工业产线上的缺陷检测,最难的从来不是把模型跑起来,而是两件事:一是缺陷样本太少,二是漏检控制不住。这两件事在学术数据集上往往被掩盖,因为公开数据集动辄几千张标注图,缺陷类型均衡、光照稳定、背景干净。但真实产线不是这样——一条新上的产线可能跑了一周才攒下几十张缺陷图,其中还有一半是同一位置同一类型的重复样本;而客户验收时盯的指标只有一个:漏检率。漏检一个缺陷流到下游,可能就是整批退货。
这篇内容围绕"小样本训练"和"漏检控制"这两条主线展开,把从数据准备、模型选型、训练策略到阈值调优、上线验证的完整链路拆开讲。适合已经跑通过YOLO基础训练、准备把模型往产线上推的工程师,也适合正在被"样本不够"和"漏检超标"两头夹击的算法同学。我会尽量把每一步背后的判断逻辑讲清楚,而不是只丢一堆参数让你抄。
1. 先搞清楚工业缺陷检测和通用目标检测的差别在哪
很多人上手工业缺陷检测的第一反应是:不就是目标检测吗,YOLO拉起来训就完了。训完发现mAP看着还行,一上产线漏检一堆。问题出在没意识到这两类任务的评价重心完全不同。
1.1 通用检测看mAP,工业检测看漏检率和过杀率
通用目标检测追求的是综合指标mAP,它把不同IoU阈值下的精度和召回做平均,本质上是一个"均衡"指标。但工业场景里,漏检(把有缺陷的判成OK)和过杀(把OK的判成缺陷)的代价是极度不对称的。漏检意味着不良品流出,可能是客诉、召回、产线停线;过杀意味着良品被误判,代价是复检人力或者直接报废。
所以工业检测真正要盯的是两个数:漏检率(Miss Rate)和过杀率(Overkill Rate)。这两个指标是一对矛盾体,你把判定阈值调低,漏检降了但过杀飙升;阈值调高,过杀降了但漏检又上去了。整个调优过程本质上是在这条权衡曲线上找一个业务能接受的平衡点,而不是追求某个单一指标的极值。
我见过不少团队拿着mAP 0.9的模型上线,结果漏检率还有5%以上,原因就是mAP这个平均值把某些难例的糟糕表现给平均掉了。所以从项目一开始,评估体系就得换成漏检率/过杀率,而不是mAP。
1.2 缺陷的形态决定了它和常规目标的本质区别
常规目标检测里的"目标"是有明确语义边界的物体——人、车、猫、狗,它们有稳定的形状、纹理和上下文。缺陷不一样,缺陷是"异常",它的形态高度依赖具体工艺:
- 划痕类:细长、对比度低、方向随机,在低分辨率下几乎和背景噪声融为一体
- 脏污类:边界模糊、形状不规则,和产品本身的纹理容易混淆
- 缺料/缺件类:本质是"该有的东西没有",检测的是缺失而非存在
- 尺寸偏差类:往往需要亚像素级的测量精度,不是简单的框回归能搞定
这意味着缺陷检测不能简单套用通用检测的思路。有些缺陷适合用目标检测框出来,有些更适合用异常检测的思路——只学好品分布,偏离分布的就判异常。选错范式,后面再怎么调都是事倍功半。
1.3 小样本在工业场景里是常态而非例外
学术数据集里每类几百上千个样本是标配,但工业现场:
- 新产线刚导入,缺陷样本可能只有个位数
- 某些缺陷是偶发的,几个月才出现一次
- 客户不愿意提供历史缺陷数据(涉及工艺机密)
- 标注成本高,缺陷区域小、边界模糊,标注一致性差
所以"小样本训练"不是可选项,是必答题。而小样本带来的直接后果就是模型容易过拟合、泛化差、对阈值极度敏感——这又直接导致漏检控制变得困难。这两件事是连在一起的,必须放在一起解决。
2. 小样本条件下,数据策略比模型结构更重要
样本少的时候,很多人第一反应是去找更强的模型、更复杂的结构。我的经验是:在样本量低于某个阈值时,数据侧的投入回报远高于模型侧。你花两周改结构涨的那点指标,可能不如花两天把数据增强和采样策略做对。
2.1 缺陷样本的采集与标注:宁缺毋滥
小样本场景下,每一个样本都很珍贵,所以标注质量比数量更重要。几个实操要点:
标注一致性优先于标注精度。缺陷边界模糊时,不同标注员画的框可能差很多。这时候要制定明确的标注规范,比如"划痕以可见对比度变化的最外沿为准",并且让同一个人标完同一类缺陷。我吃过亏:三个人标同一批划痕,框的大小差异导致模型学出来的回归目标自相矛盾,收敛都困难。
负样本(OK样本)要足够且多样。很多人只盯着缺陷样本数量,忽略了OK样本。OK样本的作用是让模型学会"什么是正常的",如果OK样本太少或者太单一,模型会把正常的产品纹理变化也当成缺陷,过杀率直接爆炸。经验比例是OK样本至少是缺陷样本的5到10倍,而且要覆盖不同的光照、角度、批次。
难例负样本要专门收集。那些"长得像缺陷但其实OK"的样本——比如产品表面的正常纹理、反光点、水渍——必须专门收集并标为负样本。这类样本是降低过杀率的关键,也是模型真正学到判别边界的依据。
2.2 数据增强:不是越多越好,要贴合缺陷的物理特性
通用检测里常用的随机裁剪、旋转、翻转,在缺陷检测里要谨慎使用,因为有些增强会破坏缺陷的物理合理性:
| 增强方式 | 是否适用 | 说明 |
|---|---|---|
| 水平/垂直翻转 | 视情况 | 划痕方向有工艺含义时不能用 |
| 随机旋转 | 谨慎 | 旋转后缺陷方向失真,可能引入错误先验 |
| 亮度/对比度扰动 | 推荐 | 模拟不同光照,提升鲁棒性 |
| 高斯噪声 | 推荐 | 模拟传感器噪声,尤其适合低对比度缺陷 |
| 马赛克增强 | 谨慎 | 小样本下容易把缺陷拼到不合理位置 |
| 复制粘贴缺陷 | 推荐 | 把缺陷实例贴到不同背景,有效扩充样本 |
复制粘贴(Copy-Paste)是小样本缺陷检测里性价比最高的增强之一。做法是把标注好的缺陷区域抠出来,随机贴到其他OK样本上,生成新的缺陷样本。这样能在不增加标注成本的前提下显著扩充缺陷样本量。但要注意贴合位置要合理——缺陷不能贴到物理上不可能出现的位置,否则模型学到错误的空间先验。
2.3 用异常检测的思路补充小样本检测
当缺陷样本实在少到个位数时,纯监督检测很难训好。这时候可以引入异常检测的思路作为补充:只用OK样本训练一个"正常分布"模型,推理时偏离分布的判为异常。
常见的做法有基于特征重建的(如自编码器、GAN重建),也有基于特征分布的(如PatchCore、PaDiM这类用预训练特征做密度估计的方法)。这类方法的优势是只需要OK样本,冷启动快;劣势是对缺陷类型没有判别能力,只能告诉你"这里不对劲",不能告诉你是什么缺陷。
实操中我倾向于混合方案:用异常检测做粗筛,把可疑区域框出来,再用小样本监督检测模型做精分类。这样既解决了冷启动问题,又保留了分类能力。异常检测负责"召回",监督模型负责"精度",分工明确。
3. 模型选型与训练策略:小样本下怎么让YOLO不崩
YOLO系列因为速度快、部署方便,是工业检测的主力选择。但小样本直接训YOLO,很容易遇到BN崩溃、过拟合、loss不收敛这些问题。这一节讲怎么把YOLO在小样本场景下调教好。
3.1 预训练权重是小样本的生命线
小样本训练第一条铁律:必须用预训练权重,而且要用和你的任务域接近的权重。从随机初始化开始训,几十张图根本训不出东西。
YOLO的预训练模型通常在COCO或ImageNet上训过,这些权重的浅层特征(边缘、纹理、颜色)是通用的,可以直接迁移。深层特征和具体类别相关,需要微调。实操建议:
- 冻结策略:小样本时先冻结backbone的前若干层,只训head和后面的层,训几个epoch后再解冻全部微调。这样能防止浅层通用特征被少量数据带偏。
- 学习率:微调时学习率要比从头训练小一个数量级,通常1e-4到1e-5起步。学习率太大,预训练权重几下就被冲没了。
- 权重选择:如果有同域的大数据集(比如同行业的其他产品缺陷数据),优先用那个训出来的权重做初始化,效果比通用COCO权重好很多。
3.2 BN层是小样本训练最容易崩的地方
BatchNorm在batch size小的时候统计量估计不准,running mean和running variance会剧烈波动,导致训练不稳定甚至崩溃。小样本场景batch size往往开不大(显存限制或者样本本来就少),BN问题尤其突出。
几个应对方案,按推荐程度排序:
- 换用GroupNorm或SyncBN:GroupNorm不依赖batch统计,小batch下更稳。如果多卡训练,SyncBN能跨卡同步统计量,等效增大batch。
- 冻结BN的running统计:设
momentum很小或者直接冻结,让统计量保持预训练时的值。适合微调场景。 - 梯度累积:用小batch前向,累积多个batch的梯度再更新,等效增大batch size。这是最省事的办法,不改模型结构。
- 调大momentum:让running统计更快跟上当前数据分布,但太大会震荡,要试。
我一般先用梯度累积把等效batch拉到16以上,如果还崩再考虑换Norm层。实测下来,梯度累积能解决大部分小样本BN崩溃问题。
3.3 损失函数:小样本下要重新配比
YOLO的损失一般由三部分组成:分类损失、框回归损失、目标置信度损失。小样本场景下,这三者的平衡要重新考虑。
分类损失:如果类别极度不均衡(比如OK样本远多于缺陷样本),要用focal loss或者类别加权,否则模型会倾向于全预测成多数类。缺陷检测里正样本(缺陷)往往是少数,加权系数要根据实际比例调。
框回归损失:小样本下框回归容易过拟合到训练集的框分布。CIoU、DIoU这些考虑了中心点距离和长宽比的损失,比单纯的IoU收敛更稳。如果缺陷框普遍很小,要注意小目标的回归权重。
置信度损失:这个直接关系到漏检。置信度阈值定在哪里,决定了多少缺陷被漏掉。训练时可以用label smoothing防止模型过度自信,推理时再通过阈值扫描找最佳工作点。
一个实操技巧:把分类和回归解耦训练。先训一个只管"有没有缺陷"的二分类模型(召回优先),再训一个只管"缺陷在哪、是什么"的模型。解耦后每个任务的数据需求更聚焦,小样本下更容易训好。
3.4 训练轮次与早停:小样本极易过拟合
小样本训练最典型的曲线是:训练loss一路下降,验证loss先降后升,升的那一点就是过拟合的开始。所以:
- 必须留验证集,哪怕只有十几张图,也要留出来监控过拟合
- 早停要果断,验证指标连续几个epoch不提升就停,别舍不得
- 数据量越少,训练轮次越少,几十张图可能几十个epoch就够了,训几百个epoch纯属过拟合
我一般会同时跑几个不同轮次的checkpoint,最后在验证集上选,而不是只留最后一个。
4. 漏检控制的完整链路:从阈值到后处理
模型训完只是开始,漏检控制是一整套工程手段的组合。这一节把从推理阈值到后处理的每个环节拆开讲。
4.1 置信度阈值扫描:找到业务可接受的工作点
推理时每个检测框都有一个置信度分数,高于阈值的才输出。阈值定得高,漏检多;定得低,过杀多。所以阈值不是拍脑袋定的,要扫出来。
做法是:在验证集(最好包含难例)上,把阈值从0.05到0.95按步长扫描,每个阈值下统计漏检率和过杀率,画出权衡曲线(类似ROC但更直接)。然后根据业务能接受的漏检率上限,反推阈值。
注意:阈值扫描必须在和产线分布一致的验证集上做。用训练集扫出来的阈值上线必然翻车,因为训练集是模型见过的,置信度普遍偏高。
实操中还有个细节:不同缺陷类型的最优阈值可能不同。划痕和脏污的置信度分布不一样,用一个全局阈值会顾此失彼。可以对每类缺陷单独扫阈值,推理时分类别应用。
4.2 多模型集成:用冗余换召回
单模型总有盲区,集成是降低漏检的有效手段。常见做法:
- 多尺度集成:同一张图用不同输入分辨率推理,结果融合。小缺陷在高分辨率下更容易检出,大缺陷在低分辨率下也稳。
- 多模型集成:训几个结构不同或初始化不同的模型,推理时投票或取并集。取并集能显著降漏检,但过杀会上升,要配合后处理。
- TTA(测试时增强):对输入做翻转、多尺度等变换,多次推理后融合。代价是推理时间成倍增加,产线节拍紧的话要权衡。
集成的本质是用计算资源换召回。产线如果节拍允许,多尺度+多模型集成能把漏检压得很低。
4.3 后处理:把漏检从后处理环节捞回来
很多漏检不是模型没检出,而是被后处理滤掉了。NMS(非极大值抑制)是重灾区:两个重叠的缺陷框,NMS可能把置信度低的那个抑制掉,如果那个恰好是真缺陷,就漏了。
针对漏检的后处理优化:
- 调低NMS的IoU阈值:让重叠框更容易同时保留,减少误抑制。但太低会导致同一缺陷出多个框,过杀上升。
- 用Soft-NMS替代NMS:不直接抑制,而是降低重叠框的分数,保留更多候选。
- 分类别NMS:不同类别的框不互相抑制,避免跨类误抑制。
- 小目标保护:对面积小于某阈值的框,降低抑制力度,因为小缺陷更容易被误抑制。
4.4 难例回流:让漏检的样本重新进入训练
上线后漏检的样本是最宝贵的训练数据。要建立回流机制:
- 产线端记录所有被判OK但后续发现缺陷的样本(可能来自下游复检或客诉)
- 定期把这些难例加入训练集,重新训练或增量训练
- 重点标注这些难例,它们代表了模型当前的盲区
这个闭环跑起来,模型会越用越准。很多团队模型上线就不管了,漏检率一直降不下来,就是因为没有回流机制。
5. 上线验证与持续监控:别让实验室指标骗了你
实验室验证集上的指标和产线实际表现往往有差距,这个差距来自数据分布偏移、光照变化、产品批次差异等。上线验证和持续监控是最后一道防线。
5.1 上线前的影子测试
正式接管产线判定之前,先做影子测试:模型在产线旁路运行,只记录判定结果,不实际控制分拣。同时人工全检,把模型判定和人工判定逐一对齐。
影子测试要跑够样本量,至少覆盖几个班次、不同批次的产品。重点看:
- 模型判OK但人工判缺陷的(漏检)有多少,都是什么类型
- 模型判缺陷但人工判OK的(过杀)有多少,集中在哪些区域
- 有没有系统性的偏差,比如某个光照条件下整体偏严或偏松
影子测试跑一两周,漏检率和过杀率稳定在业务可接受范围,再切正式运行。
5.2 上线后的指标监控
上线不是终点,要持续监控几个关键指标:
| 监控指标 | 含义 | 异常处理 |
|---|---|---|
| 漏检率 | 缺陷被判OK的比例 | 超阈值立即告警,回流难例 |
| 过杀率 | OK被判缺陷的比例 | 过高影响产能,需调阈值 |
| 置信度分布 | 检测框分数的分布 | 分布漂移说明数据分布变了 |
| 推理耗时 | 单张推理时间 | 突增可能是硬件或输入异常 |
| 输入图像质量 | 亮度、清晰度 | 质量下降会直接导致漏检 |
置信度分布漂移是个很好的早期信号。如果某天开始,检测框的置信度整体下降,说明输入数据的分布变了(可能是换了批次、光照变了、镜头脏了),这时候即使漏检率还没超标,也要提前介入。
5.3 数据分布漂移的应对
产线的数据分布不是一成不变的:换批次、换供应商、设备老化、季节变化都会导致分布漂移。应对策略:
- 定期用新数据评估:每周或每月用最新产线数据评估模型,看指标有没有退化
- 增量训练:把新数据加入训练集,做增量微调,让模型跟上分布变化
- 设置漂移告警:用置信度分布、特征分布等做漂移检测,超阈值触发重新评估
我踩过的坑:一个模型上线时漏检率0.5%,三个月后涨到3%,原因是换了原材料供应商,产品表面纹理变了,模型把新纹理当成了正常。如果当时有漂移监控,能提前发现。
6. 几个实操中反复踩的坑和应对
这一节把前面散落的经验集中一下,都是实际项目里反复遇到的问题。
6.1 标注框大小不一致导致回归学不好
前面提过,这里展开说。缺陷边界模糊时,不同标注员、甚至同一标注员不同时间画的框都可能差很多。模型学回归时,同一个缺陷的回归目标不一致,loss降不下去。
应对:制定像素级的标注规范,用标注工具固定缩放比例,定期做标注一致性检查(抽检同一批图让不同人标,算IoU)。一致性低于0.7就要重新培训标注规范。
6.2 验证集和产线分布不一致
最常见的翻车原因。验证集是从训练数据里随机分的,和训练集同分布,但产线数据可能来自不同时间段、不同批次。结果验证集指标很好,上线就崩。
应对:验证集要独立采集,最好来自不同时间段和批次,模拟真实的分布偏移。宁可验证集小一点,也要保证它和训练集有分布差异,这样才能真实反映泛化能力。
6.3 过度依赖单一阈值
前面讲过分类别阈值,这里补充:阈值应该是动态的。产线光照变化、产品批次变化时,最优阈值会漂移。可以设置基于图像质量(亮度、对比度)的动态阈值调整,或者定期用新数据重新扫阈值。
6.4 忽略推理速度对节拍的影响
工业产线节拍很紧,推理速度不达标,再高的精度也没用。集成、TTA、大分辨率这些提召回的手段都会增加推理时间。要在精度和速度之间找平衡:
- 先用轻量模型+多尺度集成,看能不能达标
- 不行再上大模型,但要评估硬件是否支持
- 模型量化、TensorRT加速是常规手段,能显著提速
6.5 漏检控制的优先级要明确
最后一点,也是最重要的:漏检和过杀的优先级必须在项目开始就明确。如果业务方说"漏检一个都不行",那就要接受高过杀率和高复检成本;如果说"过杀太多产线受不了",那漏检率就得放宽。这个优先级决定了后面所有阈值、集成、后处理策略的方向。最怕的是业务方既要低漏检又要低过杀还不给加资源,那这个项目从开始就注定拧巴。
把优先级定清楚,把评估体系换成漏检率/过杀率,把数据回流闭环跑起来,小样本缺陷检测的漏检控制就有了可落地的方法论。剩下的就是在这个框架里不断迭代调优,没有一劳永逸的银弹,但有可以持续改进的工程路径。