anomalib 图像异常检测模型完全指南:从图像数据集到视频帧化迁移
【免费下载链接】anomalibAn anomaly detection library comprising state-of-the-art algorithms and features such as experiment management, hyper-parameter optimization, and edge inference.项目地址: https://gitcode.com/GitHub_Trending/an/anomalib
本文是 anomalib 图像模型子包(anomalib.models.image)的实战技术指南。该子包汇聚了 anomalib 全部 29 种图像级异常检测算法,覆盖分类、检测、分割三类任务,并且可以直接复用同一套模型处理视频数据——只需将视频数据集转换为帧级图像数据集。读完本文,你将掌握 anomalib 图像模型的完整清单与任务划分、基于Engine的统一训练/推理范式,以及用clip_length_in_frames=1将 Avenue 等视频数据集"帧化"后套用图像模型训练的具体方案,并了解 EfficientAD 等代表模型的底层实现细节与关键参数。
一、子包定位:anomalib 的图像模型家族
src/anomalib/models/image/README.md明确了该子包的核心职责:包含处理图像数据集的模型。具体而言,它提供两类能力:
- 定义图像异常模型的类与函数(所有模型均继承自
AnomalibModule); - 覆盖图像级异常分类(classification)、检测(detection)、分割(segmentation)任务的模型实现。
从源码入口 src/anomalib/models/image/init.py 可以看到,该子包目前导出了 29 个图像模型,按技术路线可大致归类:
| 技术路线 | 模型 |
|---|---|
| 基于预训练特征/存储库(Memory Bank) | PaDiM、PatchCore、AnomalyDINO |
| 基于分布建模/密度估计 | DFM、DFKDE、Cflow、CSFlow、FastFlow、PatchFlow、UFlow |
| 基于重建误差 | DRAEM、DSR、Dinomaly、GANomaly、FRE、Reverse Distillation、InpFormer、SuperSimpleNet、CFM |
| 基于蒸馏(教师-学生) | STFPM、EfficientAD、UniNet、GeneralAD、CFA、L2BT |
| 基于视觉语言模型(零样本/少样本) | WinCLIP、VLM-AD、AnomalyVFM、Glass |
| 有监督异常检测 | SuperADD |
同时在顶层 src/anomalib/models/init.py 中,所有图像模型与 AI-VAD、FUVAS 两个视频模型一起对外导出,并提供了两个实用函数:
list_models(case="snake" | "pascal" | "title"):返回当前所有可用模型名,支持 snake_case(如efficient_ad)、PascalCase(如EfficientAd)和标题格式三种形式;get_model(model, *args, **kwargs):按名称字符串、字典、DictConfig或Namespace实例化模型,例如get_model("padim")或get_model({"class_path": "Patchcore"}, num_neighbors=10)。
get_model内部通过AnomalibModule.__subclasses__()反射查找模型类(见 src/anomalib/models/init.py),并对动态导入做了白名单安全限制(仅允许anomalib.models、anomalib.models.image、anomalib.models.video、anomalib.models.components四个模块)。这意味着你可以用统一的工厂函数在代码或配置文件里切换任意模型。
二、统一训练范式:Data + Model + Engine
anomalib 的模型使用方式高度统一:任何图像模型都可以直接配合anomalib.data中对应的 DataModule 与anomalib.engine.Engine使用。以 EfficientAD 在 Visa 图像数据集上的训练为例,原文档给出了最小可用代码:
# Import the necessary modules from anomalib.data import Visa from anomalib.models import EfficientAD from anomalib.engine import Engine # Load the ViSA dataset, model and engine. datamodule = Visa() model = EfficientAD() engine = Engine() # Train the model engine.train(model, datamodule)VisaDataModule 对应配置文件见 examples/configs/data/visa.yaml,其默认参数包括:
class_path: anomalib.data.Visa init_args: root: "./datasets/visa" category: "capsules" # VisA 数据集的子类目录 train_batch_size: 32 eval_batch_size: 32 num_workers: 8 test_split_mode: from_dir # 从目录结构划分测试集 test_split_ratio: 0.2 val_split_mode: same_as_test val_split_ratio: 0.5 seed: null其中category指定 VisA 数据集中的具体缺陷类别,训练时按类别逐个进行;train_batch_size/eval_batch_size分别控制训练与评估批大小。CLI 等价写法为:
anomalib train --model EfficientAd --data anomalib.data.VisA --data.category <category> --data.train_batch_size 1注意:EfficientAD 的训练强制要求
train_batch_size=1(详见下文第五节),CLI 示例中的--data.train_batch_size 1是必要的。
三、图像模型处理视频数据:帧化(Frame-based)方案
原文档特别指出:anomalib.models.image中的模型同样可以处理视频数据集,方法是把视频数据集转换为帧级(frame-based)图像数据集。这样同一套图像模型与训练技术就能直接迁移到视频异常检测场景。
在代码层面,这一能力的载体是视频数据集/DataModule 中的clip_length_in_frames参数。以 Avenue(CUHK Avenue)视频数据集为例,当clip_length_in_frames=1时,每个 clip 只包含一帧,视频数据集在采样时便退化为按帧组织的图像数据集。
原文档给出的完整示例:
# Import the necessary modules from anomalib.data import Avenue from anomalib.models import EfficientAD from anomalib.engine import Engine # Load the folder, model and engine. # Set the clip_length_in_frames to 1 to convert the video dataset to a # frame-based image dataset. datamodule = Avenue(clip_length_in_frames=1) model = EfficientAD() engine = Engine() # Train the model engine.train(model, datamodule)对应的 YAML 配置示例见 examples/configs/data/avenue.yaml:
class_path: anomalib.data.Avenue init_args: root: ./datasets/avenue gt_dir: ./datasets/avenue/masks clip_length_in_frames: 1 # 关键:将视频转为帧级图像数据集 frames_between_clips: 1 # 相邻 clip 之间间隔的帧数 target_frame: last # 取 clip 中哪一帧的标注作为真值 train_batch_size: 32 eval_batch_size: 32 num_workers: 8 val_split_mode: from_test val_split_ratio: 0.5 seed: null帧化背后的源码机制
从 src/anomalib/data/datasets/base/video.py 看,AnomalibVideoDataset接受clip_length_in_frames、frames_between_clips与target_frame三个核心参数:
clip_length_in_frames:每个 clip 包含的连续帧数;frames_between_clips:相邻 clip 之间的帧间隔;target_frame:取 clip 中哪一帧作为真值来源,可选first、last、mid(VideoTargetFrame枚举定义见同一文件 src/anomalib/data/datasets/base/video.py)。
关键逻辑在__getitem__中(src/anomalib/data/datasets/base/video.py):
# squeeze temporal dimensions in case clip length is 1 item.image = item.image.squeeze(0)当clip_length_in_frames=1时,clip 的时间维度被直接压缩(squeeze),输出的image张量形状与普通图像数据集完全一致([C, H, W]),因此图像模型可以零改动地消费这批数据。而当clip_length_in_frames > 1且target_frame != ALL时,则会通过_select_targets(src/anomalib/data/datasets/base/video.py)只保留目标帧的标注、原图与帧号,供多帧模型使用。
此外,视频 DataModule 的基类 src/anomalib/data/datamodules/base/video.py 明确了两点限制:视频数据集不支持动态测试集划分(帧间存在时序依赖,测试集通常由数据集预定义),也不支持SYNTHETIC验证集划分模式,配置时需注意避开val_split_mode: synthetic。
以 Avenue 数据模块为例(src/anomalib/data/datamodules/video/avenue.py),Avenue继承自AnomalibVideoDataModule,除上述参数外还支持root(数据根目录,默认./datasets/avenue)与gt_dir(真值目录)。prepare_data()在数据缺失时会自动下载 Avenue 数据集与标注,并将.mat格式的真值掩码批量转换为.png文件以加速加载(见 src/anomalib/data/datamodules/video/avenue.py)。
四、EfficientAD:图像分割模型的代表性实现
原文档的两个示例均以 EfficientAD 为模型,因此有必要深入其实现。EfficientAD 的论文为EfficientAD: Accurate Visual Anomaly Detection at Millisecond-Level Latencies(arXiv 2303.14535),模型类型为分割(Segmentation),实现位于 src/anomalib/models/image/efficient_ad。
4.1 架构:教师-学生-自编码器三重结构
从 src/anomalib/models/image/efficient_ad/lightning_model.py 与 src/anomalib/models/image/efficient_ad/README.md 可以确认其核心设计:
- 特征提取:从预训练的 EfficientNet 教师网络提取特征,用于训练轻量学生网络与自编码器;
- 局部异常:通过教师-学生网络的特征差异(teacher-student discrepancy)检测;
- 全局异常:通过学生网络-自编码器的差异(student-autoencoder discrepancy)检测;
- 防塌缩技巧:为防止学生网络在异常样本上模仿教师,损失函数中额外引入 ImageNet 图像(实现中具体使用 ImageNette 子集,见下文)作为正则项。
4.2 关键构造参数
EfficientAd的构造函数(src/anomalib/models/image/efficient_ad/lightning_model.py)参数如下:
| 参数 | 默认值 | 说明 |
|---|---|---|
imagenet_dir | ./datasets/imagenette | ImageNette 数据集目录,用于学生网络的防模仿训练,缺失时自动下载 |
teacher_out_channels | 384 | 教师网络卷积输出通道数 |
model_size | S | 模型尺寸,EfficientAdModelSize枚举,可选 S / M |
lr | 0.0001 | Adam 优化器学习率 |
weight_decay | 0.00001 | Adam 优化器权重衰减 |
padding | False | 卷积层是否使用 padding |
pad_maps | True | 当padding=False时,是否将输出的异常图补齐到与padding=True一致的尺寸 |
pre_processor/post_processor/evaluator/visualizer | True | 是否启用对应的预处理、后处理、评估器与可视化组件 |
4.3 训练时的硬性约束
on_train_start钩子(src/anomalib/models/image/efficient_ad/lightning_model.py)对训练做了两处强制校验:
train_batch_size必须为 1:否则抛出ValueError("train_batch_size for EfficientAd should be 1.")。原因在于 EfficientAD 论文中 ImageNette 数据加载器即采用 batch size 1;- 预处理变换中不能包含
Normalize:ImageNet 归一化在模型前向传播内部完成,若预处理阶段重复归一化会报错。
训练启动时还会依次执行:下载并加载预训练教师网络权重(prepare_pretrained_model,权重来自 anomalib 官方 Release)、准备 ImageNette 数据集与变换(prepare_imagenette_data,包含双倍尺寸 Resize、30% 概率随机灰度化、CenterCrop 与 ToTensor)、在全量训练集上计算教师特征图的通道级均值/标准差(teacher_channel_mean_std)用于特征归一化。优化器使用 Adam,并配套 StepLR 调度器,在训练步数到达 95% 时将学习率衰减为 0.1 倍(见 src/anomalib/models/image/efficient_ad/lightning_model.py)。
验证阶段则在验证集仅用正常样本计算学生网络与自编码器异常图的 90% 与 99.5% 分位数(map_norm_quantiles),用于后续异常分数归一化(见 src/anomalib/models/image/efficient_ad/lightning_model.py)。
4.4 MVTec AD 基准表现(仓库记录)
src/anomalib/models/image/efficient_ad/README.md 记录了 EfficientAD 在 MVTec AD 数据集上的基准结果(seed=42),可作为选型参考:
Image-Level AUC:EfficientAD-S 平均 0.982,EfficientAD-M 平均 0.975;Image F1 Score:EfficientAD-S 平均 0.970,EfficientAD-M 平均 0.966。
其中 EfficientAD-S 在 Grid、Bottle 等类别上达到 1.000 的 AUC。这些数据来自仓库自带文档,可作为同一代码库内的复现基准。
五、实战小结与选型建议
综合原文档与源码,可以总结出三条可直接落地的实践要点:
- 图像任务的统一入口:任意图像模型均可通过
anomalib.data的 DataModule +anomalib.engine.Engine完成训练与推理,模型之间可通过get_model/list_models或配置文件的class_path无感切换;CLI 下则使用anomalib train --model <ModelName> --data <DataModule> [--data.xxx ...]。 - 视频任务的"帧化"迁移:给视频 DataModule(如
Avenue、ShanghaiTech、UCSDped,见 src/anomalib/data/datamodules/video)传入clip_length_in_frames=1,即可把视频数据集转换为图像模型可直接消费的帧级数据;同时注意视频数据模块不支持动态测试集划分与SYNTHETIC验证集模式。 - 模型参数按需定制:如 EfficientAD 的
model_size(S/M)、lr、teacher_out_channels等均可作为构造参数传入;EfficientAD 特殊之处在于强制train_batch_size=1且禁用预处理中的Normalize,迁移到自定义数据集时务必遵守这两条约束,否则会在训练启动时直接报错。
如需进一步了解某个具体模型的架构细节,可继续阅读 src/anomalib/models/image 下各模型目录内的README.md与lightning_model.py;各模型对应的完整训练配置样例位于 examples/configs/model,可直接对照使用。
【免费下载链接】anomalibAn anomaly detection library comprising state-of-the-art algorithms and features such as experiment management, hyper-parameter optimization, and edge inference.项目地址: https://gitcode.com/GitHub_Trending/an/anomalib
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考