2. 混淆矩阵详解:TP、FP、FN、TN 的定义与作用
聊 mAP 之前,咱们得先把一个最基础的工具搞明白——混淆矩阵。
说实话,我刚开始做检测的时候,觉得这东西就是个统计表,没啥技术含量。后来有一次模型在某个类别上 mAP 突然掉了 10 个点,我对着日志看了半天没头绪。最后画了个混淆矩阵,一眼就发现问题了——模型把「行人」和「自行车」搞混了,而且 FN 多得离谱。嗯,从那以后,我每轮实验必看混淆矩阵。
2.1 四个核心概念:TP、FP、FN、TN
先别急着背定义。咱们用一个场景来理解。
假设你在做行人检测。一张图里实际有 5 个行人,你的模型画了 6 个框。那这 6 个框里,哪些是对的?哪些是错的?
这里就需要一个判断标准:IoU(交并比)。通常我们设 IoU ≥ 0.5 就算检测正确。
| 术语 | 全称 | 通俗理解 | 检测场景举例 |
|---|---|---|---|
| TP | True Positive | 预测为正,实际也是正 | 框到了行人,且 IoU ≥ 0.5 |
| FP | False Positive | 预测为正,实际是负 | 框到了背景,或者 IoU < 0.5 |
| FN | False Negative | 预测为负,实际是正 | 漏掉了一个行人,没框出来 |
| TN | True Negative | 预测为负,实际也是负 | 背景区域,模型也没框 |
关键点:在目标检测中,TN 几乎用不到。因为背景区域太多了,统计 TN 没有意义。我们真正关心的是 TP、FP、FN 这三个值。
2.2 如何从预测结果构建混淆矩阵
构建过程其实不复杂。我习惯分三步走:
- 匹配预测框和真实框:计算每个预测框和每个真实框的 IoU。
- 按 IoU 阈值判定:比如 IoU ≥ 0.5 就算匹配成功。
- 统计计数:匹配上的算 TP,没匹配上的预测框算 FP,没被匹配的真实框算 FN。
举个例子,假设一张图里有 3 个真实框(GT1、GT2、GT3),模型预测了 4 个框(P1、P2、P3、P4)。
| 预测框 | 匹配的真实框 | IoU | 判定结果 |
|---|---|---|---|
| P1 | GT1 | 0.85 | TP |
| P2 | GT2 | 0.72 | TP |
| P3 | GT3 | 0.91 | TP |
| P4 | 无 | — | FP |
这里 GT1、GT2、GT3 都被匹配到了,所以 FN = 0。但如果某个真实框没被任何预测框匹配上,那它就算 FN。
我的小技巧:写代码的时候,我习惯用 torchvision.ops.box_iou() 一次性算完所有 IoU,然后用匈牙利算法做最优匹配。这样能避免一个真实框被多个预测框重复匹配的问题。
2.3 混淆矩阵在 mAP 计算中的作用
mAP 的全称是 mean Average Precision。说白了,它就是在不同置信度阈值下,算出一堆 Precision 和 Recall,然后求平均。
而 Precision 和 Recall 的计算,完全依赖混淆矩阵里的 TP、FP、FN:
- Precision = TP / (TP + FP) —— 你预测的所有框里,有多少是真正对的。
- Recall = TP / (TP + FN) —— 所有真实目标里,你找出来了多少。
你想想看,如果没有混淆矩阵,这两个指标根本算不出来。所以混淆矩阵是 mAP 的基石,一点不夸张。
我举个例子,假设模型在某个类别上:
- TP = 80
- FP = 20
- FN = 20
那么 Precision = 80 / (80 + 20) = 0.8,Recall = 80 / (80 + 20) = 0.8。
如果模型为了提升 Recall,疯狂输出框,FP 涨到 80,那 Precision 就会掉到 0.5。这就是 Precision 和 Recall 的 trade-off。
避坑提醒:我曾经遇到过一个情况,模型在验证集上 mAP 很高,但实际部署效果很差。后来排查发现,是因为验证集的标注质量有问题,很多真实框没标全,导致 FN 被低估,Recall 虚高。所以,混淆矩阵的质量,取决于标注的质量。数据没洗干净,mAP 再高也是假的。
2.4 混淆矩阵的可视化与解读
光看数字不够直观。我习惯把混淆矩阵画出来,尤其是多类别检测的时候。
下面这张图展示了一个 3 类检测任务的混淆矩阵结构:
从这张图里,你能快速看出:
- 「自行车」类别的 FN 有 17 个,说明漏检比较严重。
- 「自行车」被误检为「汽车」有 8 次,说明这两个类别特征比较接近。
这种信息,光看 mAP 数字是看不出来的。所以我每次调模型,第一件事就是看混淆矩阵,找到模型最弱的类别,然后针对性优化。
2.5 小结
混淆矩阵不是个花架子。它是你理解模型行为的窗口。TP、FP、FN 这三个值,直接决定了 Precision 和 Recall,进而决定了 mAP。
我个人建议,每次训练完模型,别急着看 mAP,先画个混淆矩阵。花 5 分钟看看哪些类别容易混、哪些类别漏检多,比盯着一个数字瞎猜有用得多。