1.halcon目标检测总工作流程:

*
* 深度学习目标检测工作流程:
*
* This example demonstrates the overall workflow for
* object detection based on deep learning, using axis-aligned bounding boxes.
* (instance_type = 'rectangle1')
*
* PLEASE NOTE:
* - 这是一个简单的例子。
* - 为此,尽可能使用默认参数。
* 因此,结果可能与其他示例中的结果有所不同。
* - 有关更多详细步骤,请参阅该系列中的各个示例,
* 例如. detect_pills_deep_learning_1_prepare.hdev etc.
*
dev_close_window ()
dev_update_off ()
set_system ('seed_rand', 42)
*
* *** 0) 设置输入/输出路径 ***
*
get_system ('example_dir', HalconExampleDir)
PillBagJsonFile := HalconExampleDir + '/hdevelop/Deep-Learning/Detection/pill_bag.json'
InputImageDir := HalconExampleDir + '/images/'
*
OutputDir := 'detect_pills_data'
*
* *** 1.) 准备 ***
*
* 读入数据集
* 在这里,我们从COCO文件中读取数据
* 或者,您可以阅读DLDataset词典
* as created by e.g., the MVTec Deep Learning Tool using read_dict().
* halcon官网的一个深度学习工具可以生成需要用的数据集格式
read_dl_dataset_from_coco (PillBagJsonFile, InputImageDir, [], DLDataset)
* 这里读入数据集需要更改,具体参考https://blog.csdn.net/qq_38336419/article/details/106016641
* 使用适合于数据集的参数创建检测模型
*
create_dict (DLModelDetectionParam)
set_dict_tuple (DLModelDetectionParam, 'image_dimensions', [512,320,3])
set_dict_tuple (DLModelDetectionParam, 'max_level', 4)
get_dict_tuple (DLDataset, 'class_ids', ClassIDs)
set_dict_tuple (DLModelDetectionParam, 'class_ids', ClassIDs)
create_dl_model_detection ('pretrained_dl_classifier_compact.hdl', |ClassIDs|, DLModelDetectionParam, DLModelHandle)
*
* 预处理DLDataset中的数据。
split_dl_dataset (DLDataset, 60, 20, [])
create_dict (PreprocessSettings)
* 在这里,现有的预处理数据将被覆盖.
set_dict_tuple (PreprocessSettings, 'overwrite_files', true)
create_dl_preprocess_param_from_model (DLModelHandle, 'false', 'full_domain', [], [], [], DLPreprocessParam)
preprocess_dl_dataset (DLDataset, OutputDir, DLPreprocessParam, PreprocessSettings, DLDatasetFileName)
*
* 目视检查10个随机选择的预处理DLSamples
create_dict (WindowDict)
get_dict_tuple (DLDataset, 'samples', DatasetSamples)
for Index := 0 to 9 by 1
SampleIndex := round(rand(1) * (|DatasetSamples| - 1))
read_dl_samples (DLDataset, SampleIndex, DLSample)
dev_display_dl_data (DLSample, [], DLDataset, 'bbox_ground_truth', [], WindowDict)
stop ()
endfor
dev_display_dl_data_close_windows (WindowDict)
*
* *** 2.) 训练 ***
* 设置训练相关模型参数.
set_dl_model_param (DLModelHandle, 'batch_size', 1)
set_dl_model_param (DLModelHandle, 'learning_rate', 0.001)
set_dl_model_param (DLModelHandle, 'runtime_init', 'immediately')
*
* 在这里,我们进行了10个epoch的简短训练
* 为了获得更好的模型性能,请增加epoch数
* from 10 to e.g. 60.
create_dl_train_param (DLModelHandle, 10, 1, 'true', 42, [], [], TrainParam)
train_dl_model (DLDataset, DLModelHandle, TrainParam, 0, TrainResults, TrainInfos, EvaluationInfos)
*
* 读取最佳模型,该模型由train_dl_model写入文件
read_dl_model ('model_best.hdl', DLModelHandle)
dev_disp_text ('Press F5 to continue', 'window', 'bottom', 'left', 'black', [], [])
stop ()
*
dev_close_window ()
dev_close_window ()
*
* *** 3.) 评估 ***
*
create_dict (GenParamEval)
set_dict_tuple (GenParamEval, 'detailed_evaluation', true)
set_dict_tuple (GenParamEval, 'show_progress', true)
evaluate_dl_model (DLDataset, DLModelHandle, 'split', 'test', GenParamEval, EvaluationResult, EvalParams)
*
create_dict (DisplayMode)
set_dict_tuple (DisplayMode, 'display_mode', ['pie_charts_precision','pie_charts_recall'])
dev_display_detection_detailed_evaluation (EvaluationResult, EvalParams, DisplayMode, WindowDict)
stop ()
dev_display_dl_data_close_windows (WindowDict)
*
* *** 4.) 推断 ***
*
* 为了演示推理步骤,我们将训练后的模型应用于一些随机选择的示例图像。
*
list_image_files (InputImageDir + 'pill_bag', 'default', 'recursive', ImageFiles)
tuple_shuffle (ImageFiles, ImageFilesShuffled)
*
set_dl_model_param (DLModelHandle, 'batch_size', 1)
*
create_dict (WindowDict)
for IndexInference := 0 to 9 by 1
read_image (Image, ImageFilesShuffled[IndexInference])
gen_dl_samples_from_images (Image, DLSampleInference)
preprocess_dl_samples (DLSampleInference, DLPreprocessParam)
apply_dl_model (DLModelHandle, DLSampleInference, [], DLResult)
*
dev_display_dl_data (DLSampleInference, DLResult, DLDataset, 'bbox_result', [], WindowDict)
stop ()
endfor
dev_display_dl_data_close_windows (WindowDict)
*
*
clean_up_output (OutputDir)
准备工作
*
* 此示例是一系列示例的一部分,该示例总结了DL目标检测的工作流程。 它使用MVTec药片数据集。
*
*
*四个部分是:
* 1.创建模型并进行数据集预处理。
* 2.训练模型。
* 3.评估训练后的模型。
* 4.推断新图像。
*
* 此示例涵盖第1部分:“创建模型和数据集预处理”.
*
* 它说明了如何创建DL对象检测模型(第1.1部分)以及为该模型调整数据的需求(预处理,第1.2部分)。
*
dev_update_off ()
*
* 在此示例中,在执行预处理步骤之前,将在图形窗口中对其进行说明。
* 将以下参数设置为false可以跳过此可视化。
*
ShowExampleScreens := true
*
if (ShowExampleScreens)
*
* 初始示例窗口和参数.
dev_example_init (ShowExampleScreens, ExampleInternals)
*
* 示例系列的简介文本.
dev_display_screen_introduction_part_1 (ExampleInternals)
stop ()
dev_display_screen_introduction_part_2 (ExampleInternals)
stop ()
*
* 关于创建目标检测模型的简介文本.
dev_display_screen_introduction_model (ExampleInternals)
stop ()
*
* 说明如何选择图像的宽度和高度.
dev_display_screen_model_image_size (ExampleInternals)
stop ()
*
* 说明如何选择min_level和max_level.
dev_display_screen_model_levels (ExampleInternals)
stop ()
*
* 说明如何选择子量表的锚点数量.
dev_display_screen_model_anchor_num_subscales (ExampleInternals)
stop ()
*
* 说明如何选择锚点宽高比.
dev_display_screen_model_anchor_aspect_ratios (ExampleInternals)
stop ()
*
* 预处理数据集的简介文本.
dev_display_screen_preprocessing_introduction (ExampleInternals)
stop ()
*
* 说明目标检测数据集.
dev_display_screen_detection_data_part_1 (ExampleInternals)
stop ()
dev_display_screen_detection_data_part_2 (ExampleInternals)
stop ()
*
* 说明拆分数据集.
dev_display_screen_split_dataset (ExampleInternals)
stop ()
*
* 说明如何预处理数据集.
dev_display_screen_preprocessing_data (ExampleInternals)
stop ()
*
* Run the program.
dev_display_screen_run_program (ExampleInternals)
stop ()
endif
*
* *****************************************************
* *****************************************************
* ** Part 1.1: 创建目标检测模型 ***
* *****************************************************
* *****************************************************
*
* ************************
* ** 设定参数 ***
* ************************
*
* 设置必填参数.
Backbone := 'pretrained_dl_classifier_compact.hdl'
NumClasses := 10
*
* 网络的图像尺寸.以后,这些值将用于在预处理期间重新缩放图像
*
ImageWidth := 512
ImageHeight := 320
ImageNumChannels := 3
*
* 设置min_level,max_level,anchor_num_subscales和anchor_aspect_ratios.
MinLevel := 2
MaxLevel := 4
AnchorNumSubscales := 3
AnchorAspectRatios := [1.0,0.5,2.0]
*
* 将容量设置为“中”,足以完成此任务,并提供更好的推理和训练速度
* 与“high”相比,“medium”模型的速度快两倍以上,同时显示出几乎相同的检测性能。
*
Capacity := 'medium'
*
* *******************************************
* ** 创建目标检测模型 ***
* *******************************************
*
* 创建通用参数名称并创建对象检测模型.
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)
*
* 创建模型.
create_dl_model_detection (Backbone, NumClasses, DLModelDetectionParam, DLModelHandle)
*
*
* ****************************************
* ****************************************
* ** Part 1.2: 预处理数据 ***
* ****************************************
* ****************************************
*
* ************************************
* ** 设置输入和输出路径 ***
* ************************************
*
* 所有示例数据均写入此文件夹.
ExampleDataDir := 'detect_pills_data'
*
get_system ('example_dir', HalconExampleDir)
* 图像目录的路径.
HalconImageDir := HalconExampleDir + '/images/'
* 数据集的Json文件的路径.
PillBagJsonFile := HalconExampleDir + '/hdevelop/Deep-Learning/Detection/pill_bag.json'
*
* 编写初始化的DL目标检测模型以在示例第2部分中进行训练.
DLModelFileName := ExampleDataDir + '/pretrained_dl_model_detection.hdl'
* 数据集目录,用于由preprocess_dl_dataset编写的任何输出.
DataDirectory := ExampleDataDir + '/dldataset_pill_bag_' + ImageWidth + 'x' + ImageHeight
* 单独存储预处理参数以使用它,例如 在推理中.
PreprocessParamFileName := DataDirectory + '/dl_preprocess_param_' + ImageWidth + 'x' + ImageHeight + '.hdict'
*
* ************************
* ** 设定参数 ***
* ************************
*
* 分割数据集的百分比.
TrainingPercent := 70
ValidationPercent := 15
*
* 为了获得可复制的分割,我们设置了一个随机种子.
* 这意味着重新运行脚本会导致DLDataset的拆分.
SeedRand := 42
*
* ***************************************************
* ** 读取标记的数据集并调整模型 ***
* ***************************************************
*
* 创建输出目录(如果尚不存在).
file_exists (ExampleDataDir, FileExists)
if (not FileExists)
make_dir (ExampleDataDir)
endif
*
* 读入数据集.
* 在这里,我们从COCO文件中读取数据.
* 或者,您可以阅读DLDataset词典
* as created by e.g., the MVTec Deep Learning Tool using read_dict().
read_dl_dataset_from_coco (PillBagJsonFile, HalconImageDir, [], DLDataset)
*
* 从模型中的数据集中设置类ID.
get_dict_tuple (DLDataset, 'class_ids', ClassIDs)
set_dl_model_param (DLModelHandle, 'class_ids', ClassIDs)
*
* 编写初始化的DL目标检测模型以在第二部分中进行训练
*
write_dl_model (DLModelHandle, DLModelFileName)
* ***********************************************************
* ** 将数据集拆分为训练/验证和测试集 ***
* ***********************************************************
*
* 为了获得可重复的结果,我们在这里设置了一个种子.
set_system ('seed_rand', SeedRand)
*
* 产生分割.
split_dl_dataset (DLDataset, TrainingPercent, ValidationPercent, [])
* *********************************
* ** 预处理数据集 ***
* *********************************
*
* 从模型获取预处理参数.
create_dl_preprocess_param_from_model (DLModelHandle, 'false', 'full_domain', [], [], [], DLPreprocessParam)
*
* 预处理数据集。 这可能需要几分钟.
create_dict (GenParam)
set_dict_tuple (GenParam, 'overwrite_files', true)
preprocess_dl_dataset (DLDataset, DataDirectory, DLPreprocessParam, GenParam, DLDatasetFilename)
*
* 编写预处理参数以在以后的部分中使用它们.
write_dict (DLPreprocessParam, PreprocessParamFileName, [], [])
* *******************************************
* ** 预览预处理的数据集 ***
* *******************************************
*
* 在进行训练之前,建议先检查预处理后的数据集.
*
* 显示10个随机选择的训练图像的DL样本.
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)
*
* 设置dev_display_dl_data的参数.
create_dict (WindowHandleDict)
create_dict (GenParam)
set_dict_tuple (GenParam, 'scale_windows', 1.2)
*
* 在DLSampleBatchDisplay中显示样本.
for Index := 0 to |DLSampleBatchDisplay| - 1 by 1
*
* 在DLSampleBatchDisplay中循环采样.
dev_display_dl_data (DLSampleBatchDisplay[Index], [], DLDataset, 'bbox_ground_truth', GenParam, WindowHandleDict)
get_dict_tuple (WindowHandleDict, 'bbox_ground_truth', WindowHandles)
*
* 添加说明文字.
dev_set_window (WindowHandles[0])
get_dict_object (Image, DLSampleBatchDisplay[Index], 'image')
get_image_size (Image, ImageWidth, ImageHeight)
dev_disp_text ('New image size after preprocessing: ' + ImageWidth + ' x ' + ImageHeight, 'window', 'bottom', 'right', 'black', [], [])
*
dev_set_window (WindowHandles[1])
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
endfor
*
* 关闭用于可视化的窗口.
dev_display_dl_data_close_windows (WindowHandleDict)
*
if (ShowExampleScreens)
* 提示DL检测训练过程示例.
dev_disp_end_of_program (ExampleInternals)
stop ()
* Close example windows.
dev_close_example_windows (ExampleInternals)
endif
开始训练
*
* 本示例是一系列示例的一部分,该示例总结了DL对象检测的工作流程。 它使用MVTec药袋数据集。
*
*
* The four parts are:
* 1. Creation of the model and dataset preprocessing.
* 2. Training of the model.
* 3. Evaluation of the trained model.
* 4. Inference on new images.
*
* 此示例包含第2部分:“模型训练”.
*
* 它说明了如何在预处理的数据集上训练对象检测模型。 请注意:此脚本需要第1部分的输出detect_pills_deep_learning_1_preparation.hdev
*
dev_update_off ()
*
* 在此示例中,训练步骤在执行之前在图形窗口中进行了说明。 将以下参数设置为false可以跳过此可视化.
ShowExampleScreens := true
*
* 显示有关此示例的说明性屏幕.
if (ShowExampleScreens)
*
* 初始示例窗口和参数等.
dev_example_init (ShowExampleScreens, ExampleInternals)
*
* 示例系列的介绍文字.
dev_display_screen_introduction_train (ExampleInternals)
stop ()
*
* Check for requirements.
dev_display_screen_error (ExampleInternals, Error)
if (Error)
stop ()
endif
*
* 在训练中说明目标.
dev_display_screen_training_goals_1 (ExampleInternals)
stop ()
dev_display_screen_training_goals_2 (ExampleInternals)
stop ()
*
* 解释set_dl_model_param和create_dl_train_param.
dev_display_screen_parameters (ExampleInternals)
stop ()
*
* 说明batch_size.
dev_display_screen_batch_size (ExampleInternals)
stop ()
*
* 说明学习率.
dev_display_screen_learning_rate (ExampleInternals)
stop ()
*
* 解释epoch数.
dev_display_screen_num_epochs (ExampleInternals)
stop ()
*
* 说明其他参数.
dev_display_screen_other_params (ExampleInternals)
stop ()
*
* Explain train_dl_model.
dev_display_screen_training_process (ExampleInternals)
stop ()
*
* 说明训练将从现在开始.
dev_display_screen_training_starts (ExampleInternals)
stop ()
*
* Close any example screen windows.
dev_close_example_windows (ExampleInternals)
endif
*
* *****************************************************
* *** 设置输入输出路径. ***
* *****************************************************
*
* 所有示例数据均写入此文件夹.
ExampleDataDir := 'detect_pills_data'
* 初始化模型的文件路径.
InitialModelFileName := ExampleDataDir + '/pretrained_dl_model_detection.hdl'
* 预处理的DLDataset的文件路径.
DataDirectory := ExampleDataDir + '/dldataset_pill_bag_512x320'
DLDatasetFileName := DataDirectory + '/dl_dataset.hdict'
*
* 最佳评估模型的输出路径.
BestModelBaseName := ExampleDataDir + '/best_dl_model_detection'
* 最终训练模型的输出路径.
FinalModelBaseName := ExampleDataDir + '/final_dl_model_detection'
*
* *****************************************************
* *** 设置基本参数. ***
* *****************************************************
* 以下参数需要经常修改.
*
* 模型参数.
* Batch size.
BatchSize := 2
* 初始学习率.
InitialLearningRate := 0.0005
* 如果批量小,动量应该高.
Momentum := 0.99
*
* train_dl_model使用的参数.
* 训练模型的epochs数.
NumEpochs := 60
* 评估间隔(以epoch计),以计算验证拆分中的评估度量.
EvaluationIntervalEpochs := 1
* 在以下世代更改学习率,例如 [15,30].
* 如果不应更改学习率,请将其设置为[].
ChangeLearningRateEpochs := 30
* 将学习率更改为以下值,例如 InitialLearningRate * [0.1,0.01].
* 元组的长度必须与ChangeLearningRateEpochs相同.
ChangeLearningRateValues := InitialLearningRate * 0.1
*
* *****************************************************
* *** 设置超参数. ***
* *****************************************************
* 在极少数情况下,可能需要更改以下参数.
*
* Model parameter.
* 事先设置权重.
WeightPrior := 0.00001
*
* Parameters used by train_dl_model.
* 控制是否显示训练进度(是/否).
DisplayEvaluation := true
* Set a random seed for training.
SeedRandom := 42
*
* 设置create_dl_train_param的通用参数.
* 请参阅create_dl_train_param的文档以获取所有可用参数的概述.
GenParamName := []
GenParamValue := []
*
* 扩充参数.
* 如果在训练期间应增加样本,请创建expand_dl_samples所需的字典.
* 在这里,我们设置增强百分比和方法.
create_dict (AugmentationParam)
* 增加的样本百分比.
set_dict_tuple (AugmentationParam, 'augmentation_percentage', 50)
* 沿行和列镜像.
set_dict_tuple (AugmentationParam, 'mirror', 'rc')
GenParamName := [GenParamName,'augment']
GenParamValue := [GenParamValue,AugmentationParam]
*
* Change strategies.
* 训练期间可以更改模型参数.
* 在这里,如果上面指定了,我们将更改学习率.
if (|ChangeLearningRateEpochs| > 0)
create_dict (ChangeStrategy)
* 指定要更改的模型参数,此处为学习率.
set_dict_tuple (ChangeStrategy, 'model_param', 'learning_rate')
* 在“ initial_value”处启动参数值.
set_dict_tuple (ChangeStrategy, 'initial_value', InitialLearningRate)
* 在以下epoch降低学习率.
set_dict_tuple (ChangeStrategy, 'epochs', ChangeLearningRateEpochs)
* Reduce the learning rate to the following value at epoch 30.
set_dict_tuple (ChangeStrategy, 'values', ChangeLearningRateValues)
* Collect all change strategies as input.
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]
*
* *****************************************************
* *** 读取初始模型和数据集. ***
* *****************************************************
*
* 检查是否所有必需的文件都存在.
check_files_availability (ExampleDataDir, InitialModelFileName, DLDatasetFileName)
*
* 读入在预处理过程中初始化的模型.
read_dl_model (InitialModelFileName, DLModelHandle)
*
* 读入预处理的DLDataset文件.
read_dict (DLDatasetFileName, [], [], DLDataset)
*
* *****************************************************
* *** 设置模型参数. ***
* *****************************************************
*
* 根据上面的设置来设置模型超参数.
set_dl_model_param (DLModelHandle, 'learning_rate', InitialLearningRate)
set_dl_model_param (DLModelHandle, 'momentum', Momentum)
set_dl_model_param (DLModelHandle, 'batch_size', BatchSize)
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, DisplayEvaluation, SeedRandom, 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