干工业视觉这几年我每年年底都会干一件事把当年和缺陷检测相关的论文、开源代码、项目反馈拉在一起过一遍。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。这个顺序如果反过来后面大概率要花几倍时间回去填坑。