首页/新闻资讯/正文详情

QualityInspector 无监督异常检测(UAD)实战指南:PaDiM / PatchCore / STFPM 训练、评估与预测

发布时间:2026/9/25 15:01:50 来源:云帆数科 栏目:资讯中心
QualityInspector 无监督异常检测(UAD)实战指南:PaDiM / PatchCore / STFPM 训练、评估与预测
人工智能计算机视觉预训练【免费下载链接】PaddleSegEasy-to-use image segmentation library with awesome pre-trained model zoo, supporting wide-range of practical tasks in Semantic Segmentation, Interactive Segmentation, Panoptic Segmentation, Image Matting, 3D Segmentation, etc.项目地址https://gitcode.com/gh_mirrors/pa/PaddleSeg点击查看免费下载QualityInspector 是 PaddleSeg 仓库中的一个工业质检子项目内置了一套完整的**无监督异常检测Unsupervised Anomaly Detection, UAD**方案覆盖 PaDiM、PatchCore、STFPM 三种基于表示的算法配套 MVTec AD 数据集的训练、评估、预测工具与 YAML 配置体系。本文以contrib/QualityInspector/docs/uad/README.md为主线结合contrib/QualityInspector/qinspector/uad/与tools/uad/下的源码实现完整讲解算法原理、数据集组织、命令行操作与配置文件逐项解读读者可据此在自有缺陷检测场景中直接落地。1. 无监督异常检测算法原理无监督异常检测UAD的核心假设是工业场景中缺陷样本稀少且形态未知难以收集而正常OK样本充足。因此算法只使用正常样本建模正常分布推理时凡是偏离该分布的图像区域即判定为缺陷。技术方向可划分为两类基于表示的算法通过某种映射将输入图片映射到特征空间在该空间中正常样本与异常样本更容易区分。特点是推理速度快但一般只能实现patch 级区域级的分割基于重构的算法仅用正常样本训练的重构模型只能很好地重构正常样本无法准确重构缺陷样本通过对比重构误差检测缺陷。特点是能够实现像素级分割但速度较慢。在具体实现上基于表示的算法通常采用 ImageNet 预训练 backbone 提取特征推理时对比正常样本与异常样本的特征差异完成缺陷的分类与分割基于重构的算法通常以自编码器为重构模型推理时对比重构前后图像的差异完成分类与分割。目前 QualityInspector 的 UAD 方案支持三种基于表示的算法其中 PaDiM、PatchCore 无需训练网络算法论文思想训练阶段推理阶段PaDiMPatch Distribution Modeling用预训练 CNN 提取多尺度特征随机降维后逐位置拟合多元高斯分布用马氏距离衡量每个特征位置的异常分数分数越高异常可能性越大PatchCoreKNN Greedy CoreSet 采样提取多尺度特征经 KNN Greedy CoreSet 采样最具代表性的特征点构建特征向量记忆池比对测试特征与记忆池的距离得到每个特征位置的异常分数STFPM师生特征金字塔匹配学生网络将自身特征与冻结的教师网络逐尺度匹配学习正常样本分布对比教师、学生各尺度特征差异越大异常分数越高从源码结构看PaDiM/PatchCore 属于训练即特征统计的范式backbone 全程no_grad而 STFPM 的配置中带有epochs/lr/momentum/weight_decay等真实训练超参是需要训练网络参数的算法三种算法互补覆盖不同精度与成本需求。1.1 PaDiM 源码级实现PaDiM 的模型定义在 contrib/QualityInspector/qinspector/uad/models/padim.py 中ResNet_PaDiM直接复用 Paddle 视觉库的resnet18 / resnet50 / wide_resnet50_2前向时在paddle.no_grad()下依次取出layer1 / layer2 / layer3三个尺度的中间特征作为嵌入来源with paddle.no_grad(): x self.model.conv1(x) x self.model.bn1(x) x self.model.relu(x) x self.model.maxpool(x) x self.model.layer1(x) res.append(x) x self.model.layer2(x) res.append(x) x self.model.layer3(x) res.append(x) return res训练脚本 contrib/QualityInspector/tools/uad/padim/train.py 中体现了完整的建模流程收集训练集所有正常样本的layer1/layer2/layer3特征将后两层上采样到与layer1相同分辨率后沿通道拼接embedding concat从拼接特征中随机选取 d 个通道降维fins表中resnet18对应原始维度 448降维到 100对每个特征位置计算均值与协方差拟合多元高斯分布协方差矩阵加入0.01 * I正则项保证数值稳定将{mean, cov}分布参数与 backbone 权重一起以.pdparams保存。推理时用马氏距离衡量测试特征与训练分布每个位置的偏离程度。正因网络不参与梯度更新文档特别说明执行 PaDiM/PatchCore 训练命令时log 中 loss 恒为 0 是正常现象。1.2 数据集加载与数据增强数据集读取逻辑在 contrib/QualityInspector/qinspector/uad/datasets/mvtec.py 中MVTecDataset按train/test阶段扫描{class_name}/train与{class_name}/test下的所有缺陷子目录与good目录对非good样本再关联ground_truth/{defect_type}/{name}_mask.png标签图。图片与标签使用相同管线处理Resize(resize)→CenterCrop(cropsize)→ToTensor()图片额外做 ImageNet 均值的Normalizemean[0.485, 0.456, 0.406]std[0.229, 0.224, 0.225]。训练阶段只返回图片测试/预测阶段返回(x, y, mask)三元组用于计算 AUROC 与可视化。2. 数据集准备MVTec AD 格式QualityInspector 的 UAD 工具以 MVTec AD 数据集为例。首先下载数据集并保存在QualityInspector/data中目录结构如下data/mvtec_anomaly_detection/ | |--bottle # 某类产品 | |--ground_truth # 标签图 | |--broken_large # 某类缺陷标签图 | |--000_mask.png | |--001_mask.png | |--... | | |--broken_small # 某类缺陷标签图 | |--... | | |--contamination # 某类缺陷标签图 | |--... | |--test # 测试样本 | |--good # 正常样本测试图 | |--000.png | |--... | |--broken_large # 某类缺陷测试图 | |--000.png | |--... | |--broken_small # 某类缺陷测试图 | |--... | |--contamination # 某类缺陷测试图 | |--... | |--train # 训练样本 | |--good # 正常样本训练图 | |--000.png | |--... ...MVTec AD 数据包含结构和纹理类型的零件共计 15 类其中训练集只包含 OK 图像测试集包含 NG 和 OK 图像。从 contrib/QualityInspector/qinspector/uad/datasets/mvtec.py 可见 15 类的完整划分纹理类texturescarpet, grid, leather, tile, wood物体类objectsbottle, cable, capsule, hazelnut, metal_nut, pill, screw, toothbrush, transistor, zipper如果希望使用自己的数据集请组织成上述 MVTec AD 格式将自定义数据集作为 MVTec AD 中的一个 category即路径设置为QualityInspector/data/mvtec_anomaly_detection/{category}/...标签文件为灰度图缺陷部分像素值为 255。3. 训练、评估、预测命令以 PaDiM 模型为例训练、评估、预测脚本存放在tools/uad/padim/目录下PatchCore、STFPM 对应tools/uad/patchcore/、tools/uad/stfpm/。通过--config参数传入对应模型 YML 配置文件通过--category参数指定 MVTec AD 中的某个类别训练python tools/uad/padim/train.py --config ./configs/uad/padim/padim_resnet18_mvtec.yml --category bottle说明由于 padim 和 patchcore 的网络不参与训练执行上述命令时若 log 产生 loss 为 0 是正常现象。评估python tools/uad/padim/val.py --config ./configs/uad/padim/padim_resnet18_mvtec.yml --category bottle预测python tools/uad/padim/predict.py --config ./configs/uad/padim/padim_resnet18_mvtec.yml --category bottle从 contrib/QualityInspector/tools/uad/padim/train.py 的 argparse 定义看--category除单个类别外还支持textures、objects、all三个聚合取值分别批量处理纹理类、物体类或全部 15 类并自动将逐类 Image_AUROC / Pixel_AUROC 结果写入{save_path}/{backbone}/{category}_seed{seed}.csv最后输出 mean 平均行。因此若配置category: all一条命令即可完成全数据集训练与评估。3.1 各算法在 MVTec AD 上的实验结果三个算法目录下的 README 记录了以 resnet18 为 backbone、在 MVTec AD 上的图像级与像素级 ROCAUC 指标PaDiMresnet18指标AvgCarpetGridLeatherTileWoodBottleCableCapsuleHazelnutMetal NutPillScrewToothbrushTransistorZipperImage-level0.9180.9960.9281.0000.9650.9810.9990.8760.8750.7600.9840.8440.7740.9690.9720.850Pixel-level0.9620.9900.9440.9870.8940.9310.9790.9490.9800.9700.9630.9230.9750.9850.9740.981PatchCoreresnet18指标AvgCarpetGridLeatherTileWoodBottleCableCapsuleHazelnutMetal NutPillScrewToothbrushTransistorZipperImage-level0.9790.9920.9711.0000.9900.9901.0000.9790.9820.9990.9970.9390.9470.9420.9930.971Pixel-level0.9780.9910.9780.9990.9370.9420.9820.9850.9890.9880.9840.9760.9940.9910.9570.987PRO_score0.9320.9610.9230.9710.8480.8930.9470.9430.9370.9350.9390.9280.9710.9180.9100.957STFPMresnet18指标AvgCarpetGridLeatherTileWoodBottleCableCapsuleHazelnutMetal NutPillScrewToothbrushTransistorZipperImage-level0.9480.9880.9941.0000.9880.9940.9790.9290.9791.0000.9780.8160.8500.8750.8960.956Pixel-level0.9620.9900.9860.9950.9710.9551.0000.9370.9540.9860.9610.9050.9850.9900.8300.984整体来看PatchCore 的 Image-level 平均 ROCAUC 最高0.979STFPM 与 PaDiM 的像素级表现接近均为 0.962而 PatchCore 额外提供 PRO_score 指标0.932用于评价缺陷区域定位质量。4. 配置文件解读无监督异常检测UAD模型的参数可以通过YML 配置文件和命令行参数两种方式指定如果 YML 文件与命令行同时指定同一个参数命令行指定的优先级更高。这一优先级由 contrib/QualityInspector/qinspector/cvlib/uad_configs.py 中的ConfigParser实现如--device、--category、--resize等均可覆盖 YML 默认值便于不修改配置文件的临时实验。4.1 PaDiM 配置padim_resnet18_mvtec.yml配置文件位于 contrib/QualityInspector/configs/uad/padim/padim_resnet18_mvtec.yml主要参数如下# common arguments device: gpu seed: 3 # 指定numpy, paddle的随机种子 # dataset arguments batch_size: 1 num_workers: 0 category: bottle # 指定MVTecAD数据集的某个类别 resize: [256, 256] # 指定读取图像的resize尺寸 crop_size: [224, 224] # 指定resize图像的crop尺寸 data_path: data/mvtec_anomaly_detection # 指定MVTecAD数据集的根目录 save_path: output/ # 指定训练时模型参数保存的路径和评估/预测时结果图片的保存路径 # train arguments do_eval: True # 指定训练后是否进行评估 backbone: resnet18 # 支持resnet18, resnet50, wide_resnet50_2 # val and predict arguments save_pic: True # 指定是否保存第一张评估图片/预测图片的结果 model_path: output/resnet18/bottle/bottle.pdparams # 指定加载模型参数的路径 # predict arguments img_path: data/mvtec_anomaly_detection/bottle/test/broken_large/000.png # 指定预测的图片路径 threshold: 0.5 # 指定预测后二值化异常分数图的阈值参数说明与源码对照seed同时作用于random、numpy、paddle三个随机源见train.py中random.seed / np.random.seed / paddle.seed保证特征降维的随机通道选择等步骤可复现resize与crop_size分别对应MVTecDataset中的T.Resize与T.CenterCropPaDiM 默认 256 缩放到 224 中心裁剪PatchCore 默认crop_size: [256, 256]即不裁剪category除单类别外配置值支持textures、objects、all见 contrib/QualityInspector/qinspector/uad/datasets/mvtec.py 的CLASS_NAMES划分all时自动遍历全部 15 类并输出汇总 CSVbackbonePaDiM/PatchCore 支持resnet18 / resnet50 / wide_resnet50_2与padim.py中models字典一致STFPM 支持resnet18 / resnet34 / resnet50 / resnet101不同 backbone 的嵌入维度不同train.py的fins表记录了各 backbone 的特征通道数resnet18 为 448resnet50 / wide_resnet50_2 为 1792model_path评估/预测时加载的权重路径需与backbone、category、save_path组合保持一致如 PaDiM 训练保存路径为output/{backbone}/{category}/{class_name}.pdparams见train.py的save_name拼接逻辑PatchCore 则保存为output/coreset_resnet18_10/bottle.pdparams形式threshold预测时对异常分数图做二值化的阈值PaDiM/PatchCore 默认 0.5STFPM 默认 0.01具体取值应结合验证集 AUROC 曲线与缺陷率调节。4.2 PatchCore 特有参数contrib/QualityInspector/configs/uad/patchcore/patchcore_resnet18_mvtec.yml 在公共参数之外新增method: coreset # projection method, one of [sample, ortho, svd_ortho, gaussian, coreset] k: 10 # using feature channelsmethod特征记忆池的构建/投影方式可选sample / ortho / svd_ortho / gaussian / coreset默认coresetKNN Greedy CoreSet 采样与论文一致相关实现位于 contrib/QualityInspector/qinspector/uad/utils/k_center_greedy.py 与 contrib/QualityInspector/qinspector/uad/utils/random_projection.pyk使用的特征通道数默认 10直接影响记忆池规模与推理开销。4.3 STFPM 特有参数contrib/QualityInspector/configs/uad/stfpm/stfpm_resnet18_mvtec.yml 是三个算法中唯一需要真实训练网络的配置包含完整训练超参# train arguments epochs: 100 do_eval: True # After training, whether to eval model; backbone: resnet18 # Support resnet18, resnet34, resnet50, resnet101 lr: 0.4 momentum: 0.9 weight_decay: 1.0e-4 # val arguments compute_pro: Falselr: 0.4、momentum: 0.9、weight_decay: 1.0e-4SGD 优化器参数用于学生网络向冻结的教师网络逐尺度特征匹配学习compute_pro是否额外计算 PROPer-Region Overlap指标默认False开启后评估耗时增加但可获得更全面的定位质量评估PatchCore README 中已给出 PRO_score 参考值 0.932。5. 使用流程小结与注意事项数据按 MVTec AD 目录格式准备数据训练集仅 OK 图测试集含 OK/NG 图ground_truth为缺陷像素值为 255 的灰度图放入QualityInspector/data/mvtec_anomaly_detection/选型对精度要求高且推理资源充足可选 PatchCoreImage-level 平均 ROCAUC 最高追求更细粒度像素定位可关注 PaDiM/STFPM需要可训练网络则选择 STFPM执行分别调用tools/uad/{padim|patchcore|stfpm}/{train|val|predict}.py通过--config指定对应 YML、--category指定类别命令行参数可覆盖 YML 中同名项注意PaDiM/PatchCore 训练日志中 loss 恒为 0 属正常现象backbone 不参与训练仅统计特征分布/构建记忆池评估与预测前务必确认model_path指向正确权重STFPM 的阈值默认值0.01明显低于 PaDiM/PatchCore0.5按需基于验证集调整threshold以平衡误报与漏检。6. 相关资源索引UAD 总览文档contrib/QualityInspector/docs/uad/README.md算法配置与结果PaDiM README / 配置、PatchCore README / 配置、STFPM README / 配置核心实现padim.py、patchcore.py、stfpm.py、mvtec.py工具脚本tools/uad/padim/train.py、tools/uad/padim/val.py、tools/uad/padim/predict.pyPatchCore/STFPM 结构相同参数解析contrib/QualityInspector/qinspector/cvlib/uad_configs.py赞分享人工智能计算机视觉预训练【免费下载链接】PaddleSegEasy-to-use image segmentation library with awesome pre-trained model zoo, supporting wide-range of practical tasks in Semantic Segmentation, Interactive Segmentation, Panoptic Segmentation, Image Matting, 3D Segmentation, etc.项目地址https://gitcode.com/gh_mirrors/pa/PaddleSeg点击查看免费下载相关推荐如何用MLflow构建异常检测系统从模型训练到生产部署的完整指南如何用MLflow构建异常检测系统从模型训练到生产部署的完整指南 MLflow是一个强大的机器学习工作流程开源平台能够帮助数据科学家和工程师高效管理机器学习MLOpsLLMOps人工智能大模型模型评测LLM 网关可观测性PaddleDetection 半监督检测监督基线完全指南纯监督模型库、部分监督数据准备与训练评估实战PaddleDetection 半监督检测监督基线完全指南纯监督模型库、部分监督数据准备与训练评估实战 半监督检测Semi Supervised Objec人工智能深度学习计算机视觉Anomalib STFPM 模型详解Student-Teacher 特征金字塔匹配的无监督异常检测实现Anomalib STFPM 模型详解Student Teacher 特征金字塔匹配的无监督异常检测实现 本文围绕 anomalib 仓库中 STFPMSt人工智能计算机视觉深度学习模型评测上一篇Cloudflare Docs 风格指南审查规则编写指南从规则分类到接线与评估的完整实践下一篇终极Windows防撤回解决方案RevokeMsgPatcher完整使用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

GSD-Core 修复 `total_phases` 误计:非阶段章节标题不再污染里程碑阶段计数
GSD-Core 修复 `total_phases` 误计:非阶段章节标题不再污染里程碑阶段计数

【免费下载链接】gsd-core Git. Ship. Done - Core 项目地址: https://gitcode.com/gh_mirrors/ge/gsd-core 点击查看 免费下载 本篇文章聚焦 GSD-Core 中一个极具代表性的计数一致性修复(changeset #549):当 ROADMAP.md 中出现形… · 2026/9/25 15:01:44

ESPnet2 CMU ARCTIC TTS Recipe 实战指南:单说话人训练与 Pretrain-Finetune 微调全流程
ESPnet2 CMU ARCTIC TTS Recipe 实战指南:单说话人训练与 Pretrain-Finetune 微调全流程

人工智能语音音频深度学习NLP 【免费下载链接】espnet End-to-End Speech Processing Toolkit 项目地址: https://gitcode.com/gh_mirrors/es/espnet 点击查看 免费下载 CMU ARCTIC 是语音合成领域经典的英文单说话人朗读语料库,本指南围绕 ESPnet2 为其… · 2026/9/25 15:01:44

aws-doc-sdk-examples 的 premium-ex.md 解读:AWS SDK for Go V2 高质量示例清单与核心实现剖析
aws-doc-sdk-examples 的 premium-ex.md 解读:AWS SDK for Go V2 高质量示例清单与核心实现剖析

示例工程教程后端 【免费下载链接】aws-doc-sdk-examples Welcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below. 项目地… · 2026/9/25 15:01:38

Agent技能化改造:从杂乱工具到可复用技能库的工程实践
Agent技能化改造:从杂乱工具到可复用技能库的工程实践

1. 从“有模型”到“会干活”:为什么我重新思考了Agent的技能组织方式大概从去年下半年开始,我就不太愿意跟人聊“你接入了几个大模型”这种话题了。原因是,模型本身的差距在缩小,真正拉开体验差距的,恰恰是模型外面那… · 2026/9/25 15:27:18

Atlas 300V Pro推理加速卡YOLO部署实战指南
Atlas 300V Pro推理加速卡YOLO部署实战指南

1. 一块被误解最多的"运算加速卡":先给Atlas 300V Pro正名"atlas 300v 24g 是运算加速卡吗"——这个热搜词我太熟了,几乎每隔几天就会在技术社群里看到类似提问。包括"atlas部署yolo"这个搜索组合,说明很多人是… · 2026/9/25 15:27:12

Codeg浏览器自动化原理:隔离世界+ARIA树的跨导航元素引用安全设计详解
Codeg浏览器自动化原理:隔离世界+ARIA树的跨导航元素引用安全设计详解

Codeg浏览器自动化原理:隔离世界ARIA树的跨导航元素引用安全设计详解 【免费下载链接】codeg Collaborative multi-agent AI coding workspace: aggregate sessions from Claude Code, Codex, OpenCode, Pi, Grok Build, etc. Desktop app, self-hosted server, or … · 2026/9/25 15:27:06

SSRF漏洞详解:从原理、绕过到内网渗透与修复实战
SSRF漏洞详解:从原理、绕过到内网渗透与修复实战

先声明一句:我在安全测试这条路上认识SSRF有几年了,真正让我重视它的是某次授权渗透里,一个看似不起眼的URL输入框,直接让我拿到了内网一台数据库的血拼权限。SSRF全称是Server-Side Request Forgery,服务端请求伪造&a… · 2026/9/25 15:27:00

体育赛事直播录屏黑屏的5种实战解决方案
体育赛事直播录屏黑屏的5种实战解决方案

1. 问题本质与真实场景还原:黑屏不是故障,是信号链路上的“断点”“体育赛事直播录屏黑屏”这个标题,乍看像一个简单的技术故障,但实际踩过坑的人知道——它根本不是软件报错、不是硬盘满了、也不是显卡驱动崩了。它是一条完整信号… · 2026/9/25 15:26:53

如何使用安诺尼 SPECTRAN V6 PLUS 2000XA-6进行射频IQ数据录制
如何使用安诺尼 SPECTRAN V6 PLUS 2000XA-6进行射频IQ数据录制

引言在射频测量与信号监测工作中,原始 IQ 数据的录制是后续离线分析、信号还原与算法验证的基础。与仅保存频谱轨迹不同,IQ 数据保留了信号完整的幅度与相位信息,便于在实验室环境下反复回放与处理。本文以安诺尼SPECTRAN V6 PLUS 2000XA-6 实… · 2026/9/25 15:26:47

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码