本章阐述了如何运用基于深度学习的异常检测与全局上下文异常检测技术。
通过这两种方法,我们希望检测图像是否包含异常。异常指偏离常规的未知的事物。
异常检测或全局上下文异常检测模型学习无异常图像的共同特征。训练好的模型将推理输入图像仅包含已学习特征的可能性,或图像是否包含其他内容。后者将被解释为异常。该推理结果以灰度值图像形式呈现。图像中的像素值表明输入图像中对应像素出现异常的可能性。
我们区分两种可用的模型类型:
异常检测(模型类型为 'anomaly_detection')针对结构性异常,即任何在训练过程中未被学习到的特征。例如,这可能包括划痕、裂纹或污染物。
全局上下文异常检测(模型类型为 'gc_anomaly_detection')包含两个任务:
检测结构异常
如上所述,结构异常检测主要涉及未知特征,例如划痕、裂纹或污染物。
检测逻辑异常
当图像内容违反约束条件时,将检测到逻辑异常。例如,图像中物体的数量或位置错误均可能导致此类异常。
全局上下文异常检测模型由两个子网络组成。为提升运行时效率和降低内存消耗,该模型可简化为其中一个子网络。若单个子网络性能已足够出色,则建议采用此方案。具体操作请参阅 中的 get_dl_model_param'gc_anomaly_networks' 参数。设置 'gc_anomaly_networks' 参数后需重新评估模型,因其可能显著改变全局上下文异常检测的性能表现。
局部子网络
该子网络用于检测影响图像局部小范围的异常。其设计旨在识别结构性异常,同时也能发现逻辑异常。因此,若异常可通过分析图像的单个补丁来识别,则该异常将由模型的局部组件检测到。有关如何定义此子网络局部尺度的信息,请参阅 中 get_dl_model_param'patch_size' 的参数说明。
全局子网络
该子网络用于检测影响图像大范围或全局范围的异常。它旨在检测逻辑异常,但也能发现结构异常。因此,若识别异常需要观察图像的大部分或全部区域,则该异常将由模型的全局组件检测到。
| ( 1) | ( 2) |
| ( 3) | ( 4) |
在本段落中,我们将描述基于深度学习的异常检测或全局上下文异常检测任务的一般工作流程。
这一部分是关于如何对数据进行预处理。
您的数据集信息内容需要进行转换。 该操作通过以下函数实现:
read_dl_dataset_anomaly.
由此创建了一个名为 DLDataset 的字典,它作为数据库存储了关于数据的所有必要信息。有关数据及其传输方式的更多信息,请参阅下文的“数据”部分以及
深度学习 / 模型 一章。
将字典
DLDataset 表示的数据集进行拆分。可通过以下函数实现:
split_dl_dataset.
网络对图像提出了若干要求。这些要求(例如图像尺寸和灰度值范围)可以获取,通过算子
为此,您需要先使用
现在您可以对数据集进行预处理。为此,您可以使用以下函数:
preprocess_dl_dataset.
若需自定义预处理,本函数将提供实施指导。
要使用此函数,请指定预处理参数,例如图像尺寸。将所有参数及其值存储在字典 DLPreprocessParam 中,为此可使用函数
create_dl_preprocess_param。
我们建议保存此字典 DLPreprocessParam,以便在后续推理阶段能够访问预处理参数值。
本部分说明如何训练模型。
设置训练参数并将其存储在字典 TrainParam 中。可通过以下函数实现
create_dl_train_param。
训练模型。这可以通过以下函数实现:
train_dl_model。
该函数
通过调用 normalize_dl_gc_anomaly_features 函数,将 'gc_anomaly_detection' 类型的模型适配至数据集的图像统计特征,
并分别调用对应的训练算子
(train_dl_model_anomaly_dataset'anomaly_detection')
或 (train_dl_model_batch'gc_anomaly_detection')。
该函数需要:
模型句柄 DLModelHandle
包含数据信息的字典 DLDataset
包含训练参数的字典 TrainParam
对网络进行归一化处理。此步骤仅在使用全局上下文异常检测模型时需要执行。程序对异常分数进行归一化处理,需通过函数
normalize_dl_gc_anomaly_scores。
此操作旨在确保后续对异常分数设置阈值时能获得合理结果(详见下文“特定参数”部分)。
在本部分中,我们将评估训练好的模型。
设置可能影响评估的模型参数。
评估可以便捷完成,使用函数
evaluate_dl_model。
该函数需要一个包含评估参数的字典 GenParam。
字典 EvaluationResult 存储所需的评估指标。
本部分涵盖异常检测或全局上下文异常检测模型的应用。对于已训练的模型,请执行以下步骤:
请求模型对图像提出的要求,使用算子
或函数
create_dl_preprocess_param_from_model。
设置下文“模型参数”部分所述的模型参数, 使用算子
为每张图像生成一个数据字典DLSample。这通过以下函数实现:
gen_dl_samples_from_images。
每张图像都必须采用与训练相同的预处理方式。为此,您可以使用以下函数:
preprocess_dl_samples。
在预处理步骤中保存字典 DLPreprocessParam 后,可直接将其作为输入来指定所有参数值。
应用模型,使用算子
从字典 DLResult 中检索结果。
我们将用于训练、评估和对新图像进行推理的数据区分开来。
作为基础概念,该模型通过字典处理数据,即它从字典 DLSample 接收输入数据,并分别返回字典 DLResult 和 DLTrainResult。有关数据处理的更多信息,请参阅章节 深度学习 / 模型。
在异常检测和全局上下文异常检测中,恰好存在两类:
'ok',即无异常,类 ID 为0。
'nok',表示存在异常值,类 ID 为1
(对于ID >0 的像素值,请参见下文小节“评估数据”)。
这些类既适用于整个图像,也适用于单个像素。
该数据集仅包含无异常图像及其对应信息,且必须以模型可处理的形式提供。关于图像要求,请参阅下文“图像”部分获取更多信息。
训练数据用于针对特定任务训练模型。借助这些数据,模型能够学习无异常图像共有的特征。
该数据集应包含无异常的图像,但也可能包含异常图像。数据集中的每张图像都需要一个真实标签 image_label,用于指定图像类别(参见上文)。该标签表明图像是否显示异常('nok')或无异常('ok')。
若 字典中包含图像异常文件名(DLSampleanomaly_file_name),则可通过像素级别直观评估模型在异常检测方面的性能。该图像 anomaly_file_name 中每个像素均对应类别ID,因此若输入图像中对应像素值大于 0 则表示异常,等于 0 则表示正常。
| ( 1) | ( 2) |
anomaly_file_name 示意图。为增强可视性,采用灰色值表示数值。(1) 输入图像。(2) 对应的 anomaly_file_name 提供类别标注:0:'ok'(正常,白色和浅灰色),
2:'nok'(异常,深灰色)。
该模型对图像提出了要求,例如尺寸、灰度值范围和类型。具体数值取决于模型本身。不同模型的具体参数值请参阅 文档。对于已读取的模型,可通过 read_dl_model 查询参数。为满足这些要求,您可能需要对图像进行预处理。针对完整样本(含图像)的标准预处理流程已在 get_dl_model_parampreprocess_dl_samples 中实现。若需自定义预处理,该函数可为实现提供指导。
训练输出因所用模型类型而异:
异常检测:作为训练输出,算子
将返回一个字典 train_dl_model_anomaly_dataset,其中包含训练过程中获得的最佳误差值以及达到该误差值的训练周期 epoch。DLTrainResult
全局上下文异常检测:作为训练输出,算子
将返回一个字典 train_dl_model_batch,其中包含总损失的当前值以及模型中所有其他损失的值。
DLTrainResult
作为推理和评估输出,模型将为每个样本返回一个名为
的字典。对于异常检测和全局上下文异常检测,该字典包含以下额外条目:
DLResult
anomaly_score:该分数反映整张图像包含异常的可能性。该分数基于 anomaly_image 中给定的像素分数计算得出。
对于全局上下文异常检测,根据所使用的子网络,异常分数也可仅通过局部子网络(anomaly_score_local)和全局子网络(anomaly_score_global)进行计算。
anomaly_image:一张图像,其中每个像素的值表示其对应输入图像像素出现异常的可能性(见下图)。异常检测的数值范围为
而全局上下文异常检测则无此限制。根据所用子网络的不同,采用全局上下文异常检测时,异常图像也可仅通过局部子网络(anomaly_image_local)或全局子网络(anomaly_image_global)单独计算得出。
| ( 1) | ( 2) |
anomaly_image 示意图。为便于可视化,采用灰度值表示数值。(1) 提供类别标注的 anomaly_file_name,
0:'ok'(白色和浅灰色),
2:'nok' (深灰色)(2) 对应的 anomaly_image。
对于异常检测或全局上下文异常检测模型,模型参数及超参数均通过
进行设置。模型参数的详细说明请参见
set_dl_model_param。由于异常检测模型的训练采用全数据集一次性处理而非批次处理,因此某些参数(如 get_dl_model_param'batch_size_multiplier')对其效果无影响。
该模型返回分数值,但不会对像素或图像进行异常与否的分类。要实现此分类功能,需设定阈值以确定像素或图像被视为异常的最低分数阈值。可通过 compute_dl_anomaly_thresholds 函数估算可能的阈值。应用这些阈值可使用 threshold_dl_anomaly_results 函数。该函数会将以下(取决于阈值的)条目添加到样本的 字典中:
DLResult
anomaly_class
整个图像的预测类别(针对给定阈值)。对于全局上下文异常检测,根据所使用的子网络,异常类别也可仅通过局部子网络(anomaly_class_local)和全局子网络(anomaly_class_global)计算得出。
anomaly_class_id
整个图像的预测类别 ID(针对给定阈值)。对于全局上下文异常检测,根据所使用的子网络,异常类别 ID 也可仅通过局部子网络(anomaly_class_id_local)和全局子网络(anomaly_class_id_global)计算得出。
anomaly_region
异常区域由所有被视为显示异常的像素组成(具体阈值见下图)。对于全局上下文异常检测,根据所使用的子网络,异常区域也可仅通过局部子网络(anomaly_region_local)和全局子网络(anomaly_region_global)进行计算。
| ( 1) | ( 2) |
anomaly_region 示意图。为便于可视化,采用灰度值表示数值。(1) 带有获取像素分数的 anomaly_image 。(2) 对应的 anomaly_region。
train_dl_model_anomaly_dataset训练深度学习模型异常数据集