Halcon DeepLearning初识
Halcon提供三种类型神经网络:
1、Classification(分类)
2、Object Detection(目标检测)
3、Semantic Segmentation(语义分割)
工作流程:
一、准备网络和数据
- 使用的网络:可以使用预训练过的网络或者创建一个新的网络,我使用的是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) 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
分类网络(Classification):
流程中可能使用到的算子:
一、准备网络和数据
- 读取网络: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_progress
- select_percentage_dl_classifier_data
- apply_dl_classifier_batchwise
- evaluate_dl_classifier
三、使用和评估最终分类器
- 应用:apply_dl_classifier,获取预测结果:get_dl_classifier_result
- 评估网络:
- 混淆矩阵打分:gen_confusion_matrix
- gen_interactive_confusion_matrix
- 获取测试图片结果:get_dl_classifier_image_results
- 显示检测分栏:dev_display_dl_classifier_heatmap
工业检测样本(自己做的项目):分类气泡、划伤、破损、翘脚等(从左到右)
训练过程:
测试结果: