1. 问题定义
目标: 预测图像中各个物体是否出现及其位置。目标检测涉及图像中物体的定位和分类。
例如我们要区分出红细胞(RBC)、白细胞(WBC)和血小板(platelets)。除了需要用框(bounding box)框出物体,还需要对他们分类,标在框上。每个类别后跟着一个数字即判定为该类别的置信度。
那么如何判断那个模型好(准确)呢?
比如上图中绿色的框标出大部分的白细胞 ,但是有些边缘的没有标出,但是我们不能通过图片,凭直觉判断模型的好坏。我们需要一个量化指标。即直接量化每个模型在测试集中的图像、类和不同置信阈值下的表现。这个工具就是mAP。
为了学习mAP,需要先了解几个概念。
2. 几个概念
- mAP: (Mean Average Precision)平均AP
- AP:P-R下面积,平均精度。
- P-R曲线:Precision-Recall曲线
- Precision:精度,即所有检测结果中,正确(IoU>0.5)个数的占比。
TP/(TP+FP)
。 - Recall:召回率,即所有真实物体中被检测出来的个数占比。
TP/(TP+FN)
- TP:(True Positive)真正例。IoU>0.5的检测框个数,同一个Ground Truth只计算一次
- FP:(False Positive)假正例。IoU<0.5的检测框个数,同一个GT的多余检测框也计算
- FN:(False Negatives)假负例。GT里没有被检测到的数量。即模型漏检的物体。
- IoU:交并比。评价边界框正确性的度量指标
一张有猫的图片中,不光要检测出猫,还要检测的猫的位置正确。
3. Precision-Recall曲线
可以分别用一句话区分精度Precision和召回率Recall
Precision : “when your model guesses how often does it guess correctly?” (模型多少次预测正确?)
Recall :“has your model guessed every time that it should have guessed?” (模型应该检测到的某一物体时候是否检测到了物体?)
例如上面的例子。假设一张图里有10个红细胞,模型检测到一个红细胞,并且标注位置和类别都正确,那么模型就是有高精度(1个红细胞的框是准确的),低召回率(10个只检测到1个)
通过调整阈值可以控制召回率。具体做法要看模型需要的环境。比如当避免假真例比避免假负例更重要时(可以不都检测到,但检测到的一定要正确),可以设置高阈值。
建立Precision和Recall之前的函数关系并绘制在图上,这个曲线就是P-R曲线。该曲线向下倾斜的(递减),因为当置信度降低时,会做出更多的预测(提升召回),而做出的预测则不那么精确(影响精度)。打个比方,当要求“说出每一种鲨鱼的名称”,你会从熟悉且肯定的说起(高精度),但是很难保证说出来的都正确(接近于高召回率,低精度)。如果PR曲线不是向下倾斜的,说明模型有问题,需要回去检测。
那么如何通过P-R曲线找到最好的阈值呢?
有三种思路。
(1)斜率接近-1
(2)计算P-R曲线下的面积(AUC,Area Under the Curve)
(3)计算平均精度(AP,Average Precision)
通常我们采用AP的方法。下面将开始介绍AP的计算。
4. AP
VOC2010前:Recall >= 0, 0.1, 0.2, …, 1共11个recall下precision的平均值。熟悉微积分的可以看出,下面公式的含义就是
p
(
r
)
p(r)
p(r)即precision-recall曲线下的面积。
A
P
=
1
11
∑
r
∈
{
0
,
0.1
,
.
.
.
,
1
}
p
i
n
t
e
r
p
(
r
)
AP = \frac {1}{11}\sum_{r\in{\lbrace 0,0.1,...,1\rbrace}}p_{interp}(r)
AP=111r∈{0,0.1,...,1}∑pinterp(r)
VOC2010后:所有数据点,而不是仅使用11个recall值来计算AP。
p
i
n
t
e
r
p
(
r
)
=
max
r
^
:
r
^
≥
r
p
(
r
^
)
p_{interp}(r)=\max_{\hat{r}:\hat{r}\geq{r}}p(\hat{r})
pinterp(r)=r^:r^≥rmaxp(r^)
为保证p-r曲线单调递减,对于某个recall值r,precision值取所有recall>=r中的最大值。
5. mAP
AP是针对一个类别的计算。所有类别的AP平均值即mAP。
建议在分析模型结果时查看各个类的AP值。这些值也许暗示你需要添加更多的训练样本。
例如下面的分析结果:
// EfficientDet模型
78.59% = Platelets AP
77.87% = RBC AP
96.47% = WBC AP
mAP = 84.31%
// YOLOv3模型
72.15% = Platelets AP
74.41% = RBC AP
95.54% = WBC AP
mAP = 80.70%
表明在这一数据集上EfficientDet更精确 ,同时,对于白细胞检测比红细胞更容易。
mAP除了分不同的IOU阈值(COCO从0.5到0.95,步长为0.05),还通常分为小、中、大三个对象,帮助识别模型(或数据集)可能出错的地方。
【参考】
[1] Measuring Object Detection models - mAP - What is Mean Average Precision?
[2]What is Mean Average Precision (mAP) in Object Detection?