Halcon深度学习,语义分割,预处理和部署过程

halcon在深度学习中提供了7种学习方式和例子。其中最为常见的为语义分割,一般使用与在需要标注显示的缺陷检测项目中。几乎所有的2D缺陷检测都可以使用语义分割作为项目部署。
先上完整程序

预处理部分


*** 设置输入输出路径 ***
*总路径
AllDir := 'E:/HALCONDeepingLearn/单一缺陷/训练图/训练'
*图片路径
ImageDir := AllDir +'/全部训练_images'
*语义分割标注好的图像,label,分割图片路径
DivisionImagesDir := AllDir + '/全部训练_labels'
*存放数据总路径,存放输出的全部参数
DataDir := AllDir + '/data'
*预处理后的路径
DataDirectoryBaseName := DataDir + '/dldataset'
*存储预处理参数
PreprocessParamFileBaseName := DataDir + '/dl_preprocess_param'

* 预处理后DLDataset的文件路径。
*:调整DataDirectory预处理后与另一个图像大小。
DataDirectory :=AllDir + '/data/dldataset/samples'
DLDatasetFileName := AllDir + '/data/dldataset'+ '/dl_dataset.hdict'
*最终训练模型的输出路径。
FinalModelBaseName := AllDir + '/final_dl_model_segmentation'
*最优评价模型的输出路径。
BestModelBaseName := AllDir + '/best_dl_model_segmentation'


*** 设置参数 ***
*类别名称
ClassNames := ['好','凸粉','擦花']
*类别ID
ClassIDs := [0,1,2]
*拆分数据集,训练百分比例,验证百分比例
TrainingPercent := 70
ValidationPercent := 15
*图片尺寸参数,图像宽,图像高,图像颜色通道数
ImageWidth := 400
ImageHeight := 400
ImageNumChannels := 3
*图片灰度范围
ImageRangeMin := -127
ImageRangeMax := 128
*图像预处理的进一步参数
*图像归一化,用于缩小图像分辨率
ContrastNormalization := 'none'
*域处理,全局缩放。crop_domain(指定缩放,与reduce_domain相使用)
DomainHandling := 'full_domain'
*不需要训练的类别的ID
IgnoreClassIDs := []
*设置背景类ID
SetBackgroundID := []
ClassIDsBackground := []
*随机种子
SeedRand := 42


*** 处理图片并进行拆分 ***
*设置随机种子
set_system ('seed_rand', SeedRand)
*通过参数将文件夹中数据分割为数据集 参数:图像路径、分割图像路径、类别名称、类别ID、图像路径列表、分割图像路径列表、字典、生成的数据集
read_dl_dataset_segmentation (ImageDir, DivisionImagesDir, ClassNames, ClassIDs, [], [], [], DLDataset)
*拆分数据集。数据集字典,训练图像百分比,验证图像百分比,测试图像百分比
split_dl_dataset (DLDataset, TrainingPercent, ValidationPercent, [])

************************************** 预处理数据集 *************************
*创建预处理输出文件夹
file_exists (DataDir, FileExists)
if (not FileExists)
    make_dir (DataDir)
endif
*创建预处理参数
*classification', 'detection', 'segmentation';分类,检测,分割
create_dl_preprocess_param ('segmentation', ImageWidth, ImageHeight, ImageNumChannels, ImageRangeMin, ImageRangeMax, ContrastNormalization, DomainHandling, IgnoreClassIDs, SetBackgroundID, ClassIDsBackground, [], DLPreprocessParam)
*预处理后的数据集路径
PreprocessParamFile := PreprocessParamFileBaseName +'.hdict'
*将参数写入
write_dict (DLPreprocessParam, PreprocessParamFile, [], [])
*创建字典
create_dict (GenParam)
set_dict_tuple (GenParam, 'overwrite_files', true)
*预处理
preprocess_dl_dataset (DLDataset, DataDirectoryBaseName, DLPreprocessParam, GenParam, DLDatasetFilename)

*******************************检查********************
*随机选取10张图像
get_dict_tuple (DLDataset, 'samples', DatasetSamples)
find_dl_samples (DatasetSamples, 'split', 'train', 'match', SampleIndices)
tuple_shuffle (SampleIndices, ShuffledIndices)
read_dl_samples (DLDataset, ShuffledIndices[0:9], DLSampleBatchDisplay)
* 
create_dict (WindowHandleDict)
for Index := 0 to |DLSampleBatchDisplay| - 1 by 1
    *可视化不同的图像、注释和推理结果
    dev_display_dl_data (DLSampleBatchDisplay[Index], [], DLDataset, ['image','segmentation_image_ground_truth'], [], WindowHandleDict)
    get_dict_tuple (WindowHandleDict, 'segmentation_image_ground_truth', WindowHandleImage)
    dev_set_window (WindowHandleImage[1])
    Text := 'Press Run (F5) to continue'
    dev_disp_text (Text, 'window', 400, 40, 'black', [], [])
    
endfor
stop ()
*关闭窗体
dev_display_dl_data_close_windows (WindowHandleDict)


*校验GPU是否正常运行与可连接状态
get_system ('cuda_loaded', Information1)
get_system ('cuda_version', Information2)
get_system ('cuda_devices', Information3)
get_system ('cudnn_loaded', Information4)
get_system ('cudnn_version', Information5)
get_system ('cublas_loaded', Information6)
get_system ('cublas_version', Information7)

query_available_dl_devices (['runtime','runtime'], ['gpu','cpu'], DLDeviceHandles)

if (|DLDeviceHandles| == 0)
    throw ('No supported device found to continue this example.')
endif
* Due to the filter used in query_available_dl_devices, the first device is a GPU, if available.
DLDevice := DLDeviceHandles[0]
*返回98在0o支持深度学习的设备参数,默认优先级为GPU
get_dl_device_param (DLDevice, 'type', DLDeviceType)
if (DLDeviceType == 'cpu')
    * The number of used threads may have an impact
    * on the training duration.
    NumThreadsTraining := 4
    set_system ('thread_num', NumThreadsTraining)
endif
**********************************************开始训练模式*********************************

* 以下参数需要经常调整。
*模型参数。
*需要重新训练的分割模型。选取默认的halcon模型
ModelFileName := 'pretrained_dl_segmentation_enhanced.hdl'
* 批处理大小。
*如果设置为“maximum”,批量大小由set_dl_model_param_max_gpu_batch_size设置
*如果运行时'gpu'给定。
BatchSize := 'maximum'
* 初始学习率。
InitialLearningRate := 0.0001
* 如果批量大小较小,动量应该很高。
Momentum := 0.99
*train_dl_model使用的参数。
*训练模型的epoch(迭代次数)数。
NumEpochs := 100
* 评估间隔(以epoch为单位)用于计算验证分裂上的评估度量。
EvaluationIntervalEpochs := 1
* 在接下来的时代中改变学习率,例如[15,30]*如果不需要更改学习率,请设置为[]。
ChangeLearningRateEpochs := []
* 将学习率更改为以下值,例如InitialLearningRate *[0.1, 0.01]*元组必须与ChangeLearningRateEpochs具有相同的长度。
ChangeLearningRateValues := []
* 
* ***********************************
* ***   设置高级参数。  ***
* ***********************************
* 
* 在极少数情况下,可能需要更改以下参数。
*模型参数。
*使用[]默认权重优先。
WeightPrior := []
* 
* train_dl_model参数。
*控制是否显示训练进度(true/false)。
EnableDisplay := true
* 为训练设置一个随机种子。
RandomSeed := 42
set_system ('seed_rand', RandomSeed)
* 
*为了在同一GPU上获得近乎确定性的训练结果
* (system, driver, cuda-version)你可以指定"cudnn_deterministic"*true”。注意,这可能会减慢训练速度。
* set_system ('cudnn_deterministic', 'true')
* 设置create_dl_train_param的通用参数。
*请参阅create_dl_train_param的文档,了解所有可用参数的概述。
GenParamName := []
GenParamValue := []
* 
* 改变策略。
*可以在训练过程中更改模型参数。
*在这里,如果上面指定,我们会改变学习率。
if (|ChangeLearningRateEpochs| > 0)
    create_dict (ChangeStrategy)
    * 指定要更改的模型参数。
    set_dict_tuple (ChangeStrategy, 'model_param', 'learning_rate')
    * 以“initial value”开始参数值。
    set_dict_tuple (ChangeStrategy, 'initial_value', InitialLearningRate)
    * 在每个“epochs”步骤更改参数值。
    set_dict_tuple (ChangeStrategy, 'epochs', ChangeLearningRateEpochs)
    * 将参数值修改为“值”中的对应值。
    set_dict_tuple (ChangeStrategy, 'values', ChangeLearningRateValues)
    * 收集所有变更策略作为输入。
    GenParamName := [GenParamName,'change']
    GenParamValue := [GenParamValue,ChangeStrategy]
endif
* 
* 串行化策略。
*有几种将中间模型保存到磁盘的选项(参见create_dl_train_param)*在这里,最好的和最终的模型被保存到上面设置的路径。
create_dict (SerializationStrategy)
set_dict_tuple (SerializationStrategy, 'type', 'best')
set_dict_tuple (SerializationStrategy, 'basename', BestModelBaseName)
GenParamName := [GenParamName,'serialize']
GenParamValue := [GenParamValue,SerializationStrategy]
create_dict (SerializationStrategy)
set_dict_tuple (SerializationStrategy, 'type', 'final')
set_dict_tuple (SerializationStrategy, 'basename', FinalModelBaseName)
GenParamName := [GenParamName,'serialize']
GenParamValue := [GenParamValue,SerializationStrategy]
* 
*显示参数。
*在此示例中,训练的评估措施不显示
* training(默认)。如果您想这样做,请选择一定百分比的训练
*在训练过程中用于评估模型的样本。较低的百分比有助于加快速度

*设置自动评估。
SelectedPercentageTrainSamples := 0
*设置训练集的X轴参数
XAxisLabel := 'epochs'
create_dict (DisplayParam)
set_dict_tuple (DisplayParam, 'selected_percentage_train_samples', SelectedPercentageTrainSamples)
set_dict_tuple (DisplayParam, 'x_axis_label', XAxisLabel)
GenParamName := [GenParamName,'display']
GenParamValue := [GenParamValue,DisplayParam]
* 
* 
* *********************************
* ***  读取所需要的模型和预处理训练集.  ***
* *********************************
* 
*检查是否存在所需要的全部文件
check_data_availability (AllDir, DLDatasetFileName)
* 
*读取预处理的文件(hdict后缀)
read_dict (DLDatasetFileName, [], [], DLDataset)
*读取预处理的初始化模型,选取halcon的模型。
*C:/Program Files/MVTec/HALCON-20.11-Progress/dl/pretrained_dl_segmentation_enhanced.hdl。
read_dl_model (ModelFileName, DLModelHandle)

set_dl_model_param (DLModelHandle, 'device', DLDevice)
* 
* ******************************
* ***  设置模型参数. ***
* ******************************
* 
* 根据预处理参数设置模型.
get_dict_tuple (DLDataset, 'preprocess_param', DLPreprocessParam)
get_dict_tuple (DLDataset, 'class_ids', ClassIDs)
set_dl_model_param_based_on_preprocessing (DLModelHandle, DLPreprocessParam, ClassIDs)
* 
* 设置模型超参数.
*设置初始学习率
set_dl_model_param (DLModelHandle, 'learning_rate', InitialLearningRate)
*设置动量
set_dl_model_param (DLModelHandle, 'momentum', Momentum)
if (BatchSize == 'maximum' and DLDeviceType == 'gpu')
    *设置GPU训练,当程序出现报错时,为内存占用过大,重启程序即可
    *重启程序不行,则需要减少训练图像数,或者增加电脑内存
    set_dl_model_param_max_gpu_batch_size (DLModelHandle, 100)
else
    if (BatchSize == 'maximum' and DLDeviceType == 'cpu')
        * Please set a suitable batch size in case of 'cpu'
        * training before continuing.
        stop ()
    endif
    set_dl_model_param (DLModelHandle, 'batch_size', 1)
endif
if (|WeightPrior| > 0)
    set_dl_model_param (DLModelHandle, 'weight_prior', WeightPrior)
endif
set_dl_model_param (DLModelHandle, 'runtime_init', 'immediately')
* 
* *************************
* ***  开始训练模型. ***
* *************************
* 
* 创建通用训练字典
create_dl_train_param (DLModelHandle, NumEpochs, EvaluationIntervalEpochs, EnableDisplay, RandomSeed, GenParamName, GenParamValue, TrainParam)
* 
* 通过下列算子开始训练
* train_dl_model_batch () within the following procedure.
train_dl_model (DLDataset, DLModelHandle, TrainParam, 0.0, TrainResults, TrainInfos, EvaluationInfos)
* 
* Stop after the training has finished, before closing the windows.
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
* 
* Close training windows.
dev_close_window ()
dev_close_window ()
* 
write_dl_model (DLModelHandle, DLDatasetFileName)
* Set parameters for evaluation.
set_dl_model_param (DLModelHandle, 'optimize_for_inference', 'true')
*将训练好的文件写入路径中
write_dl_model (DLModelHandle, 'E:/HALCONDeepingLearn/单一缺陷/best_dl_model_segmentation.hdl')


************************************************评估模型*********************************

SegmentationMeasures := ['mean_iou','pixel_accuracy','class_pixel_accuracy','pixel_confusion_matrix']
create_dict (GenParamEval)
set_dict_tuple (GenParamEval, 'measures', SegmentationMeasures)
set_dict_tuple (GenParamEval, 'show_progress', 'true')
* 
* 评估训练好的模型
evaluate_dl_model (DLDataset, DLModelHandle, 'split', 'test', GenParamEval, EvaluationResult, EvalParams)
* 
* 
* ******************************
* **   显示结果   ***
* ******************************
* 
* Display measures.
create_dict (WindowHandleDict)
create_dict (GenParamEvalDisplay)
set_dict_tuple (GenParamEvalDisplay, 'display_mode', ['measures','absolute_confusion_matrix'])
dev_display_segmentation_evaluation (EvaluationResult, EvalParams, GenParamEvalDisplay, WindowHandleDict)
* 
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', 'box', 'true')
stop ()

模型部署

*设置训练好模型的路径
AllDir := 'E:/HALCONDeepingLearn/单一缺陷/训练图/训练'
RetrainedModelFileName:=AllDir+'/best_dl_model_segmentation.hdl'
PreprocessParamFileName:=AllDir+'/data/dl_preprocess_param.hdict'
*校验GPU是否可以使用
query_available_dl_devices (['runtime','runtime'], ['gpu','cpu'], DLDeviceHandles)
if (|DLDeviceHandles| == 0)
    throw ('No supported device found to continue this example.')
endif
*设置运行设备
DLDevice := DLDeviceHandles[0]

ClassNames := ['好','凸粉','擦花']
ClassIDs := [0,1,2]
*检查程序必须文件是否齐全
check_data_availability (AllDir, PreprocessParamFileName, RetrainedModelFileName, true)
* 
*读取训练好的模型
read_dl_model (RetrainedModelFileName, DLModelHandle)
* 
* 设置批处理量为1,(将每张图片做为单次处理).
set_dl_model_param (DLModelHandle, 'batch_size', 1)
* 
* 初始化部署推理模型.
set_dl_model_param (DLModelHandle, 'device', DLDevice)
* 
* 获取预处理参数.
read_dict (PreprocessParamFileName, [], [], DLPreprocessParam)

 
* Image Acquisition 01: Code generated by Image Acquisition 01
list_files ('E:/HALCONDeepingLearn/单一缺陷/擦花', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
    read_image (Image, ImageFiles[Index])
    
    * 生成图像模型
    gen_dl_samples_from_images (Image, DLSampleBatch)
    * 
    * 预处理图像模型
    preprocess_dl_samples (DLSampleBatch, DLPreprocessParam)
    * 
    * 将学习模型,应用到图像模型中
    apply_dl_model (DLModelHandle, DLSampleBatch, ['segmentation_image','segmentation_confidence'], DLResultBatch)

    * 获取预处理图像
    get_dict_object (Image, DLSampleBatch, 'image')
    * 获取结果图像
    get_dict_object (SegmentationImage, DLResultBatch, 'segmentation_image')  
    *获取1号缺陷
    threshold (SegmentationImage, Region_Tu, 1, 1)
    gen_contour_region_xld (Region_Tu, Contours, 'border')
    *获取2号缺陷
    threshold (SegmentationImage, Region_Ca, 2, 2)
    gen_contour_region_xld (Region_Ca, Contours1, 'border')
    dev_display (Image)
    dev_set_color ('red')
    dev_display (Contours)
    dev_set_color ('green')
    dev_display (Contours1)
    stop ()   
endfor

讲解部分

第一:图像标注

在图像标注时,我们需要针对我们所需要识别的图像,尽可能的减少缺陷的数量和类别,保证标注的准确性。
文章中我选取,阿里天池数据大赛铝材表面缺陷检测基础图像进行训练和测试,数据源网址:https://tianchi.aliyun.com/competition/entrance/231682/information
缺陷部分选取在项目上最为常见的金属突起缺陷(凸粉)与金属表面划痕部分(擦花)作为文章的参考。
标注工具,文章选取halcon开发的标注工具MVTec Deep Learning Tool 22.10 版本进行标注。
标注过程。在标注时我们需要新建2种缺陷标注,即为擦花和凸粉,还有背景(无缺陷的图片)

标注过程

标注完成结果示意

导出标注数据
导出结果

第二:开始图像预处理

1.导入图像路径

将我们标注好的图像文件夹路径写入到预处理的文件夹中。

*** 设置输入输出路径 ***
*总路径
AllDir := 'E:/HALCONDeepingLearn/单一缺陷/训练图/训练'
*图片路径,原始图像路径
ImageDir := AllDir +'/全部训练_images'
*语义分割标注好的图像,label,分割图片路径
DivisionImagesDir := AllDir + '/全部训练_labels'
*存放数据总路径,存放输出的全部参数
DataDir := AllDir + '/data'
*预处理后的路径
DataDirectoryBaseName := DataDir + '/dldataset'
*存储预处理参数
PreprocessParamFileBaseName := DataDir + '/dl_preprocess_param'
* 预处理后DLDataset的文件路径。
*:调整DataDirectory预处理后与另一个图像大小。
DataDirectory :=AllDir + '/data/dldataset/samples'
DLDatasetFileName := AllDir + '/data/dldataset'+ '/dl_dataset.hdict'

2.设置图像预处理参数

其中类别ID,0代表为我们标注的背景图像,1和2代表我们标注的缺陷类型,与标注标签循序相关。
拆分数据集。训练与验证半分比的和应小于100%,测试百分比可以设置为默认即可。在实际训练中训练百分比通常为70%以上即可。可根据实际训练效果来选取。
图像尺寸参数。图像尺寸越大训练和部署的时间越长,所以推荐使用400*400的图像大小。图像通道数根据自身图像可使用单通道与三通道2种。
图像域处理,预处理中可以选择全局或者指定区域,指定区域需要使用reduce_domain算子进行对图像进行裁剪

*** 设置参数 ***
*类别名称
ClassNames := ['好','凸粉','擦花']
*类别ID
ClassIDs := [0,1,2]
*拆分数据集,训练百分比例,验证百分比例
TrainingPercent := 70
ValidationPercent := 15
*图片尺寸参数,图像宽,图像高,图像颜色通道数
ImageWidth := 400
ImageHeight := 400
ImageNumChannels := 3
*图片灰度范围
ImageRangeMin := -127
ImageRangeMax := 128
*图像预处理的进一步参数
*图像归一化,用于缩小图像分辨率
ContrastNormalization := 'none'
*域处理,全局缩放。crop_domain(指定缩放,与reduce_domain相使用)
DomainHandling := 'full_domain'
*不需要训练的类别的ID
IgnoreClassIDs := []
*设置背景类ID
SetBackgroundID := []
ClassIDsBackground := []
*随机种子
SeedRand := 42

3.拆分和检测图像集

read_dl_dataset_segmentation函数报错:通常为在文件夹中的原图像数量与标注文件夹的数量不一致造成的


*** 处理图片并进行拆分 ***
*设置随机种子
set_system ('seed_rand', SeedRand)
*通过参数将文件夹中数据分割为数据集 参数:图像路径、分割图像路径、类别名称、类别ID、图像路径列表、分割图像路径列表、字典、生成的数据集
read_dl_dataset_segmentation (ImageDir, DivisionImagesDir, ClassNames, ClassIDs, [], [], [], DLDataset)
*拆分数据集。数据集字典,训练图像百分比,验证图像百分比,测试图像百分比
split_dl_dataset (DLDataset, TrainingPercent, ValidationPercent, [])

************************************** 预处理数据集 *************************
*创建预处理输出文件夹
file_exists (DataDir, FileExists)
if (not FileExists)
    make_dir (DataDir)
endif
*创建预处理参数
*classification', 'detection', 'segmentation';分类,检测,分割
create_dl_preprocess_param ('segmentation', ImageWidth, ImageHeight, ImageNumChannels, ImageRangeMin, ImageRangeMax, ContrastNormalization, DomainHandling, IgnoreClassIDs, SetBackgroundID, ClassIDsBackground, [], DLPreprocessParam)
*预处理后的数据集路径
PreprocessParamFile := PreprocessParamFileBaseName +'.hdict'
*将参数写入
write_dict (DLPreprocessParam, PreprocessParamFile, [], [])
*创建字典
create_dict (GenParam)
set_dict_tuple (GenParam, 'overwrite_files', true)
*预处理
preprocess_dl_dataset (DLDataset, DataDirectoryBaseName, DLPreprocessParam, GenParam, DLDatasetFilename)

*******************************检查********************
*随机选取10张图像
get_dict_tuple (DLDataset, 'samples', DatasetSamples)
find_dl_samples (DatasetSamples, 'split', 'train', 'match', SampleIndices)
tuple_shuffle (SampleIndices, ShuffledIndices)
read_dl_samples (DLDataset, ShuffledIndices[0:9], DLSampleBatchDisplay)
* 
create_dict (WindowHandleDict)
for Index := 0 to |DLSampleBatchDisplay| - 1 by 1
    *可视化不同的图像、注释和推理结果
    dev_display_dl_data (DLSampleBatchDisplay[Index], [], DLDataset, ['image','segmentation_image_ground_truth'], [], WindowHandleDict)
    get_dict_tuple (WindowHandleDict, 'segmentation_image_ground_truth', WindowHandleImage)
    dev_set_window (WindowHandleImage[1])
    Text := 'Press Run (F5) to continue'
    dev_disp_text (Text, 'window', 400, 40, 'black', [], [])
    
endfor
stop ()
*关闭窗体
dev_display_dl_data_close_windows (WindowHandleDict)

4.设置训练设备

在深度学习训练中GPU的训练速度是同等级别下的CPU的10倍,所以通常情况下使用GPU进行训练。
训练前可以先校验GPU是否处于连接状态。halcon是否可以识别


*校验GPU是否正常运行与可连接状态
*当对应的信息正确时,代表GPU校验成功
get_system ('cuda_loaded', Information1),'true'
get_system ('cuda_version', Information2)
get_system ('cuda_devices', Information3),'NVIDIA GeForce RTX 3050 Ti Laptop GPU'
get_system ('cudnn_loaded', Information4),'true'
get_system ('cudnn_version', Information5)
get_system ('cublas_loaded', Information6),'true'
get_system ('cublas_version', Information7)

query_available_dl_devices (['runtime','runtime'], ['gpu','cpu'], DLDeviceHandles)

if (|DLDeviceHandles| == 0)
    throw ('No supported device found to continue this example.')
endif
* Due to the filter used in query_available_dl_devices, the first device is a GPU, if available.
DLDevice := DLDeviceHandles[0]
*返回98在0o支持深度学习的设备参数,默认优先级为GPU
get_dl_device_param (DLDevice, 'type', DLDeviceType)
if (DLDeviceType == 'cpu')
    * The number of used threads may have an impact
    * on the training duration.
    NumThreadsTraining := 4
    set_system ('thread_num', NumThreadsTraining)
endif

5.设置训练参数

图像分割处理模型。在halcon的安装目录下
在这里插入图片描述
训练模型迭代次数:在实际训练中迭代次数大于80即可获得较好的效果,当然可以跟Loss训练曲线来衡量是否增加或者减少迭代次数。推荐迭代次数100次。


* 以下参数需要经常调整。
*模型参数。
*需要重新训练的分割模型。选取默认的halcon模型
ModelFileName := 'pretrained_dl_segmentation_enhanced.hdl'
* 批处理大小。
*如果设置为“maximum”,批量大小由set_dl_model_param_max_gpu_batch_size设置
*如果运行时'gpu'给定。
BatchSize := 'maximum'
* 初始学习率。
InitialLearningRate := 0.0001
* 如果批量大小较小,动量应该很高。
Momentum := 0.99
*train_dl_model使用的参数。
*训练模型的epoch(迭代次数)数。
NumEpochs := 100
* 评估间隔(以epoch为单位)用于计算验证分裂上的评估度量。
EvaluationIntervalEpochs := 1
* 在接下来的时代中改变学习率,例如[15,30]*如果不需要更改学习率,请设置为[]。
ChangeLearningRateEpochs := []
* 将学习率更改为以下值,例如InitialLearningRate *[0.1, 0.01]*元组必须与ChangeLearningRateEpochs具有相同的长度。
ChangeLearningRateValues := []

6.开始训练模型

* *************************
* ***  开始训练模型. ***
* *************************
* 
* 创建通用训练字典
create_dl_train_param (DLModelHandle, NumEpochs, EvaluationIntervalEpochs, EnableDisplay, RandomSeed, GenParamName, GenParamValue, TrainParam)
* 
* 通过下列算子开始训练
* train_dl_model_batch () within the following procedure.
train_dl_model (DLDataset, DLModelHandle, TrainParam, 0.0, TrainResults, TrainInfos, EvaluationInfos)
* 
* Stop after the training has finished, before closing the windows.
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
* 
* Close training windows.
dev_close_window ()
dev_close_window ()
* 
write_dl_model (DLModelHandle, DLDatasetFileName)
* Set parameters for evaluation.
set_dl_model_param (DLModelHandle, 'optimize_for_inference', 'true')
*将训练好的文件写入路径中
write_dl_model (DLModelHandle, 'E:/HALCONDeepingLearn/单一缺陷/best_dl_model_segmentation.hdl')

训练完成图
训练完成时,我们可以根据对训练曲线对图像迭代次数进行优化和选取,并且调配其他参数。

7.验证模型和写入文件

*写入模型文件
write_dl_model (DLModelHandle, DLDatasetFileName)
* Set parameters for evaluation.
set_dl_model_param (DLModelHandle, 'optimize_for_inference', 'true')
*将训练好的文件写入路径中
write_dl_model (DLModelHandle, 'E:/HALCONDeepingLearn/单一缺陷/best_dl_model_segmentation.hdl')

SegmentationMeasures := ['mean_iou','pixel_accuracy','class_pixel_accuracy','pixel_confusion_matrix']
create_dict (GenParamEval)
set_dict_tuple (GenParamEval, 'measures', SegmentationMeasures)
set_dict_tuple (GenParamEval, 'show_progress', 'true')
* 
* 评估训练好的模型
evaluate_dl_model (DLDataset, DLModelHandle, 'split', 'test', GenParamEval, EvaluationResult, EvalParams)
* 
* 
* ******************************
* **   显示结果   ***
* ******************************
* 
* Display measures.
create_dict (WindowHandleDict)
create_dict (GenParamEvalDisplay)
set_dict_tuple (GenParamEvalDisplay, 'display_mode', ['measures','absolute_confusion_matrix'])
dev_display_segmentation_evaluation (EvaluationResult, EvalParams, GenParamEvalDisplay, WindowHandleDict)
* 

评估参数
我们可以根据训练的评估结果进行判断是否需要再次调整参数进行训练。
LOU参数代表实际预测量与标注量的交集比值。越接近1越好。但是其实际值收到我们标注的效果直接影响,如果标注的面积过大会找出数值过低。PixAcc:匹配准确度。匹配准确度可以更加的直观的发现模型对缺陷的识别效果,当准确度达到0.9以上即可。

8.优化模型

针对上面的训练结果,我们可以提出几个改进的地方。第一:在标注时尽可能的贴近缺陷位置,可以使得LOU参数提高。第二:增加标注好的图像(文章中的缺陷各选取20张图像)。第三:调整参数配置。

第三:模型部署

在我们训练好所需要的模型后就可以开始部署和验证使用模型

1.导出训练好的模型和校验GPU

*设置训练好模型的路径
AllDir := 'E:/HALCONDeepingLearn/单一缺陷/训练图/训练'
RetrainedModelFileName:=AllDir+'/best_dl_model_segmentation.hdl'
PreprocessParamFileName:=AllDir+'/data/dl_preprocess_param.hdict'
*校验GPU是否可以使用
query_available_dl_devices (['runtime','runtime'], ['gpu','cpu'], DLDeviceHandles)
if (|DLDeviceHandles| == 0)
    throw ('No supported device found to continue this example.')
endif
*设置运行设备
DLDevice := DLDeviceHandles[0]

ClassNames := ['好','凸粉','擦花']
ClassIDs := [0,1,2]

2.检查文件是否缺失和读取文件

*检查程序必须文件是否齐全
check_data_availability (AllDir, PreprocessParamFileName, RetrainedModelFileName, true)
* 
*读取训练好的模型
read_dl_model (RetrainedModelFileName, DLModelHandle)
* 
* 设置批处理量为1,(将每张图片做为单次处理).
set_dl_model_param (DLModelHandle, 'batch_size', 1)
* 
* 初始化部署推理模型.
set_dl_model_param (DLModelHandle, 'device', DLDevice)
* 
* 获取预处理参数.
read_dict (PreprocessParamFileName, [], [], DLPreprocessParam)

3.图像验证和缺陷提取

list_files ('E:/HALCONDeepingLearn/单一缺陷/擦花', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
    read_image (Image, ImageFiles[Index])
    
    * 生成图像模型
    gen_dl_samples_from_images (Image, DLSampleBatch)
    * 
    * 预处理图像模型
    preprocess_dl_samples (DLSampleBatch, DLPreprocessParam)
    * 
    * 将学习模型,应用到图像模型中
    apply_dl_model (DLModelHandle, DLSampleBatch, ['segmentation_image','segmentation_confidence'], DLResultBatch)

    * 获取预处理图像
    get_dict_object (Image, DLSampleBatch, 'image')
    * 获取结果图像
    get_dict_object (SegmentationImage, DLResultBatch, 'segmentation_image')  
    *获取1号缺陷
    threshold (SegmentationImage, Region_Tu, 1, 1)
    gen_contour_region_xld (Region_Tu, Contours, 'border')
    *获取2号缺陷
    threshold (SegmentationImage, Region_Ca, 2, 2)
    gen_contour_region_xld (Region_Ca, Contours1, 'border')
    dev_display (Image)
    dev_set_color ('red')
    dev_display (Contours)
    dev_set_color ('green')
    dev_display (Contours1)
    stop ()   
endfor

实际效果图

第四:结尾

halcon的深度学习由于是属于封装好的学习模块,所以对于很多项目来说,并不需要过多的修改参数(甚至不需要修改参数),往往默认参数的效果最佳。其次提升训练效果的最佳办法是增加缺陷图像,尤其是明显缺陷图像,有助于降低部署的NG率。对于细小的缺陷(例如很小的表面划痕或者油污这些)可以大量增加特定种类的训练图。
如果出现无法识别GPU的情况,可以访问这篇文章解决:https://www.cnblogs.com/QuincyYi/articles/14209643.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/222690.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript的一个代码小挑战

题目 我们正在开发一个足球投注应用程序! 假设我们从一个网络服务获取了一场比赛的数据(如下所示)。在这个挑战中,我们将处理这些数据。这里是你的任务: const game {team1: Bayern Munich,team2: Borrussia Dortmund,players:…

适合家具集团的ERP软件有哪些?家具集团用什么ERP软件好

不同的家具企业有不同的经营策略和管理方式,同时在各个发展阶段遇会遇到各种新的问题,而这也对企业的信息化水平有着较高的要求。 另外,集团型家具企业通常涉及多仓库、多工厂、多平台、多业务模式等,而这些业务数据的实时和准确…

【趣味篇】Scratch之圣诞节跑酷

【作品展示】圣诞节跑酷 操作:点击小绿旗进入游戏主页面,不仅可以选择角色,而且选择好的角色还可以进行游戏闯关。

相对路径与绝对路径

1、相对路径与绝对路径 定义:要去的path是否和当前页面有联系 绝对: 1、http://www.baidu.com/a/b 2、/a/b 如果没有host则会直接取当前站点的host (location.origion) 相对: 1、当前是 http://www.baidu.com/a/b…

图像批量设计软件Retrobatch Pro mac中文版功能特色

Retrobatch Mac是一款灵活的批量图像处理工具。用户可以自由创建Workflow来实现相应的功能,这些Workflow能取代大量的重复劳动,提高生产力。Retrobatch Mac的一般操作是从左边栏拖动相应动作到工作区形成节点(Nodes),节…

python+paddleocr 进行图像识别、找到文字在屏幕中的位置

目录 前言 1、安装paddleocr 2、安装PIL 3、安装numpy 4、 安装pyautogui 5、进行文本识别 6、识别结果 7、获取文字在图片/屏幕中的位置 8、pyautoguipaddleocr鼠标操作 9、完整代码 前言 最近在做自动化测试,因为是处理过的界面,所以使用pyw…

机器人制作开源方案 | 自主型收集餐盘机器人

作者:蔡佳怡、朱启会、郭晨杰、杨昊天、焦家辉 单位:西安外事学院 指导老师:杜喜昭、张燕 1. 产品说明 1.1 设计目的 对于如学校、工厂这种大型食堂,一般的收餐盘模式为用餐人用餐完毕后,把餐盘拿到最近的收餐盘点&…

社交泛娱乐出海,市场 赛道、投放 变现的最新干货分享

(全网都在找的《社交泛娱乐出海作战地图》,点击获取👆) 11 月 29 日,融云、Flat Ads、Alibaba Cloud、TopOn 联合主办的“泛娱乐社交 App 出海新风口”主题沙龙在浙江杭州圆满收官。关注【融云全球互联网通信云】了解…

deepflow本地部署过程

本地服务器配置,32C,48G内存 整个过程需要配置k8s,安装helm, 安装grafana, 安装deepflow以及deepflow-ctl,以及部署demo 在采用sealos进行ALL-IN-ONE部署之前, grafana 先安装它 wget -q -O /usr/share/keyrings/gr…

自动化定时发送天气提醒邮件

🎈 博主:一只程序猿子 🎈 博客主页:一只程序猿子 博客主页 🎈 个人介绍:爱好(bushi)编程! 🎈 创作不易:如喜欢麻烦您点个👍或者点个⭐! &#x1f…

智能安全芯片ACH512芯片描述及功能

ACH512 芯片是一款基于安全算法的高性能 SOC 芯片, 主要应用于 eMMC/SD/Nandflash 大容量存储设备、加密 U 盘、指纹识别等市场。 芯片采用 32 位内核,片内集成多种安全密码模块,包括SM1、 SM2、 SM3、 SM4、 SSF33 算法以及RSA/ECC、 ECDSA、…

4WRPH6C3B24L-2X/G24Z4/M伺服比例方向阀控制板

4WRPH6C3B12L-2X/G24Z4/M、4WRPH6C3B40P-2X/G24Z4/M、4WRPH6C3B40L-2X/G24Z4/M、4WRPH6C4B24L-2X/G24Z4/M、4WRPH6C4B40L-2X/G24Z4/M、4WRPH6C3B24L-2X/G24Z4/M、4WRPH10C4B100L-2X/G24Z4/M、4WRPH10C3B100L-2X/G24K0/M-750适合控制4WRPH系列比例伺服阀,用于安装在架…

rt-thread主线程启动流程

rt-thread主线程启动流程 1.启动分析2.源码分析 1.启动分析 基于:rt-thread-v5.0.1 先执行:汇编代码startup_stm32f429xx.s开始运行,主要调用SystemInit和 __main ; Reset handler Reset_Handler PROCEXPORT Reset_Handler …

功率信号源工作原理是什么

功率信号源是一种专门产生大功率信号的设备,主要用于驱动高功率负载,如电机、变频器等。其工作原理涉及信号生成、放大和输出三个关键步骤。 首先,信号生成。功率信号源通常会采用各种信号发生器来产生不同类型的信号波形。这些信号可以是正弦…

DenseNet分类网络改进(添加SPP)--亲测有效

最近,我在做多分类问题。在针对基模型的选择中,我使用了DenseNet作为基本模型。我在阅读论文时,遇到了一种改进方式: 如上图所示,在全连接层之前引入SPP模块: 代码如下: SPP模块代码&#x…

6 大 Android 照片恢复软件深度评测

当您发现令人难忘的照片在 Android 上被错误删除或丢失时,您可能会感到非常沮丧。然而,当您尝试安装一些恢复应用程序并希望将它们重新恢复时,其中许多应用程序无法再次检测到丢失的照片。 为了节省您逐一尝试此类应用程序的时间&#xff0c…

yum命令详解和使用

目录 一、yum介绍 常见的软件封包类型 RPM的含义 二、 yum命令格式 三、常用命令 3.1 yum清空缓存列表 3.2 yum显示信息 3.2 yum安装 3.3 yum删除 3.4 yum包的更新和升级 四、常用的国内 yum 源 一、yum介绍 Yum(全称为 Yellow dog Updater, Modified),是…

西工大计算机学院计算机系统基础实验一(环境配置)

首先,不要焦虑,稳住心态慢慢来,一点一点做,跟着作者把基础打好,比什么都重要。作者曾经经历过这份痛苦,知道它有多么不好受。当初的作者高中之前甚至都没有自己的一台笔记本,上了大学以后学C语言…

unity旋转选中效果

代码和预制体 函数PlayAnim()中的角度要根据按钮数量手动填好 using System; using DG.Tweening; using DG.Tweening.Core; using DG.Tweening.Plugins.Options; using UnityEngine;// Token: 0x0200001B RID: 27 public class BtnParentScript : Base…

数字化智慧工地管理云平台源码(人工智能、物联网)

​智慧工地优势:"智慧工地”将施工企业现场视频管理、建筑起重机械安全监控、现场从业人员管理、物料管理、进度管理、扬尘噪声监测等现场设备有机、高效、科学、规范的结合起来真正实现工程项目业务流与现场各类监控源数据流的有效结合与深度配合,…