Halcon 目标检测深度学习训练

本文介绍了如何在Halcon中进行目标检测的深度学习训练。首先,使用预训练模型作为Backbone,在create_dl_model_detection中创建模型。然后,进行追加训练,此阶段Backbone基于先前训练的最佳模型,通过read_dl_model读取模型进行进一步优化。
摘要由CSDN通过智能技术生成

初次训练

Backbone 使用Halcon中的预训练模型
在create_dl_preprocess_param_from_model前使用create_dl_model_detection创建预训练模型

*****预处理****** 
dev_update_off ()

***预训练模型,初次训练则使用基础的几种模型
Backbone := 'pretrained_dl_classifier_resnet50.hdl'
***分类数量
NumClasses := 1
*
* 图像维度
ImageWidth := 512
ImageHeight := 320
ImageNumChannels := 1
* 
***设置容量为“中等”,足以完成此任务和提供更好的推理和训练速度。
***与“高等”相比,具有“中等”的模型的速度是其两倍多,同时显示出几乎相同的检测性能。
Capacity := 'medium'
* 
***数据集划分比例
TrainingPercent := 70
ValidationPercent := 15
* 
***随机数种子
SeedRand := 42
* 
***基础路径
ExampleDataDir := './基础路径/'
* 创建输出路径.
file_exists (ExampleDataDir, FileExists)
if (not FileExists)
    make_dir (ExampleDataDir)
endif
file_exists (ExampleDataDir+'/预处理', FileExists)
if (not FileExists)
    make_dir (ExampleDataDir+'/预处理')
endif
file_exists (ExampleDataDir+'/已训练', FileExists)
if (not FileExists)
    make_dir (ExampleDataDir+'/已训练')
endif
*输入初始地址和标签文件地址
Input_OriginalImageDir         := ExampleDataDir + '原图/images'
* 训练结果输出路径
DLModelOutputDir               := ExampleDataDir + '已训练/'
**用于测试的图像路径
TestImageDir                    :=''
*标签字典名称
HdictName                      :='dl_dataset'
*标签字典路径
Input_DatasetDictDir           :=ExampleDataDir + '预处理/' + HdictName + '.hdict'
***预训练模型输出路径
Output_PreDLModelFileName      := ExampleDataDir+'预处理/pretrained_dl_model_detection.hdl'
***预处理数据集输出路径
Output_SplitedDataSetDir       := ExampleDataDir +'预处理/'+ HdictName + '_' + ImageWidth + 'x' + ImageHeight
***模型参数(预处理参数)输出路径
Output_PreprocessParamFileName := DLModelOutputDir + 'dl_preprocess_param.hdict'
***数据集字典
Input_DLDatasetFileName        := Output_SplitedDataSetDir + '/dl_dataset.hdict'
* 最终模型文件名.
Output_FinalModelBaseName      := DLModelOutputDir + 'final_dl_model_detection'
* 最佳模型文件名.
Output_BestModelBaseName       := DLModelOutputDir + 'best_dl_model_detection'
*
*
******************************************
*****************预处理阶段****************
******************************************
set_system ('seed_rand', SeedRand) //设置随机种子
read_dict (Input_DatasetDictDir, [], [], DLDatasetDict) //读取数据集
set_dict_tuple (DLDatasetDict, 'image_dir', Input_OriginalImageDir) //设置图像路径
split_dl_dataset (DLDatasetDict, TrainingPercent, ValidationPercent, []) //分割数据集
create_dict (GenParam) //创建分割参数字典
set_dict_tuple (GenParam, 'split', 'train') //设置分割类型为训练
***
determine_dl_model_detection_param (DLDatasetDict, ImageWidth, ImageHeight, GenParam, DLDetectionModelParam) //自动选择合适的训练参数
get_dict_tuple (DLDetectionModelParam, 'min_level', MinLevel) //获取特征金字塔最小层数
get_dict_tuple (DLDetectionModelParam, 'max_level', MaxLevel) //获取特征金字塔最大层数
get_dict_tuple (DLDetectionModelParam, 'anchor_num_subscales', AnchorNumSubscales) //创建不同大小的锚点
get_dict_tuple (DLDetectionModelParam, 'anchor_aspect_ratios', AnchorAspectRatios) //创建不同形状的锚点
***
create_dict (DLModelDetectionParam)
set_dict_tuple (DLModelDetectionParam, 'image_width', ImageWidth) //设置图像宽度
set_dict_tuple (DLModelDetectionParam, 'image_height', ImageHeight) //设置图像高度
set_dict_tuple (DLModelDetectionParam, 'image_num_channels', ImageNumChannels) //设置图像深度
set_dict_tuple (DLModelDetectionParam, 'min_level', MinLevel) //设置特征金字塔最小层数
set_dict_tuple (DLModelDetectionParam, 'max_level', MaxLevel) //设置特征金字塔最大层数
* set_dict_tuple (DLModelDetectionParam, 'anchor_num_subscales', AnchorNumSubscales)
* set_dict_tuple (DLModelDetectionParam, 'anchor_aspect_ratios', AnchorAspectRatios)
set_dict_tuple (DLModelDetectionParam, 'capacity', Capacity) //设置模型容量
***
get_dict_tuple (DLDatasetDict, 'class_ids', ClassIDs) //从数据集中获取类别ID
set_dict_tuple (DLModelDetectionParam, 'class_ids', ClassIDs) //设置类别ID
get_dict_tuple (DLDatasetDict, 'class_names', ClassNames) //从数据集中获取类别名称
set_dict_tuple (DLModelDetectionParam, 'class_names', ClassNames) //设置类别名称
***
create_dl_model_detection (Backbone, NumClasses, DLModelDetectionParam, DLModelHandle) //创建预训练模型
write_dl_model (DLModelHandle, Output_PreDLModelFileName) //保存预训练模型
***
create_dl_preprocess_param_from_model (DLModelHandle, 'none', 'full_domain', [], [], [], DLPreprocessParam) //创建预处理参数
***
create_dict (GenParam) //创建预处理参数字典
set_dict_tuple (GenParam, 'overwrite_files', 'auto') //设置覆盖文件为自动
preprocess_dl_dataset (DLDatasetDict, Output_SplitedDataSetDir, DLPreprocessParam, GenParam, DLDatasetFilename) //开始预处理
write_dict (DLPreprocessParam, Output_PreprocessParamFileName, [], []) //保存预处理参数

******************************************
*****************训练阶段******************
******************************************
dev_update_off ()
ShowExampleScreens := true
* 
* 选择CPU或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]
get_dl_device_param (DLDevice, 'type', DLDeviceType)
if (DLDeviceType == 'cpu')
    NumThreadsTraining := 4
    set_system ('thread_num', NumThreadsTraining)
endif
****************************
*****设置基本训练参数*********
****************************
BatchSize := 1 //训练批次大小
InitialLearningRate := 0.00005 //初始学习率
***用在权重更新的时候 v=Momentum*v-learning_rate*dw, w = w + v 
***如果上次的Momentum(v)与这次的负梯度方向是相同的,那这次下降的幅度就会加大,从而加速收敛
Momentum := 0.99 //SGD动量
NumEpochs := 400 //训练周期
EvaluationIntervalEpochs := 1 //训练中的评估周期
ChangeLearningRateEpochs := 1 //改变学习率的周期
ChangeLearningRateValues := InitialLearningRate //每次改变所使用的学习率,这里是固定学习率
* ChangeLearningRateEpochs := [50,100,200] //改变学习率的周期,第50,100,200个周期的时候改变学习率
* ChangeLearningRateValues := [0.00005,0.00001,0.000005] //每次改变所使用的学习率,分别对应50,100,200周期的时候
****************************
*****设置超参数**************
****************************
* 建议一开始将正则项系数λ设置为0,先确定一个比较好的learning rate。
* 然后固定该learning rate,给λ一个值(比如1.0),然后根据validation accuracy,
* 将λ增大或者减小10倍(增减10倍是粗调节,当你确定了λ的合适的数量级后,比如λ = 0.01,再进一步地细调节,比如调节为0.02,0.03,0.009之类。)
WeightPrior := 0.001 //正则化系数
*
EnableDisplay := true //显示训练过程
****************************
*****设置训练参数************
****************************
GenParamName := []
GenParamValue := []
create_dict (AugmentationParam) //增强参数
set_dict_tuple (AugmentationParam, 'augmentation_percentage', 50) //训练时图像增强比例
* set_dict_tuple (AugmentationParam, 'rotate', 0) //训练时图像旋转角度 [0, 90, 180]
* set_dict_tuple (AugmentationParam, 'rotate_range', 0) //训练时图像旋转角度步长
* set_dict_tuple (AugmentationParam, 'mirror', 'off') //训练时图像镜像 'r' , 'c'.
* set_dict_tuple (AugmentationParam, 'brightness_variation', 0) //训练时图像亮度变化范围 [-value, +value]. 0-255
* set_dict_tuple (AugmentationParam, 'brightness_variation_spot', 0) //训练时图像随机定位斑点的绝对亮度峰值 [-value, +value]. 0-255
* set_dict_tuple (AugmentationParam, 'crop_percentage', 1) //训练时图像剪切比例
* set_dict_tuple (AugmentationParam, 'crop_pixel', 'off') //训练时图像剪切后剩余图像宽高 [w,h]
GenParamName := [GenParamName,'augment']
GenParamValue := [GenParamValue,AugmentationParam]
****************************
*****设置训练策略************
****************************
if (|ChangeLearningRateEpochs| > 0)
    create_dict (ChangeStrategy)
    set_dict_tuple (ChangeStrategy, 'model_param', 'learning_rate')
    set_dict_tuple (ChangeStrategy, 'initial_value', InitialLearningRate)
    set_dict_tuple (ChangeStrategy, 'epochs', ChangeLearningRateEpochs)
    set_dict_tuple (ChangeStrategy, 'values', ChangeLearningRateValues)
    GenParamName := [GenParamName,'change&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多巴胺耐受

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值