目标检测与实例分割

算子列表 ↓

本章阐述了如何基于深度学习进行目标检测。

目标检测旨在识别图像中的不同实例并将其分配至特定类别。这些实例可部分重叠,但仍能被区分开来。如下图所示:

image/svg+xml 'apple' 0.9 'apple' 0.7 'lemon' 0.9
目标检测的一个可能示例:在输入图像中找到三个实例并将其分配到一个类别。

实例分割是目标检测的特殊情况,模型还会预测一个实例掩模,标记图像中实例的具体区域。如下图所示。总体而言,目标检测的说明同样适用于实例分割。可能存在的差异将在具体章节中阐述。

image/svg+xml 'apple' 0.9 'apple' 0.7 'lemon' 0.9
实例分割的一个可能示例:在输入图像中检测到三个实例。每个实例被分配到一个类别,并获得一个标记其特定区域的掩模。

目标检测涉及两个不同任务:定位实例并进行分类。为此,我们采用由三个主要部分组成的组合网络。第一部分称为骨干网络,由预训练的分类网络构成。其任务是生成多种特征图,因此去除了分类层。这些特征图根据在网络中的深度不同,编码了不同尺度下的各类信息。详见 深度学习。因此,具有相同宽度和高度的特征图被视为属于同一层级。在第二部分中,不同层级的骨干层被组合起来。更精确地说,不同层级的骨干层被指定为对接层,其特征图被整合。由此我们获得包含低层级与高层级信息的特征图,这些正是第三部分将使用的特征图。第二部分亦称为特征金字塔,与第一部分共同构成特征金字塔网络。第三部分包含为每个选定层级添加的额外网络单元(称为头部)。这些单元接收对应特征图作为输入,分别学习定位与分类潜在目标的能力。此外,第三部分还负责处理重叠预测边界框的融合。下图展示了三部分的整体架构。

image/svg+xml (1) (2) (3) 'lemon' 0.9 'apple' 0.7 'apple' 0.9 confidences confidences confidences + +
所述三部分的示意性概述:(1) 骨干网络;(2) 骨干特征图被组合并生成新的特征图;(3) 附加网络(称为头部),分别学习如何定位和分类潜在目标。重叠的边界框会被抑制。

让我们看看第三部分发生了什么。在目标检测中,实例在图像中的位置由矩形边界框给出。因此,首要任务是为每个实例找到合适的边界框。为此,网络生成参考边界框,并学习如何修改它们以尽可能贴合实例。这些参考边界框被称为锚点。锚点对真实边界框形状的拟合度越高,网络学习效率就越高。为此,网络会在特征金字塔中每个特征图的像素点(即锚点位置)生成一组锚点。该集合包含所有形状、尺寸组合的锚点,例如类型为 'rectangle2'"rectangle2""rectangle2""rectangle2""rectangle2""rectangle2" (见下文)的锚点还包含所有方向组合。这些框的形状受参数 'anchor_aspect_ratios'"anchor_aspect_ratios""anchor_aspect_ratios""anchor_aspect_ratios""anchor_aspect_ratios""anchor_aspect_ratios" 影响,尺寸由参数 'anchor_num_subscales'"anchor_num_subscales""anchor_num_subscales""anchor_num_subscales""anchor_num_subscales""anchor_num_subscales" 决定,方向则由参数 'anchor_angles'"anchor_angles""anchor_angles""anchor_angles""anchor_angles""anchor_angles" 控制,详见下图及 get_dl_model_paramget_dl_model_paramGetDlModelParamGetDlModelParamGetDlModelParamget_dl_model_param 算子说明。如果参数生成多个相同的锚点,网络内部会忽略这些重复项。

image/svg+xml (1) (2) (4) (3)
特征图(右)与输入图像(左)中锚点的生成方案:(1) 锚点在不同层级的特征图上生成,例如图中绘制的浅蓝、橙色和深蓝色锚点。(2) 通过设置 'anchor_num_subscales'"anchor_num_subscales""anchor_num_subscales""anchor_num_subscales""anchor_num_subscales""anchor_num_subscales" 生成不同尺寸的锚点。(3) 通过设置 'anchor_aspect_ratios'"anchor_aspect_ratios""anchor_aspect_ratios""anchor_aspect_ratios""anchor_aspect_ratios""anchor_aspect_ratios" 生成不同形状的锚点。(4) 通过设置 'anchor_angles'"anchor_angles""anchor_angles""anchor_angles""anchor_angles""anchor_angles" 生成不同方向的锚点(仅适用于 'rectangle2'"rectangle2""rectangle2""rectangle2""rectangle2""rectangle2" 实例类型)。

该网络通过预测偏移量来调整锚点位置,从而生成更契合潜在实例的边界框。网络通过边界框预测头部实现这一学习过程:这些预测头部将当前层级生成的锚点与对应的真实边界框进行比对,从而获取单个实例在图像中的具体位置信息。下图展示了该过程的示意图。

image/svg+xml image/svg+xml
( 1) ( 2)
边界框比较,以示例类型 'rectangle1'"rectangle1""rectangle1""rectangle1""rectangle1""rectangle1" 为例说明。(1) 网络通过修改锚点(浅蓝色)来预测更贴合的边界框(橙色)。(2) 训练过程中,预测的边界框(橙色)会与最重叠的真实边界框(蓝色)进行比较,从而使网络能够学习必要的调整。

如前所述,会使用不同层级的特征图。根据实例在整张图像中所占比例的大小,是否包含早期特征图(此时特征图压缩程度较低,细微特征仍清晰可见)和深层特征图(此时特征图高度压缩,仅能呈现大尺度特征)具有重要意义。这可通过参数 'min_level'"min_level""min_level""min_level""min_level""min_level"'max_level'"max_level""max_level""max_level""max_level""max_level" 进行控制,它们决定了特征金字塔的层级范围。

通过这些边界框,我们获得了潜在实例的位置信息,但实例尚未被分类。因此,第二项任务是将边界框内图像区域的内容进行分类,这由分类头部负责完成。有关分类的更多通用信息,请参阅 深度学习 / 分类 一章及 “分类解决方案指南”

网络很可能会为单个目标找到多个有潜力的边界框。通过非最大抑制来减少重叠的预测边界框,该抑制机制在创建模型时通过参数 'max_overlap'"max_overlap""max_overlap""max_overlap""max_overlap""max_overlap"'max_overlap_class_agnostic'"max_overlap_class_agnostic""max_overlap_class_agnostic""max_overlap_class_agnostic""max_overlap_class_agnostic""max_overlap_class_agnostic" 设置,或在后续使用 set_dl_model_paramset_dl_model_paramSetDlModelParamSetDlModelParamSetDlModelParamset_dl_model_param 时配置。下图给出了示意图。

image/svg+xml image/svg+xml image/svg+xml
( 1) ( 2) ( 3)
显著重叠边界框的抑制,以实例类型 'rectangle1'"rectangle1""rectangle1""rectangle1""rectangle1""rectangle1" 为例说明。(1) 网络为苹果类(橙色)和柠檬类(蓝色)找到了若干有潜力的实例。(2) 同一类别下重叠实例的抑制阈值由 'max_overlap'"max_overlap""max_overlap""max_overlap""max_overlap""max_overlap" 设定。不同类别间的重叠实例不予抑制。(3) 启用 'max_overlap_class_agnostic'"max_overlap_class_agnostic""max_overlap_class_agnostic""max_overlap_class_agnostic""max_overlap_class_agnostic""max_overlap_class_agnostic" 参数后,不同类别间强重叠实例也将被抑制。

作为输出,您将获得包含物体可能位置的边界框及置信度值,该值反映图像该区域与某一类别的关联度。

在实例分割任务中,后续还包含额外步骤:附加头部将预测边界框对应的特征图区域作为输入,据此生成(类别无关的)二值掩模图像。该掩模标记图像中属于预测实例的区域。示意图如下所示。

image/svg+xml
掩模预测的示意性概述。该图示采用了上文所示目标检测网络三部分概述中的组件。

在 HALCON 中,基于深度学习的目标检测功能被集成于更通用的深度学习模型框架内。有关后者的详细信息,请参阅 深度学习 / 模型 一章。目前实现了两种不同实例类型的目标检测模型,其差异在于边界框的方向:

实例类型 'rectangle1'"rectangle1""rectangle1""rectangle1""rectangle1""rectangle1"

矩形边界框是轴对齐的。

实例类型 'rectangle2'"rectangle2""rectangle2""rectangle2""rectangle2""rectangle2"

矩形边界框具有任意方向。

要了解应用深度学习的具体系统要求,请参阅 HALCON “安装指南”

以下章节将介绍目标检测所需的一般工作流程、相关数据和参数信息,以及评估指标的说明。

一般工作流程

本节描述基于深度学习的目标检测任务的一般工作流程。该流程分为四个部分:创建模型并预处理数据、训练模型、评估训练后的模型,以及对新图像进行推理。在此我们假设您的数据集已完成标注,详见下文“数据”部分。可参考 HDevelop 示例系列 detect_pills_deep_learning 了解应用实例。示例 dl_instance_segmentation_workflow 则展示了实例分割应用的完整工作流程。

模型创建与数据集预处理

本部分涵盖深度学习目标检测模型的创建及数据适配流程。具体步骤亦可在 HDevelop 示例 detect_pills_deep_learning_1_prepare.hdev 中查看。

  1. 创建模型使用算子

    因此,您至少需要指定骨干网络和需要区分的类别数量。例如,在进行实例分割时,必须设置 'instance_segmentation'"instance_segmentation""instance_segmentation""instance_segmentation""instance_segmentation""instance_segmentation" 参数才能创建相应的模型。

    可通过字典 DLModelDetectionParam 设置更多参数。其取值需根据具体任务精心选择,尤其要考虑可能降低内存消耗和运行时间。更多信息请参阅算子文档。

    可估算适合您数据集的锚定参数通过使用函数

    • determine_dl_model_detection_param

    若数据集未能涵盖网络在训练过程中可能遇到的所有方向(例如因数据增强所致),则需相应调整建议值。

    请注意,模型创建后,其底层网络架构将固定为指定的输入值。因此该算子返回一个句柄 'DLModelHandle'"DLModelHandle""DLModelHandle""DLModelHandle""DLModelHandle""DLModelHandle"

    或者,您也可以使用

    来读取您已通过 write_dl_modelwrite_dl_modelWriteDlModelWriteDlModelWriteDlModelwrite_dl_model 保存的模型。

  2. 需要读取训练数据集中各图像所包含的信息。这可以通过以下方式实现:

    该字典 DLDataset 充当数据库,存储数据的所有必要信息。有关数据及其传输方式的更多信息,请参阅下文“数据”部分及 深度学习 / 模型 一章。

  3. 将字典 DLDataset 表示的数据集进行分割。可通过以下函数实现

    • split_dl_dataset

    生成的分割结果将通过键 split 保存至 DLDataset 中每个样本条目中。

  4. 网络对图像有特定要求,例如图像宽度和高度。您可以获取每个单独的数值使用算子

    或者您可以获取所有必要的参数通过函数

    • create_dl_preprocess_param_from_model

    注意,对于通过 'class_ids_no_orientation'"class_ids_no_orientation""class_ids_no_orientation""class_ids_no_orientation""class_ids_no_orientation""class_ids_no_orientation" 声明的类别,其边界框在预处理阶段需要特殊处理。因此,这些类别最迟应在此处设置。

    现在您可以对数据集进行预处理。为此,您可以使用以下函数

    • preprocess_dl_dataset

    本函数还提供了如何实现自定义预处理函数的指导。我们建议在开始训练前对所有用于训练的图像进行预处理并存储,因为这能显著加快训练速度。

    为可视化预处理后的数据,该函数

    • dev_display_dl_data

    可用。

模型训练

本部分涵盖深度学习目标检测模型的训练过程。具体步骤也可在 HDevelop 示例 detect_pills_deep_learning_2_train.hdev 中查看。

  1. 设置训练参数并将其存储在字典 TrainParam 中。这些参数包括:

    • 超参数,概述请参见下文“模型参数与超参数”部分及 深度学习 一章。

    • 可能的数据增强参数。

  2. 训练模型。这可以通过以下函数实现

    • train_dl_model

    该函数要求:

    • 模型句柄 DLModelHandleDLModelHandleDLModelHandleDLModelHandleDLModelHandledlmodel_handle

    • 数据信息字典 DLDataset

    • 训练参数字典 TrainParam

    • 训练应运行的 epochs(周期) 次数信息。

    训练过程中,您应观察总损失如何最小化。

训练模型评估

在本部分中,我们将评估目标检测模型。具体步骤也可在 HDevelop 示例 detect_pills_deep_learning_3_evaluate.hdev 中查看。

  1. 设置可能影响评估的模型参数。

  2. 该评估可通过以下函数轻松完成

    • evaluate_dl_model

    该函数需要一个包含评估参数的字典 GenParamEval。将参数 detailed_evaluation 设置为 'true'"true""true""true""true""true" 可获取可视化所需的数据。

  3. 您可以通过该函数可视化您的评估结果

    • dev_display_detection_detailed_evaluation

新图像推理

本部分涵盖深度学习目标检测模型的应用。具体步骤也可在 HDevelop 示例 detect_pills_deep_learning_4_infer.hdev 中查看。

  1. 请求网络对图像的要求使用算子

    或使用函数

    • create_dl_preprocess_param_from_model

  2. 设置下文“模型参数与超参数”部分所述的模型参数使用算子

    'batch_size'"batch_size""batch_size""batch_size""batch_size""batch_size" 通常可独立于待推理的图像数量进行设置。有关如何设置此参数以提升效率的详细信息,请参阅 apply_dl_modelapply_dl_modelApplyDlModelApplyDlModelApplyDlModelapply_dl_model

  3. 为每张图像生成一个数据字典 DLSample。这可通过以下函数实现

    • gen_dl_samples_from_images

  4. 每张图像都必须像训练时那样进行预处理。为此,您可以使用函数

    • preprocess_dl_samples

  5. 应用模型使用算子

  6. 从字典 'DLResultBatch'"DLResultBatch""DLResultBatch""DLResultBatch""DLResultBatch""DLResultBatch" 中检索结果。

数据

我们将数据分为训练与评估用数据(包含图像及其实例信息)和推理用数据(仅含原始图像)。对于前者,您需为每个实例提供所属类别信息及其在图像中的位置(通过边界框标注)。针对实例分割任务,则需要像素级精确的对象区域(通过掩模提供)。

作为基础概念,该模型通过字典处理数据,即接收以字典 DLSample 形式输入的数据,并分别返回字典 DLResultDLTrainResult。有关数据处理的更多信息,请参阅 深度学习 / 模型 一章。

训练和评估数据

该数据集包含图像及其对应信息。这些数据必须以模型可处理的形式提供。关于图像要求,请参阅下文“图像”部分获取更多信息。

训练数据用于针对特定任务训练和评估网络。借助这些数据,网络能够学习需要区分的类别、这类样本的外观特征以及如何定位它们。必要信息通过为每张图像中的每个对象标注所属类别及位置实现。具体操作是为每个对象提供类别标签和包围框。若涉及实例分割,则需为每个实例额外添加掩模。存储和检索这些信息的方式有多种可能。关于数据在 HALCON 中如何格式化以适配深度学习模型的说明,详见 深度学习 / 模型 一章。简而言之,字典 DLDataset 作为训练和评估函数所需信息的数据库。您可以使用 MVTec 官网提供的 MVTec 深度学习工具对数据进行标注,并直接创建符合相应格式的 DLDataset。若您的数据已按标准 COCO 格式进行标注,可使用 read_dl_dataset_from_coco 函数(仅限 'instance_type'"instance_type""instance_type""instance_type""instance_type""instance_type" = 'rectangle1'"rectangle1""rectangle1""rectangle1""rectangle1""rectangle1" 时使用)。该函数对数据进行格式化处理并创建字典 DLDataset。有关 COCO 数据格式所需部分的更多信息,请参阅该函数的文档。

你还需要足够的训练数据,以便将其划分为三个子集,分别用于训练、验证和测试网络。这些子集最好是独立且同分布的,详见 深度学习 一章中的“数据”部分。

请注意,在目标检测中,网络必须学会如何定位实例的可能位置和尺寸。因此,后续关键的实例位置和尺寸也需要在训练数据集中具有代表性地出现。

图像

无论应用场景如何,网络对图像都提出了要求,例如图像尺寸等。具体数值取决于网络本身,可通过 get_dl_model_paramget_dl_model_paramGetDlModelParamGetDlModelParamGetDlModelParamget_dl_model_param 进行查询。为满足这些要求,您可能需要对图像进行预处理。整个数据集的标准预处理以及相应图像的预处理分别在 preprocess_dl_datasetpreprocess_dl_samples 中实现,后者用于处理单个样本。 本函数还提供了如何实现自定义预处理函数的指导。

边界框

根据目标检测模型的实例类型,边界框的参数化方式有所不同:

实例类型 'rectangle1'"rectangle1""rectangle1""rectangle1""rectangle1""rectangle1"

边界框通过左上角坐标 ('bbox_row1'"bbox_row1""bbox_row1""bbox_row1""bbox_row1""bbox_row1", 'bbox_col1'"bbox_col1""bbox_col1""bbox_col1""bbox_col1""bbox_col1") 和右下角坐标 ('bbox_row2'"bbox_row2""bbox_row2""bbox_row2""bbox_row2""bbox_row2", 'bbox_col2'"bbox_col2""bbox_col2""bbox_col2""bbox_col2""bbox_col2") 定义。这与 gen_rectangle1gen_rectangle1GenRectangle1GenRectangle1GenRectangle1gen_rectangle1 保持一致。

实例类型 'rectangle2'"rectangle2""rectangle2""rectangle2""rectangle2""rectangle2"

边界框通过其中心坐标 ('bbox_row'"bbox_row""bbox_row""bbox_row""bbox_row""bbox_row", 'bbox_col'"bbox_col""bbox_col""bbox_col""bbox_col""bbox_col")、方向角 'Phi'"Phi""Phi""Phi""Phi""Phi" 以及半边长 'bbox_length1'"bbox_length1""bbox_length1""bbox_length1""bbox_length1""bbox_length1"'bbox_length2'"bbox_length2""bbox_length2""bbox_length2""bbox_length2""bbox_length2" 定义。方向角采用弧度制表示,指水平轴与 'bbox_length1'"bbox_length1""bbox_length1""bbox_length1""bbox_length1""bbox_length1" 之间的夹角(数学上为正值)。此定义与 gen_rectangle2gen_rectangle2GenRectangle2GenRectangle2GenRectangle2gen_rectangle2 保持一致。

若在 'rectangle2'"rectangle2""rectangle2""rectangle2""rectangle2""rectangle2" 的情况下,您关注的是定向边界框,但无需考虑边界框内目标的方向,可将参数 'ignore_direction'"ignore_direction""ignore_direction""ignore_direction""ignore_direction""ignore_direction" 设置为 'true'"true""true""true""true""true"。如下图所示。

image/svg+xml image/svg+xml image/svg+xml
( 1) ( 2) ( 3)
不同目标检测实例类型的边界框格式:(1) 实例类型 'rectangle1'"rectangle1""rectangle1""rectangle1""rectangle1""rectangle1"。(2) 实例类型 'rectangle2'"rectangle2""rectangle2""rectangle2""rectangle2""rectangle2",其中边界框朝向香蕉末端。(3) 实例类型 'rectangle2'"rectangle2""rectangle2""rectangle2""rectangle2""rectangle2",其中仅关注定向边界框本身,不考虑香蕉在边界框内的朝向。
掩模

实例分割除了需要精确的边界框外,还要求为每个待学习对象提供掩模。该掩模以区域形式呈现。请注意,这些区域是以图像为基准给出的。

单张图像的掩模以区域对象元组的形式给出,详见下图。掩模的顺序与边界框标注的顺序相对应。

image/svg+xml , ,
图像中掩模的示意图:对于每个待学习的对象,元组都包含一个独立的区域。
网络输出

网络输出取决于任务:

训练

作为输出,算子 train_dl_model_batchtrain_dl_model_batchTrainDlModelBatchTrainDlModelBatchTrainDlModelBatchtrain_dl_model_batch 将返回一个字典 DLTrainResultDLTrainResultDLTrainResultDLTrainResultDLTrainResultdltrain_result,其中包含总损失的当前值以及模型中包含的所有其他损失的值。

推理与评估

作为输出,apply_dl_modelapply_dl_modelApplyDlModelApplyDlModelApplyDlModelapply_dl_model 算子将为每张图像返回一个名为 DLResultDLResultDLResultDLResultDLResultdlresult 的字典。对于目标检测,该字典将包含每个检测到的实例的边界框、所分配类别的置信度值,以及在实例分割情况下对应的掩模。因此图像中同一对象可能被检测出多个实例,详见上文关于非最大抑制的说明。生成的边界框根据实例类型(通过 'instance_type'"instance_type""instance_type""instance_type""instance_type""instance_type" 指定)进行参数化,并以像素为中心、亚像素级精度的坐标形式呈现。有关坐标系统的更多信息,请参阅 变换 / 二维变换 一章。关于输出字典的进一步信息,请参阅 深度学习 / 模型 一章。

模型参数与超参数

除了 深度学习 中解释的通用 DL 超参数外,还有其他与目标检测相关的超参数:

这些超参数在 get_dl_model_paramget_dl_model_paramGetDlModelParamGetDlModelParamGetDlModelParamget_dl_model_param 中进行了更详细的说明,并通过 create_dl_model_detectioncreate_dl_model_detectionCreateDlModelDetectionCreateDlModelDetectionCreateDlModelDetectioncreate_dl_model_detection 进行设置。

对于目标检测模型而言,存在两种不同类型的模型参数:

目标检测结果的评估指标

对于目标检测,HALCON 支持以下评估指标。请注意,计算图像的评估指标时需要相关的真值信息。

前述方法采用交并比(IoU)作为评估指标。该指标用于衡量目标检测的准确性,通过比较候选边界框与真实边界框的交集面积与重叠面积之比来实现。下图展示了该指标的可视化示例。

image/svg+xml image/svg+xml IoU=
( 1) ( 2)
IoU 的可视化示例,以实例类型 'rectangle1'"rectangle1""rectangle1""rectangle1""rectangle1""rectangle1" 为例说明。(1) 输入图像包含真实边界框(橙色)和预测边界框(浅蓝色)。(2) IoU 是面积交集与面积重叠的比率。

在实例分割中,IoU 默认基于掩模计算。用户可更改默认设置,改用边界框进行计算。


算子列表

create_dl_model_detectionCreateDlModelDetectioncreate_dl_model_detectionCreateDlModelDetectioncreate_dl_model_detection创建深度学习模型检测
创建用于目标检测或实例分割的深度学习网络。