Anomalib 中 GLASS 模型全解析:基于梯度上升的统一异常合成工业异常检测框架 Anomalib 中 GLASS 模型全解析基于梯度上升的统一异常合成工业异常检测框架【免费下载链接】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/anomalibGLASSGradient Ascent for Industrial Anomaly detection and localization是 Anomalib 提供的一种单类one-class工业异常检测与定位模型核心思想是在特征层面与图像层面分别合成全局异常和局部异常样本用一个共享判别器同时学习正常分布的边界从而显著提升对弱缺陷与正常区域高度相似的细微缺陷的检出能力。本文基于 Anomalib 仓库中 GLASS 参考文档 所对应的 lightning_model 模块 与 torch_model 模块 展开系统讲解其三分支架构、全部构造参数、训练/推理调用链、配置文件写法与基准结果读完后你能够独立完成 GLASS 的训练、调参尤其是svd分布假设选择与推理部署。一、GLASS 解决什么问题无监督工业异常检测通常只用正常样本训练。GLASS 的思路是既然只有正常样本就主动合成异常样本来喂给判别器。仓库中 模型 README 将其概括为三条训练分支Normal 分支正常分支冻结的预训练特征提取器backbone加一个可训练的特征适配器feature adaptor从正常图像中抽取适配后的正常特征用于缓解潜在域偏差GAS 分支Global Anomaly Synthesis全局异常合成在特征层面给正常特征叠加高斯噪声再以判别器损失为引导做梯度上升gradient ascent并在流形manifold或超球面hypersphere分布约束下做截断投影truncated projection合成接近正常分布near-in-distribution的异常特征专治弱缺陷LAS 分支Local Anomaly Synthesis局部异常合成在图像层面用 Perlin 噪声生成的掩码把外部纹理数据集默认 DTD中的增强纹理叠加到图像上合成远离正常分布far-from-distribution的异常图像。三个分支的特征共同训练一个共享判别器推理时只保留 Normal 分支测试图像经特征提取后直接由判别器输出异常分数与定位掩码。这种训练三分支、推理单分支的设计是 GLASS 相对普通重建式模型的关键差异。二、仓库中的模块组织GLASS 的实现位于src/anomalib/models/image/glass/参考文档通过automodule指令渲染两个核心模块的公开 API文件职责lightning_model.pyGlass(AnomalibModule)Lightning 训练循环、优化器配置、预处理/后处理/评估器/可视化配置torch_model.pyGlassModel(nn.Module)前向传播、特征生成、梯度上升、中心点计算、推理打分components/Aggregator、Discriminator、PatchMaker、Preprocessing、Projection、RescaleSegmentor等网络组件loss.pyFocalLoss用于局部异常像素级监督的焦点损失gamma2含标签平滑Glass类继承自AnomalibModule声明的学习类型为LearningType.ONE_CLASS即单类无监督学习——只需正常样本即可训练。三、完整参数详解以下参数表综合自 Glass 类 docstring 与 GlassModel 构造函数所有默认值均以当前仓库代码为准参数默认值说明input_shape(288, 288)输入图像尺寸(height, width)用于构造输入流水线anomaly_source_pathNone异常纹理源DTD 数据集目录。目录不存在时会按内置DTD_DOWNLOAD_INFO自动下载并校验哈希backbonewide_resnet50_2用于特征提取的 CNN backbone 名称pretrain_embed_dim1536预训练 backbone 输出的特征维度target_embed_dim1536适配/投影后的目标特征维度patchsize3特征聚合时局部 patch 的边长patchstride1patch 提取步长pre_trainedTrue是否使用 ImageNet 预训练权重True时 backbone 冻结layers[layer2, layer3]从 backbone 抽取特征的网络层pre_projection1特征适配器中投影层MLP数量0时启用Projection模块discriminator_layers2判别器堆叠层数discriminator_hidden1024判别器每层隐单元数learning_rate0.0001特征适配器与判别器的学习率判别器实际用 2 倍step20每个训练 batch 的梯度上升步数svd0分布假设开关0流形manifold1超球面hypersphere按类别设置见第五节gaussian_noise_std0.015GAS 分支高斯噪声标准差radius_quantile0.75截断投影半径的分位数估计值focal_loss_quantile_threshold0.5Focal Loss 难例挖掘分位数0表示使用全部样本miningTrue是否执行梯度上升关闭后只走一步 BCE 前向pre_processorTrue默认预处理Resize 288 ImageNet 归一化post_processorTrue默认后处理异常图平滑/阈值evaluatorTrue评估器验证期额外同时计算 image/pixel AUROCvisualizerTrue可视化模块热力图、分割叠加、异常分数几个值得注意的实现细节判别器用2 倍学习率训练lrself.learning_rate * 2见 configure_optimizers投影模块用Adam weight_decay1e-5backbone 仅在pre_trainedFalse时才加入优化器列表优化器顺序固定为「判别器 → 投影 → backbone」training_step按同一顺序解包这是断点续训checkpoint resume正确性的前提Glass.configure_evaluator()被显式覆写在验证阶段同时输出image_AUROC与pixel_AUROC因为官方实现按两者之和选择最佳检查点见 configure_evaluator训练器参数固定为{gradient_clip_val: 0, num_sanity_val_steps: 0}即不做梯度裁剪梯度上升过程依赖原始梯度也不做 sanity 检查验证。四、训练与推理的源码级流程4.1 训练前的中心点估计训练第一个 epoch 开始时on_train_epoch_start钩子调用 calculate_center遍历整个训练 dataloader对每张图像生成 patch 级嵌入必要时先过Projection累加求平均得到self.center。这个中心点是后续截断投影的锚点——svd0流形假设时投影锚定到当前真实特征svd1超球面假设时锚定到该中心。4.2 前向传播双路特征 梯度上升循环训练态的 forward 主要做四件事LAS 图像级合成先把预处理归一化后的图像反归一化回[0,1]交给PerlinAnomalyGeneratorprobability1.0, dual_maskTrue叠加纹理并得到 patch 级掩码mask_s再重新归一化。该增强器实现见 perlin.py噪声采用五重内插的梯度噪声、scale 在2^0~2^6随机生成粗细不一的局部扰动提取三路特征calculate_features分别对原图与增强图调用generate_embeddings——抽取layer2/layer3特征、PatchMaker切 patch、对多层特征做双线性插值对齐空间尺寸、经Preprocessing与Aggregator自适应平均池化到target_embed_dim聚合必要时过ProjectionGAS 特征级合成给正常特征加N(0, gaussian_noise_std²)噪声得到gaus_feats用正常样本到中心的距离的radius_quantile分位数估计半径r_t然后进入step 1轮循环每轮先让判别器对[true_feats, gaus_feats]打分正常侧 BCE 目标为 0、合成侧目标为 1随后执行 _gradient_ascent_step——对gaus_loss求梯度、归一化后以0.001 的固定步长做上升每 5 步做一次截断投影把特征沿径向缩放回[r, 2r]流形模式或围绕中心约束半径超球面模式的范围内防止合成特征跑出正常流形太远组合损失bce_loss正常 全局合成加上focal_lossLAS 分支的像素级监督。Focal 部分按focal_loss_quantile_threshold做难例挖掘——只保留与掩码误差平方超过分位数的 patch实现定义在 loss.py。training_step中手动执行一次manual_backward(loss)后按「投影 → backbone → 判别器」的顺序step()判别器放在最后并记录true_loss / gaus_loss / bce_loss / focal_loss / loss五项日志。4.3 推理单分支打分非训练态下前向传播直接走 calculate_anomaly_scoresgenerate_embeddings生成 patch 级特征过Projection判别器逐 patch 输出 sigmoid 分数PatchMaker.unpatch_scores还原空间布局图像级分数由 patch 分数聚合compute_score得到patch 分数经 RescaleSegmentor 双线性上采样到input_shape并用预计算的 33×33、sigma4 高斯核平滑得到最终分割掩码高斯核在构造时注册为 buffer保证 ONNX 导出时形状静态。4.4 判别器结构Discriminator 是一个小型 MLPn_layers - 1个Linear → BatchNorm1d → LeakyReLU(0.2)堆叠尾层为无偏置的Linear(→1) Sigmoid输出[0,1]的异常概率。五、实操训练命令、配置文件与 svd 选择5.1 命令行训练模型 README 给出的标准命令是按类别训练 MVTec ADanomalib train --model Glass --data MVTecAD --data.category category关键注意事项来自仓库文档原文GLASS 对不同类别采用不同分布假设即svd0表示流形、svd1表示超球面默认配置使用svd0。仓库给出的按类别推荐表如下svd0manifold流形svd1hypersphere超球面Carpet, Grid, Leather, Tile, Wood, Capsule, Hazelnut, Metal Nut, Toothbrush, ZipperBottle, Cable, Pill, Screw, Transistor5.2 YAML 配置文件仓库提供完整可运行的参考配置 examples/configs/model/glass.yaml其全部init_args与第三节参数表一一对应model: class_path: anomalib.models.Glass init_args: input_shape: [288, 288] backbone: wide_resnet50_2 layers: - layer2 - layer3 pretrain_embed_dim: 1536 target_embed_dim: 1536 patchsize: 3 patchstride: 1 pre_trained: true pre_projection: 1 discriminator_layers: 2 discriminator_hidden: 1024 learning_rate: 0.0001 step: 20 svd: 0 gaussian_noise_std: 0.015 radius_quantile: 0.75 focal_loss_quantile_threshold: 0.5 mining: true trainer: max_epochs: 100 callbacks: - class_path: lightning.pytorch.callbacks.EarlyStopping init_args: patience: 5 monitor: pixel_AUROC mode: max配合数据配置如 examples/configs/data/mvtec.yaml使用anomalib train --config ...即可运行。5.3 复现基准的训练要点模型 README 说明为得到接近论文I-AUROC 99.9%、P-AUROC 99.3%MVTec AD的数字需要 288×288 输入尺寸、按类别设置 SVD、每类别 100 epochs、batch size 8、学习率 1e-4、seed 0并以combined_AUROCimage pixel选择最佳检查点。默认 YAML 中的 EarlyStopping 监控pixel_AUROC复现时可视需要调整。六、基准结果MVTec AD以下结果来自仓库 模型 README 的 Benchmark 小节训练条件seed0、100 epochs、按combined_AUROC逐类别选最佳检查点。图像级 AUC模型AvgCarpetGridLeatherTileWoodBottleCableCapsuleHazelnutMetal NutPillScrewToothbrushTransistorZipperWide ResNet-500.9720.9980.9951.0001.0000.9931.0000.9280.9671.0000.9990.9530.9090.9500.8970.995像素级 AUC模型AvgCarpetGridLeatherTileWoodBottleCableCapsuleHazelnutMetal NutPillScrewToothbrushTransistorZipperWide ResNet-500.9650.9920.9810.9990.9920.9780.9730.9380.9810.9680.8460.9740.9710.9760.9110.988七、实用建议与适用边界结合源码与文档使用 GLASS 时建议关注以下几点svd是最关键的类别相关超参源码中该参数直接切换截断投影的锚点与半径策略svd1时锚定中心点、半径取r_tsvd0时锚定真实特征、半径固定 0.5见 _gradient_ascent_step务必按第五节的类别表设置miningFalse可关闭梯度上升只保留单步判别器前向可用于调试或降低训练开销step则控制上升步数默认 20focal_loss_quantile_threshold控制难例挖掘强度设为0时使用全部 LAS 样本计算 Focal Loss否则只保留误差最大的分位部分纹理源需 DTD 数据集训练时 LAS 分支依赖 DTD 纹理代码内置了下载信息dtd-r1.0.1.tar.gz及哈希校验首次运行会自动下载解压到anomaly_source_path弱缺陷场景是其强项GAS 分支专门合成近分布异常官方基准中弱缺陷占比较高的类别如 Leather、Grid、Capsule像素级 AUC 普遍在 0.97 以上而个别类别Metal Nut 0.846明显偏低说明结果仍随类别纹理特性波动推理开销低推理阶段只有 backbone 适配器 判别器无需重建式模型的解码器且RescaleSegmentor的静态高斯核设计对 ONNX 导出友好。八、小结GLASS 在 Anomalib 中提供了一个合成驱动的单类异常检测范式正常分支提供稳健的特征底座GAS 用带截断投影的梯度上升在特征空间逼近正常流形边界LAS 用 Perlin 噪声掩码 DTD 纹理在图像空间注入强异常共享判别器把两条监督信号统一起来。实现上通过 lightning_model.py 管理多优化器训练循环、通过 torch_model.py 承载核心前向逻辑、通过 examples/configs/model/glass.yaml 给出可复现配置。按仓库文档给出的类别化svd建议与训练条件即可在 MVTec AD 上复现仓库记录的 0.972图像级/0.965像素级平均 AUC。【免费下载链接】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),仅供参考