3. 混淆矩阵详解:TP、FP、FN、TN的计算
聊缺陷检测,绕不开一个东西——混淆矩阵。
说白了,它就是一张表。把你的检测结果和真实情况放在一起,看看你到底对了多少、错了多少。我刚开始做视觉工程师那会儿,觉得这东西太基础了,不就是四个格子嘛。后来真上了产线,才发现这四个格子背后全是坑。
3.1 四个基本量的定义
先明确一下概念。假设我们检测一个产品,判断它“有缺陷”还是“无缺陷”。
| 缩写 | 全称 | 通俗解释 | 我自己的理解 |
|---|---|---|---|
| TP | True Positive | 有缺陷,被正确检出 | 抓对了,该报警的报了 |
| FP | False Positive | 无缺陷,被误报为有缺陷 | 虚警,好产品被冤枉了 |
| FN | False Negative | 有缺陷,但没检出来 | 漏检,坏产品溜过去了 |
| TN | True Negative | 无缺陷,正确判定为无缺陷 | 正常通过,啥事没有 |
3.2 怎么算?一个例子走通
假设我们检测了100个产品。人工复判后,真实情况是:20个有缺陷,80个无缺陷。
我们的算法跑下来,结果是这样的:
- 算法报了25个“有缺陷”
- 其中,有15个是真的有缺陷,10个是误报
- 真实有缺陷的20个里,有5个没报出来
来,我们填一下这个矩阵:
| 真实:有缺陷 | 真实:无缺陷 | |
|---|---|---|
| 预测:有缺陷 | TP = 15 | FP = 10 |
| 预测:无缺陷 | FN = 5 | TN = 70 |
验证一下:
- 真实有缺陷 = TP + FN = 15 + 5 = 20 ✅
- 真实无缺陷 = FP + TN = 10 + 70 = 80 ✅
- 总样本 = 15 + 10 + 5 + 70 = 100 ✅
3.3 从混淆矩阵推导核心指标
有了这四个数,我们能算出一堆指标。每个指标看问题的角度不一样。
3.3.1 准确率(Accuracy)
最直观的指标:所有判断中,对了多少?
Accuracy = (TP + TN) / (TP + TN + FP + FN)
上面例子:Accuracy = (15 + 70) / 100 = 85%。
但是! 我踩过这个坑。如果缺陷率只有1%,你全部判“无缺陷”,准确率也有99%。这指标在样本不平衡时,就是个骗子。
3.3.2 精确率(Precision)
关注的是:你报的“有缺陷”里,有多少是真的?
Precision = TP / (TP + FP)
上面例子:Precision = 15 / (15 + 10) = 60%。
说白了,这就是误检率的反面。精确率低,说明FP太多,产线上天天响假警报,操作员会疯的。
3.3.3 召回率(Recall / TPR)
关注的是:真实有缺陷的,你抓出来多少?
Recall = TP / (TP + FN)
上面例子:Recall = 15 / (15 + 5) = 75%。
这就是漏检率的反面。召回率低,说明FN太多,坏产品流出去了。这在汽车、医疗行业是要命的事。
3.3.4 特异度(Specificity)
关注的是:真实无缺陷的,你放过了多少?
Specificity = TN / (TN + FP)
上面例子:Specificity = 70 / (70 + 10) = 87.5%。
这个指标在缺陷检测里用得少,但在医学影像里很常见。我一般只看Precision和Recall。
3.3.5 F1分数
精确率和召回率的调和平均。当你想同时控制误检和漏检时,就看它。
F1 = 2 * (Precision * Recall) / (Precision + Recall)
上面例子:F1 = 2 * (0.6 * 0.75) / (0.6 + 0.75) ≈ 66.7%。
3.4 知识体系:混淆矩阵与指标关系图
下面这张图,把混淆矩阵和各个指标的关系画清楚了。我每次做项目汇报,都会在PPT里放一张类似的图,老板一看就懂。
3.5 实际项目中的选择策略
指标不是越多越好。我一般这样选:
| 场景 | 首要指标 | 次要指标 | 原因 |
|---|---|---|---|
| 产线终检(漏检致命) | Recall | Precision | 宁可误报,不能漏放 |
| 产线预检(误报致命) | Precision | Recall | 误报太多,产线停摆 |
| 样本均衡的实验室测试 | Accuracy | F1 | 正负样本差不多,准确率有意义 |
| 模型调参对比 | F1 Score | Precision/Recall | 单一指标,方便横向比较 |
3.6 常见错误与避坑
- 把TP和FP搞反: 记住,TP是“你对了”,FP是“你错了”。我刚开始也经常搞混,后来在代码里加了中文注释才改过来。
- 只看Accuracy: 缺陷率1%时,Accuracy 99% 可能全是废的。一定要看混淆矩阵的分布。
- 忽略TN: 虽然TN不影响Precision和Recall,但算Accuracy和Specificity时要用到。别漏了。
- 样本不平衡时盲目优化: 我曾经在一个项目里,缺陷率只有0.5%,拼命调Recall,结果Precision掉到10%以下,产线天天误报。后来加了样本权重才平衡过来。