本章阐述了 HALCON中 深度学习(DL)模型的基本概念及其数据处理方式。
从概念上讲,HALCON 中的深度学习模型是深度神经网络的内部表示形式。每个深度神经网络都具有定义其功能(即可执行的任务)的架构。单一功能可能存在多种网络架构方案。目前,HALCON 已将以下功能的网络实现为模型:
三维抓取点检测,参见 三维匹配 / 三维抓取点检测。
异常检测与全局上下文异常检测,参见 深度学习 / 异常检测与全局上下文异常检测。
分类,参见 深度学习 / 分类。
深度 OCR,参见 OCR / 深度 OCR。
对象检测与实例分割,参见 深度学习 / 对象检测与实例分割。
语义分割与边缘提取,参见 深度学习 / 语义分割与边缘提取。
每项功能均通过其独特的模型类型进行标识。对于已实现的方法,您可在对应章中查阅具体工作流程、数据要求及验证措施的详细信息。关于深度学习的通用信息详见 深度学习 一章。
在本章中,您将了解深度学习模型需要哪些数据、返回哪些数据,以及这些数据如何传输。
深度学习应用中存在不同类型的数据需要区分。大致来说它们包括:可能带有标注的原始图像、经过模型适配预处理的数据,以及输出数据。
在说明不同类型的数据和具体字典的条目之前,我们将先了解数据如何相互关联。图示中的符号和颜色对应下文给出的示意图。
简而言之,训练或评估的数据结构始于原始图像及其真实标注(灰色框)。读取数据后将创建以下字典:字典 DLDataset(红色)作为数据库,为每张输入图像指向特定字典(黄色)。字典 DLSample(橙色)以网络可处理的形式存储样本数据。一批 DLSample 通过 传递给模型。评估时返回 DLSampleBatch,即由多个字典组成的元组 DLResultBatchDLResult(深蓝色),每个样本对应一个字典。这些字典用于获取评估结果 EvaluationResult。训练时,训练结果(如损失值)以字典 DLTrainResult (浅蓝色)形式返回。修改或创建字典的关键步骤包括:
读取原始数据(符号:带箭头的纸张)
数据预处理(符号:齿轮)
训练(符号:弧形透明大脑)
模型评估(符号:图表)
样本评估(符号:放大镜)
推理阶段无需标注。因此数据结构以原始图像(灰色框)为起点。字典 DLSample(橙色)以网络可处理的形式存储样本数据。样本结果通过字典 DLResult(深蓝色)返回。修改或创建字典的关键步骤包括:
读取原始数据(符号:带箭头的纸张)
数据预处理(符号:齿轮)
推理(符号:圆圈中的大脑)
样本评估(符号:放大镜)
为了使模型能够处理数据,数据需要遵循特定的规范,包括数据的必要性及其向模型提供的形式。如上图所示,在 HALCON 中,数据是通过字典进行传输的。
以下我们将说明涉及的字典、创建方法及其条目。这些字典按其创建所在深度学习应用的主要步骤进行分组,并区分其作为输入数据或输出数据的用途。下列缩写标注了条目适用的方法:
'Any':任意方法
'3D-GPD':三维抓取点检测
'AD':异常检测
'CL':分类
'OCR-D':深度 OCR 检测组件
'OCR-R':深度 OCR 识别组件
'GC-AD':全局上下文异常检测
'OD':对象检测
若条目仅适用于特定的
'instance_type',则添加规范 'r1':'rectangle1',
'r2':'rectangle2'。
对于仅适用于实例分割的条目,添加规范 'is'。
'SE':语义分割
仅适用于特定方法的条目将在对应章节中进行更详细的说明。
该数据集包含图像及其对应信息。这些数据必须以模型可处理的形式提供。关于图像要求,请参阅下文“图像”部分获取更多信息。
图像及数据集的相关信息存储于字典 DLDataset 中,该字典充当数据库角色。更具体地说,它保存数据集的通用信息,并在键名为 samples 的条目下存储各个样本的字典。当需要实际图像数据时,系统会为每张所需图像创建(或读取已存在的)字典 。这些字典之间的关系如图所示。
DLSample
BatchSize 设置为 3。本例中有 个样本,其中随机选取三个样本:i、j 和 k。创建对应的 DLSample 字典并组合成元组 DLSampleBatch。
DLDataset字典 DLDataset 充当数据库,用于存储数据集的通用信息并收集各个样本的字典。因此,DLDataset 中不包含图标数据,而是存储对应图像的路径。字典 DLDataset 该字典被训练和评估流程所使用,虽然模型运行时并非必需,但强烈建议创建。其必要条目如下所述。
该字典可通过以下方式创建:使用 MVTec 深度学习工具(DLT)标注数据时直接生成,或通过下列特定函数创建:
read_dl_dataset_3d_gripping_point_detection(三维抓取点检测)
read_dl_dataset_anomaly(异常检测,全局上下文异常检测)
read_dl_dataset_classification(分类)
read_dl_dataset_ocr_detection(深度 OCR-检测组件)
read_dl_dataset_ocr_recognition(深度 OCR-识别组件)
read_dl_dataset_from_coco(对象检测,需设置
'instance_type' = 'rectangle1')
read_dl_dataset_segmentation(语义分割)。
请参阅相应函数文档以了解使用这些函数所需的数据要求。若通过其他方式创建 DLDataset,则其必须至少包含以下描述中未标注编号的条目。在数据集预处理过程中,相关函数会包含字典 DLDataset 的其他条目。
根据模型类型,该字典可能包含以下条目:
image_dir:Any所有图像的公共根路径。
格式: 字符串
dlsample_dir:Any [1]所有样本文件的公共基准路径(若存在)。
格式: 字符串
class_names:Any 除 OCR-R 外所有需要区分的类名称。
格式: 字符串元组
class_ids:Any 除 OCR-R 外所有需要区分的类别的 IDs(范围:0-65534)。
格式: 整数元组
preprocess_param:Any [1]预处理过程中使用的所有参数值。
格式: 字典
samples:Any样本描述集。
格式: 字典元组
normals_dir:3D-GPD可选。所有法线图像的公共基准路径。
格式: 字符串
xyz_dir:3D-GPD所有 XYZ 图像的公共基准路径。
格式: 字符串
anomaly_dir:AD, GC-AD所有异常区域的公共基准路径(图像中显示异常的区域)。
格式: 字符串
class_weights:CL, SE [1]不同类别的权重。
格式: 实数元组
segmentation_dir:SE, 3D-GPD所有分割图像的公共基准路径。
格式: 字符串
该字典是在使用 MVTec 深度学习工具(DLT)标注数据时直接生成的,也可通过上述数据读取函数创建。标记为[1]的条目由预处理函数添加。
samplesDLDataset 键 samples 的值是一个字典元组,其中每个字典对应数据集中的一个样本。这些字典包含数据集中单个样本的相关信息。根据模型类型不同,该字典可能包含以下条目:
image_file_name:Any
图像文件名及其相对于 image_dir 的路径。
格式: 字符串
image_id:Any唯一图像ID(编码格式:UINT8)。
格式: 整数
split:Any [2]
指定分配的分割子集
('train','validation','test').
格式: 字符串
dlsample_file_name:Any [3]
对应字典 的文件名及其相对于 DLSampledlsample_dir 的相对路径。
格式: 字符串
normals_file_name:3D-GPD
可选。法线图像的文件名及其相对于 normals_dir 的相对路径。
格式: 字符串
segmentation_file_name:3D-GPD, SE
真实分割图像的文件名及其相对于 segmentation_dir 的路径。
格式: 字符串
xyz_file_name:3D-GPD
XYZ 图像的文件名及其相对于 xyz_dir 的路径。
格式: 字符串
anomaly_file_name:AD, GC-AD
可选。包含真实标注的区域文件路径(相对于 anomaly_dir)。
格式: 字符串
anomaly_label:AD, GC-AD
图像级的真实异常标签(以 class_names 的形式呈现)。
格式: 字符串
image_label_id:CL
图像的真实标签(以 class_ids 的形式呈现)。
格式: 整数元组
image_id_origin:OCR-R原始图像的 ID,样本即从中提取而来。
格式: 整数
word:OCR-D, OCR-R真实标注单词。
格式: 字符串
bbox_label_id:OD, OCR-D
边界框的真实标签(以 class_ids 的形式呈现)。
格式: 整数元组
bbox_row1:OD:r1 [4]真实边界框:左上角,行坐标。
格式: 实数元组
bbox_col1:OD:r1 [4]真实边界框:左上角,列坐标。
格式: 实数元组
bbox_row2:OD:r1 [4]真实边界框:右下角,行坐标。
格式: 实数元组
bbox_col2:OD:r1 [4]真实边界框:右下角,列坐标。
格式: 实数元组
coco_raw_annotations:OD:r1
可选项。它包含该图像中每个 bbox_label_id 对应的字典,内含所有原始 COCO 标注信息。
格式: 字典元组
bbox_row:OCR-D, OCR-R, OD:r2 [4]真实边界框:中心点,行坐标。
格式: 实数元组
bbox_col:OCR-D, OCR-R, OD:r2 [4]真实边界框:中心点,列坐标。
格式: 实数元组
bbox_phi:OCR-D, OCR-R, OD:r2 [4]真实边界框:角度φ。
格式: 实数元组
bbox_length1:OCR-D, OCR-R, OD:r2 [4]真实边界框:边长 1 的一半。
格式: 实数元组
bbox_length2:OCR-D, OCR-R, OD:r2 [4]真实边界框:边长 2 的一半。
格式: 实数元组
mask:OD:is标记实例区域的真实掩膜。
格式: 区域元组
这些字典属于 DLDataset 的一部分,因此它们是并行创建的。
例外情况是表格中带有标记的条目,
[2]:函数 split_dl_dataset 添加 split,
[3]:函数 preprocess_dl_samples 添加 dlsample_file_name。
[4]:使用的坐标:像素居中,亚像素精度的坐标。
DLSample字典 作为模型的输入。对于一个批次,它们作为元组
DLSample 的条目传递给 DLSampleBatch 或
apply_dl_model。每个样本都通过 train_dl_model_batchgen_dl_samples 函数创建,随便由 DLDataset 生成,最后经过 preprocess_dl_samples 处理。注意,preprocess_dl_samples 会更新对应的 字典。若使用标准预处理函数
DLSamplepreprocess_dl_dataset 进行处理,预处理后的样本将存储于文件系统中,后续需通过 read_dl_samples 函数进行读取。
包含预处理后的图像,在训练和评估场景下还包含所有真实标注。根据模型类型不同,它可能包含以下条目:
DLSample
anomaly_ground_truth:AD, GC-AD
异常图像或区域,从 anomaly_file_name 读取。
格式: 图像或区域
anomaly_label:AD, GC-AD
图像级的真实异常标签(以 class_names 的形式呈现)。
格式: 字符串
anomaly_label_id:AD, GC-AD
图像级的真实异常标签 ID(以 class_ids 形式呈现)。
格式: 整数
bbox_label_id:OD
边界框内图像部分的真实标签(以 class_ids 的形式呈现)。
格式: 整数元组
bbox_row1:OD:r1 [4]真实边界框:左上角,行坐标。
格式: 实数元组
bbox_col1:OD:r1 [4]真实边界框:左上角,列坐标。
格式: 实数元组
bbox_row2:OD:r1 [4]真实边界框:右下角,行坐标。
格式: 实数元组
bbox_col2:OD:r1 [4]真实边界框:右下角,列坐标。
格式: 实数元组
bbox_row:OCR-D, OD:r2 [4]真实边界框:中心点,行坐标。
格式: 实数元组
bbox_col:OCR-D, OD:r2 [4]真实边界框:中心点,列坐标。
格式: 实数元组
bbox_phi:OCR-D, OD:r2 [4]真实边界框:角度φ。
格式: 实数元组
bbox_length1:OCR-D, OD:r2 [4]真实边界框:边长 1 的一半。
格式: 实数元组
bbox_length2:OCR-D, OD:r2 [4]真实边界框:边长 2 的一半。
格式: 实数元组
image:Any输入图像。
格式: 图像
image_label_id:CL
图像的真实标签(以 class_ids 的形式呈现)。
格式: 整数
mask:OD:is标记实例区域的真实掩膜。
格式: 区域元组
normals:3D-GPD二维映射(三通道图像).
格式: 图像
segmentation_image:SE, 3D-GPD
包含真实值分割结果的图像,从 segmentation_file_name 读取。
格式: 图像
weight_image:SE [5]带有像素权重的图像。
格式: 图像
target_orientation:OCR-D用于单词方向的方向目标图像。
格式: 图像
target_text:OCR-D用于字符检测的文本目标图像。
格式: 图像
target_link:OCR-D链接目标图像,用于将检测到的字符中心点连接至相连的单词。
格式: 图像
target_weight_orientation:OCR-D
相对于 target_orientation 的权重。
格式: 图像
target_weight_link:OCR-D
相对于 target_link 的权重。
格式: 图像
target_weight_text:OCR-D
相对于 target_text 的权重。
格式: 图像
word:OCR-D, OCR-R真实单词。
格式: 字符串
x:3D-GPDX 图像(数值需从左至右递增)。
格式: 图像
y:3D-GPDY 图像(数值需自上而下递增)。
格式: 图像
z:3D-GPDZ 图像(值需从靠近传感器的点向远点递增;例如当数据以相机坐标系给出时即属此类情况)。
格式: 图像
这些字典是通过执行函数 gen_dl_samples 后再执行 preprocess_dl_samples 生成的。例外情况是上表中标记的条目,[5]:由函数 gen_dl_segmentation_weights创建。[4]:使用的坐标:像素中心坐标,亚像素级精确坐标。
推理输入数据由单个 字典或此类字典的元组组成。与训练和评估不同,仅使用以下键:
DLSample
image:Any输入图像。
格式: 图像
normals:3D-GPD二维映射(三通道图像)。
格式: 图像
x:3D-GPDX 图像(数值需从左至右递增)。
格式: 图像
y:3D-GPDY 图像(数值需自上而下递增)。
格式: 图像
z:3D-GPDZ 图像(值需从靠近传感器的点向远点递增;例如当数据以相机坐标系给出时即属此类情况)。
格式: 图像
关于图像要求,请参阅下文“图像”小节中的更多信息。
对于推理阶段,可通过 gen_dl_samples_from_images 或
gen_dl_samples_3d_gripping_point_detection(仅限三维抓取点检测)函数创建仅包含图像数据的字典。这些字典可逐个传递,或通过元组 批量传递。
DLSampleBatch
训练输出数据存储在字典 中。其条目取决于模型,因此也取决于所使用的算子(更多信息请参阅对应算子的文档):
DLTrainResult
算子 返回
train_dl_model_batch
total_loss
模型中可能包含的其他损失
算子 返回
train_dl_model_anomaly_dataset
final_error
final_epoch
作为算子 的输出,模型将为每个样本返回一个名为 apply_dl_model 的字典。下图给出了示意图。评估基于这些结果和标注进行。评估结果存储在名为
DLResultEvaluationResult 的字典中。
| ( 1) | ( 2) |
DLSample 包含图像及其内容信息,该数据作为评估基础。为便于可视化, BatchSize 设置为 3(包含随机选取的样本i、j、k,详见上文),且仅记录少量条目。(2) 推理:DLSample 仅包含图像。这些字典可逐个传递,也可通过元组形式批量传递。
根据模型类型,字典 可包含以下条目:
DLResult
gripping_confidence:3D-GPD图像,包含场景中每个点的原始、未校准的置信度值。
格式: 图像
gripping_map:3D-GPD二进制图像,用于标记场景中每个像素点:模型是否预测该点为抓取点(像素值=1.0)或非抓取点(0.0)。
格式: 图像
anomaly_image:AD, GC-AD单通道图像,其灰度值为分数,表示输入图像中对应像素属于异常的可能性。
格式: 图像
anomaly_image_global:GC-AD
单通道图像,其灰度值为分数,表示输入图像中对应像素属于异常的可能性。由模型的 'global' 子网络计算得出。
格式: 图像
anomaly_image_local:GC-AD
单通道图像,其灰度值为分数,表示输入图像中对应像素属于异常的可能性。由模型的 'local' 子网络计算得出。
格式: 图像
anomaly_score:AD, GC-AD
基于 anomaly_image 计算的图像级异常分数。
格式: 实数
anomaly_score_local:GC-AD
基于 anomaly_image_local 计算的图像级异常分数。
格式: 实数
anomaly_score_global:GC-AD
基于 anomaly_image_global 计算的图像级异常分数。
格式: 实数
classification_class_ids:CL按置信度值排序的图像推断类IDs。
格式: 整数元组
classification_class_names:CL按置信度排序的图像推断类名。
格式: 字符串元组
classification_confidences:CL图像推理中各类别的置信度值。
格式: 实数元组
char_candidates:DO单词中每个字符的候选项及其置信度。
格式: 字典元组
word:OCR-R已识别单词。
格式: 字符串
score_maps:OCR-D以四通道图像形式呈现的分数:
字符分数:字符检测的分数。
连接分数:检测到的字符中心与相连单词连接的分数。
方向1:预测单词方向的正弦分量。
方向2:预测单词方向的余弦分量。
格式: 图像
words:OCR-D字典包含以下条目。其中,每个条目均为元组,对应每个检索到的单词(word)提供对应值。
row:定位单词:中心点,行坐标。
col:定位单词:中心点,列坐标。
phi:定位单词:角度φ。
length1:定位单词:边长 1 的一半。
length2:定位单词:边长 2 的一半。
line_index:若
'detection_sort_by_line' 设为 'true' 则为定位单词的行索引。
格式: 包含实数和字符串元组的字典
word_boxes_on_image:OCR-D
词典,其中包含在 image 中预处理图像坐标系上的单词定位信息。条目为元组形式,每个发现的单词都对应一个值。
row:定位单词:中心点,行坐标。
col:定位单词:中心点,列坐标。
phi:定位单词:角度φ。
length1:定位单词:边长 1 的一半。
length2:定位单词:边长 2 的一半。
格式: 包含实数元组的字典
word_boxes_on_score_maps:OCR-D
包含单词定位的字典,其坐标系基于放置在 score_maps 中的分数图像。条目与上述 word_boxes_on_image 相同。
格式: 包含实数元组的字典
bbox_class_id:OD
边界框的推断类别(以 class_ids的形式呈现)。
格式: 整数元组
bbox_class_name:OD边界框的推断类别名称。
格式: 字符串元组
bbox_confidence:OD边界框推理的置信度值。
格式: 实数元组
bbox_row1:OD:r1 [6]推断出的边界框:左上角,行坐标。
格式: 实数元组
bbox_col1:OD:r1 [6]推断出的边界框:左上角,列坐标。
格式: 实数元组
bbox_row2:OD:r1 [6]推断出的边界框:右下角,行坐标。
格式: 实数元组
bbox_col2:OD:r1 [6]推断出的边界框:右下角,列坐标。
格式: 实数元组
bbox_row:OD:r2 [6]推断出的边界框:中心点,行坐标。
格式: 实数元组
bbox_col:OD:r2 [6]推断出的边界框:中心点,列坐标。
格式: 实数元组
bbox_phi:OD:r2 [6]推断出的边界框:角度φ。
格式: 实数元组
bbox_length1:OD:r2 [6]推断出的边界框:边长 1 的一半。
格式: 实数元组
bbox_length2:OD:r2 [6]推断出的边界框:边长 2 的一半。
格式: 实数元组
mask:OD:is标记实例区域的推断掩模。
格式: 区域元组
mask_probs:OD:is带有推断出的掩模置信度的图像。
格式: 图像
segmentation_image:SE带有分割结果的图像。
格式: 图像
segmentation_confidence:SE带有分割结果置信度值的图像。
格式: 图像
[6]: 使用的坐标:像素中心坐标,亚像素级精确坐标。
关于输出值的进一步说明,请参阅相应方法的章节,例如 深度学习 / 语义分割与边缘提取。
无论应用场景如何,网络对图像都存在特定要求。具体数值取决于网络模型本身,可通过 算子查询。为满足这些要求,您可能需要对图像进行预处理。针对整个数据集(包括图像)的标准预处理流程已在 get_dl_model_parampreprocess_dl_samples 函数中实现。若需进行自定义预处理,该函数可为具体实现提供指导。
add_dl_pruning_batch添加深度学习剪枝批次apply_dl_model应用深度学习模型clear_dl_model清除深度学习模型create_dl_pruning创建深度学习剪枝(deserialize_dl_model反序列化深度学习模型gen_dl_model_heatmap生成深度学习模型热图gen_dl_pruned_model生成深度学习修剪模型get_dl_model_param获取深度学习模型参数(get_dl_pruning_param获取深度学习剪枝参数read_dl_model读取深度学习模型serialize_dl_model序列化深度学习模型set_dl_model_param设置深度学习模型参数set_dl_pruning_param设置深度学习剪枝参数train_dl_model_batch训练深度学习模型批次write_dl_model写入深度学习模型