mAP计算方法
mAP:mean Average Precision
说mAP之前首先要说IOU
重叠度(IOU)
物体检测最终会定位到一个bounding box(边界框),就是最终框到目标的那个框
对于bounding box的定位精度,我们有一个评价指标,就是IOU。
I O U = ( A ⋂ B ) / ( A ⋃ B ) IOU=(A\bigcap B) / (A \bigcup B) IOU=(A⋂B)/(A⋃B)
就是A交B面积除以A并B,这可以用来评价我们的预测结果与实际结果(人工标注)的误差。
mAP的相关概念和定义:
- 正样本、负样本:比如我们要检测字母A,那样本里面是A的就是正样本,不是A的就是负样本。我们不光要识别正样本,也要把负样本检测出来。
- TP(True Positives):被分为正样本,并且分对了
- TN(True Negatives):被分为负样本,并且分对了
- FP(False Positives):被分为正样本,但是分错了
- FN(False Negatives):被分为负样本,但是分错了
结合图来解释一下:(image From Wikipedia – “Precision and recall”)
True和False代表分类正确与否,Positives和Negatives代表被分为正样本还是负样本。
按下图来解释,一个样本空间,左边是正样本,右边是负样本。一个2分类器,在图上画了个圆,分类器认为圆内是正样本,圆外是负样本。(一堆猫和狗的照片,左边是猫,右边是狗,一个识别猫的分类器,认为圆圈内的都是猫)
那么左半圆里的样本,分类器认为它是正样本,同时它确实是正样本,那么就是TP:“被分为正样本,并且分对了”
左半矩形扣除左半圆的部分就是分类器认为它是负样本,但是它本身却是正样本,就是FN:“被分为负样本,但是分错了”
右半圆分类器认为它是正样本,但是本身却是负样本,那么就是FP:“被分为正样本,但是分错了”
右半矩形扣除右半圆的部分就是分类器认为它是负样本,同时它本身确实是负样本,那么就是“被分为负样本,而且分对了”即TN
如何判断分的对不对呢?IOU>0.5就是对,反之就是错的
有了TP、TN、FP、FN之后,就可以定义Precision 和 recall了
Precision(精度): T P T P + F P \frac{TP}{TP + FP} TP+FPTP “分类器认为是正类并且确实是正类的部分占所有分类器认为是正类的比例”
Recall(召回率): T P T P + F N \frac{TP}{TP+FN} TP+FNTP “分类器认为是正类并且确实是正类的部分占所有确实是正类的比例”
Precision 和 recall也被叫做查准率和查全率。
-
有了Precision 和 recall,用二者绘制出来的曲线成为P-R曲线
-
PR曲线下的面积,称为AP
-
所谓的mAP:mean Average Precision,就是各个类别AP的平均值。
下面模拟计算一下mAP:
假设,现在只有一个类别:cat
首先我们有很多张图,每张图里面标注了猫,也就是说我们有很多的标注框,也就是GT(ground truth)。
每个标注框我们给他不同的ID。然后经过我们网络识别出来的预测框,有其对应的GT ID(也就是这个框是预测哪个目标的),并且还有置信度,也就是概率Confidence,另外就是如果预测框和对应的GT框IOU>0.5我们记作True。
假设所有数据,统计结果如下:
GT ID | Confidence | IOU > 0.5 |
---|---|---|
1 | 0.98 | True |
3 | 0.89 | True |
6 | 0.88 | True |
7 | 0.78 | True |
3 | 0.66 | False |
1 | 0.61 | False |
4 | 0.52 | True |
(ps:可以看到,同一个目标,会产生多个预测框,比如GT1号,有两个预测框,但是置信度不同,IOU也不同)
得到了这个统计结果之后,我们以confidence作为排序标准,从大到小排序。
然后我们在不同置信度阈值下获得Precision和Recall
首先,设置阈值为0.98,无视所有小于0.98框。那么表格就剩这一个了
GT ID | Confidence | IOU > 0.5 |
---|---|---|
1 | 0.98 | True |
(ps:也就是说,大于等于阈值的,都被认为是猫,也就是被分为了正样本。小于阈值的,都被分为负样本,但是另外六个其实也是猫,有GT的,所以这就是分为负样本,被分错了,他不是负样本的,这就是FN=6。)
那么TP=1(只有一个检测对了,IOU是True)
FP=0(没有检测错的,没有False)
FN=6(总共有7个GT,这里就检测到了1个,漏检了6个)
那么Precision=1/1=1,Recall=0.14。这样就得到一组P、R值。
再设置阈值为0.89,符合要求的有两个。
GT ID | Confidence | IOU > 0.5 |
---|---|---|
1 | 0.98 | True |
3 | 0.89 | True |
那么TP=2(两个检测对了,IOU是True)
FP=0(没有检测错的,没有False)
FN=5(总共有7个GT,这里就检测到了2个,漏检了5个)
那么Precision=1,Recall=0.28。这样就得到一组P、R值。
以此类推,我们可以得到一组结果
Rank | 阈值 | Precision | Recall |
---|---|---|---|
1 | 0.98 | 1.0 | 0.14 |
2 | 0.89 | 1.0 | 0.28 |
3 | 0.88 | 1.0 | 0.42 |
4 | 0.78 | 1.0 | 0.57 |
5 | 0.66 | 0.80 | 0.57 |
6 | 0.61 | 0.66 | 0.57 |
7 | 0.52 | 0.71 | 0.71 |
得到这个表以后,就可以画P-R曲线了。
这里要注意,这个表还要做个处理,有相同的Recall值,就按照Precision值排序,只保留Precision最大的那个。
所以处理完,就是这样了
Rank | 阈值 | Precision | Recall |
---|---|---|---|
1 | 0.98 | 1.0 | 0.14 |
2 | 0.89 | 1.0 | 0.28 |
3 | 0.88 | 1.0 | 0.42 |
4 | 0.78 | 1.0 | 0.57 |
7 | 0.52 | 0.71 | 0.71 |
以Recall为横轴,Precision为纵轴,画出图像
(注意那两个没框起来的点已经被剔除了,其实就是相同横坐标的,选择纵坐标最高的点)
然后每个点往左画一条线段直到与上一个点的垂直线相交。这样画出来的线段与坐标轴围起来的面积就是AP值。
得到了AP值,这是一个类:cat,那还有别的类别,每个类别的AP值都求出来,取平均值得到了mAP
参考文章:
https://blog.csdn.net/hsqyc/article/details/81702437
https://www.zhihu.com/question/53405779/answer/399478988
https://www.bilibili.com/video/BV1ez4y1X7g2?share_source=copy_web