
过杀下降 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 | 对照组 |
训练配置
python
# 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 芯片焊盘缺陷检测实战》系列第五篇。