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

无监督缺陷检测实战:PatchCore从跑通到产线部署

发布时间:2026/9/27 5:19:21 来源:云帆数科 栏目:资讯中心
无监督缺陷检测实战:PatchCore从跑通到产线部署
简介这份资源面向希望入门工业视觉缺陷检测的开发者与算法学习者提供一套基于无监督学习的缺陷检测Python实现方案。核心思路借助相位变换phase by transform完成图像重构与异常判别无需大量标注缺陷样本即可定位产品表面异常适合数据采集成本高、缺陷样本稀缺的检测场景属于深度学习与图像处理交叉的进阶实践内容。压缩包共13个文件约7.02MB包含1个py脚本与1个ipynb笔记本作为可本地直接运行的主程序另有5个jpeg、4个png图像用于展示原始图、模糊图、重构图、二值化图与检测结果对比并附README说明与LICENSE授权文件。资源已有332人学习下载读者可据此理解无监督缺陷检测的完整流程包括图像预处理、相位变换重构、阈值分割与缺陷定位并对照示例图像验证各阶段输出快速搭建可复现的检测基线。1. 无监督缺陷检测到底在产线上解决什么问题一条SMT贴片线换型之后新料号只给了几十张良品图缺陷样本一张没有——这是制造业质检场景里最真实的开局。传统监督检测模型在这里直接趴窝没有负样本分类头学不出来标注成本又高得离谱。基于无监督学习的缺陷检测系统核心思路就是只用正常样本训练一个正常长什么样的模型推理时凡是偏离正常分布的像素或区域一律判为异常。它解决的不是这个缺陷叫什么名字而是这里有没有不该出现的东西。适合谁用三类人最该关注一是产线换型频繁、缺陷样本攒不起来的工艺工程师二是做工业视觉方案、被标注预算卡脖子的算法工程师三是想把检测能力快速铺到新品类、又不想重训模型的落地团队。它不挑缺陷类型划痕、脏污、缺件、偏移都能兜住代价是对缺陷分类这件事无能为力——你得接受它只告诉你哪里不对不告诉你这是什么缺陷。这个取舍是后面所有选型和调参的出发点。2. 无监督缺陷检测的原理与主流方案选型2.1 为什么重建和嵌入两类方法能work无监督缺陷检测的底层假设只有一句话正常样本在特征空间里是稠密的、可压缩的异常是稀疏的、难压缩的。围绕这个假设主流方案分成两大流派。第一类是重建派代表是AutoEncoder和GAN。训练时让网络只学正常样本的重建推理时异常区域因为没见过重建误差大误差图就是异常热力图。优点是直观、可视化好缺点是网络太强会把异常也重建出来俗称泛化过头尤其是小缺陷重建误差可能比噪声还小。第二类是嵌入派代表是PaDiM、PatchCore这类基于预训练特征的方法。它们不训练重建而是拿ImageNet预训练 backbone 提取正常样本的patch特征建一个特征记忆库memory bank推理时算测试patch到记忆库的距离距离大就是异常。优点是无需训练、对小缺陷敏感、推理稳定缺点是对backbone的域偏移敏感工业图和ImageNet分布差太远时特征会飘。我一般会先上PatchCore跑一版baseline因为它几乎不用调参就能出结果能快速判断这个场景到底可不可做。如果PatchCore都压不住误报再考虑上重建派做互补。2.2 用PatchCore在本地跑通最小闭环先装依赖注意faiss是PatchCore做近邻检索的核心CPU版就够跑通验证pip install torch torchvision pip install faiss-cpu pip install scikit-learn opencv-python tqdm数据目录按MVTec的经典结构组织这是工业异常检测事实上的标准格式data/bottle/ ├── train/good/ # 只放正常样本 │ ├── 000.png │ └── ... ├── test/good/ # 测试用正常样本 └── test/broken_large/ # 测试用各类缺陷核心的特征记忆库构建与推理逻辑下面这段是能直接跑的最小实现import torch import torch.nn.functional as F import faiss import numpy as np from torchvision import models, transforms from PIL import Image import glob # 1. 用预训练WideResNet提取patch特征去掉最后的分类层 backbone models.wide_resnet50_2(weightsmodels.Wide_ResNet50_2_Weights.IMAGENET1K_V1) backbone.eval() features torch.nn.Sequential(*list(backbone.children())[:-2]) # 保留到最后一层卷积 preprocess transforms.Compose([ transforms.Resize((256, 256)), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), ]) def extract_patch_features(img_path): img Image.open(img_path).convert(RGB) x preprocess(img).unsqueeze(0) with torch.no_grad(): feat features(x) # [1, 2048, 8, 8] # 局部邻域聚合让每个patch特征带上下文这是PatchCore的关键 feat F.avg_pool2d(feat, kernel_size3, stride1, padding1) b, c, h, w feat.shape feat feat.permute(0, 2, 3, 1).reshape(-1, c).numpy() return feat, (h, w) # 2. 构建记忆库把所有正常样本的patch特征堆起来 all_feats [] for p in glob.glob(data/bottle/train/good/*.png): f, _ extract_patch_features(p) all_feats.append(f) memory np.concatenate(all_feats, axis0).astype(float32) # 3. 用faiss建近邻索引L2距离 index faiss.IndexFlatL2(memory.shape[1]) index.add(memory) # 4. 推理测试patch到记忆库最近邻的距离即异常分数 def infer(img_path): f, (h, w) extract_patch_features(img_path) f f.astype(float32) D, _ index.search(f, 1) # 每个patch找最近的一个正常patch score_map D.reshape(h, w) return score_map score infer(data/bottle/test/broken_large/000.png) print(异常分数图尺寸:, score.shape, 最大值:, score.max())逻辑说明features截到最后一层卷积输出的是空间特征图而非全局向量这样才能定位到具体区域。avg_pool2d(kernel_size3)做局部邻域聚合是PatchCore论文里明确提到的关键操作能把单点噪声平滑掉显著降低误报。IndexFlatL2是最朴素的暴力检索样本量上万后建议换IndexIVFFlat加速。参数说明输入尺寸256是精度和显存的折中产线小缺陷多可以提到512但记忆库会膨胀4倍。kernel_size3是默认值缺陷尺寸小于3个patch时改成1否则会被平滑掉。异常分数阈值不要拍脑袋定用测试集正常样本的分数分布取99分位数作为阈值这是最稳的做法。2.3 重建派方案什么时候该上PatchCore跑完如果发现漏检集中在纹理类缺陷比如织物断经、金属拉丝不均说明预训练特征对这种细粒度纹理不敏感这时候上重建派。AE的重建误差对纹理变化更敏感因为它学的是像素级分布。但重建派有个血泪经验别用太强的decoder。我见过有人拿U-Net做重建结果缺陷区域重建得比正常区域还清楚误差图一片黑。正确做法是给latent加瓶颈、给decoder加dropout故意让它重建不好异常才暴露得出来。这个度很难调所以重建派我只在嵌入派确实压不住时才上。3. 从跑通到产线可用阈值、后处理与部署3.1 异常分数阈值怎么定才不玄学跑通demo和产线可用之间隔着一条叫阈值的鸿沟。无监督检测输出的是连续异常分数判不判缺陷全靠阈值切。定阈值有三条路我按推荐度排序。第一条是分位数法最稳。拿一批纯正常样本跑推理收集所有patch的分数取99.5分位数作为阈值。含义是正常样本里允许0.5%的patch被误判这个比例对应产线可接受的过杀率。缺点是如果正常样本本身有波动光照、来料差异分位数会被拉高导致漏检。第二条是良品分布拟合适合正常样本多的场景。把正常分数拟合成高斯或Gamma分布阈值取均值加3倍标准差。比裸分位数更抗离群点。第三条是按缺陷召回反推需要少量标注缺陷。给定缺陷召回必须到95%在缺陷分数分布上找对应分位点。这条最准但违背了无监督不要标注的初衷一般只在验收阶段用。提示阈值不是定一次就完事。产线换批次、换光源、换镜头分数分布都会漂。我一般会在系统里留一个正常样本回流通道每周自动重算一次阈值。3.2 后处理把像素级热力图变成可判定的缺陷框原始输出是一张分数图直接拿去报警会碎成几百个小点。必须做后处理标准流程是四步import cv2 import numpy as np def postprocess(score_map, threshold, min_area50): # 1. 归一化到0-255便于形态学操作 norm (score_map - score_map.min()) / (score_map.ptp() 1e-8) binary (norm threshold).astype(np.uint8) * 255 # 2. 开运算去孤立噪点闭运算连断裂区域 kernel cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)) binary cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel) binary cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel) # 3. 连通域分析过滤小面积 num, labels, stats, _ cv2.connectedComponentsWithStats(binary) boxes [] for i in range(1, num): area stats[i, cv2.CC_STAT_AREA] if area min_area: continue x, y, w, h stats[i, cv2.CC_STAT_LEFT], stats[i, cv2.CC_STAT_TOP], \ stats[i, cv2.CC_STAT_WIDTH], stats[i, cv2.CC_STAT_HEIGHT] boxes.append((x, y, w, h, area)) return boxes逻辑说明开运算先腐蚀后膨胀专门杀孤立噪点闭运算先膨胀后腐蚀把断成两截的同一缺陷连起来。顺序不能反反了会把噪点连成片。min_area是最关键的过滤参数设太小误报爆炸设太大漏检小缺陷。参数说明min_area按产线最小可接受缺陷面积定。比如相机分辨率下1mm缺陷占50像素就设50。形态学kernel用3x3是通用值缺陷本身很细如裂纹时kernel要小于缺陷宽度否则缺陷被腐蚀没了。3.3 部署时的推理加速与显存控制产线节拍通常要求单张推理在100ms内PatchCore的瓶颈在faiss检索。记忆库上万条时IndexFlatL2会拖到几百毫秒。换成IndexIVFFlat并设置合适的nlistquantizer faiss.IndexFlatL2(memory.shape[1]) index faiss.IndexIVFFlat(quantizer, memory.shape[1], 100) # 100个聚类中心 index.train(memory) index.add(memory) index.nprobe 10 # 检索时只搜10个最近的聚类速度换精度nlist一般取sqrt(样本数)nprobe取nlist的10%左右。这两个参数直接决定速度和召回的平衡产线上要实测调。显存方面backbone用FP16推理能省一半显存精度损失在异常检测里几乎看不出来。4. 无监督缺陷检测的避坑与排查清单4.1 误报满天飞先查这四处现象正常样本被大量判为异常过杀率超过20%。原因最常见的是训练集混入了不干净的正常样本——比如正常图里带了轻微脏污、反光、边缘阴影。无监督模型会把这些当成正常的一部分反而对真正干净的产品误报。其次是backbone域偏移ImageNet特征和工业灰度图差太远。解决先做训练集清洗用模型对训练集自检把分数最高的几张正常图挑出来人工看大概率有问题。域偏移严重时换在工业数据集上预训练的backbone或者干脆上重建派。4.2 小缺陷漏检别急着换模型现象大缺陷检出正常1-2像素的划痕、针孔全漏。原因avg_pool2d的邻域聚合把小缺陷平滑掉了或者输入resize把缺陷缩没了。256输入下原图2000像素宽的1像素划痕resize后直接消失。解决把输入尺寸提到512甚至1024或者改用滑窗推理——大图切patch分别推理再拼回去。聚合kernel从3降到1。这三招按代价从低到高试。4.3 阈值换批次就失效现象这周调好的阈值下周换批来料就疯狂误报或漏检。原因光照、镜头脏污、来料批次差异都会让分数分布整体漂移。固定阈值在动态产线上必然翻车。解决上自适应阈值。每批来料先跑前N张做分布估计动态更新阈值。或者用相对分数——把当前图的分数减去该批次的正常分数中位数再做判定。4.4 记忆库太大导致推理卡顿现象训练样本攒到几千张后单张推理从50ms涨到500ms。原因PatchCore的记忆库随正常样本线性增长IndexFlatL2是O(N)检索。解决做记忆库的coreset采样用k-center-greedy把记忆库压到原来的10%精度几乎不掉。这是PatchCore论文里的标准操作别省这一步。4.5 把无监督当分类器用现象老板问这个缺陷是划痕还是脏污系统答不上来。原因无监督只输出异常/正常没有类别概念。解决两级架构——无监督做粗定位出缺陷框再拿这些框去训一个小的有监督分类器。缺陷样本攒够之前分类器可以先不上人工复判。别指望无监督一步到位做分类那是另一个问题。5. 让无监督检测真正落地的两个进阶技巧第一个技巧是多尺度分数融合。单一尺度的异常分数对小缺陷和大缺陷总有一头不讨好。我的做法是同时跑256和512两个尺度把两张分数图resize到同一尺寸后取逐像素最大值。小缺陷在256尺度上响应强大缺陷在512尺度上更完整融合后召回明显提升。代价是推理时间翻倍产线节拍紧的话可以只在复判环节跑第二尺度。第二个技巧是用正常样本的分数分布做在线监控。系统上线后持续记录每批正常样本的分数均值和中位数。如果某天均值突然抬升说明产线出了变化——可能是光源衰减、镜头脏了、或者来料本身变了。这时候系统还没开始误报但你已经收到预警了。这个监控比阈值本身更有价值它把无监督检测系统变成了产线状态的传感器。验证方法上我习惯用留一批法把正常样本分成训练集和验证集验证集完全不参与记忆库构建。如果验证集上的过杀率远高于训练集说明模型过拟合了训练集的正常模式泛化不行得加数据或换backbone。最后说个我踩过的坑别在项目初期就追求完美阈值。我第一个项目花了三周调阈值结果产线一换型全白费。后来学乖了先把系统跑起来用宽松阈值加人工复判边跑边收数据边调。无监督检测系统的价值不在一次调对而在持续自适应。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

Windows C盘空间告警的本质:系统健康诊断而非简单清理
Windows C盘空间告警的本质:系统健康诊断而非简单清理

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

做网站怎么切图避坑指南:3步搞定不返工
做网站怎么切图避坑指南:3步搞定不返工

做网站怎么切图避坑指南:3步搞定不返工 改个需求建站公司拖一周,这种憋屈事儿谁没遇到过?明明只是换个Banner图,对方却说“要重新切图、调参数、测兼容性”,一来一回半个月过去了,项目进度全卡在一张图上。其实, 做网站怎么切图… · 2026/9/27 5:19:21

银河麒麟V10服务器系统深度解析与信创部署指南
银河麒麟V10服务器系统深度解析与信创部署指南

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

分组密码填充(Padding)完全指南:PKCS7、0x80 填充规则与不校验填充引发的 CTF 攻击
分组密码填充(Padding)完全指南:PKCS7、0x80 填充规则与不校验填充引发的 CTF 攻击

文档网络安全教程 【免费下载链接】ctf-wiki Come and join us, we need you! 项目地址: https://gitcode.com/gh_mirrors/ct/ctf-wiki 点击查看 免费下载 本文以 CTF Wiki 中 填充方式 一节为骨架,系统梳理分组密码中常见的五种填充规则及其字节级示例… · 2026/9/27 7:03:38

不会代码也能做站:新手建站广告联盟赚钱完整流程
不会代码也能做站:新手建站广告联盟赚钱完整流程

不会代码也能做站:新手建站广告联盟赚钱完整流程 自己不会代码想做网站,是不是觉得心里发虚,怕被坑钱或者根本做不出来?别慌,今天就把这套 新手建站广告联盟赚钱 的 完整流程… · 2026/9/27 7:03:32

RSUITE DOMHelper 使用指南:React 项目中的 DOM 操作助手 API 全解析
RSUITE DOMHelper 使用指南:React 项目中的 DOM 操作助手 API 全解析

前端UI组件 【免费下载链接】rsuite 🧱 A suite of React components . 项目地址: https://gitcode.com/gh_mirrors/rs/rsuite 点击查看 免费下载 在 React 项目中,官方并不推荐直接操作 DOM,而是主张通过状态与虚拟 DOM 驱动界… · 2026/9/27 7:03:32

Open CoDesign EDITMODE 协议指南:从 TWEAK_DEFAULTS 声明到可调节控件的完整实现
Open CoDesign EDITMODE 协议指南:从 TWEAK_DEFAULTS 声明到可调节控件的完整实现

人工智能AI 应用桌面应用 【免费下载链接】open-codesign Open-source Claude Design alternative. One-click import your Claude Code / Codex API key. Prompt → prototype / slides / PDF. Multi-model (Claude, GPT, Gemini, Kimi, GLM, Ollama). BYOK, local-first, MIT… · 2026/9/27 7:03:26

GitHub Desktop 发布说明写作规范与自动化流程解析
GitHub Desktop 发布说明写作规范与自动化流程解析

开发工具桌面应用 【免费下载链接】desktop Fork of GitHub Desktop to support various Linux distributions 项目地址: https://gitcode.com/gh_mirrors/des/desktop 点击查看 免费下载 本篇技术指南基于 GitHub Desktop 仓库的 docs/process/writing-release-no… · 2026/9/27 7:03:26

iPhone手机防盗迎来重大升级!iOS 27自动锁定功能曝光,被偷瞬间秒锁屏保护你的数据
iPhone手机防盗迎来重大升级!iOS 27自动锁定功能曝光,被偷瞬间秒锁屏保护你的数据

手机被人从手里一把拽走的那几秒钟,恰恰是你最不设防的时刻——屏幕还亮着,微信还在弹消息,支付宝甚至不需要密码就能打开。就在这个令人后背发凉的缝隙里,苹果悄悄出手了。在最新曝光的 iOS 27 Beta 2 版本中,一项名为… · 2026/9/27 7:03:20

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

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

企业微信二维码