初次训练
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&#