资讯详情

资讯详情

U-Flow 模型深度解析:U 形归一化流与无监督阈值的图像异常定位(anomalib 实现)

U-Flow 模型深度解析U 形归一化流与无监督阈值的图像异常定位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 开源仓库中 U-Flow 模型文档 为主体结合 torch_model.py、anomaly_map.py、feature_extraction.py 等源码实现系统讲解 U-Flow 的三阶段方法多尺度特征提取 → U 形归一化流 → 基于 a contrario 框架的无监督阈值分割、训练配置、结果复现与数据准备。读完本文你将掌握在 anomalib 中训练与推理 U-Flow 的完整命令、核心超参数的作用以及其自动阈值分割NFA与默认似然阈值两条技术路线在仓库中的具体落点。U-Flow 整体架构图一、方法概述统计检测理论与深度学习的结合U-Flow论文编号 arXiv:2211.12353是一种面向图像异常分割的单类自监督方法其设计理念同时受益于现代机器学习手段与经典的统计检测理论。整个方法分为三个阶段多尺度特征提取使用多尺度图像 Transformer 架构MCait提取特征U 形归一化流将特征输入 U 形结构的归一化流Normalizing Flow为后续检测提供理论基础像素级异常图与 a contrario 分割计算像素级异常图并基于 a contrario 框架完成分割。其中第三阶段采用多重假设检验multiple-hypothesis testing策略能够推导出鲁棒的自动检测阈值——这对必须给出实际工作点operational point的工业落地场景至关重要。论文在 MVTec-AD 数据集上以像素级 AUROCarea under the Receiver Operating Characteristic curve、AUPROarea under the per-region-overlap curve与 IoUIntersection over Union三个指标进行评测绝大多数类别排名第一平均像素级 AUROC 达98.74%。注意论文摘要中的指标为论文作者在原始实现下的报告值。本文仅作方法背景引用仓库实测请以本地训练/评估结果为准。二、仓库实现架构从特征提取到异常图生成U-Flow 在 anomalib 中的代码位于 src/anomalib/models/image/uflow/由 6 个文件构成职责划分如下文件职责feature_extraction.py多尺度特征提取器MCait / ResNet 系torch_model.pyU 形归一化流网络主体UflowModelloss.py训练损失似然 雅可比行列式anomaly_map.py异常图生成 NFA 无监督分割lightning_model.pyLightning 封装训练/验证流程、优化器init.py模块导出2.1 特征提取器MCait 双尺度结构与 ResNet 备选feature_extraction.py 中定义了受支持的骨干网络集合AVAILABLE_EXTRACTORS [mcait, resnet18, wide_resnet50_2]mcait官方默认CaitFeatureExtractor使用两个独立预训练的 CaiT 模型分别处理两个尺度——cait_m48_448输入 448×448与cait_s24_224输入 224×224。源码中特征并非走完整网络而是按论文 Table 6 的设定截取中间层输出CaiT-M48 只取前 41 个 blockBlock Index 40CaiT-S24 只取前 21 个 block随后经norm、permute、reshape 变为空间特征图。两个尺度输出的通道数与下采样倍率分别为[768, 384]与[16, 32]。resnet18/wide_resnet50_2LayerNormFeatureExtractor继承自 anomalib 的TimmFeatureExtractor从(layer1, layer2, layer3)三个层级提取特征并对每个尺度附加一个nn.LayerNorm做特征归一化。两个骨干的权重均被冻结requires_grad False即特征提取阶段不参与训练。2.2 U 形归一化流GraphINN 图结构与仿射耦合层UflowModeltorch_model.py基于 FrEIA 库的GraphINN以图graph方式构建网络。其build_flow过程体现了 U 形结构的关键为每个尺度创建ff.InputNode节点尺寸为通道数 × 输入尺寸/下采样倍率从最粗尺度开始逐级通过build_flow_stage每个 stage 由flow_steps个AllInOneBlock耦合层串联每个 stage 输出经过fm.Split按(4/8, 4/8)的比例在通道维拆分一部分直接作为该尺度的输出节点另一部分经fm.IRevNetUpsampling可逆上采样后与下一尺度的特征fm.Concat拼接形成 U 形跳连最细尺度scale 1经最后一个 flow stage 输出。每个 stage 内的耦合层AllInOneBlock交替使用 3×3 与 1×1 卷积作为AffineCouplingSubnet其结构为“Conv2d → ReLU → Conv2d”中间通道数由affine_subnet_channels_ratio决定mid_channels in_channels * ratio。耦合层的关键超参数包括affine_clamp默认 2.0仿射耦合层的钳制值约束缩放因子的范围以稳定训练permute_soft默认 False是否使用软置换flow_steps默认 4每个 flow stage 内的耦合层数量。2.3 训练损失负对数似然 雅可比行列式loss.py 中的UFlowLoss实现为lpz torch.sum(torch.stack([0.5 * torch.sum(z_i**2, dim(1, 2, 3)) for z_i in hidden_variables], dim0)) return torch.mean(lpz - jacobians)即训练目标为“隐变量的高斯似然项 − 流变换的 log 雅可比行列式”这正是归一化流最大化数据对数似然的标准形式。训练时UflowModel.forward返回(z, ljd)推理时返回InferenceBatch含pred_score与anomaly_map图像级分数取异常图空间维的最大值torch.amax。2.4 默认异常图多尺度似然加权融合默认情况下仓库为与库内其他方法对齐在训练时基于异常图计算阈值AnomalyMapGenerator.compute_anomaly_mapanomaly_map.py按如下流程生成异常热图对每个尺度的隐变量z计算对数似然-0.5 * mean(z², dim1)再取指数得到似然图用双线性插值将各尺度似然图上采样到输入尺寸对多尺度似然取平均后用1 - mean(likelihoods)得到异常图越异常值越大。源码注释特别说明使用 mean 而非 sum 是为了避免数值问题同时使各尺度权重相同、不依赖通道数。2.5 NFA 无监督分割自动阈值的关键实现论文的核心贡献之一是无需标注即可自动确定分割阈值。仓库在 anomaly_map.py 的compute_anomaly_mask中完整实现了基于NFANumber of False Alarms的 a contrario 分割注意README 中所写的路径src/anomalib/models/uflow/anomaly_map.py在当前仓库实际为src/anomalib/models/image/uflow/anomaly_map.py对每个尺度以窗口window_size默认 7随尺度按2**scale缩放执行二项检验先以卡方阈值由正态分布分位数推导tau统计窗口内异常候选像素数再调用scipy.stats.binom.logsf计算在零假设局部区域正常下出现如此极端计数的对数概率各尺度结果经 bicubic 插值上采样后求和并叠加测试次数对数项log10(Σ 每个尺度像素数)得到log(NFA)最终异常分数为-log(NFA)阈值取log(NFA) 0即分数 0 判为异常生成二值分割掩码。该方法比默认似然路线更慢high_precisionTrue时可切换到 float64 提升精度但能提供完全无监督的端到端分割——论文报告的 IoU 结果log(NFA)0阈值即来自该路线。README 中给出的三种评测指标对应该两条路线像素 AUROC / AUPRO 评估异常图质量IoU 评估 NFA 分割质量。三、各阶段的张量尺寸变化README 详细给出了默认配置MCait 骨干、448 输入下各阶段的张量尺寸仓库源码feature_extraction.py 与 torch_model.py与此完全对应输入- Scale 1: [3, 448, 448] - Scale 2: [3, 224, 224]MS-Cait 输出- Scale 1: [768, 28, 28] - Scale 2: [384, 14, 14]归一化流输出- Scale 1: [816, 28, 28] -- 816 768 384 / 2 / 4 - Scale 2: [192, 14, 14] -- 192 384 / 2其中/ 2对应通道维的 split一半直接输出、一半上采样/ 4对应可逆上采样IRevNetUpsampling带来的尺度折算。这也解释了为什么 scale 1 的流输出通道数816大于其特征通道数768——它额外拼接了来自 scale 2 上采样的 96 个通道。四、安装与使用命令行与 Python API4.1 CLI 训练命令README 给出的训练命令为data.category 需替换为具体类别如bottleanomalib train --model Uflow --data MVTecAD --data.category category4.2 配置文件解读仓库提供了完整可用的模型配置 examples/configs/model/uflow.yaml其中模型参数与训练器参数如下model: class_path: anomalib.models.Uflow init_args: flow_steps: 4 permute_soft: false affine_clamp: 2.0 affine_subnet_channels_ratio: 1.0 backbone: mcait # official: mcait, other extractors tested: resnet18, wide_resnet50_2. Could use others... trainer: max_epochs: 200 log_every_n_steps: 50 callbacks: - class_path: lightning.pytorch.callbacks.EarlyStopping init_args: patience: 20 monitor: pixel_AUROC mode: max各参数要点flow_steps: 4每个 flow stage 的耦合层层数affine_clamp: 2.0仿射耦合钳制值防止缩放因子过大affine_subnet_channels_ratio: 1.0耦合子网中间通道与输入通道的比例1.0 表示不压缩backbone: mcait官方推荐骨干也可换成resnet18/wide_resnet50_2注意输入尺寸与特征通道会随之变化训练器默认 200 个 epoch并以pixel_AUROC为监控指标、patience 20 的 EarlyStopping 提前收敛。注意lightning_model.py中的configure_pre_processor会强制将输入 resize 到 448×448 并使用 ImageNet 均值/方差归一化传入其他 image_size 会输出警告并被忽略输入尺寸对 U-Flow 是模型决定的固定值。4.3 Python API 使用依据 lightning_model.py 的文档示例也可以用 Python API 完成训练与预测from anomalib.models.image import Uflow from anomalib.engine import Engine from anomalib.data import MVTecAD datamodule MVTecAD() model Uflow() engine Engine(modelmodel, datamoduledatamodule) engine.fit() predictions engine.predict()Uflow类的构造参数与 yaml 配置一一对应backbone、flow_steps、affine_clamp、affine_subnet_channels_ratio、permute_soft并可通过pre_processor、post_processor、evaluator、visualizer四个开关注入自定义组件。其learning_type为LearningType.ONE_CLASS即单类仅正常样本训练范式。五、复现论文结果5.1 默认参数下的像素级 AUROCREADME 说明使用默认配置参数即可得到与论文非常接近的 MVTec-AD 各类别像素级 AUROC类别Pixel AUROC类别Pixel AUROCbottle97.98pill99.15cable98.17screw99.25capsule98.95tile96.93carpet99.45toothbrush98.97grid98.19transistor96.70hazelnut99.01wood96.87leather99.41zipper97.92metal_nut98.19——5.2 精确复现所需的分类别学习率架构参数保持不变的前提下要在每个类别上精确复现论文数值需要按类别使用特定学习率。仓库源码 lightning_model.py 的configure_optimizers注释中保留了论文用到的逐类别学习率bottle: 0.0001128999, cable: 0.0016160391, capsule: 0.0012118892, carpet: 0.0012118892, grid: 0.0000362248, hazelnut: 0.0013268899, leather: 0.0006124724, metal_nut: 0.0008148858, pill: 0.0010756100, screw: 0.0004155987, tile: 0.0060457548, toothbrush: 0.0001287313, transistor: 0.0011212904, wood: 0.0002466546, zipper: 0.0000455247默认优化器为 Adam初始 lr1e-3weight_decay1e-5配合LinearLR调度器在 25000 步内将学习率从 1.0 倍线性衰减到 0.4 倍。仓库未包含论文中各类别使用的精确 batch size 数值如需完整复现应参考原始实现mtailanian/uflow随代码发布的 configs 与已训练权重。六、数据准备与预训练模型6.1 数据集U-Flow 的 README 涉及以下数据集均需自行下载并组织为 anomalib 支持的数据格式MVTec AD工业缺陷检测基准数据集可从 MVTec 官网的研究数据集页面获取BeanTechBTAD工业异常检测数据集LGG MRI脑部低级别胶质瘤 MRI 分割数据集ShanghaiTech CampusSTC校园监控视频异常检测数据集。其中 MVTec AD 可直接通过 anomalib 的--data MVTecAD数据模块配合--data.category使用。6.2 预训练模型原始项目提供了各 MVTec-AD 类别的已训练权重随原仓库 release 发布可用于直接推理或对比复现。README 同时指出为复现论文的精确结果每个类别需使用不同的学习率与 batch size具体数值可查阅原始实现随代码发布的configs目录。七、基准测试注意事项README 特别提醒U-Flow 默认使用MCait 特征提取器输入尺寸固定为 448×448而 anomalib 库内统一基准测试benchmarking使用 256×256 输入因此基准测试中报告的数值可能与论文有所不同。在评估或横向对比 U-Flow 时务必确认输入尺寸是否与论文一致避免指标失真。八、结果可视化与测试验证8.1 定位与分割结果论文报告了 MVTec-AD 上的像素级 AUROC 与 AUPRO下图为像素级 AUROC 结果对比MVTec-AD 像素级 AUROC 结果NFA 自动阈值log(NFA)0下的 IoU 分割结果同样在论文中有完整报告log(NFA)0 阈值下的 IoU 分割结果此外docs/source/images/uflow/ 下还提供了 MVTec-AD、BeanTech、LGG MRI、STC 等数据集的异常/正常样本可视化对比results-mvtec-anomalies.jpg、results-others-anomalies.jpg、results-mvtec-good.jpg、results-others-good.jpg以及论文主图teaser.jpg。8.2 仓库测试佐证U-Flow 已纳入 anomalib 的模型配置测试在 tests/unit/models/components/base/test_anomaly_module.py 中uflow与其他主流模型padim、patchcore、stfpm 等一同通过参数化测试test_from_config验证其可从模型配置文件正确实例化——这保证了 examples/configs/model/uflow.yaml 的可用性与anomalib.models.Uflow注册名的正确性。模块文档也由 Sphinx 自动生成见 docs/source/markdown/guides/reference/models/image/uflow.md。九、小结U-Flow 在 anomalib 中的落地保持了论文方法的完整脉络多尺度 MCait 特征提取、U 形可逆归一化流密度估计、以及可选的 a contrarioNFA无监督阈值分割。日常使用只需一行anomalib train --model Uflow --data MVTecAD --data.category category而深入源码则能看清每个超参数flow_steps、affine_clamp、affine_subnet_channels_ratio、permute_soft、backbone对网络结构与训练动态的实际影响。若要在真实工业场景中使用自动阈值能力可重点关注 anomaly_map.py 中的compute_anomaly_mask实现——它是“无需标注即可得到分割掩码”这一论文核心主张的代码落地。【免费下载链接】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),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →