一、准备网络和数据
二、训练网络和评估训练进度
参数名 | 名称 | 定义 | 运用 |
批量大小 | 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) |
gpu | gpu | GPU标识符 | 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.001 | set_dl_classifier_param(DLClassifierHandle,'learning_rate',Rate) |
动量 | momentum | 损失函数的动量参数。默认0.9 | set_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
一、准备网络和数据
二、训练网络和评估训练进度
三、使用和评估最终分类器
工业检测样本(自己做的项目):分类气泡、划伤、破损、翘脚等(从左到右)
训练过程:
测试结果: