HALCON 20.11:深度学习笔记(9)
HALCON 20.11.0.0中,实现了深度学习方法。
本章解释了如何使用基于深度学习的异常检测。
通过异常检测,我们想要检测图像是否包含异常。异常指的是偏离常规的、未知的东西。
异常检测的例子:输入图像的每个像素都被分配了一个值,该值表明该像素是异常的可能性有多大。
蠕虫不是模型在训练中看到的无虫苹果的一部分,因此它的像素得到了更高的分数。
一个异常检测模型学习没有异常的图像的共同特征。训练后的模型将推断出输入图像只包含学习过的特征的可能性有多大,还是该图像包含不同的东西。后一个被解释为异常。此推理结果作为灰度图像返回。其中的像素值表示输入图像像素中相应像素显示异常的可能性有多大。
一般工作流程
在本节中,我们描述了基于深度学习的异常检测任务的一般流程。
预处理数据
这一部分是关于如何预处理数据的。
- 需要转换数据集的信息内容。这是通过函数read_dl_dataset_anomaly来完成的。它创建了一个字典DLDataset,它充当一个数据库,存储关于您的数据的所有必要信息。要了解更多关于数据及其传输方式的信息,请参阅下面的“数据”一节和深度学习/模型一章。
- 拆分字典DLDataset表示的数据集。这可以使用函数split_dl_dataset来完成。
- 网络对图像有几个要求。可以使用函数get_dl_model_param检索这些需求(例如图像大小和灰度值范围)。为此,您需要首先通过函数read_dl_model读取模型。
- 现在可以对数据集进行预处理了。为此,您可以使用该函数preprocess_dl_dataset。对于自定义预处理,本函数提供了实现的指导。要使用这个函数,请指定预处理参数,例如,图像的大小。将所有参数及其值存储在DLPreprocessParam字典中,您可以使用该函数create_dl_preprocess_param。我们建议保存这个字典DLPreprocessParam,以便稍后在推理阶段访问预处理参数值。
模型训练
本节说明如何训练一个DL异常检测模型。
- 设置训练参数并将它们存储在字典TrainingParam中。这可以使用函数create_dl_train_param来完成。
- 训练模型。这可以使用函数train_dl_model来完成。这个过程预计:
模型处理DLModelHandle;
字典DLDataset包含数据信息;
包含训练参数的字典TrainParam。
评估训练模型
本节说明如何评估异常检测模型。
- 设置可能影响评价的模型参数。
- 使用该函数evaluate_dl_model可方便地进行评价。该函数需要一个包含求值参数的字典GenParamEval。
- 字典评估结果包含期望的评估措施。
推理新图像
本节将介绍DL异常检测模型的应用。对于一个训练过的模型,执行以下步骤:
- 使用操作符get_dl_model_param或函数create_dl_preprocess_param_from_model请求模型对图像施加的要求;
- 使用操作符set_dl_model_param设置“模型参数”一节中描述的模型参数;
- 使用函数gen_dl_samples_from_images为每个图像生成一个数据字典DLSample;
- 每个图像都必须像训练一样使用函数preprocess_dl_samples进行预处理。当您在预处理步骤中保存DLPreprocessParam字典时,您可以直接使用它作为输入来指定所有参数值;
- 使用函数apply_dl_model应用模型;
- 从字典'DLResult'中检索结果。
数据
我们区分用于训练、评估和推断新图像的数据。
作为一个基本概念,模型通过字典处理数据,这意味着它从字典DLSample接收输入数据,并分别返回字典DLResult和DLTrainResult。关于数据处理的更多信息可以在深度学习/模型一章中找到。
类
在异常检测中有两类:
- 'ok'表示没有异常,类ID 0。
- 'nok',表示异常,类ID 1(关于像素值ID > 0,请参阅下面的小节“用于评估的数据”)。
这些类适用于整个图像以及单个像素。
训练数据
该数据集仅包含无异常的图像和相应的信息。必须以模型能够处理它们的方式提供它们。关于图像要求,请在下面的“图像”部分找到更多信息。训练数据用于训练特定任务的模型。有了这些数据的帮助,模型可以学习没有异常的图像有什么共同的特征。
评估数据
这个数据集应该包含没有异常的图像,但它也可以包含有异常的图像。这个集合中的每个图像都需要一个ground truth标签image_label来指定图像的类(请参阅上面的小节)。这表示图像是否显示异常('nok')或不显示异常('ok')。
如果DLSample字典中包含一个anomaly_file_name 图像,那么也可以在像素级别上可视化地评估模型在发现异常方面的性能。在这个图像中,每个像素都表示类ID,输入图像中的对应像素显示异常(像素值>0)或否(像素值=0)。
Scheme of anomaly_file_name. For visibility, gray values are used to represent numbers.
(1) Input image.
(2) The corresponding anomaly_file_name providing the class annotations, 0: 'ok' (white and light gray), 2: 'nok' (dark gray).
图像
模型对图像提出要求,比如尺寸、灰度值范围和类型。具体的值取决于模型本身。有关不同模型的具体值,请参阅read_dl_model文档。对于一个读取模型,它们可以用get_dl_model_param查询。为了满足这些要求,您可能必须对您的图像进行预处理。整个样本(包括图像)的标准预处理在preprocess_dl_samples中实现。在定制预处理的情况下,这些函数提供了实现的指导。
模型输出
作为训练输出,操作符train_dl_model_anomaly_dataset将返回一个字典DLTrainResult,其中包含在训练期间接收到的最佳错误以及出现此错误的时间。
作为推理和评估输出,模型将为每个样本返回一个字典DLResult。对于异常检测,本词典包括以下额外条目:
anomaly_score:表示整个图像包含异常的可能性的分数。这个分数是基于在anomaly_image中给出的像素分数。
anomaly_image:一幅图像,其中每个像素的值表示输入图像中对应像素显示异常的可能性有多大(参见下面的插图)。这些值∈[0, 1]。
Scheme of anomaly_image. For visualization purpose, gray values are used to represent numbers.
(1) The anomaly_file_name providing the class annotations, 0: 'ok’ (white and light gray), 2: 'nok’ (dark gray)
(2)The corresponding anomaly_image.
特殊参数
对于异常检测模型,使用set_dl_model_param设置模型参数和超参数。模型参数在get_dl_model_param中有更详细的解释。由于训练是利用完整的数据集一次完成的,而不是按批处理的,某些参数,如“batch_size_multiplier”没有影响。
该模型返回分数,但不会将像素和图像分类为是否显示异常。对于这种分类,需要设定阈值,将像素或图像视为异常的最低分值。您可以使用函数compute_dl_anomaly_threshold估计可能的阈值。可以通过函数threshold_dl_anomaly_results来应用这些阈值。作为结果,该函数将以下(取决于阈值)项添加到示例的DLResult字典中:
- anomaly_class:整个图像的预测类(对于给定阈值)。
- anomaly_class_id:整个图像的预测类的ID(对于给定阈值)。
- anomaly_region:由所有被认为显示异常的像素组成的区域(对于给定的阈值,请参阅下面的插图)。
Scheme of anomaly_region. For visualization purpose, gray values are used to represent numbers.
(1) The anomaly_image with the obtained pixel scores.
(2) The corresponding anomaly_region