过杀下降 vs 漏检上升,工业检测的两难选择
开头:过杀太严重,客户投诉
你有没有过这种经历?
模型精度 99%,但误杀率太高——正常芯片被判定为缺陷,客户投诉不断。你降低阈值,误杀下降了,但漏检又上来了。
过杀和漏检,永远是跷跷板。
AOI 项目的芯片缺陷分类从 V1 迭代到 V4,核心目标就是「降低过杀」。V4 的 a_chip 误杀率大幅下降,但 c_broken 漏检率从 94% 降到了 47%。
不是因为迭代有多难——而是因为「过杀 vs 漏检」的权衡没有标准答案。
一、过杀 vs 漏检
过杀(False Positive): 正常芯片被判定为缺陷 后果:返工成本增加,客户投诉 漏检(False Negative): 缺陷芯片被漏掉 后果:缺陷产品流出,质量事故 权衡: 降低过杀 -> 漏检上升 降低漏检 -> 过杀上升工业场景的选择
安全关键(汽车/医疗):宁可过杀,不可漏检 消费电子:平衡过杀和漏检 AOI 项目:降低过杀优先(a_chip 误杀严重)二、V1 到 V4 的迭代历史
各版本对比
| 版本 | 整体准确率 | c_broken 召回 | a_chip 误杀 | 变化 |
|---|---|---|---|---|
| V1 | 98.11% | - | 严重 | 基线 |
| V2 | 98.65% | - | 改善 | +0.54% |
| V3 | 98.97% | 94% | 改善 | +0.32% |
| V4 | 98.77% | 47% | 大幅改善 | -0.20% |
V4 的核心变化
V3 -> V4: 过杀下降:a_chip 误杀大幅改善 漏检上升:c_broken 召回从 94% 降到 47% 原因: V4 加了 hard 样本增强(把容易误判的 a_chip 样本增强后回灌训练) 模型学到了「不要把 a_chip 误判为 c_broken」 但同时也学到了「不要把 c_broken 判定为缺陷」三、AOI 项目的缺陷分类
数据集
| 数据集 | 图片数 | 用途 |
|---|---|---|
| train_sets/v3 | 基线 | V3 训练 |
| train_sets/v4_cbroken_safe | 1,450 | V4 训练 |
| train_sets/v4_finetune_no_extra | 同 V4,移除 extra hard | 对照组 |
训练配置
# V4 训练model=YOLO("runs/train/defect_cls_v3/weights/last.pt")# 从 V3 续训model.train(data="train_sets/v4_cbroken_safe",epochs=50,batch=128,imgsz=224,amp=False,cos_lr=True,)V4 vs 对照组
V4(加了 extra hard 样本): 整体准确率:98.77% c_broken 召回:47% 对照组(移除 extra hard 样本): 整体准确率:98.77% c_broken 召回:47% 结论:extra hard 样本对 V4 精度无显著影响四、V4 过杀下降的原因
hard 样本增强
V4 加了 hard 样本增强: 1. 识别容易误判的 a_chip 样本 2. 对这些样本做增强(翻转/旋转/缩放) 3. 把增强后的样本回灌训练集 4. 模型学到:这些样本是 a_chip,不是 c_broken 效果: a_chip 误杀大幅下降 但 c_broken 漏检也上升了为什么漏检会上升?
模型学到的决策边界: V3:c_broken 的边界较宽(容易误判 a_chip 为 c_broken) V4:c_broken 的边界较窄(不容易误判 a_chip 为 c_broken) 代价: V4 的 c_broken 边界太窄,真正的 c_broken 也被漏掉了五、避坑指南
坑1:只看整体准确率
现象:整体准确率 99%,但 c_broken 漏检严重。
原因:c_broken 样本太少,整体准确率被 a_chip 拉高。
解法:看各类别的召回率,不能只看整体准确率。
坑2:不看混淆矩阵
现象:不知道哪些类被混淆了。
解法:看混淆矩阵,了解 c_broken 被误判为什么。
坑3:V4 和 V3 混淆
现象:V4 的 ONNX 文件和 V3 的混淆。
解法:版本化管理,每个版本有独立的文件名。
坑4:hard 样本增强过拟合
现象:hard 样本增强后,模型过拟合。
解法:控制 hard 样本数量,不要太多。
坑5:不看召回率
现象:只看准确率,不看召回率。
解法:重点关注 c_broken 的召回率(漏检率)。
AOI 项目优秀实践
- 版本化迭代:V1->V2->V3->V4,每个版本有独立目录
- hard 样本增强:V4 加了 hard 样本增强,降低过杀
- 对照组实验:V4 vs 对照组,验证 extra hard 样本的效果
AOI 项目可改进之处
- 缺少产线误杀统计:没有量化产线上的误杀率
- 缺少 c_broken 漏检后果评估:没有评估漏检的质量风险
- 缺少 A/B 测试框架:没有系统对比不同版本的产线表现
结尾
说回那个「过杀太严重,客户投诉」的故事。
后来我迭代了 4 个版本,V4 的 a_chip 误杀率大幅下降。但 c_broken 漏检率从 94% 降到了 47%。这是一个权衡:降低过杀的代价是漏检上升。
不是因为迭代有多难——而是因为「过杀 vs 漏检」的权衡没有标准答案。
翻翻你的项目:
- 你的模型过杀严重吗?漏检严重吗?
- 你看的是整体准确率还是各类别召回率?
- 你有版本化管理吗?V3 和 V4 的 ONNX 文件会混淆吗?
评论区说说你的缺陷分类是怎么权衡过杀和漏检的。
觉得有用?
收藏这篇,下次缺陷分类时翻出来对照。转发给你团队里那个天天被过杀折磨的同事。
下期预告:
.onnx 到 C++ 的最后一公里。
opset / IR / FP16 / dynamic batch,导出参数一个都不能错。
下一篇,我们聊 ONNX 导出与兼容性——「导出参数的正确姿势」。
本文是《AOI 芯片焊盘缺陷检测实战》系列第五篇。