尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

EfficientAd 毫秒级异常分割模型详解:Anomalib 中的教师-学生-自编码器架构实现

EfficientAd 毫秒级异常分割模型详解:Anomalib 中的教师-学生-自编码器架构实现 EfficientAd 毫秒级异常分割模型详解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 仓库中的 EfficientAd 模型文档 为核心深入解析这一面向工业视觉场景的快速异常分割算法。EfficientAd 通过蒸馏预训练教师网络并结合轻量学生网络与自编码器在保持毫秒级推理延迟的同时实现高精度像素级异常定位。读完本文你将掌握 EfficientAd 的完整架构原理、Anomalib 中的全部可配置参数、CLI 与 API 两种训练方式以及其在 MVTec AD 基准上的官方实测指标。模型概述面向分割任务的毫秒级异常检测算法EfficientAd 是 Anomalib 内置的分割型Segmentation异常检测模型其核心设计目标是在极低推理延迟下同时实现精准的局部异常与全局异常检测。从 Anomalib 的模块组织来看EfficientAd 位于 src/anomalib/models/image/efficient_ad/ 目录由三个核心文件构成文件职责lightning_model.pyLightning 训练/验证/推理流程封装含数据准备与统计量计算torch_model.py纯 PyTorch 网络结构实现教师、学生、自编码器README.md官方模型说明与 MVTec AD 基准结果该实现基于论文EfficientAd: Accurate Visual Anomaly Detection at Millisecond-Level Latencies并参考了社区多个开源实现完成。Anomalib 中的实现文档声明其为 Segmentation 类型模型即输出逐像素的异常分数图anomaly map而非仅图像级分数。核心架构教师-学生-自编码器三方协同EfficientAd 的架构由三部分网络组成各自承担不同的检测职责预训练教师网络Teacher从预训练 EfficientNet 蒸馏得到的特征提取骨干参数冻结不参与训练学生网络Student通过知识蒸馏学习模拟教师输出同时承担异常检测任务自编码器Autoencoder对输入进行重建与教师输出对比实现全局异常检测。这一架构在 torch_model.py 中通过EfficientAdModel类实现其forward方法清晰地展示了推理阶段的两路异常分数计算逻辑局部异常学生-教师差异计算教师与学生网络输出特征图的平方距离distance_st经通道均值化得到局部异常图map_st全局异常学生-自编码器差异计算自编码器重建输出与学生网络后半段输出之间的平方距离得到全局异常图map_stae最终异常图anomaly_map 0.5 * map_st 0.5 * map_stae两者各占 50% 权重融合图像级异常分数取异常图的最大值torch.amax。输入图像 │ ├──► 教师网络(冻结) ──► 教师特征 ──┬──► 与学生对齐部分求距离 ──► 局部异常图(50%) │ │ ├──► 学生网络 ──► 学生特征(前段)──┘ │ └──► 自编码器 ──► 重建特征 ──► 与学生后半段输出求距离 ──► 全局异常图(50%) │ ▼ 0.5×局部 0.5×全局 最终异常图特征提取阶段特征提取由预训练教师网络完成其输出特征被用于同时训练学生网络与自编码器。这里有一个关键设计为防止学生网络在异常样本上模仿教师网络即异常区域本应产生高差异学生不应学会复制异常特征训练损失函数中引入了 ImageNet 图像的惩罚项——见 lightning_model.py 中compute_losses的loss_penalty torch.mean(student_output_penalty**2)。异常检测阶段异常被定义为教师、学生、自编码器三者输出特征图之间的差异正常样本上三者输出高度一致差异趋近于零异常区域则出现显著差异从而形成异常分数图。网络细节PDN 骨干与模型尺寸学生与教师网络均采用**补丁描述网络Patch Description Network, PDN**结构Anomalib 提供了两种变体见 torch_model.pySmallPatchDescriptionNetworkEfficientAd-S4 层卷积 2 层平均池化通道数演进 3 → 128 → 256 → 256 → 输出通道MediumPatchDescriptionNetworkEfficientAd-M6 层卷积 2 层平均池化通道数演进 3 → 256 → 512 → 512 → 512 → 512 → 输出通道参数量更大、表征能力更强。两种网络在输入阶段都会应用 ImageNet 通道级归一化mean[0.485, 0.456, 0.406]std[0.229, 0.224, 0.225]见imagenet_norm_batch函数。自编码器由Encoder6 层卷积逐步压缩至 64×1×1 特征与Decoder8 层卷积 双线性上采样逐步恢复空间分辨率组成解码器每层之间穿插 Dropout(p0.2) 以增强泛化。模型尺寸通过EfficientAdModelSize枚举控制S small、M medium其中学生网络输出通道数为教师网络的2 倍前半段对齐教师特征后半段对齐自编码器重建特征教师网络则通过teacher_out_channels参数指定输出通道数默认 384。完整配置参数解析Anomalib 为 EfficientAd 提供了开箱即用的配置文件 examples/configs/model/efficient_ad.yaml其中定义了所有核心超参数model: class_path: anomalib.models.EfficientAd init_args: teacher_out_channels: 384 model_size: small lr: 0.0001 weight_decay: 1.0e-05 padding: false pad_maps: true trainer: max_epochs: 1000 max_steps: 70000结合 lightning_model.py 中EfficientAd.__init__的参数定义各参数含义与默认值如下参数默认值含义与影响imagenet_dir./datasets/imagenetteImageNette 数据集目录训练时会自动下载 imagenetette2.tgz含 SHA1 校验用于学生网络的惩罚损失teacher_out_channels384教师网络卷积输出通道数决定特征图的表征维度model_sizesmall学生/教师网络尺寸可选smallS或mediumMlr0.0001Adam 优化器学习率weight_decay0.00001Adam 优化器权重衰减系数paddingfalse卷积层是否使用 paddingfalse时输出特征图略小可减少计算量pad_mapstrue仅在paddingFalse时生效为true时会对异常图四周补零各 4 像素使输出尺寸与 padding 情形一致避免分辨率丢失pre_processortrue输入预处理EfficientAd 默认仅做 Resize 到 (256, 256)ImageNet 归一化在模型 forward 内部完成因此配置变换中不能包含Normalizepost_processor/evaluator/visualizertrue分别控制后处理、指标评估与可视化组件是否启用关于上述参数源码中有两点值得特别注意train_batch_size 必须为 1on_train_start会强制校验train_batch_size 1否则抛出ValueError这是论文中的设定变换中禁止 Normalize若预处理变换中包含Normalize训练同样会报错——因为 ImageNet 归一化已由模型内部显式完成见imagenet_norm_batch。此外configure_optimizers使用 Adam 优化器仅优化学生网络与自编码器参数教师网络冻结并配套 StepLR 学习率调度器在训练步数的95% 处将学习率衰减为原来的 0.1。训练全流程从预训练权重到量化统计EfficientAd 的训练流程与常规异常检测模型有显著差异它需要在训练开始前完成三件准备工作全部封装在on_train_start中见 lightning_model.py加载预训练教师权重prepare_pretrained_model会从预训练权重目录下载efficientad_pretrained_weights.zip含 SHA1 校验并加载对应尺寸的pretrained_teacher_{size}.pth准备 ImageNette 数据prepare_imagenette_data若检测到imagenet_dir不存在则自动下载 ImageNette 数据集并应用 [Resize(2×)、RandomGrayscale(p0.3)、CenterCrop] 组合变换以 batch_size1 的 DataLoader 驱动无限迭代计算教师特征通道统计量teacher_channel_mean_std在torch.no_grad()下遍历整个训练集累积计算教师网络输出特征的通道级均值与标准差shape 为 (1, C, 1, 1)用于后续特征归一化。训练阶段每个 step 的损失由三部分组成training_step中求和并分别记录train_st/train_ae/train_stae/train_loss学生-教师损失loss_st对教师-学生距离取 99.9% 分位数作为硬阈值仅对超过阈值的高差异像素求均值聚焦最难样本再加上 ImageNette 图像的惩罚项自编码器损失loss_ae对输入随机施加亮度/对比度/饱和度增强系数采样自 U(0.8, 1.2)见choose_random_aug_image后计算自编码器重建与教师输出之间的均方误差学生-自编码器损失loss_stae计算自编码器重建与学生后半段输出之间的均方误差。验证阶段开始前on_validation_startmap_norm_quantiles会在正常good样本上统计学生图与自编码器图的 90% 与 99.5% 分位数qa_st、qa_ae、qb_st、qb_ae用于推理时异常图的归一化。由于torch.quantile最多支持 2^24 个元素reduce_tensor_elems会在元素超限时随机采样至多 2^24 个元素再计算分位数。使用方式CLI 与 API 两种入口命令行方式Anomalib 官方文档给出的标准训练命令为anomalib train --model EfficientAd --data anomalib.data.MVTecAD --data.category category --data.train_batch_size 1其中category替换为 MVTec AD 数据集的具体类别如bottle、cable、hazelnut等。--data.train_batch_size 1是必选项——如前述batch size 非 1 会直接报错。也可直接基于配置文件运行anomalib train --config examples/configs/model/efficient_ad.yaml --data anomalib.data.MVTecAD --data.category categoryPython API 方式在 Anomalib 的 Lightning 框架中EfficientAd 通过Engine完成训练与推理与 lightning_model.py 模块 docstring 中的示例一致from anomalib.data import MVTecAD from anomalib.models import EfficientAd from anomalib.engine import Engine datamodule MVTecAD() model EfficientAd() engine Engine() engine.fit(model, datamoduledatamodule) predictions engine.predict(model, datamoduledatamodule)也可按需自定义关键超参数from anomalib.models import EfficientAd model EfficientAd( imagenet_dir./datasets/imagenette, model_sizes, lr1e-4, )推理细节异常图的生成与归一化推理阶段的完整链路位于EfficientAdModel.compute_maps见 torch_model.py教师网络输出经通道均值/标准差归一化mean_std计算学生-教师平方距离与自编码器-学生后半段平方距离沿通道维取均值得到两路原始异常图若pad_mapsTrue两路图各向四周填充 4 像素再双线性插值恢复到输入分辨率默认 256×256使用验证阶段统计的 90%/99.5% 分位数将两路图归一化到 0.1 尺度0.1 * (map - qa) / (qb - qa)两路图各取 50% 权重融合为最终异常图图像级分数取通道/空间最大值。最终的InferenceBatch同时包含逐像素的anomaly_mapshape 与输入一致如 (1, 256, 256)和图像级pred_score可直接送入 Anomalib 的 post-processor 与评估器计算 AUROC、F1 等指标。官方基准MVTec AD 实测结果原文档给出了 EfficientAd-S 与 EfficientAd-M 在 MVTec AD 数据集上的官方基准结果seed42按类别逐一列出。下表为图像级 AUCAvgCarpetGridLeatherTileWoodBottleCableCapsuleHazelnutMetal NutPillScrewToothbrushTransistorZipperEfficientAd-S0.9820.9821.0000.9971.0000.9861.0000.9520.9500.9520.9790.9870.9600.9970.9990.994EfficientAd-M0.9750.9720.9981.0000.9990.9840.9910.9450.9570.9480.9890.9260.9751.0000.9650.971下表为图像级 F1 ScoreAvgCarpetGridLeatherTileWoodBottleCableCapsuleHazelnutMetal NutPillScrewToothbrushTransistorZipperEfficientAd-S0.9700.9661.0000.9951.0000.9751.0000.9070.9560.8970.9780.9820.9440.9840.9880.983EfficientAd-M0.9660.9770.9911.0000.9940.9670.9840.9220.9690.8840.9840.9520.9551.0000.9290.979从平均指标看EfficientAd-S 在图像级 AUC 与 F1 上均略优于 EfficientAd-M同时参数量更小、推理更快——这正是小模型 蒸馏路线在效率和精度之间取得的平衡。值得注意的是两个尺寸在 Grid、Tile、Bottle 等结构纹理类上均达到 1.000 的近乎满分成绩。测试覆盖与集成验证Anomalib 对 EfficientAd 的集成约束有专门的测试保障见 tests/integration/model/test_models.py其中明确验证了EfficientAd 要求训练 batch size 为 1以及batch size 必须小于数据集样本数这两条约束防止用户在不满足前提的条件下误用。此外模型通过anomalib.models.EfficientAd导出见 models/init.py 与 efficient_ad/init.py与 Anomalib 的 Engine、数据模块、后处理与可视化管线无缝集成learning_type固定为ONE_CLASS单类异常检测并通过trainer_arguments设置num_sanity_val_steps0以跳过验证集上的预检。总结EfficientAd 代表了 Anomalib 在高效工业异常检测方向上的核心实现通过冻结的蒸馏教师网络提供稳定的特征参考学生网络与自编码器分别捕捉局部与全局异常配合 ImageNette 惩罚损失、通道级统计归一化与分位数映射实现了在普通硬件上毫秒级推理的同时保持接近最先进水平的 MVTec AD 精度。若你的场景对推理延迟敏感如产线在线质检EfficientAd 的 S 尺寸配合同样轻量的 EfficientAD 参考配置 是 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创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表