一、准备网络和数据
使用的网络:可以使用预训练过的网络或者创建一个新的网络,我使用的是18.11.1.0版本有三种网络供选择: 'pretrained_dl_classifier_compact.hdl':需要图像格式为'real',该网络不包含全连接层,要求最小图片尺寸大于15*15 'pretrained_dl_classifier_enhanced.hdl':比上个能处理更复杂的图像,需要图像格式为'read',最小尺寸要求大于47*47, 'pretrained_dl_classifier_resnet50.hdl':需要图像格式为'real',最小尺寸要求大于32*32. 上述三种网络均需要设置基本参数:'image_width','image_height','image_num_channels','image_range_min','image_range_max‘,即图像宽高、通道数、灰度范围。准备数据:分类好训练样本的种类准备对应需求的大量图片(例如:图像维度、灰度范围等),在原图基础上还需要进行预处理,剔除背景影响,最大程度突出主体部分。 预处理操作:阈值化,提取特征roi,转换图像格式到'real',合成3通道图像等等。做好训练集、验证集、测试集:一般地按照70%,15%,15%比例分类。二、训练网络和评估训练进度
设置超参数适用任务和系统 set_dl_classifier_param:设置'batch_size','batch_size_device','classes','gpu','image_width','image_height‘,'image_num_channels','image_dimensions','learning_rate','momentum’,'runtime','runtime_init','weight_prior' 参数名名称定义运用批量大小batch_size批处理中图像(和相应标签)的数量,即在一次训练迭代中同时处理的图像数量。set_dl_classifier_param(DLClassifierHandle,'batch_size‘,Batch_Size)
批量大小设备
batch_size_device传输到设备存储器的批处理中的图像数目。设置为小于等于批量大小。set_dl_classifier_param
(DLClassifierHandle,'batch_size_device‘,Batch_Size)
类名classes与要识别的对象类相对应的标签组。set_dl_classifier_param(DLClassifierHandle,'classes‘,Classes)gpugpuGPU标识符set_dl_classifier_param
(DLClassifierHandle,'gpu',GPU)
图像宽度image_width过程处理图像宽度set_dl_classifier_param(DLClassifierHandle,'image_width‘,Width)
图像高度image_height过程处理图像高度set_dl_classifier_param(DLClassifierHandle,'image_height‘,Height)
图像通道数image_num_channels处理图像的通道数set_dl_classifier_param
(DLClassifierHandle,'image_num_channels‘,Channels)
图像维度image_dimensions包含图像尺寸“image_width”、“image_height”和通道数量“image_num_channels”的元组。set_dl_classifier_param
(DLClassifierHandle,'image_dimensions‘,Dimensions)
学习率learning_rate训练中决定梯度影响因素的初始值。默认0.001set_dl_classifier_param(DLClassifierHandle,'learning_rate',Rate)动量momentum损失函数的动量参数。默认0.9set_dl_classifier_param(DLClassifierHandle,'momentum‘,Momentum)运行环境runtime执行的设备。默认'gpu‘set_dl_classifier_param(DLClassifierHandle,'runtime','cpu')
set_dl_classifier_param(DLClassifierHandle,'runtime','gpu')
运行环境runtime_init执行环境初始化使用'immediately',初始化GPU。否则不初始化。set_dl_classifier_param(DLClassifierHandle,'runtime_init','immediately')正则化参数weight_prior用于损失函数防止过拟合,默认0非0,则使用set_dl_classifier_param(DLClassifierHandle,'weight_prior',WeightPrior)一般的设置:
* ** 训练 Halcon语法** * * 读取训练模型 read_dl_classifier ('pretrained_dl_classifier_compact.hdl', DLClassifierHandle) * 训练图像目录 RawDataFolder := 'food/' + ['apple_braeburn','apple_golden_delicious','apple_topaz','peach','pear'] * 获取图像内容和标签 read_dl_classifier_data_set (RawDataFolder, 'last_folder', RawImageFiles, Labels, LabelIndices, Classes) * 预处理数据集的输出目录路径 PreprocessedFolder := 'fruit_preprocessed' * 关闭覆盖图像. OverwritePreprocessingFolder := false * 移除预处理图像 RemovePreprocessingAfterExample := true *分类图像和标签和种类 read_dl_classifier_data_set (PreprocessedFolder, 'last_folder', ImageFiles, Labels, LabelsIndices, Classes) * * 将训练集、验证集和测试集以70%、15%、15%比例分类 TrainingPercent := 70 ValidationPercent := 15 split_dl_classifier_data_set (ImageFiles, Labels, TrainingPercent, ValidationPercent, TrainingImages, TrainingLabels, ValidationImages, ValidationLabels, TestImages, TestLabels) * * 设置分类超参数 set_dl_classifier_param (DLClassifierHandle, 'classes', Classes) * 设置训练块大小 BatchSize := 64 set_dl_classifier_param (DLClassifierHandle, 'batch_size', BatchSize) * 初始化运行环境 set_dl_classifier_param (DLClassifierHandle, 'runtime_init', 'immediately') * 设置初始学习率 InitialLearningRate := 0.001 set_dl_classifier_param (DLClassifierHandle, 'learning_rate', InitialLearningRate) * 每30步降低90%学习率 LearningRateStepEveryNthEpoch := 30 LearningRateStepRatio := 0.1 * 迭代100次 NumEpochs := 100 * * 训练分类器 * * 每4次打印plot表 PlotEveryNthEpoch := 4 FileName := 'classifier_fruit.hdl' *训练模型文件 train_fruit_classifier (DLClassifierHandle, FileName, NumEpochs, TrainingImages, TrainingLabels, ValidationImages, ValidationLabels, LearningRateStepEveryNthEpoch, LearningRateStepRatio, PlotEveryNthEpoch, WindowHandle)图中两条不断下降的曲线分别是训练过程和验证过程中的错误率曲线,两条线的走势都向0趋近且较为平稳。验证错误率曲线呈现追随学习错误率的走势表明训练平稳运行,训练效果较好。
可选择的指定数据扩充和增强在训练中开始训练并且评估网络三、 评估最终网络(是否能较好解决实际问题,混淆矩阵)
*读取训练好的文件 read_dl_classifier (FileName, DLClassifierHandle) * * 计算验证集的混淆矩阵 get_predicted_classes (ValidationImages, DLClassifierHandle, PredictedClassesValidation) *生成混淆矩阵 gen_confusion_matrix (ValidationLabels, PredictedClassesValidation, [], [], WindowHandle, ConfusionMatrix) dev_disp_text ('Validation data', 'window', 'top', 'left', 'gray', 'box', 'false') dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])四、最终测试
* * 推理 * * 读取训练网络文件 read_dl_classifier (FileName, DLClassifierHandle) * 一次测试1张. set_dl_classifier_param (DLClassifierHandle, 'batch_size', 1) *设置网络环境 set_dl_classifier_param (DLClassifierHandle, 'runtime', 'gpu') set_dl_classifier_param (DLClassifierHandle, 'runtime_init', 'immediately') dev_resize_window_fit_size (0, 0, WindowWidth, WindowHeight, -1, -1) dev_disp_inference_text (Runtime) * Read / acquire images in a loop and classify them. for Index := 0 to 20 by 1 ImageFile := RawImageFiles[floor(rand(1) * |RawImageFiles|)] read_image (Image, ImageFile) dev_resize_window_fit_image (Image, 0, 0, -1, -1) *处理图像 preprocess_dl_fruit_example (Image, ImagePreprocessed, DLClassifierHandle) *利用已经训练好的网络识别图像 apply_dl_classifier (ImagePreprocessed, DLClassifierHandle, DLClassifierResultHandle) *得到检测结果 get_dl_classifier_result (DLClassifierResultHandle, 'all', 'predicted_classes', PredictedClass) * dev_display (Image) Text := 'Predicted class: ' + PredictedClass dev_disp_text (Text, 'window', 'top', 'left', 'white', 'box', 'false') dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], []) stop () endfor一、准备网络和数据
读取网络:read_dl_classifier读取训练集:read_dl_classifier_data_set获取超参数:get_dl_classifier_param分离训练集(根据分类样本种类):split_dl_classifier_data_set设置超参数(例如'batch_size'、'learning_rate'):set_dl_classifier_param二、训练网络和评估训练进度
设置超参数:set_dl_classifier_param训练数据块大小:train_dl_classifier_batch可视化训练效果: plot_dl_classifier_training_progressselect_percentage_dl_classifier_dataapply_dl_classifier_batchwiseevaluate_dl_classifier三、使用和评估最终分类器
应用:apply_dl_classifier,获取预测结果:get_dl_classifier_result评估网络: 混淆矩阵打分:gen_confusion_matrixgen_interactive_confusion_matrix获取测试图片结果:get_dl_classifier_image_results显示检测分栏:dev_display_dl_classifier_heatmap工业检测样本(自己做的项目):分类气泡、划伤、破损、翘脚等(从左到右)
训练过程:
测试结果: