在工业生产中,质量保证是至关重要的,因为生产中的细小缺陷可能导致产品不合格,甚至损害消费者和企业的利益。工业异常检测是一项关键任务,旨在从大规模的生产数据中可靠地检测出异常情况,这些异常可能是缺陷、故障或其他不正常情况。以下是关于工业异常检测的更多详细内容:
在工业生产中,产品和生产过程通常受到监控和控制,以确保产品质量和生产效率。然而,由于各种因素,例如材料变异、设备故障、操作误差等,仍然存在生产过程中的异常情况。这些异常可能包括产品中的缺陷、生产线中的故障、异常的工艺参数,以及其他与正常生产不符的情况。
工业异常检测面临多种挑战,这些挑战在很大程度上区分它与传统监督学习问题的不同之处:
异常,又被称为离群值,是一个在数据挖掘领域中常见的概念,已经有不少的工作尝试对异常数据进行定义。一般情况下,会将常见的异常样本分为3个类:点异常、上下文异常和集群异常。
图像数据中每一个像素点上的像素值就对应着一个观测结果,由于图像内像素值的多样性,仅仅分析某一个点的像素值很难判断其是否属于异常.所以在大部分图像异常检测任务中,需要联合分析图像背景以及周国像素信息来进行分类,检测的异常也大多属于上下文或者模式异常:当然,这种异常类型之间并没有非常严格的界限 例如,有一部分方法就提取图像的各类特征,并将其与正常图像的特征进行比较以判断是否属于异常,这就将原始图像空间内模式异常的检测转专换到了特征空间内点异常的检测。
图像异常检测任务根据异常的形态可以分为定性异常的分类和定量异常的定位两个类别。
一般情况下图像异常检测的目标是通过无监督或者半监督学习的方式,检测与正常图像不同的异常图像或者局部异常区域,近年来传统机器学习方法已经在图像异常检测领域有了较多的应用,而随着深度学习技术的发展,越来越多的方法尝试结合神经网络来实见图像异常检测。根据在模型构建阶段有无神经网络的参与,现有的图像异常检测方法可以分为基于传统方法和基于深度学习的方法两大类别。
如下图了所示,基于传统方法的异常检测技术大致包含6个类别:
而基于深度学习的方法大致包含4个类别:
为了解决图像异常检测上的问题,这里介绍无监督学习的一种方法。无监督学习采用深度学习技术,如卷积神经网络(CNN)、生成对抗网络(GAN)和自动编码器(AE)等,以进行无监督的异常检测和定位。这些方法通常利用深度学习模型来学习数据的表示,并使用这些表示来计算异常分数或执行像素级异常定位。它们属于基于深度学习的异常检测方法中的一部分。
无监督图像异常检测和定位方法从方法上可以分为判别方法和生成方法。下面将对其中一些算法进行更详细的介绍
判别方法:
生成方法:
那如何更快上手使用这么多算法呢,这里介绍一个python异常检测库anomalib
github:https://github.com/openvinotoolkit/anomalib
Anomalib 是一个深度学习库,旨在收集最先进的异常检测算法,以便在公共和私有数据集上进行基准测试。Anomalib 提供了近期文献中描述的异常检测算法的几种即用型实现,以及一套便于开发和实现自定义模型的工具。该库重点关注基于图像的异常检测,算法的目标是识别异常图像或数据集中图像的异常像素区域。
这是一个有关"anomalib"库的安装和使用的教程
你可以通过使用pip轻松开始使用anomalib。
pip install anomalib
强烈建议在安装anomalib时使用虚拟环境。例如,使用Anaconda,可以按以下方式安装anomalib:
yes | conda create -n anomalib_env python=3.10
conda activate anomalib_env
git clone https://github.com/openvinotoolkit/anomalib.git
cd anomalib
pip install -e .
默认情况下,python tools/train.py 在MVTec AD(CC BY-NC-SA 4.0)数据集的leather类上运行PADIM模型。
python tools/train.py # 在MVTec AD的leather上训练PADIM
在特定数据集和类别上训练模型需要进一步配置。每个模型都有其自己的配置文件config.yaml,其中包含了数据、模型和训练可配置参数。要在特定数据集和类别上训练特定模型,需要提供相应的配置文件:
python tools/train.py --config <path/to/model/config.yaml>
例如,要训练PADIM,可以使用以下命令:
python tools/train.py --config src/anomalib/models/padim/config.yaml
或者,也可以提供模型名称作为参数,脚本会自动找到相应的配置文件。
python tools/train.py --model padim
目前可提供的模型:
预训练的骨干模型来自PyTorch图像模型(timm),它们由FeatureExtractor包装。
配置骨干模型可以在配置文件中设置,以下是两个示例:
model:
name: cflow
backbone: wide_resnet50_2
pre_trained: true
也可以在自定义文件夹数据集上进行训练。为此,需要修改config.yaml文件的数据部分,如下所示:
dataset:
name: -of-the-dataset>
format: folder
path: >
normal_dir: normal # name of the folder containing normal images.
abnormal_dir: abnormal # name of the folder containing abnormal images.
normal_test_dir: null # name of the folder containing normal test images.
task: segmentation # classification or segmentation
mask: > #optional
extensions: null
split_ratio: 0.2 # ratio of the normal images that will be used to create a test split
image_size: 256
train_batch_size: 32
test_batch_size: 32
num_workers: 8
normalization: imagenet # data distribution to which the images will be normalized: [none, imagenet]
test_split_mode: from_dir # options: [from_dir, synthetic]
val_split_mode: same_as_test # options: [same_as_test, from_test, sythetic]
val_split_ratio: 0.5 # fraction of train/test images held out for validation (usage depends on val_split_mode)
transform_config:
train: null
val: null
create_validation_set: true
tiling:
apply: false
tile_size: null
stride: null
remove_border_count: 0
use_random_tiling: False
random_tile_count: 16
通过将上述配置放置到config.yaml文件的数据部分,模型将在自定义数据集上进行训练。
Anomalib包括多个推理脚本,包括Torch、Lightning、Gradio和OpenVINO推理器,用于使用训练/导出的模型执行推理。在这一部分,我们将介绍如何使用这些脚本进行推理。
# 要获得有关参数的帮助,请运行:
python tools/inference/torch_inference.py --help
# 示例Torch推理命令:
python tools/inference/torch_inference.py \
--weights results/padim/mvtec/bottle/run/weights/torch/model.pt \
--input datasets/MVTec/bottle/test/broken_large/000.png \
--output results/padim/mvtec/bottle/images
# 要获得有关参数的帮助,请运行:
python tools/inference/lightning_inference.py --help
# 示例Lightning推理命令:
python tools/inference/lightning_inference.py \
--config src/anomalib/models/padim/config.yaml \
--weights results/padim/mvtec/bottle/run/weights/model.ckpt \
--input datasets/MVTec/bottle/test/broken_large/000.png \
--output results/padim/mvtec/bottle/images
要运行OpenVINO推理,您需要首先将PyTorch模型导出到OpenVINO模型中。确保在相应的模型config.yaml文件中设置export_mode为"openvino"。
# 示例OpenVINO配置文件config.yaml
optimization:
export_mode: "openvino" # 选项: openvino, onnx
# 要获得有关参数的帮助,请运行:
python tools/inference/openvino_inference.py --help
# 示例OpenVINO推理命令:
python tools/inference/openvino_inference.py \
--weights results/padim/mvtec/bottle/run/openvino/model.bin \
--metadata results/padim/mvtec/bottle/run/openvino/metadata.json \
--input datasets/MVTec/bottle/test/broken_large/000.png \
--output results/padim/mvtec/bottle/images
确保在需要正确应用标准化时提供metadata.json路径。
使用Gradio推理与训练模型交互,使用用户界面。有关更多详情,请参阅我们的指南。
# 要获得有关参数的帮助,请运行:
python tools/inference/gradio_inference.py --help
# 示例Gradio推理命令:
python tools/inference/gradio_inference.py \
--weights results/padim/mvtec/bottle/run/weights/model.ckpt \
--metadata results/padim/mvtec/bottle/run/openvino/metadata.json \ # 可选
--share # 可选,用于共享UI
要运行超参数优化,请使用以下命令:
python tools/hpo/sweep.py \
--model padim --model_config ./path_to_config.yaml \
--sweep_config tools/hpo/sweep.yaml
要收集各种基准测试数据,如跨类别的吞吐量,使用以下命令:
python tools/benchmarking/benchmark.py \
--config /.yaml
Anomalib与各种实验追踪库集成,如Comet、tensorboard和wandb,通过PyTorch Lightning日志记录器。
以下是如何启用超参数、指标、模型图以及在测试数据集中的图像预测的日志示例:
visualization:
log_images: True # log images to the available loggers (if any)
mode: full # options: ["full", "simple"]
logging:
logger: [comet, tensorboard, wandb]
log_graph: True