新品 YOLO 缺陷检测冷启动:每类只有十几个缺陷样本,如何在研发期做到可上线(系列第 9 篇)
新品发布,产线催着"检测功能先跑起来",但翻遍全场只攒下一两百张整板图——摊到每个缺陷类别头上,只有十几二十个标注框。这个量级对"能不能出框"够用,对高精度工业识别要的稳定性和置信度,还差着距离。用 YOLO 做工业缺陷检测的人,迟早会被"新品先上线、数据以后再补"这句话压一遍。
这篇讲我们的真实应对:126 张整图、三类缺陷共 54 个标注框(每类 12~22 个)起步,靠迁移学习、样本效率三板斧、标注预算精算和一个能自转的数据飞轮,16 天内把一级检测做到 test 检出率 100%、二级分类 Top1 91.7%,并且之后每周都能稳定变强。适合样本总量不算少、但摊到每类就捉襟见肘的工业视觉工程师。
一、先定义什么叫"研发阶段基本可以商用"
样本少的时候最容易犯的错是盯着 mAP 焦虑。我们后来想明白了,研发期的验收标准应该是四个操作性指标:
- 检出率满格:test 集缺陷一个不漏(漏检是产线事故,误报不是)
- 误报有兜底:误检框能被二级判 ok 吸收,不污染良品率
- 置信度可定阈值:分数结构清晰,拦截线划得下去
- 迭代够快:新来一批图,当天就能完成"标注 → 训练 → 评估"一轮
这四条和"论文级精度"无关,但恰好是"能不能先上线跑着"的判定标准。后面所有动作都是围着这四条转的。
二、样本效率三板斧:让每一张图发挥三张的作用
第一板斧:预训练底模迁移。不从零训。yolov8n 的骨干在 ImageNet 上学过通用纹理特征,我们要教它的只是"板材上的这种纹路是缺陷"——几十个样本够教这个,不够教"什么是纹理"。
第二板斧:切片放大相对尺寸。整板图 2048×1536,缺陷框中位只有 150~200px(占图宽 5~8%)。直接训,缩到 imgsz 后缺陷只剩几十像素。切成 1280×1280 的片(overlap 0.2),缺陷在片里的相对尺寸接近翻倍——等价于不花一分钱标注把"有效分辨率"翻了一倍。我们的 126 张整图切出 229 片、160 个框。
第三板斧:crop 放大给分类器。这是 08 那篇的重点:检测框裁下来外扩 20%、缩放到 224×224 喂分类模型,有效像素再翻几倍。细粒度分类拼的就是像素,这一步是白捡的。
三板斧下来,"54 个框"实际发挥的信息量远超字面。
三、标注预算精算:每一张人工标注都花在刀刃上
样本少时,标注人力是最贵的资源,不能瞎标。三个机制配合:
批量预标注:有一个初始模型后,让它先标一遍,人工只做确认和修正。标注从"画框"变成"点确认",效率数倍提升。
主动学习扫描:模型跑一遍所有未标注图,按"模型最没把握"的程度排序,优先标模型最不会的图。标 100 张模型已经很有把握的图,不如标 20 张它犯迷糊的——同样的标注预算,信息增量差好几倍。
标注自查:训练完拿模型回头扫训练集,找"疑似漏标"(模型很确定有缺陷但你没标)和"疑似错标"(你标的和模型认的完全对不上)。我们第一次跑自查就捞出 15 条疑似问题。小样本数据集里每一张错标的杀伤力都被放大——54 个框里错 3 个就是 5% 的噪声。
四、数据飞轮:上线之后模型自己长数据
冷启动不是一次性冲刺,是一个能转起来的循环:
模型上线试跑 → 收它的误检框(自动变成 ok 负样本)和漏检图(人工补标) → 缺陷 crop 数据集重新生成 → 二级分类重训(实测 40 秒) → 标注自查清洗一轮 → 新版本评估 → 下周一模型更强几个让飞轮转得起来的关键设计:
- 二级重训只要 40 秒,所以"改标注、调类别、补负样本"这类实验可以随便做,一天迭代十轮不心疼
- 误检框是免费的高质量负样本:模型说"像缺陷"而人工没标的区域,正是它最容易犯的错,裁下来喂 ok 类,误报率一代比一代低。挖取的判断逻辑只有几行:
# 误检框 = 与所有 GT 框 IoU 都低于阈值的预测框(GT 为空的图上,所有预测框都算误检)forpredinpreds:# preds: 一级模型的预测框,按 conf 降序ifpred["conf"]<conf_thresh:continueifall(iou(pred,gt)<iou_threshforgtingt_boxes):save_as_negative(crop(pred))# 裁下来,标为 ok 类- 数据集版本快照保证"这个模型用的到底是哪版标注"可追溯,飞轮转十圈也不会乱
五、真实数字时间线
| 时间 | 动作 | 状态 |
|---|---|---|
| 第 1 周(9.24~9.28) | 首批整图标注完成(126 张,54 个缺陷框,3 类) | 数据集就绪 |
| 第 2 周 | 切片策略迭代(尺寸、空片限额、框处理,出了近十版切片数据集) | 切片定型为混合版 |
| 第 3 周(10.8~10.10) | 整图直训 mAP50 仅 0.431;换切片数据第二天冲到 0.995;随后 crop 数据集自动生成(54 缺陷 + 76 ok)、二级分类训练(100 epochs,40 秒) | 一级 test 检出率 100%,二级 Top1 91.7%,级联上线试跑 |
从"只有几十张图"到"两级模型上线试跑",跨度 16 天。核心工时不在训练,而在标注和评估纪律——机器时间总共不到半小时。
什么时候不用这套打法
- 缺陷形态新品间差异巨大:飞轮的价值在于同一产品线持续积累,如果每个新品的缺陷都要重新学"什么是纹理",三板斧的收益会打折
- 首批样本一张都没有:冷启动至少需要几十张带标注的图破冰,零样本请先用规则/OpenCV 传统方法顶着
- 产线误判成本极高且无人复核:研发期模型再好用也建议配人工复核岗,飞轮攒的是"每周变强",不是"一步到位"
- 没有迭代条件:如果上线后数据回不来(涉密产线等),飞轮转不动,那不如一次性多标注再上
诚实交代局限
- 先纠正一个容易误导的画面:我们的现场并不轻松——车间木屑粉尘多、背景杂乱干扰无法完全去除,缺陷又很细微,很多缺陷肉眼看图都得放大找半天。这套打法恰恰是在这种工业级场景里磨出来的,不是"纹理规律性强所以容易"。真正的边界在别处:我们缺陷体系是稳定的(固定三类);如果你的产线缺陷类型本身在频繁变化、定义还在演化,同样的迭代节奏未必跟得上——飞轮攒的是"同一套缺陷体系"上的复利
- test 集很小(5 个缺陷框),100% 检出率的置信区间其实很宽——小样本下的指标要留有余地读,别外推
- 二级分类器的 91.7% 是在 12 张 val crop 上算的,裂纹类样本仍不足,正在补数据中
- 我们没有做过"同一节点上这套打法 vs 蛮力多标注"的对照(现实中没有平行宇宙),飞轮省的标注量无法给出精确数字
小结
- 研发期"可商用"的判定是四条操作标准:检出满格、误报有兜底、置信度可定阈值、迭代够快——不是 mAP;
- 样本效率三板斧:预训练迁移、切片放大、crop 放大,全部零新增标注;
- 标注预算花在"模型最没把握的图"上,主动学习排序比闷头按顺序标效率高数倍;
- 飞轮的关键部件是"误检框自动变负样本"和"二级重训 40 秒"——迭代成本越低,模型长得越快;
- 级联结构(08)和冷启动打法(本篇)是同一件事的两面:样本少时,结构为数据效率服务。
FAQ
Q:首批几十张图都没有怎么办?
先破冰再谈飞轮:让工艺/质检同事用一周时间攒 30~50 张带典型缺陷的图(手机拍后补拍也行),配合传统图像方法(阈值、边缘)先顶一个粗筛。没有这几十张,任何深度方法都起不来。
Q:为什么不用数据增强把 54 个框变五千个?
增强在用,但要有自知之明:翻转/亮度/裁切变的是几何和光照,变不出"新的缺陷形态"。54 个框的多样性就是 54 个框的多样性,增强只是防止过拟合的手段,不是数据量的替代品。真正的增量来自飞轮收集的新图。
Q:一级模型为什么也要在研发期就训,不等数据攒够?
因为它是飞轮的发动机:没有一级模型就没有预标注、没有主动学习排序、没有误检框挖矿。研发期的第一版模型不要求多准,能把"大概在哪"学会就够驱动整个循环了——我们 9.28 批次的第一版整图模型 mAP50 只有 0.43,换成切片数据后第二天就冲到 0.995(07 篇有完整对照)。早期模型的价值是启动循环,不是直接上岗。
Q:二级分类 40 秒训完,是不是说明它很水?
恰恰相反,这是设计出来的优势。分类模型小(yolov8n-cls,3MB)、输入是几百张 crop,快是应该的。快意味着你敢做实验:调 pad、换负样本比例、清洗标注后重训,每个想法几分钟出结果。模型质量是迭代出来的,迭代速度就是质量的生产力。
Q:新品换得勤(一个月一个新板材),这套还转得动吗?
转得动,而且越转越省:同一产品线的缺陷形态有共性,老品的模型给新品做预标注,新品的破冰标注量会明显少于第一个品。第一个品是最难的,之后每个新品都在吃飞轮的复利。
技术栈:FastAPI · SQLite · Vue 3 · ultralytics
本系列共 6+4 篇(1~6 为平台搭建篇,7 起为 2.0 应用篇):
- 系列第 1~6 篇:见「yolo训练管理」目录(平台搭建:踩坑教训 / 选型 / 训练进程管理 / 数据一致性 / Windows 打包 / 方法论)
- 系列第 7 篇:大图切片训练——框处理策略演进(2.0 开篇)
- 系列第 8 篇:小缺陷细分类——两级级联的结构
- 系列第 9 篇:新品缺陷检测冷启动——每类十几个样本的迭代打法(本篇)
- 系列第 10 篇:级联上线实操——阈值、误报兜底与监控
有问题欢迎评论区交流。