ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

GeneralAD 异常检测模型:基于 ViT 失真特征注意力判别的跨域分割方案(anomalib 集成实践)

2026/9/17 15:08:55 拓冰建站 浏览量
GeneralAD 异常检测模型:基于 ViT 失真特征注意力判别的跨域分割方案(anomalib 集成实践) GeneralAD 异常检测模型基于 ViT 失真特征注意力判别的跨域分割方案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/anomalibGeneralADAnomaly Detection Across Domains by Attending to Distorted Features论文见 arXiv:2407.12427 展开结合 torch_model.py 与 lightning_model.py 源码完整讲解其架构、自监督伪异常生成、判别器训练与推理流程并给出 MVTec AD 复现上游精度的关键配置尤其是后处理归一化对 AUROC 的影响帮助读者在 anomalib 的Engine、CLI 与指标/后处理管线上直接训练、评估与部署 GeneralAD。模型概览与定位GeneralAD 的模型类型为Segmentation分割即同时输出图像级异常分数image-level score与像素级异常热力图anomaly map。其核心设计思想可以概括为三点冻结的 ViT 骨干特征利用预训练 Vision Transformer 隐藏状态的 patch 结构作为判别器的输入特征不参与梯度更新自监督伪异常生成对正常 patch 特征施加噪声注入noise injection、洗牌shuffling与复制copying操作构造伪异常样本注意力判别器训练一个基于注意力的判别器为图像中的每个 patch 打分从而同时完成准确的图像级异常识别与可解释的异常图生成。在 anomalib 中GeneralAD 被移植到标准的模型接口之下支持使用Engine进行训练通过 CLI 直接调用使用 anomalib 内置的指标metrics与后处理post-processing管线进行评估。模型在anomalib.models中注册为GeneralAD见 src/anomalib/models/init.py底层 PyTorch 实现为GeneralADModel见 src/anomalib/models/image/general_ad/init.py。架构总览上图为 GeneralAD 的整体架构来自 docs/source/images/general_ad/architecture.jpg核心流程如下训练阶段正常样本图像被切分为 patch 送入视觉 TransformerViT骨干提取 patch 特征特征失真Feature Distortion模块对部分 patch 特征施加噪声注入、洗牌或复制生成失真特征伪异常判别器接收正常特征与失真特征的拼接为每个 patch 输出分数并与失真掩码Distortion Masks计算二元交叉熵BCE损失推理阶段待检测图像经 ViT 提取 patch 特征后直接送入判别器得到 patch 分数Patch Scores与注意力分数Attention Scores最终聚合为图像级异常分数与像素级热力图。源码结构解析anomalib 中的 GeneralAD 集成由以下文件构成目录src/anomalib/models/image/general_ad文件职责lightning_model.pyLightning 封装GeneralAD继承AnomalibModule负责预处理、优化器、评估器与训练/验证步骤torch_model.py核心 PyTorch 实现GeneralADModel特征提取器、伪异常生成、Patch 判别器与前向推理__init__.py导出GeneralAD与GeneralADModelREADME.md官方集成文档本文主体单元测试位于 tests/unit/models/image/general_ad/test_torch_model.py验证了模型可离线实例化、前向输出形状正确以及训练损失有限。核心实现特征提取器torch_model.py中实现了两类特征提取器ViTFeatureExtractortorch_model.py#L92-L165基于timm创建 ViT 骨干支持vit前缀的 backbone默认vit_large_patch14_dinov2.lvd142m。它会在指定层layers收集归一化后的 patch 特征并拼接同时通过实例级方法替换_make_attn_forward_with_map捕获所选层的 class-attention 映射——该替换仅影响当前注意力模块实例避免污染进程中其他 ViT 实例EVAFeatureExtractortorch_model.py#L168-L219针对 EVA 风格骨干eva前缀的变体使用旋转位置编码RoPE前向传播但不暴露注意力映射。从源码结构看以下几点是使用约束输入必须是正方形图像否则抛出ValueError当前不支持以_ibot结尾的 backbone需要外部权重下载layers必须落在骨干的有效 transformer block 索引范围内1 到len(blocks)之间骨干参数被整体冻结requires_grad False并置于eval()模式只有判别器参与训练若 backbone 为eva而fake_feature_type需要注意力映射如attn、copy_out、shuffle等会抛出ValueError。自监督伪异常生成失真特征GeneralAD 的关键创新在于以自监督方式构造伪异常样本。torch_model.py中通过FakeFeatureTypetorch_model.py#L29-L41声明了 11 种失真策略类型说明random随机 patch 注入高斯噪声attn按注意力最高的 patch 注入噪声copy_out将注意力最高的 patch 特征复制为其他 patch 的特征shuffle将注意力最高的 patch 特征在彼此之间打乱randshuffle随机 patch 特征相互打乱copy_out_and_random/copy_out_and_attn组合策略复制 随机/注意力噪声shuffle_and_random/shuffle_and_attn组合策略洗牌 随机/注意力噪声randshuffle_and_random/randshuffle_and_attn组合策略随机洗牌 随机/注意力噪声其中attn、copy_out、shuffle及各类*_and_attn组合必须依赖 class-attention 映射因此只适用于 ViT 骨干见ATTENTION_REQUIRED_FAKE_FEATURE_TYPEStorch_model.py#L43-L50。以默认fake_feature_typerandom为例compute_losstorch_model.py#L363-L413的训练损失包含三个部分真实特征 BCE判别器对所有真实 patch 特征的 logit 与全零掩码计算binary_cross_entropy_with_logits全噪声特征 BCE对全部 patch 特征叠加noise_std标准差的高斯噪声_add_noise_all以全一掩码监督部分随机噪声 BCE_add_random_noise为每个样本随机选取 1 到 N 个 patch 注入噪声_masked_bce分别对正常与异常 patch 计算 BCE 后相加。其余失真策略沿同一骨架扩展_add_attn_noise依据 class-attention 的最高响应 patch 注入噪声_add_attn_copy_out用随机 patch 的特征覆盖高注意力 patch_add_attn_shuffle/_add_random_shuffle则在选中 patch 之间洗牌。各策略每次随机抽取的 patch 数量由_sample_patch_count控制上限为num_fake_patches-1 表示全部 patch。注意力判别器与推理打分判别器PatchDiscriminatortorch_model.py#L245-L268由堆叠的AttentionBlockLayerNorm MultiheadAttention GELU 前馈网络带残差连接与一个无偏置线性输出层组成并为每个 patch 位置学习可学习的位置编码。推理阶段score_featurestorch_model.py#L348-L355判别器为每个 patch 输出 logit 分数取每个样本最高的top_k个 patch 分数求平均得到图像级异常分数将 patch 分数重排为(patches_per_side, patches_per_side)网格再双线性插值回输入分辨率得到像素级异常热力图。默认配置下top_k10图像 518×518、patch 14共 37×371369 个 patch图像级分数由 top-10 patch 的平均 logit 决定——这一设计使图像级检测对局部异常高度敏感。训练配置与 Lightning 封装lightning_model.py中的GeneralAD(AnomalibModule)提供了完整训练配置默认超参数如下参数默认值说明backbonevit_large_patch14_dinov2.lvd142mtimm 骨干冻结layers(24,)用于收集 patch 特征的 transformer blockhidden_dim2048判别器隐藏维度lr5e-4AdamW 学习率lr_decay_factor0.2余弦退火最终学习率比例eta_min lr * 0.2weight_decay1e-5权重衰减epochs160用于参数化 LR 调度器noise_std0.25伪异常特征噪声标准差dsc_layers1判别器注意力块数量dsc_heads4判别器注意力头数dsc_dropout0.1判别器 dropoutnum_fake_patches-1每图扰动 patch 数上限-1 全部fake_feature_typerandom伪异常生成策略top_k10图像级分数聚合的 patch 数-1 全部image_size(518, 518)输入分辨率默认预处理优化器为 AdamW仅更新discriminator参数学习率调度器为CosineAnnealingLRT_maxepochsintervalepoch训练器默认关闭梯度裁剪并跳过 sanity 验证步trainer_argumentslightning_model.py#L156-L159。评估器configure_evaluatorlightning_model.py#L138-L154在验证阶段监控image_AUROC用于 checkpoint 选择测试阶段计算图像级 AUROC/F1 与像素级 AUROC/F1。默认预处理为 BICUBIC 缩放到 518×518 ImageNet 均值/标准差归一化lightning_model.py#L108-L123。快速开始CLI 训练使用 anomalib CLI 训练 GeneralAD 的最小命令对应官方文档 Usage 一节anomalib train --model GeneralAD --data MVTecAD --data.category category其中category替换为目标类别如toothbrush。该命令会加载 MVTec AD 数据集使用默认 518×518 预处理与上述默认超参数训练 160 epoch在验证/测试阶段输出图像级与像素级 AUROC/F1 指标。同时支持以代码方式使用Engine训练例如from anomalib import Engine from anomalib.data import MVTecAD from anomalib.models import GeneralAD engine Engine() datamodule MVTecAD(categorytoothbrush) model GeneralAD() engine.fit(modelmodel, datamoduledatamodule)复现上游结果关键后处理对齐官方文档记录了一次重要的复现验证2026-04-10 在 MVTec ADtoothbrush类别上当评估配置与上游打分管线一致时anomalib 集成可以复现上游结果Runimage_AUROCpixel_AUROCUpstream GeneralAD原仓库0.994—Anomalib默认后处理0.9670.962Anomalib关闭分数归一化0.9970.962关键发现anomalib 默认的PostProcessor会在测试阶段计算 AUROC 之前对pred_score进行归一化并截断到[0, 1]。归一化公式为pred_score ((score - threshold) / (max - min)) 0.5 pred_score pred_score.clamp(0, 1)这是一个非单调变换可能改变样本间的排序rank ordering从而影响 AUROC。而上游仓库直接在原始判别器 logit 上计算 AUROC不做任何后处理。因此默认后处理反而使 image_AUROC 从 0.994 降至 0.967关闭归一化后可恢复至 0.997pixel_AUROC 不受影响仍为 0.962。该归一化逻辑在 src/anomalib/post_processing/post_processor.py 的_normalizepost_processor.py#L301-L324中实现验证阶段通过MinMax指标累积image_min/image_max并在forward/post_process_batch中应用于批次预测。关闭归一化的代码方式在 Python API 中关闭后处理归一化from anomalib.post_processing import PostProcessor model GeneralAD( ..., post_processorPostProcessor(enable_normalizationFalse), )注意enable_normalizationFalse只禁用分数归一化enable_thresholding仍默认开启因此不影响阈值化与pred_label/pred_mask的生成。其他对齐细节官方文档还指出两项与上游行为对齐的要点drop_lastTrue上游训练加载器使用drop_lastTrueCLI 训练时可传入--drop-last以匹配Checkpoint 选择以val_split_modeSAME_AS_TEST下的image_AUROC作为监控指标与上游在测试集上验证的行为一致对应configure_evaluator的实现说明lightning_model.py#L138-L146。实现约束与注意事项结合 torch_model.py 源码使用 GeneralAD 时需注意仅支持 transformer 骨干backbone 必须以vit或eva开头其他架构会直接报错正方形输入image_size的宽高必须相等top_k与num_fake_patches的合法取值必须为 -1 或正整数0 会抛出ValueError-1 表示使用全部 patch超过 patch 总数时自动截断为num_patches注意力依赖策略的骨干限制使用attn/copy_out/shuffle及其组合时必须选择 ViT 骨干EVA 无注意力映射iBOT 权重不支持*_ibot结尾的 backbone 需外部权重下载本集成不支持。单元测试tests/unit/models/image/general_ad/test_torch_model.py使用vit_tiny_patch16_224等轻量骨干离线验证了模型实例化、前向输出pred_score形状(2,)、anomaly_map形状(2, 1, 256, 256)与损失有限性可作为快速验证的参考范例。总结GeneralAD 将异常检测转化为判别器区分正常特征与失真特征的自监督二分类问题冻结的 ViT/EVA 骨干提供 patch 级表示噪声注入/洗牌/复制构造伪异常样本注意力判别器逐 patch 打分最终以 top-k 平均得到图像级分数、插值得到像素级热力图。在 anomalib 中它已完整接入Engine、CLI、指标与后处理管线开箱即用。若要在 MVTec AD 上复现上游论文精度务必关注后处理归一化的非单调变换对 AUROC 排序的影响通过PostProcessor(enable_normalizationFalse)关闭并配合--drop-last与基于image_AUROC的 checkpoint 选择策略即可获得与上游一致的评估结果。【免费下载链接】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),仅供参考