一句话结论
外观缺陷检测项目失败,多数不是模型不行,是光没打对、口径没定清、误报没人管。
一、先解决成像,再谈算法
缺陷检测的第一性问题是"缺陷在图像上可不可见、稳不稳定"。
三件事决定成像质量:光源类型、入射角、工作距离。金属反光件重点在抑制镜面反射,通常用低角度环形光或无影穹顶光;平面印刷/薄膜类重点在均匀性;深孔与凹槽需要同轴光。
判据很直接:同一缺陷在连续 50 张图上都要能看见,且形态一致。如果同一个划伤在相邻帧里时隐时现,说明光或曝光不稳,这时训练模型等于给噪声建模型。
二、样本:先量覆盖,再谈数量
样本收集的目标是覆盖"缺陷类型 × 工件型号 × 成像条件"的组合,而不是单纯堆数量。
实操步骤:
- 按缺陷类型分类(划伤、脏污、压伤、缺件、错件、颜色异常),每类单独统计
- 按工件型号分别统计,不同型号的表面工艺往往不同
- 记录正常样本的多样性:批次差异、来料差异、模具磨损后的差异
- 明确"严重程度"的分级口径,微缺陷算不算判 NG,必须由工艺方给结论
一个常见错误是只收 NG 样本。没有足量且多样化的 OK 样本,模型会把"没见过但正常"的当成异常,误报率下不来。
三、标注口径要写进文件
标注不是画框,是定义。要写清楚:
- 什么算缺陷、什么算可接受(比如 0.1mm 以下的划伤放行)
- 框到缺陷边界还是框到最小外接矩形
- 一处缺陷还是多处缺陷在同一个工件上,如何计数
- 边界模糊的样本由谁裁决(工艺工程师,不是标注员)
口径不统一的代价很大:同一个工件两个人标出两种结果,模型学到的就是矛盾的信号。
四、判定:分区与分类型阈值
整图一个大阈值是最常见的失败做法。
正确做法是分区检测:把工件按结构切成若干净区(表面、边缘、孔位、字符区),每个区域单独设阈值;再按缺陷类型分别设置信度阈值与面积阈值。
为什么必须分开:字符区的正常纹理与表面区的缺陷在特征空间里完全不同,混在一起设阈值,必然是一边漏检一边误报。
五、误报与漏检要分开统计
这两个错误的代价不同,处理方式也不同,绝不能合成一个"准确率"。
- 漏检(把 NG 判成 OK):流出风险,通常是客户最不能接受的
- 误报(把 OK 判成 NG):产线停线、工人返工,误报多了系统会被关掉
验收时必须分别给口径:漏检率上限、误报率上限、以及各自的统计样本量。只有"准确率 99%"这种数字,没有意义。
六、产线节拍
判定必须在节拍内完成,否则系统会被绕过。
先测单帧总耗时(采集 + 预处理 + 推理 + 后处理 + 与 PLC 通讯),再与节拍对比。余量建议不低于 30%,因为产线实际节拍会随工况波动。
如果超时,优先做的是减少检测区域(分区后只送关心区域),而不是硬换更强的算力——多数时候图像里大部分像素与判定无关。
七、验收怎么做
- 用一批未参与训练的样本做验证,含各类型缺陷与多型号
- 现场连续跑满一个班次,统计漏检、误报、平均耗时
- 结果标在原图上复核:标缺陷本身,不画包围大框(大框会掩盖定位不准的问题)
- 争议样本单独归档,作为后续迭代的训练素材
八、运维与迭代
上线不是终点。产线会换料、换模、换班次,成像条件也会漂移。
要留两条通道:一是异常样本自动留图回收;二是模型版本可灰度、可回滚。没有回滚能力的检测系统,一次升级事故就可能让客户把整套东西停掉。
九、常见误区
- 用研发阶段拍的漂亮图片训练,现场用的是不同相机与镜头
- 只优化总体指标,不区分漏检与误报
- 阈值由算法方单方面定,工艺方没签字
- 认为"多训几轮就能好",实际是成像或口径的问题
文档会随实施经验更新。发现表述过时或有误,欢迎指正。
← 返回全部白皮书