初次训练

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&#

参考链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: