☰
2022工业缺陷检测路线盘点:从YOLO到无监督异常检测
2026/10/15 11:06:10 网站建设 项目流程

干工业视觉这几年,我每年年底都会干一件事:把当年和缺陷检测相关的论文、开源代码、项目反馈拉在一起过一遍。2022 年是比较特别的一年——工业缺陷检测深度学习方法不再只是“谁家的 yolo 调参调得更好”,而是开始系统性地往无监督异常检测、扩散模型、自监督预训练这些新方向上走。很多以前靠老师傅肉眼看的工序,那一年开始真正能把深度学习模型跑在工控机上做实时质检。这篇文章干脆就沿着 2022 年最值得梳理的几条主线做一次综述式拆解:检测、分割、无监督异常检测、小样本与部署落地,每一条我都会把原理、选型逻辑、实际踩坑放在一起说。适合正在挑方案的算法工程师,也适合刚入行、想快速建立一个完整认识的学生。

1. 2022 年工业缺陷检测为什么值得重新梳理一遍

1.1 工业质检的真实痛点:不是精度不够,是漏检和过检

传统机器视觉在产线上已经扎根很多年了,阈值分割、边缘检测、模板匹配对高对比度的缺陷很有效,比如明显的碰撞伤、大块油污、缺料。但一旦缺陷变成细小划痕、微裂纹、低对比度脏污,传统方法的参数就变得非常脆弱。光源稍微动一点,阈值就得重新调,老师傅都知道这不是长久之计。深度学习最大的价值是它不用人肉写规则,能从大量样本里自动学出“什么叫正常、什么叫异常”的边界,所以才会在工业质检里被反复拿来做尝试。

但真正上产线之后你会发现问题不是“模型答得准不准”,而是漏检率和过检率怎么平衡。漏检,就是真缺陷放过去了,流到客户那边就是批量退货;过检,就是正常产品被误杀,产线上需要人工复查,一个班几万件产品,哪怕误检 1% 都是巨大的工作量。学术界常说的 mAP、AUC 在这里只能算参考,甲方真正盯着的是漏了几个、多杀了几件、单帧耗时几毫秒。这三个指标互相拉扯,调模型也好、调阈值也好,本质上都是在找那个让总成本最小的点。2022 年的很多新方法,与其说把精度刷高了多少,不如说是在想办法让这个“平衡”更好控制。

1.2 2022 年的技术环境发生了哪些关键变化

2022 年前后的技术变化对工业缺陷检测产生了很明显的推动。第一个是视觉 Transformer 开始成熟,ViT、Swin Transformer 这些骨架不断出现在论文里,DETR 系列的检测器也被尝试用在缺陷数据集上,算力条件好一点的产线开始能跑。第二个是无监督异常检测异军突起,MVTec AD 这个基准数据集成了试金石,大家开始意识到“只用正常样本训练也能把缺陷找出来”这件事在工业上是多么宝贵。第三个是扩散模型迅速升温,它不仅能做图像生成,还被用来做异常检测和缺陷样本生成,这在当时是很新的玩法,值得单独讲一讲。

除此之外,自监督预训练也在悄悄影响工业实践。MAE、DINO 这些方法让很多人开始思考:工厂里有海量正常品图像,能不能先让模型在大量无标注数据上做自监督训练,再拿少量缺陷样本做微调。这个思路非常对工业的胃口,因为正常样本几乎是无限的,而缺陷样本往往少得可怜。2022 年正好是这些方向从论文走到开源代码的一年,所以我说这一年值得花时间来梳理。

2. 检测与分类路线:产线上部署最多的一类方法

2.1 为什么 YOLO 家族仍是产线上的主力

先别急着追新,产线上最常用的还是检测框架,尤其是 YOLO 家族。原因很朴素:分类网络只能告诉你“这张图有没有缺陷”,但给不出位置;生产线上定位缺陷非常重要,因为后续要贴标、返修、触发剔除机构,至少要告诉机械手“缺陷在哪里”。YOLO 从 V3 到 V5、V7 一路下来,速度够快、精度够用、生态成熟。2022 年能看到大量做缺陷检测的方案都是在 YOLOv5 上做改进,比如换更深的 backbone、加注意力模块、改进特征金字塔。YOLOv7 在 2022 年中发布,E-ELAN 结构让速度和精度更均衡,也很受欢迎。

用 YOLO 做缺陷检测有几个关键细节和公开数据集刷点不一样。缺陷通常都很小,一张 640×640 的图里,缺陷可能只有十几个像素,这时候默认的 P3、P4、P5 输出层对小目标不友好,常见做法是提高输入分辨率,或者增加 P2 层。还有一类缺陷长宽比特别极端,比如划痕、拉丝、裂纹,在 anchor-based 配置里很难匹配好,需要好好调 anchor 尺度;如果用的是 anchor-free 版本,也要注意中心点采样策略。我自己调过 PCB 焊点虚焊的检测项目,初始 mAP0.5 只有 0.82,后来做了小目标重采样、把训练图按缺陷实际像素面积分层抽样,才勉强到 0.91,这个提升足够说明小目标问题有多影响最终效果。

2.2 分类网络在工业场景的适用边界

分类网络并不是不能用于工业检测,只是要清楚它的适用边界。它适合缺陷种类少、只需要判“有/无”的场景,比如瓶盖有没有污点、芯片表面有没有异色、灯泡有没有装反。样本数相对充足时,一个 ResNet 或者 EfficientNet 就能解决大部分问题。这里说的“样本充足”在工业场景下通常是指每类缺陷至少几百张,如果只有几十张,训练分类网络就很容易过拟合,我见过模型在训练集上 99%,到现场一测就崩的情况。

一旦缺陷样本严重不足,我建议优先考虑预训练加微调,别从零训练。在 ImageNet 上预训练过的模型对纹理、边缘、颜色的底层特征已经有很强的表征能力,迁移到表面缺陷上往往很轻松。类别不平衡严重时,可以用类别权重交叉熵、Focal Loss 来拉高少样本类别的梯度。另一个容易被忽略的思路是把分类网络当特征提取器用,取倒数第二层的向量做余弦相似度或者距离判断,这一招在“正常样本很多、缺陷样本极少”的场景非常好用,相当于用小分类器搭了一个最朴素的异常检测系统。分类网络最大的问题是没有空间定位,如果你想把它接到自动化剔除机构上,至少得配合滑窗或区域提案,否则只能做整幅图级别的报警,这就浪费了大量计算量。

3. 分割路线:像素级定位才是很多缺陷的真正答案

3.1 从 U-Net 到 Mask R-CNN,分割路线怎么选

检测框给的是一个矩形包围盒,但很多工业缺陷的形状非常不规则,有些缺陷细长、有些缺陷还带有分支,一个框里既包括了缺陷像素也包括了大量正常背景。如果产线上需要按缺陷面积、周长、宽度来判定是否合格,检测框就很难满足要求。这时候就得上分割网络,输出逐像素的缺陷掩码。语义分割的代表是 U-Net 以及它的各种变体,适合一个或少数几个类别,网络轻、训练快、推理也不慢。实例分割的代表是 Mask R-CNN,适合多个缺陷目标互相挨着、甚至粘连在一起的情况,它能把每个实例单独分出来。

选型时我通常会先问几个问题:缺陷需不需要计数?需不需要测量单个缺陷的大小?缺陷之间是不是经常粘连?如果只是看有没有、面积大概多少,U-Net 足够;如果既要位置又要实例数量和各自面积,Mask R-CNN 更合适。分割模型的输出在产线上往往还要接一个后处理层,把掩码转换成缺陷面积、主轴长度、圆度这些形态学指标,再和工艺公差做比较。比如锂电池极片上的凸点,检测模型告诉你这里有一块异常区域,分割模型会精确告诉你这块区域是不是已经超出工艺允许的范围,这个差别在实际生产里就是能不能放行的问题。

3.2 2022 年分割方向值得关注的两个改进点

2022 年分割方向有几个改进非常对工业胃口。第一个是注意力机制和边界感知的结合。Attention U-Net 在跳跃连接时加入注意力权重,对细小裂纹的定位比普通 U-Net 更准;U-Net++ 的深监督机制可以有效缓解小目标漏分;边界感知损失则是让模型更关注缺陷边缘,因为很多表面缺陷的边缘非常模糊,像素级标注都不稳定,通过边界距离图做监督可以明显提升边缘的连续性。第二个是弱监督和点监督的思路开始落地。完全逐像素标注的成本极高,大多数工厂根本没有精力做,所以很多团队开始尝试用检测框或者点标注生成伪掩码,再交给分割网络去精修。

我自己在做一个织物瑕疵分割项目时,就是先用 LabelImg 快速画框,再用框中心和背景区域构造初始种子,配合类似 GrabCut 的思路生成伪 mask,最后用 U-Net 在这些伪 mask 上进行训练。整个过程标注成本比纯像素级标注低了大概一半,分割结果也足以满足 AOI 设备上按面积阈值报警的需求。顺便提一句,2022 年前后像 SegFormer、Mask2Former 这类 Transformer 分割模型在学术界很火,但放到产线上落地还很少,主要原因是推理速度和中低端显卡上的内存占用暂时撑不住,我个人建议观望为主,不必要为了赶热点牺牲交付时间。

4. 无监督与异常检测:2022 年最值得关注的新主线

4.1 无监督异常检测的核心逻辑:只学正常,不学长缺陷

聊到工业缺陷检测,就绕不开 2022 年最热的无监督异常检测。这个思路的出发点和传统监督学习完全不同:传统方法需要大量“正常图”和“缺陷图”才能训练一个分类器;无监督异常检测只用正常样本训练,推理时自动找出与正常分布偏差太大的区域。为什么工业场景特别适合这个思路?因为工厂里正常产品的图像几乎可以无限采集,而缺陷本身是稀有事件,尤其新产线刚启动时,根本攒不齐足够的缺陷样本。更进一步说,缺陷的形式是开放的,今天划痕、明天气泡、后天可能有从没人见过的脏污,监督学习很难覆盖所有异常类型,无监督方法只需要建模“正常是什么样”。

做个类比:小区保安不需要知道所有小偷的长相,他只要熟悉日常进出住户的节奏和面孔,看到一个陌生人就会警觉。无监督异常检测就是这个逻辑。工业上这类方法通常给每个像素或者每个 patch 一个异常分数,分数高的地方就是可疑区域,然后通过阈值控制漏检和过检。2022 年各种新方法层出不穷,但万变不离其宗,基本可以归为三类:重建差异类、特征嵌入类、合成异常判别类。

4.2 PatchCore 与特征嵌入方法到底在解决什么问题

2022 年 MVTec AD 这个基准上最绕不开的模型就是 PatchCore。它属于特征嵌入方法,思路可以拆成两句话:先用一个在 ImageNet 上预训练过的骨干网络提取正常图像的 patch 级特征,把这些特征存到一个记忆库里;推理时再提取测试图像的 patch 级特征,与记忆库做最近邻距离计算,距离大的位置就是异常。它不重新训练骨干网络,而是直接吃预训练网络的特征,这一点在工业上非常划算。为什么用 patch 级特征而不是整图特征?因为局部特征才能定位异常的位置;为什么用预训练模型?因为它已经具备丰富的纹理、颜色、边缘先验,相当于一个不用从头学的“通用眼睛”。

实际调用 PatchCore 时要注意几个参数。backbone 可以根据现场精度要求选择,通常 WideResNet-50 效果好但特征维度大,对嵌入设备压力不小;patch 大小一般取 3×3 或 5×5,太大容易把细小缺陷平均掉,太小对噪声敏感。记忆库不能无限堆特征,常见做法是做高斯降采样或者 coreset 抽样,抽样比例 1% 到 10% 之间,需要根据验证集的结果来定。阈值怎么设也有讲究,我会用一批纯正常样本算出异常分数的 P95 或 P99 分位线,把它作为初始阈值,再叠加产线上复检记录微调。我在一个塑料瓶盖异色检测项目里,只用 200 张正常图训练,500 张测试图上 AUC 做到了 0.96,这放在传统监督方案里几乎不可想象。

4.3 生成式方法与扩散模型在异常检测中的新角色

2022 年扩散模型大火,工业缺陷检测也没少蹭上热度。扩散模型在缺陷检测里主要有两个用途,一个是做缺陷样本生成,另一个是直接做异常检测器。前者很好理解:用扩散模型或者 GAN 生成大量人工缺陷图像,补到监督训练集里,解决缺陷样本稀缺的问题。我自己试过用生成合成缺陷来训练检测模型,有点用,但要注意合成分布和真实缺陷分布之间的偏差,如果模型只学会了“假缺陷长这样”,真实缺陷反而认不准。后者更有意思,扩散模型通过一个逐步加噪声、逐步去噪的过程重建图像,如果输入是正常图像,重建会很顺利;如果是异常图像,重建过程中会出现明显的不一致,这个重建误差就成了异常分数。相关方法有 DDAD、AnoDDPM 这些,论文里刷分都不错,但扩散模型推理速度太慢,几百步采样在产线毫秒级节拍下根本跑不动,更适合离线抽检场景。

重建类方法的共同优点是直观,缺点是容易“把缺陷也一起重建掉”。这听起来很反直觉,但确实是重建类方法的老大难:模型学的是正常流形,输入一张异常图时,它可能直接把它“修好”,重建出一张看起来正常的图,结果重建误差并不大,漏检就发生了。所以 2022 年之后大家更偏爱特征距离类方法,就是在特征空间比较差异,而不是在像素空间比,PatchCore 就是典型。顺带提一句,自监督方式也有很多团队在试,用 MAE 那种随机掩码重建的思路做过预训练,对图像块做掩码重建,正常块重建误差低、异常块重建误差高,这个思路适合有大量正常图但缺陷极罕见的项目。

5. 小样本、边缘部署与工程化落地

5.1 缺陷样本严重不足时,先别急着加数据

现实项目里最常听到的一句话是“这个缺陷图片再找找,不够 500 张就训练不了”。实际上真到产线上,缺陷样本往往只有几十张甚至几张,这时候的核心思路不是硬凑数据,而是改变学习方法。第一种方式是吃预训练的红利,不管是分类、检测还是分割,用 ImageNet 或者自监督预训练的权重做初始化,哪怕只有几十张缺陷图,模型也能快速收敛出可用的特征。第二种方式是合成数据,把已有缺陷图像通过裁剪、贴图、泊松融合等方式贴到正常产品图像上,我还会刻意保留一定比例的原图,防止模型把贴图痕迹本身当成特征。第三种方式更绕,直接放弃监督学习,上线无监督异常检测,让模型先只学正常分布,少量缺陷样本留给后面人工复核和增量训练用。

增量学习也是小样本落地时一个常被忽略的环节。不要幻想一次训练就交付,先把一个最简模型推到产线,让它在运行中回收误检漏检,再每周或每月更新一轮。2022 年有些团队会做主动学习闭环:模型先跑一批图,把置信度低的、特征距离大的图片自动收集起来,人工只标注这些“难例”,再回到训练集里迭代,这样人工负担比按帧全标小非常多。我的经验是,小样本项目真正拼的不是模型有多大,而是迭代闭环有多快。

5.2 模型压缩与推理优化:从 PyTorch 到 TensorRT 的实战要点

学术界论文一般不关心推理时间,但产线必须关心。以检测任务为例,一条视觉检测流水线可能要求单帧处理不超过 20 毫秒,模型本身有时候只占预算的一半,另一半要给相机触发、图像预处理、前后处理和 IO。常见的优化链路是 PyTorch 训练,导出 ONNX,再转成 TensorRT 部署到 NVIDIA 显卡上,或者用 OpenVINO 部署到 Intel CPU。这一步看似简单,实际操作会踩不少坑。

第一是算子兼容问题,可变形卷积、自定义上采样、部分注意力模块在导出 ONNX 时经常会报不支持,处理办法要么是换成等价算子,要么在部署阶段用 TensorRT plugin 自己写。第二是动态形状问题,TensorRT 里默认按固定输入 shape 优化,如果你在导出时开启动态尺寸,就必须显式配置 profile,否则可能会出现莫名其妙的性能下降甚至报错,工业现场最好直接固定输入分辨率。第三是精度问题,FP16 大多数情况下和 FP32 几乎无差异,可以直接上;INT8 就需要校准数据集,校准集选不好会出大面积误检,我一般会拿现场真实的三五百张图做校准集,而不是随便用训练集凑数。第四是 BatchNorm 折叠,推理阶段最好把 BatchNorm 参数融合到卷积层里,这一步在转 ONNX 之前做能省不少延迟。

我在一个 YOLOv5s 项目里做过对比,输入 640×640,纯 PyTorch 推理大约 25 毫秒,用 TensorRT FP16 优化后能压到 7 到 9 毫秒,这就给前端预处理和后处理留出了充足余量。如果是 CPU 环境,OpenVINO 也能把大多数 CNN 模型推理时间压到原来的一半以内。还有一句肺腑之言:模型优化做得再好,也扛不住光源没打好。光学方案决定了图像上限,模型只是在这个上限里还原信息,打光、光圈、曝光、频闪控制没有稳定,再新的算法都白搭。

6. 常用数据集与评估指标:别被一堆论文刷点骗了

6.1 工业缺陷检测领域常用数据集速查

做工业缺陷检测研究,至少要知道几个常用的公开数据集,因为很多论文的对比实验就是在这些数据上做的。NEU-DET 是热轧钢板表面缺陷的经典数据集,一共 6 类缺陷、1800 张图,常用于检测任务;DAGM2007 是合成纹理缺陷数据集,纹理背景类型多,适合验证传统纹理缺陷检测能力;KolektorSDD 是一套非常小的电换向器表面微裂纹数据集,样本量很少,很适合考验小样本方法;PCB Defect 数据集覆盖 6 类 PCB 缺陷,共 1386 张图,常用于电路板缺陷检测;MVTec AD 则是工业异常检测领域的标准基准,覆盖 15 类物品,有 4000 多张正常图和 1200 多张异常图,2022 年几乎每篇无监督异常检测论文都要在上面跑结果。

整理成表格会更直观:

数据集应用领域规模与特点任务类型
NEU-DET钢铁表面6 类缺陷,约 1800 张目标检测
DAGM2007纹理背景10 类合成缺陷,类间纹理差异大分割/检测
KolektorSDD电换向器349 张,微裂纹分割/检测
PCB Defect电路板6 类缺陷,1386 张目标检测
MVTec AD多种工业品15 类,正常图约 4000+,异常图 1200+无监督异常检测

不过要清醒一点,公开数据集刷分和现场交付是两码事。公开数据集已经做过图像去噪和背景统一,现场却没有这么好的“卫生条件”,光照变化、产品混批、传送带抖动都会让指标断崖式下跌。所以读论文时看数据集上的绝对数值就可以,但别把那个数字当产线承诺。

6.2 评估指标怎么选:mAP、F1、漏检率、过检率的取舍

学术报告里最常见的是 mAP 和 F1,但在工业交付里,甲方经常直接问:漏检率是多少?过检率是多少?这俩指标和分类阈值直接相关,阈值调高一点,漏检降了,过检就会涨;阈值调低一点,过检降了,漏检又会冒头。真正合理的做法是给两类错误加上成本权重。比如一个缺陷流到客户手里可能要赔几千块,而一个正常品被误杀最多是返工几毛钱,那模型阈值就应该设置得更保守,宁可多杀一点也不能放过缺陷。

我写交付报告时一般不会只给一个 F1,而是把 PR 曲线、混淆矩阵、按缺陷尺寸分层的召回率、以及过检图像的缩略图一起贴出来。这样客户能直观看到模型错在哪、漏在哪,也方便一起定“可接受的操作点”。无监督异常检测场景里,AUC 是最常见的评估指标,但 AUC 高不代表现场阈值好使,真正上线时还是要回到正常样本上取 P95/P99 分位数来定阈值,并且留出一段观察期持续监控误报率。对于分割任务,除了像素级 IoU,更要关注缺陷面积误差,因为产线上判定是否合格通常用的是面积阈值,面积误差十几个像素都会影响最终裁定。

7. 常见工程问题与我的避坑细节

7.1 样本不平衡与过拟合的几个典型处理手段

工业缺陷数据集里的类别不平衡往往比公开数据集严重得多,可能某个缺陷有几千张,另一个缺陷只有五十张。最简单的处理是给 loss 加类别权重,但权重过大又容易让模型把注意力全放在少数类上,反而导致多数类崩掉。另一个常用手段是 Focal Loss,让模型把精力集中在难分类样本上;检测任务里还会用 OHEM 在线难例挖掘,把训练过程中 loss 最高的样本重点回传。数据层面可以每个 epoch 对少数类缺陷做重复采样,或者用多尺度裁剪、旋转、颜色扰动做增强,但一定要控制增强强度,别把正常产品的真实分布也改没了。

过拟合在工业项目里同样常见。一个典型信号是训练 loss 降得很快,验证集指标也还行,一到现场就频频误检。很多情况下这意味着数据集太小,模型把训练图里的背景特征也当成了缺陷线索。解决思路一是加强正则,DropBlock、权重衰减、早停都可以;二是固定归一化参数,不要在推理时再用训练集的统计量;三是反复确认训练集和测试集切分时没有数据泄露,我之前就看到过有人按图片拍摄顺序切分,导致同一个产品的多角度图同时出现在训练和测试里,指标虚高得很离谱。

7.2 光照、运动模糊与产线噪声对模型的真实影响

模型在实验室里测得好好的,一上产线就报警乱跳,这种案例几乎每个项目都会遇到。最大的变量就是成像质量。很多工厂车间里的光源不是恒流的,灯管老化、频闪、临近设备的电磁干扰,都会让同一类产品在不同时刻拍出来的图出现明显差异。传送带速度变化还会带来运动模糊,尤其是检测对象是小缺陷时,几个像素的模糊就能让模型彻底失灵。所以入场第一步不是训模型,而是先把成像摸透:用标准色卡和灰度卡调白平衡,固定 ROI 区域,把输入图像的归一化方式统一成一套固定参数。

我还有一个习惯,就是在产线现场单独建一个“环境干扰图库”,凡是遇到光源闪烁、反光、遮挡、喷码重叠这类场景,全部拍照存档。这些图不是用来训练模型找缺陷的,而是用来做预处理和后处理压测的,看看模型会不会被干扰带偏。无监督异常检测对这种干扰尤其敏感,因为它的逻辑就是“和正常分布不同就是异常”,光照一旦变化,可能整张图都变成“异常”,所以必须在成像端把亮度稳定住。

7.3 标注质量差怎么办:围标、伪标签与主动学习的实际经验

标注质量问题经常被低估。一个项目如果有三个标注员,各人眼中的“缺陷”可能完全不一样,有的喜欢把边缘模糊区域也框上,有的只标特别明显的目标,最终模型学到的边界必然混乱。我的建议是先做一份带图标注规范,正例、反例、边缘样本都要有示例,然后选一小组图让所有标注员标完,计算两两之间的 IoU 一致性,不达标就继续培训。这个流程听起来麻烦,但比起训练一个标注混乱的模型再返工,划算得多。

对于边界非常模糊的缺陷,与其纠结逐像素标注,不如试试伪标签迭代。先用少量干净数据训练一个还不错的模型,对更多未标注数据做推理,生成伪 mask 或伪框,再由人工快速修正明显错误。人工修边界比从零标注容易得多,工作效率能提上去不少。主动学习也是这个闭环里的一环:模型对某些样本的置信度特别低的时候,把这些样本自动送回标注队列,优先处理那些“模型最拿不准”的区域,数据利用率会非常高。踩过几次坑之后我有一个很直观的感受:好的标注闭环,往往比换一个更牛的骨干网络更能提升项目上限。

建模这件事,说到底不是比谁的模型新,而是比谁更懂现场。2022 年让我印象最深的不是某个算法跑出了多高的分,而是越来越多的团队开始接受“用正常样本建模、把少量缺陷留给人工复核、用部署效率倒推模型选型”这套思路。你在实际项目里也可以这样:先花两周把成像稳定,把标注标准量化,再用最稳的 YOLO 或 PatchCore 搭一套可解释、可回退的基线,而不是一上来就上最复杂的 Transformer。这个顺序如果反过来,后面大概率要花几倍时间回去填坑。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询