Halcon学习---深度学习篇segment2
*
*此示例是一系列示例的一部分,该示例总结了
* DL细分的工作流程。 它使用MVTec药丸数据集。
*
*四个部分是:
* 1.数据集预处理。
* 2.训练模型。
* 3.评估训练后的模型。
* 4.推断新图像。
*
*此示例包含第2部分:“模型训练”。
*
*请注意:此脚本需要第1部分的输出:
* segment_pill_defects_deep_learning_1_preprocess.hdev
*
dev_update_off ()
*
ShowExampleScreens := true
*
* Initial example windows and parameters.
dev_example_init (ShowExampleScreens, ExampleInternals)
*
* Display the explanatory screens about this example.
if (ShowExampleScreens)
*
* Introduction text of example series.
dev_display_screen_introduction_train (ExampleInternals)
stop ()
*
* Requirement check.
dev_display_screen_error (ExampleInternals, Error)
if (Error)
stop ()
endif
*
* Explain model selection.解释模型选择
*************************************************************************************************************************************************HALCON提供了两个可以针对特定应用进行重新训练的预训练分割模型: 具有更多全局功能的复杂场景。要优化结果,可以帮助尝试每个模型并比较性能。所选模型可以加载\'read_dl_model \'。*************************************************************************************************************************************************
dev_display_screen_model_selection (ExampleInternals)
stop ()
*
* Explain goals during training.解释训练的目标*************************************************************************************************************************************************训练时,有两个主要目标要实现:
1.)“损失”通常用于优化训练数据模型。 因此,目的是尽可能减少训练数据的损失。
2.)对于验证数据的评估措施,“'mean_iou \'(mean Intersection over Union)通常用于语义“细分”。 在训练过程中,该值应呈上升趋势。下面显示了成功训练过程中的损失示例。*************************************************************************************************************************************************
dev_display_screen_training_goals_1 (ExampleInternals)
*****
stop ()
*
dev_display_screen_training_goals_2 (ExampleInternals)
*****
stop ()
*
*解释set_dl_model_param和create_dl_train_param。
*************************************************************************************************************************************************
模型和训练参数有多个,要设置模型参数\'set_dl_model_param \',训练参数在\'create_dl_train_param \'中设置,这些参数用于指定训练过程,其中一些会在训练结果上会产生重大影响。最突出的解释如下。************************************************************************************************************************************************* dev_display_screen_parameters (ExampleInternals)
stop ()
*
*说明批量大小。
*************************************************************************************************************************************************模型参数:\'batch_size \'将数据集分为较小的数据子集,称为批处理。\'batch_size \'确定成批并同时处理的图像数量,建议设置对于可用的GPU内存,\'batch_size \'尽可能高。 这可以通过过程\'set_dl_model_param_max_gpu_batch_size\'来完成。*************************************************************************************************************************************************
dev_display_screen_batch_size (ExampleInternals)
stop ()
*
* 解释学习率。
*************************************************************************************************************************************************模型参数:\'learning_rate \'。\'learning_rate \'确定优化损失函数的步骤大小:
-学习速度过高可能会导致优化算法出现分歧。-非常低的学习速度将不必要地采取许多步骤。
不同学习率的近似损耗曲线如下所示。
*************************************************************************************************************************************************
dev_display_screen_learning_rate (ExampleInternals)
stop ()
*
*说明 epochs数.
*************************************************************************************************************************************************训练参数:epochs 数
在一个epochs内,整个训练数据只使用一次。epochs的数量取决于具体问题。问题越复杂,训练就需要越长的时间才能获得良好的结果。 因此,增加该值是有益的。在过程\'create_dl_train_param \'中设置时期数。*************************************************************************************************************************************************
dev_display_screen_num_epochs (ExampleInternals)
stop ()
*
* 解释更多参数。
*************************************************************************************************************************************************此外,可以指定更多高级参数来增强训练过程,例如用于以下参数:
-数据扩充(例如\'augmentation_percentage \',\'rotation \')
-更改策略(例如在训练过程中适应\'learning_rate \')
'-评估措施(例如\'mean_iou\')*************************************************************************************************************************************************
dev_display_screen_other_params (ExampleInternals)
stop ()
*
*解释train_dl_model
*************************************************************************************************************************************************设置参数后,可以使用'\train_dl_model \'在数据集中训练模型。在训练过程中,最好的训练模型将被存储并在相应的训练步骤后写入磁盘。*************************************************************************************************************************************************
dev_display_screen_training_process (ExampleInternals)
stop ()
*
* 说明训练将从现在开始。
*************************************************************************************************************************************************现在开始对模型进行训练,在训练过程中以可视方式指示进度,训练需要一段时间,并且在很大程度上取决于参数设置和使用的GPU类型。*************************************************************************************************************************************************
dev_display_screen_training_starts (ExampleInternals)
stop ()
*
* 关闭任何示例屏幕窗口
dev_example_close_windows (ExampleInternals)
endif
*
* ***********************************
* *** 设置输入/输出路径 ***
* ***********************************
*所有示例数据都将写入此文件夹
ExampleDataDir := 'segment_pill_defects_data'
* 预处理的DLDataset的文件路径
DLDatasetFileName := ExampleDataDir + '/dldataset_pill_400x400/dl_dataset.hdict'
* 最终训练模型的输出路径
FinalModelBaseName := ExampleDataDir + '/final_dl_model_segmentation'
* 最佳评估模型的输出路径
BestModelBaseName := ExampleDataDir + '/best_dl_model_segmentation'
*
* *******************************
* *** 设置基本参数 ***
* *******************************
*
* 以下参数需要经常修改
*
* 模型参数
*要重新训练的细分模型
ModelFileName := 'pretrained_dl_segmentation_enhanced.hdl'
* 批次大小.
* 如果设置为“最大”,则批处理大小由set_dl_model_param_max_gpu_batch_size设置。
BatchSize := 'maximum'
* 初始学习率
InitialLearningRate := 0.0001
* 如果批量较小,动量应较高
Momentum := 0.99
*
* train_dl_model使用的参数。
*训练模型的epochs 。
NumEpochs := 10
*评估interval(in epochs),以计算验证拆分时的评估度量。
EvaluationIntervalEpochs := 1
*在以下时期更改学习率,例如 [15,30]
*如果不应更改学习率,请将其设置为[]
ChangeLearningRateEpochs := []
* 将学习率更改为以下值,例如 InitialLearningRate * [0.1,0.01]
*元组的长度必须与ChangeLearningRateEpochs相同
ChangeLearningRateValues := []
*
* ***********************************
* *** 设置高级参数 ***
* ***********************************
*
* 在极少数情况下,可能需要更改以下参数
*
* Model parameter.
*使用 [] 作为默认的优先权
WeightPrior := []
*
* train_dl_model的参数
* 控制是否显示训练进度(是/否)(true/false).
EnableDisplay := true
* 设置随机种子进行训练
SeedRand := 42
*
* 设置create_dl_train_param的通用参数
*有关所有可用参数的概述,请参阅create_dl_train_param的文档
GenParamName := []
GenParamValue := []
*
* Change strategies.改变策略
* 在训练期间可以更改模型参数
*在这里,如果上面指定,我们将更改学习率
if (|ChangeLearningRateEpochs| > 0)
create_dict (ChangeStrategy)
* Specify the model parameter to be changed.
set_dict_tuple (ChangeStrategy, 'model_param', 'learning_rate')
* Start the parameter value at 'initial_value'.
set_dict_tuple (ChangeStrategy, 'initial_value', InitialLearningRate)
* Change the parameter value at each 'epochs' step.
set_dict_tuple (ChangeStrategy, 'epochs', ChangeLearningRateEpochs)
* Change the parameter value to the corresponding value in values.
set_dict_tuple (ChangeStrategy, 'values', ChangeLearningRateValues)
* Collect all change strategies as input.
GenParamName := [GenParamName,'change']
GenParamValue := [GenParamValue,ChangeStrategy]
endif
*
* Serialization strategies.序列化策略。
*有几个选项可用于将中间模型保存到磁盘(请参见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]
*
*
* *********************************
* *** 读取模型和数据集 ***
* *********************************
*
* 检查是否所有必需的文件都存在
check_files_availability (ExampleDataDir, DLDatasetFileName)
*
* 读取预处理的DLDataset文件
read_dict (DLDatasetFileName, [], [], DLDataset)
* 读入在预处理期间初始化的模型
read_dl_model (ModelFileName, DLModelHandle)
*
* ******************************
* *** 设置模型参数 ***
* ******************************
*
* 根据预处理参数设置模型参数
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')
set_dl_model_param_max_gpu_batch_size (DLModelHandle, 100)
else
set_dl_model_param (DLModelHandle, 'batch_size', BatchSize)
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, SeedRand, GenParamName, GenParamValue, TrainParam)
*
* 开始训练
train_dl_model (DLDataset, DLModelHandle, TrainParam, 0.0, TrainResults, TrainInfos, EvaluationInfos)
*
*
* 训练结束后停止,然后关闭窗口
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
* 关闭训练窗口
dev_close_window ()
dev_close_window ()
* 显示最后的模型窗口
if (ShowExampleScreens)
* 提示DL分割评估和推理示例
dev_display_screen_final (ExampleInternals)
stop ()
* Close example windows.
dev_close_example_windows (ExampleInternals)
endif