Anomalib: A Deep Learning Library for Anomaly Detection
PDF:https://arxiv.org/pdf/2202.08341.pdf
代码:https://github.com/openvinotoolkit/anomalib
1 概述
Anomalib是一个专注于异常检测的深度学习库。它的目标是收集最新的异常检测算法,并提供用于在公共和私有数据集上进行基准测试的工具。该库提供了一系列已实现的异常检测算法,这些算法在最近的文献中有所描述。此外,Anomalib还提供了一套工具,方便开发人员开发和实现自定义模型。该库特别注重基于图像的异常检测,旨在识别数据集中的异常图像或图像中的异常像素区域。通过使用Anomalib,用户可以快速构建和评估各种异常检测算法,以满足其特定需求。
2 安装
Clone the Repository
git clone https://github.com/openvinotoolkit/anomalib.git
cd anomalib
2-1 Windows
Install the Packages
python -m pip install --upgrade pip wheel setuptools
pip install -r .[full]
2-2 Ubuntu
Install the Packages
python -m pip install --upgrade pip
pip install wheel setuptools
pip install -r requirements.txt
2-3 CentOS
Install the Packages
python -m pip install --upgrade pip
pip install -r requirements.txt
3 Training
每个模型都有自己的配置文件config.yaml,其中包含数据、模型和训练可配置参数。模型训练时需要指定配置文件。
python tools/train.py --config <path/to/model/config.yaml>
或者
python tools/train.py --model stfpm
4 Inference
推理相关参数
4-1 PyTorch (Lightning) Inference
python tools/inference/lightning.py --config padim.yaml --weights results/weights/model.ckpt --input image.png
更改推理时的阈值,只需将metrics.threshold.method为manual,并在metrics.threshold.manual_image和metrics.threshold.manual_pixel中指定自定义阈值。
threshold:
method: manual #options: [adaptive, manual]
manual_image: null
manual_pixel: null
4-2 OpenVINO Inference
OpenVINO IR导出时同时会生成 metadata.json文件,OpenVINO 推理时,需要一并指定。
python tools/inference/openvino.py --weights results/openvino/model.xml --input image.png --metadata results/openvino/metadata.json
4-3 Gradio Inference
python tools/inference/gradio_inference.py \
--weights ./results/padim/mvtec/bottle/weights/model.ckpt
或者
python python tools/inference/gradio_inference.py \
--weights ./results/padim/mvtec/bottle/openvino/openvino_model.onnx \
--metadata ./results/padim/mvtec/bottle/openvino/metadata.json
5 Export && Optimization
将以下配置添加到您的config.yaml文件中,在训练后,模型将导出为OpenVINO IR
optimization:
export_mode: openvino
如果只导出ONNX格式
optimization:
export_mode: onnx
Anomalib支持OpenVINO的神经网络压缩框架(NNCF),以进一步提高导出的OpenVINO模型的性能。NNCF在训练过程中优化异常模型的神经网络组件,因此可以实现比后训练方法更好的性能-准确性平衡。
要启用NNCF,请将以下配置添加到您的config.yaml文件中
optimization:
nncf:
apply: true
注意: 当前只有STFPM模型支持NNCF
6 Benchmarking
为了增加实验跟踪和优化的功能,Anomalib还包括了一个基准测试脚本,用于收集不同模型、参数和数据集类别组合的结果。模型的性能和吞吐量将被记录到一个CSV文件中,该文件也可以用作跟踪模型漂移的手段。
在CPU和GPU上计算了Padim和STFPM模型对自定义文件夹数据集的两个类别的吞吐量和性能指标的配置文件如下:
seed: 42
compute_openvino: false
hardware:
- cpu
- gpu
writer:
- comet
- wandb
- tensorboard
grid_search:
dataset:
category:
- colour
- crack
image_size: [128, 256]
model_name:
- padim
- stfpm
compute_openvino 是否使用openvino推理;
writer: [] 只记录csv文件,不记录日志;
使用自定义数据集
seed: 42
compute_openvino: false
hardware:
- cpu
- gpu
writer:
- comet
- wandb
- tensorboard
grid_search:
dataset:
name: hazelnut
format: folder
path: path/hazelnut_toy
normal_dir: good # name of the folder containing normal images.
abnormal_dir: colour # name of the folder containing abnormal images.
normal_test_dir: null
task: segmentation # classification or segmentation
mask: path/hazelnut_toy/mask/colour
extensions: .jpg
split_ratio: 0.2
category:
- colour
- crack
image_size: [128, 256]
model_name:
- padim
- stfpm
运行
python tools/benchmarking/benchmark.py --config <relative/absolute path>/<paramfile>.yaml
7 Logging
Anomalib提供了多种机制来记录指标和预测的掩码。
7-1 启用日志记录
启用单个
logging:
logger: "tensorboard"
或者启用多个
logging:
logger: [comet, tensorboard, wandb]
log_graph: false
7-2 记录图像
通过在可视化部分设置log_images: True,Anomalib允许您将预测结果保存到文件系统中。这将使您能够将预测结果保存为图像文件,以便后续分析和查看。
visualization:
show_images: False # show images on the screen
save_images: False # save images to the file system
log_images: True # log images to the available loggers (if any)
image_save_path: null # path to which images will be saved
mode: full # options: ["full", "simple"]
logging:
logger: [comet, tensorboard, wandb]
log_graph: false
7-3 记录模型图
在模型配置文件的logging参数下设置log_graph为True,您可以更轻松地将模型图记录到Comet、TensorBoard或Weights and Biases。
logging:
logger: [comet, tensorboard]
log_graph: true
8 Hyperparameter Optimization
默认配置的模型并不总能适用于新的数据集。此外,为了提高性能,需要调整/选择学习率、优化器、激活函数等,以确定最佳的超参数组合,Anomalib支持使用Comet或weights and biases进行超参数优化。
8-1 YAML 文件
在tools/hpo/configs/comet.yaml中提供了一个使用Comet进行超参数优化的示例配置文件,如下所示:
algorithm: "bayes"
spec:
maxCombo: 10
metric: "image_F1Score"
objective: "maximize"
parameters:
dataset:
category: capsule
image_size:
type: discrete
values: [128, 256]
model:
backbone:
type: categorical
values: ["resnet18", "wide_resnet50_2"]
其中 maxCombo定义要运行的实验总数。algorithm是要使用的优化方法。metric是用于评估模型性能的指标。parameters是要优化的超参数。更多参数配置需要参考 Comet文档 https://www.comet.com/docs/v2/api-and-sdk/python-sdk/introduction-optimizer/
在tools/hpo/configs/wandb.yaml中提供了一个使用Weights and Bias进行超参数优化的示例配置文件,如下所示:
observation_budget: 10
method: bayes
metric:
name: pixel_AUROC
goal: maximize
parameters:
dataset:
category: hazelnut
image_size:
values: [128, 256]
model:
backbone:
values: [resnet18, wide_resnet50_2]
其中observation_budget定义了要运行的实验总数。method是要使用的优化方法。metric是用于评估模型性能的指标。parameters是要优化的超参数。更多参数配置需要参考Weights and Bias文档 https://docs.wandb.ai/guides/sweeps
8-2 运行 HPO
python tools/hpo/sweep.py --model padim \
--model_config ./path_to_config.yaml \
--sweep_config tools/hpo/configs/comet.yaml
或者
python tools/hpo/sweep.py --sweep_config tools/hpo/configs/comet.yaml