1. 简介
该 Halcon 脚本(.hdev
程序)完整地演示了如何使用 Halcon 的深度学习工具来训练和评估一个多标签分类模型。多标签分类是指一个样本(在这里是图像)可以同时被赋予多个类别标签。
整个流程遵循一个标准的深度学习项目工作流,包括:
- 数据加载:加载带有标签的数据集。
- 模型准备:加载一个预训练的骨干网络,并根据任务需求进行初始化。
- 数据检查:可视化部分数据,确保数据加载和预处理正确。
- 训练准备:设置训练所需的超参数(如学习率、迭代次数、数据增强等)。
- 模型训练:执行训练过程。
- 模型评估:使用验证集评估训练好的模型的性能。
- 结果检查:可视化评估结果,分析模型的错误。
- 推断 (Inference):使用训练好的模型对新图像进行预测。
- 清理:删除训练过程中产生的中间文件。
下面我们将对脚本的每个部分进行详细的解释。
2. 流程详解
2.1 初始化与环境设置
* Multi-label classification workflow:
* ... (注释部分)
dev_close_window ()
dev_update_off ()
dev_close_window ()
: 关闭所有在 HDevelop 中打开的图形窗口。dev_update_off ()
: 关闭 HDevelop 的自动更新显示功能。这可以加速程序执行,因为图形窗口、变量窗口等不会在每一步操作后都刷新。通常在脚本开始时关闭,在需要显示结果时再手动更新或在脚本结尾重新打开。
2.2 加载数据集
* *****************************************************
* *** LOAD DATASET ***
* *****************************************************
FileName := 'pill_defects.hdict'
load_dataset (FileName, DLDataset)
FileName := 'pill_defects.hdict'
: 定义数据集文件的名称。这里的数据集是一个 Halcon 字典 (.hdict
文件),它包含了图像信息、标签以及数据集的划分(训练集、验证集、测试集)。load_dataset
: 这是一个自定义的过程(procedure),用于加载数据集。它会读取指定的.hdict
文件,并将解析后的数据存储在DLDataset
字典中。
2.3 准备输出目录
* *****************************************************
* *** PREPARE OUTPUTDIR ***
* *****************************************************
parse_filename (FileName, BaseName, _, _)
prepare_output_dir (BaseName, OutputDir)
parse_filename
: 从完整文件名pill_defects.hdict
中提取出基本名称pill_defects
。prepare_output_dir
: 这是一个自定义过程,它会根据基本名称创建一个新的目录,用于存放训练过程中产生的所有文件,如训练好的模型、日志文件、评估结果等。输出目录的路径存储在OutputDir
变量中。
2.4 加载预训练模型
* *****************************************************
* *** LOAD PRETRAINED MODEL ***
* *****************************************************
ImageWidth := 224
ImageHeight := 224
BackboneModelFilename := 'pretrained_dl_classifier_resnet18.hdl'
load_and_intialize_dl_model (DLDataset, ImageWidth, ImageHeight, BackboneModelFilename, DLModelHandle)
ImageWidth
,ImageHeight
: 设置模型输入图像的尺寸。所有输入图像在送入模型前都会被缩放到这个尺寸。较小的尺寸可以加快训练速度和减少内存占用。BackboneModelFilename
: 选择一个预训练的分类模型作为骨干网络。Halcon 提供了多种模型(如 ResNet, AlexNet, MobileNet V2 等)。使用预训练模型可以利用其在大型数据集上学到的特征提取能力,从而在自己的任务上更快更好地收敛,这种技术称为迁移学习。load_and_intialize_dl_model
: 自定义过程,用于加载指定的预训练模型,并根据我们任务的具体情况(如类别数量、输入尺寸)来修改和初始化模型的最后一层。处理后的模型句柄存储在DLModelHandle
中。
2.5 检查数据集
* *****************************************************
* *** INSPECT DATASET ***
* *****************************************************
create_dl_preprocess_param_from_model (DLModelHandle, 'none', 'full_domain', [], [], [], DLPreprocessParam)
InspectionSkip := false
NumInspectionSamples := 5
inspect_dataset (DLDataset, DLPreprocessParam, NumInspectionSamples, InspectionSkip)
create_dl_preprocess_param_from_model
: 根据模型DLModelHandle
的设置,创建一个预处理参数字典DLPreprocessParam
。这个字典定义了如何对输入图像进行归一化等预处理操作。inspect_dataset
: 自定义过程,用于随机抽取NumInspectionSamples
(这里是5)个训练样本,并将其显示出来。这是一个非常重要的健全性检查(Sanity Check)步骤,可以帮助我们确认数据集是否被正确加载、图像和标签是否对应。