halcon提供了基于它自身的深度学习框架,虽然深入学习基本算法框架上没有提供改动的接口,但在应用上确实做到了便捷性。也是基于这种特性,halcon在深度学习模块方面也具有自身特色,博主认为其主要特设在于 1、代码集成度高、便捷性高 2、可视化手段多样 3、针对性比较明显,且易于传统算法和深度学习算法的结合等。
深度学习顾名思义就是通过深度的神经网络进行特征提取与学习,最终得到准确的学习结果的一种方式。一般,深度学习算法都采用python进行开发,主要的开发框架有tensorflow、pytorch、caffe等。深度学习的本质就是参数迭代,结果就是学习完成后得到的输出模型。其与传统的学习模型相比,最明显的区别就是网络更加复杂。最近几年比较火的深度网络包括:编解码网络、强化学习网络、生成对抗网络等。
图像处理
在深度学习中,对图像的处理主要是以分类和定位为主(也有生成)常见的分类算法包括ResNet系列和GoogleNet系列等。而定位算法一般和分类算法合在一起的,主要因场景不同而不同,包括面向非实时检测的RCNN类算法及面向实时检测的YOLO系列算法等。
深度学习网络基本构成
训练模块:
a、特征提取部分
b、分类或回归网络
c、优化部分
测试及验证模块:
halcon中所自带的网络
halcon中有三种分类器网络,分别为:
a、pretrained_dl_classifier_compact.hdl代表的compact transformer网络,该网络比较轻便,所以训练速度表较快内存消耗小等优点;
b、pretrained_dl_classifier_enhanced.hdl 所代表的Enhanced ResNet网络;
c、pretrained_dl_classifier_resnet50.hdl所代表的ResNet50网络。
数据处理
图像数据是无法直接输入网络中学习的,所以一般都要先将图像数据转换为矩阵然后的输入网络中,具体过程参照如下halcon代码:
*数据处理及数据集定义
RawDataPath := 'D:/DataSet/Image_total/'+['Bad','Up','Down','Left','Right']
*read_dl_classifier_data_set,这里参照的是halcon中的'classify_fruit_deep_learning'中的示例函数
read_dl_classifier_data_set (RawDataPath, 'last_folder', RawImageFiles, Labels, LabelIndices, Classes)
for I := 0 to |RawImageFiles| - 1 by 1
read_image (Image, RawImageFiles[I])
* Write preprocessed image to hobj file.
PreprocessingGenParamName := 'domain_handling'
PreprocessingGenParamValue := 'crop_domain'
ObjectFilesOut := PreprocessedFolder + '/' + Labels + '/' + BaseNames + '.hobj'
*preprocess_dl_classifier_images,这里参照的是halcon中的'classify_fruit_deep_learning'中的示例函数,目的是将图像处理为特定大小的
preprocess_dl_classifier_images (Image, ImagePreprocessed, PreprocessingGenParamName, PreprocessingGenParamValue,DLSetHandle)
write_object (ImagePreprocessed, ObjectFilesOut[I])
endfor
*数据集划分,采用'classify_fruit_deep_learning'中的split_dl_classifier_data_set函数
read_dl_classifier_data_set (PreprocessedFolder, 'last_folder', ImageFiles, Labels, LabelsIndices, Classes)
* Split the data into three subsets,
* for training 70%, validation 15%, and testing 15%.
TrainingPercent := 70
ValidationPercent := 15
split_dl_classifier_data_set (ImageFiles, Labels, TrainingPercent, ValidationPercent, TrainingImages, TrainingLabels, ValidationImages, ValidationLabels, TestImages, TestLabels)
*1、超参数设置,包括epoch、batch size、learning rate等,通过set_dl_classifier_param()实现
set_dl_classifier_param (DLSetHandle, 'classes', Classes)
BatchSize := 16
set_dl_classifier_param (DLSetHandle, 'batch_size', BatchSize)
b、模型训练
*1、获取数据集
read_image (BatchImages, BatchImageFiles)
*2、将数据输入模型
train_dl_classifier_batch (BatchImages, DLClassifierHandle, BatchLabels, DLClassifierTrainResultHandle)
*3、保存模型
write_dl_classifier (DLSetHandle,'getline.hdl')
c、模型的测试与验证:
**1、获取模型
* Read the classifier.
read_dl_classifier (FileName, DLSetHandle)
* If it is not possible to accumulate more than one image
* at a time the batch size should be set to
**2、设置超参数
set_dl_classifier_param (DLSetHandle, 'batch_size', 1)
**3、读取测试数据
read_image (Image, ImageFile)
**4、将数据输入已训练好的模型
apply_dl_classifier (ImagePreprocessed, DLSetHandle, DLClassifierResultHandle)
**5、获取输出结果
get_dl_classifier_result (DLClassifierResultHandle, 'all', 'predicted_classes', PredictedClass)
d、模型的使用
**1、获取待验证的数据
list_image_files ('D:/DataSet/testImage', 'default', [], ImageFiles)
read_image (Image, ImageFiles)
count_obj (Image, Number)
**2、获取模型
read_dl_classifier ('C:/Users/25003958/Desktop/getline.hdl', DLSetHandle)
**3、设置超参数
set_dl_classifier_param (DLSetHandle, 'batch_size', 1)
set_dl_classifier_param (DLSetHandle, 'runtime', 'cpu')
set_dl_classifier_param (DLSetHandle, 'runtime_init', 'immediately')
**4、逐个输出结果
for i:=1 to Number by 1
select_obj (Image, ObjectSelected, i)
dev_resize_window_fit_image (ObjectSelected, 0, 0, -1, -1)
PreprocessingGenParamName := 'domain_handling'
PreprocessingGenParamValue := 'crop_domain'
preprocess_dl_classifier_images (ObjectSelected, ImagePreprocessed, PreprocessingGenParamName, PreprocessingGenParamValue,DLSetHandle)
apply_dl_classifier (ImagePreprocessed, DLSetHandle, DLClassifierResultHandle)
get_dl_classifier_result (DLClassifierResultHandle, 'all', 'predicted_classes', PredictedClass)
*
dev_display (ObjectSelected)
Text := 'Predicted class: ' + PredictedClass
dev_disp_text (Text, 'window', 'top', 'left', 'red', 'box', 'false')
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
dev_clear_window ()
endfor
a、深度学习模块可参照python版本的模型的的训练和使用
b、halcon中的深度学习算法比较固定,目前只提供了三种,不利于畸变较大、伸缩性较大、特征复杂的场景
c、halcon中的深度学习模块具有很好的扩展性,有利于新的算法的扩展
d、halcon中的深度学习模块的优势在于传统方法和深度学习方法的结合,即通过传统方法进行’降噪’,然后将处理好的图像输入深度学习网络中进行训练,这样的方式具有一定的应用场景