本章阐述了如何基于深度学习进行目标检测。
目标检测旨在识别图像中的不同实例并将其分配至特定类别。这些实例可部分重叠,但仍能被区分开来。如下图所示:
实例分割是目标检测的特殊情况,模型还会预测一个实例掩模,标记图像中实例的具体区域。如下图所示。总体而言,目标检测的说明同样适用于实例分割。可能存在的差异将在具体章节中阐述。
目标检测涉及两个不同任务:定位实例并进行分类。为此,我们采用由三个主要部分组成的组合网络。第一部分称为骨干网络,由预训练的分类网络构成。其任务是生成多种特征图,因此去除了分类层。这些特征图根据在网络中的深度不同,编码了不同尺度下的各类信息。详见 深度学习。因此,具有相同宽度和高度的特征图被视为属于同一层级。在第二部分中,不同层级的骨干层被组合起来。更精确地说,不同层级的骨干层被指定为对接层,其特征图被整合。由此我们获得包含低层级与高层级信息的特征图,这些正是第三部分将使用的特征图。第二部分亦称为特征金字塔,与第一部分共同构成特征金字塔网络。第三部分包含为每个选定层级添加的额外网络单元(称为头部)。这些单元接收对应特征图作为输入,分别学习定位与分类潜在目标的能力。此外,第三部分还负责处理重叠预测边界框的融合。下图展示了三部分的整体架构。
让我们看看第三部分发生了什么。在目标检测中,实例在图像中的位置由矩形边界框给出。因此,首要任务是为每个实例找到合适的边界框。为此,网络生成参考边界框,并学习如何修改它们以尽可能贴合实例。这些参考边界框被称为锚点。锚点对真实边界框形状的拟合度越高,网络学习效率就越高。为此,网络会在特征金字塔中每个特征图的像素点(即锚点位置)生成一组锚点。该集合包含所有形状、尺寸组合的锚点,例如类型为 'rectangle2' (见下文)的锚点还包含所有方向组合。这些框的形状受参数 'anchor_aspect_ratios' 影响,尺寸由参数 'anchor_num_subscales' 决定,方向则由参数 'anchor_angles' 控制,详见下图及 算子说明。如果参数生成多个相同的锚点,网络内部会忽略这些重复项。
get_dl_model_param
'anchor_num_subscales' 生成不同尺寸的锚点。(3) 通过设置 'anchor_aspect_ratios' 生成不同形状的锚点。(4) 通过设置 'anchor_angles' 生成不同方向的锚点(仅适用于 'rectangle2' 实例类型)。
该网络通过预测偏移量来调整锚点位置,从而生成更契合潜在实例的边界框。网络通过边界框预测头部实现这一学习过程:这些预测头部将当前层级生成的锚点与对应的真实边界框进行比对,从而获取单个实例在图像中的具体位置信息。下图展示了该过程的示意图。
| ( 1) | ( 2) |
'rectangle1' 为例说明。(1) 网络通过修改锚点(浅蓝色)来预测更贴合的边界框(橙色)。(2) 训练过程中,预测的边界框(橙色)会与最重叠的真实边界框(蓝色)进行比较,从而使网络能够学习必要的调整。
如前所述,会使用不同层级的特征图。根据实例在整张图像中所占比例的大小,是否包含早期特征图(此时特征图压缩程度较低,细微特征仍清晰可见)和深层特征图(此时特征图高度压缩,仅能呈现大尺度特征)具有重要意义。这可通过参数 'min_level' 和
'max_level' 进行控制,它们决定了特征金字塔的层级范围。
通过这些边界框,我们获得了潜在实例的位置信息,但实例尚未被分类。因此,第二项任务是将边界框内图像区域的内容进行分类,这由分类头部负责完成。有关分类的更多通用信息,请参阅 深度学习 / 分类 一章及 “分类解决方案指南”。
网络很可能会为单个目标找到多个有潜力的边界框。通过非最大抑制来减少重叠的预测边界框,该抑制机制在创建模型时通过参数 'max_overlap' 和 'max_overlap_class_agnostic' 设置,或在后续使用 时配置。下图给出了示意图。
set_dl_model_param
| ( 1) | ( 2) | ( 3) |
'rectangle1' 为例说明。(1) 网络为苹果类(橙色)和柠檬类(蓝色)找到了若干有潜力的实例。(2) 同一类别下重叠实例的抑制阈值由 'max_overlap' 设定。不同类别间的重叠实例不予抑制。(3) 启用 'max_overlap_class_agnostic' 参数后,不同类别间强重叠实例也将被抑制。
作为输出,您将获得包含物体可能位置的边界框及置信度值,该值反映图像该区域与某一类别的关联度。
在实例分割任务中,后续还包含额外步骤:附加头部将预测边界框对应的特征图区域作为输入,据此生成(类别无关的)二值掩模图像。该掩模标记图像中属于预测实例的区域。示意图如下所示。
在 HALCON 中,基于深度学习的目标检测功能被集成于更通用的深度学习模型框架内。有关后者的详细信息,请参阅 深度学习 / 模型 一章。目前实现了两种不同实例类型的目标检测模型,其差异在于边界框的方向:
'rectangle1'矩形边界框是轴对齐的。
'rectangle2'矩形边界框具有任意方向。
要了解应用深度学习的具体系统要求,请参阅 HALCON “安装指南”。
以下章节将介绍目标检测所需的一般工作流程、相关数据和参数信息,以及评估指标的说明。
本节描述基于深度学习的目标检测任务的一般工作流程。该流程分为四个部分:创建模型并预处理数据、训练模型、评估训练后的模型,以及对新图像进行推理。在此我们假设您的数据集已完成标注,详见下文“数据”部分。可参考 HDevelop 示例系列 detect_pills_deep_learning 了解应用实例。示例 dl_instance_segmentation_workflow 则展示了实例分割应用的完整工作流程。
本部分涵盖深度学习目标检测模型的创建及数据适配流程。具体步骤亦可在 HDevelop 示例
detect_pills_deep_learning_1_prepare.hdev 中查看。
创建模型使用算子
因此,您至少需要指定骨干网络和需要区分的类别数量。例如,在进行实例分割时,必须设置 'instance_segmentation' 参数才能创建相应的模型。
可通过字典 DLModelDetectionParam 设置更多参数。其取值需根据具体任务精心选择,尤其要考虑可能降低内存消耗和运行时间。更多信息请参阅算子文档。
可估算适合您数据集的锚定参数通过使用函数
determine_dl_model_detection_param。
若数据集未能涵盖网络在训练过程中可能遇到的所有方向(例如因数据增强所致),则需相应调整建议值。
请注意,模型创建后,其底层网络架构将固定为指定的输入值。因此该算子返回一个句柄 'DLModelHandle'。
或者,您也可以使用
来读取您已通过 保存的模型。write_dl_model
需要读取训练数据集中各图像所包含的信息。这可以通过以下方式实现:
使用 从 read_dictDLDataset 字典中读取数据,或使用
read_dl_dataset_from_coco 函数读取 COCO 数据格式的文件,该程序会创建一个 DLDataset 字典。
该字典 DLDataset 充当数据库,存储数据的所有必要信息。有关数据及其传输方式的更多信息,请参阅下文“数据”部分及 深度学习 / 模型 一章。
将字典 DLDataset 表示的数据集进行分割。可通过以下函数实现
split_dl_dataset。
生成的分割结果将通过键 split 保存至 DLDataset 中每个样本条目中。
网络对图像有特定要求,例如图像宽度和高度。您可以获取每个单独的数值使用算子
或者您可以获取所有必要的参数通过函数
create_dl_preprocess_param_from_model。
注意,对于通过 'class_ids_no_orientation' 声明的类别,其边界框在预处理阶段需要特殊处理。因此,这些类别最迟应在此处设置。
现在您可以对数据集进行预处理。为此,您可以使用以下函数
preprocess_dl_dataset。
本函数还提供了如何实现自定义预处理函数的指导。我们建议在开始训练前对所有用于训练的图像进行预处理并存储,因为这能显著加快训练速度。
为可视化预处理后的数据,该函数
dev_display_dl_data
可用。
本部分涵盖深度学习目标检测模型的训练过程。具体步骤也可在 HDevelop 示例 detect_pills_deep_learning_2_train.hdev 中查看。
设置训练参数并将其存储在字典 TrainParam 中。这些参数包括:
超参数,概述请参见下文“模型参数与超参数”部分及 深度学习 一章。
可能的数据增强参数。
训练模型。这可以通过以下函数实现
train_dl_model。
该函数要求:
模型句柄 DLModelHandle
数据信息字典 DLDataset
训练参数字典 TrainParam
训练应运行的 epochs(周期) 次数信息。
训练过程中,您应观察总损失如何最小化。
在本部分中,我们将评估目标检测模型。具体步骤也可在 HDevelop 示例 detect_pills_deep_learning_3_evaluate.hdev 中查看。
设置可能影响评估的模型参数。
该评估可通过以下函数轻松完成
evaluate_dl_model。
该函数需要一个包含评估参数的字典 GenParamEval。将参数 detailed_evaluation 设置为 'true' 可获取可视化所需的数据。
您可以通过该函数可视化您的评估结果
dev_display_detection_detailed_evaluation。
本部分涵盖深度学习目标检测模型的应用。具体步骤也可在 HDevelop 示例 detect_pills_deep_learning_4_infer.hdev 中查看。
请求网络对图像的要求使用算子
或使用函数
create_dl_preprocess_param_from_model。
设置下文“模型参数与超参数”部分所述的模型参数使用算子
'batch_size' 通常可独立于待推理的图像数量进行设置。有关如何设置此参数以提升效率的详细信息,请参阅 。
apply_dl_model
为每张图像生成一个数据字典 DLSample。这可通过以下函数实现
gen_dl_samples_from_images。
每张图像都必须像训练时那样进行预处理。为此,您可以使用函数
preprocess_dl_samples。
应用模型使用算子
从字典
'DLResultBatch' 中检索结果。
我们将数据分为训练与评估用数据(包含图像及其实例信息)和推理用数据(仅含原始图像)。对于前者,您需为每个实例提供所属类别信息及其在图像中的位置(通过边界框标注)。针对实例分割任务,则需要像素级精确的对象区域(通过掩模提供)。
作为基础概念,该模型通过字典处理数据,即接收以字典 DLSample 形式输入的数据,并分别返回字典 DLResult 和 DLTrainResult。有关数据处理的更多信息,请参阅 深度学习 / 模型 一章。
该数据集包含图像及其对应信息。这些数据必须以模型可处理的形式提供。关于图像要求,请参阅下文“图像”部分获取更多信息。
训练数据用于针对特定任务训练和评估网络。借助这些数据,网络能够学习需要区分的类别、这类样本的外观特征以及如何定位它们。必要信息通过为每张图像中的每个对象标注所属类别及位置实现。具体操作是为每个对象提供类别标签和包围框。若涉及实例分割,则需为每个实例额外添加掩模。存储和检索这些信息的方式有多种可能。关于数据在 HALCON 中如何格式化以适配深度学习模型的说明,详见 深度学习 / 模型 一章。简而言之,字典 DLDataset 作为训练和评估函数所需信息的数据库。您可以使用 MVTec 官网提供的 MVTec 深度学习工具对数据进行标注,并直接创建符合相应格式的 DLDataset。若您的数据已按标准 COCO 格式进行标注,可使用 read_dl_dataset_from_coco 函数(仅限 'instance_type' = 'rectangle1' 时使用)。该函数对数据进行格式化处理并创建字典 DLDataset。有关 COCO 数据格式所需部分的更多信息,请参阅该函数的文档。
你还需要足够的训练数据,以便将其划分为三个子集,分别用于训练、验证和测试网络。这些子集最好是独立且同分布的,详见 深度学习 一章中的“数据”部分。
请注意,在目标检测中,网络必须学会如何定位实例的可能位置和尺寸。因此,后续关键的实例位置和尺寸也需要在训练数据集中具有代表性地出现。
无论应用场景如何,网络对图像都提出了要求,例如图像尺寸等。具体数值取决于网络本身,可通过 进行查询。为满足这些要求,您可能需要对图像进行预处理。整个数据集的标准预处理以及相应图像的预处理分别在 get_dl_model_parampreprocess_dl_dataset 和 preprocess_dl_samples 中实现,后者用于处理单个样本。
本函数还提供了如何实现自定义预处理函数的指导。
根据目标检测模型的实例类型,边界框的参数化方式有所不同:
'rectangle1'
边界框通过左上角坐标 ('bbox_row1', 'bbox_col1') 和右下角坐标 ('bbox_row2', 'bbox_col2') 定义。这与 保持一致。gen_rectangle1
'rectangle2'
边界框通过其中心坐标 ('bbox_row', 'bbox_col')、方向角 'Phi' 以及半边长 'bbox_length1' 和 'bbox_length2' 定义。方向角采用弧度制表示,指水平轴与 'bbox_length1' 之间的夹角(数学上为正值)。此定义与 保持一致。gen_rectangle2
若在 'rectangle2' 的情况下,您关注的是定向边界框,但无需考虑边界框内目标的方向,可将参数
'ignore_direction' 设置为 'true'。如下图所示。
| ( 1) | ( 2) | ( 3) |
'rectangle1'。(2) 实例类型 'rectangle2',其中边界框朝向香蕉末端。(3) 实例类型 'rectangle2',其中仅关注定向边界框本身,不考虑香蕉在边界框内的朝向。
实例分割除了需要精确的边界框外,还要求为每个待学习对象提供掩模。该掩模以区域形式呈现。请注意,这些区域是以图像为基准给出的。
单张图像的掩模以区域对象元组的形式给出,详见下图。掩模的顺序与边界框标注的顺序相对应。
网络输出取决于任务:
作为输出,算子 将返回一个字典 train_dl_model_batch,其中包含总损失的当前值以及模型中包含的所有其他损失的值。
DLTrainResult
作为输出, 算子将为每张图像返回一个名为 apply_dl_model 的字典。对于目标检测,该字典将包含每个检测到的实例的边界框、所分配类别的置信度值,以及在实例分割情况下对应的掩模。因此图像中同一对象可能被检测出多个实例,详见上文关于非最大抑制的说明。生成的边界框根据实例类型(通过 DLResult'instance_type' 指定)进行参数化,并以像素为中心、亚像素级精度的坐标形式呈现。有关坐标系统的更多信息,请参阅 变换 / 二维变换 一章。关于输出字典的进一步信息,请参阅 深度学习 / 模型 一章。
除了 深度学习 中解释的通用 DL 超参数外,还有其他与目标检测相关的超参数:
'bbox_heads_weight'
'class_heads_weight'
'mask_head_weight'(在实例分割的情况下)
这些超参数在 中进行了更详细的说明,并通过 get_dl_model_param 进行设置。create_dl_model_detection
对于目标检测模型而言,存在两种不同类型的模型参数:
定义架构的参数。模型创建后这些参数将无法更改。所有参数均通过 算子在创建模型时设置。
create_dl_model_detection
影响预测结果的参数,进而影响评估结果。仅与目标检测相关的参数包括:
'max_num_detections'
'max_overlap'
'max_overlap_class_agnostic'
'min_confidence'
这些参数在 中进行了更详细的说明。设置时,您可以在创建模型时使用 get_dl_model_param,或之后使用 create_dl_model_detection 进行设置。
set_dl_model_param
对于目标检测,HALCON 支持以下评估指标。请注意,计算图像的评估指标时需要相关的真值信息。
均值平均精度(mAP)及某类别的平均精度(AP)在特定交并比阈值下的表现,ap_iou_classname
AP 值是不同召回率下最高精度的平均值。简而言之,它告诉我们:该类别预测出的目标是否普遍属于正确检测。因此我们更关注置信度值较高的预测结果——数值越高越好。
要将预测视为命中,我们要求其前1名分类结果和定位结果均正确。衡量定位正确性的指标是交并比(IoU):当 IoU 值高于设定阈值时,即判定实例定位正确。IoU 的具体定义将在下文详述。因此,AP 值取决于类别和交并比阈值。
您可以获取具体的 AP 值、各类别的平均值、不同 IoU 阈值的平均值,以及类别与 IoU 阈值的双重平均值。后者即均值平均精度(mAP),该指标用于评估实例的检出与分类效果。
真正类、假正类、假负类
深度学习 中阐述了真正类、假正类与假负类的概念。该概念同样适用于目标检测,但需注意假正类存在多种类型,例如:
一个实例被错误分类。
发现一个实例,其中仅存在背景。
某个实例定位效果不佳,即实例与其真实目标的交并比(IoU)低于评估阈值。
存在重复实例:至少两个实例主要覆盖相同真实目标边界框,但彼此重叠度未超过 'max_overlap' 阈值,因此均未被抑制。
请注意,这些值仅可在详细评估中获取。这意味着在 evaluate_dl_model 中,必须将
detailed_evaluation 参数设置为 'true'。
角度精度分数(SoAP)
SoAP 值是衡量推断方位角精度的评分指标。该评分由推理实例(I)与对应真值标注(GT)之间的角度差异决定:
其中索引 遍历所有推断出的实例。该分数仅适用于检测模型为 'instance_type'
'rectangle2' 的情况。
前述方法采用交并比(IoU)作为评估指标。该指标用于衡量目标检测的准确性,通过比较候选边界框与真实边界框的交集面积与重叠面积之比来实现。下图展示了该指标的可视化示例。
| ( 1) | ( 2) |
'rectangle1' 为例说明。(1) 输入图像包含真实边界框(橙色)和预测边界框(浅蓝色)。(2) IoU 是面积交集与面积重叠的比率。
在实例分割中,IoU 默认基于掩模计算。用户可更改默认设置,改用边界框进行计算。
create_dl_model_detection创建深度学习模型检测