作为一个没有什么天赋的半小白,从网上搜索想要的知识还是很辛苦的。首先感谢好多大神的分享,但是其中也不乏各种不负责任的“神”,会错误的引导读者,可能是笔误,也可能是脑袋“短路”,使得刚入门的新手(比如我),因为一个简单的问题+错误的回答而浪费很长时间,所以以后遇到问题,或者学会了新知识还是自己记录一下吧。
关于mAP(mean average precision),首先翻译成中文,即平均精度均值,从字面意思理解就是要算好多个平均精度,然后再取它们的均值。所以问题就在于AP,即平均精度怎么求。
首先上一张图
接下来根据这张图描述AP怎么算(先不用管物理意义),有两种算法:
一. 11-point interpolated average precision(不用管它的名字,直接看算法)
这里取11个数,第一个数为横轴recall大于0时,precision最大的值,记它为P(max0),第二个数为横轴recall大于0.1时,precision最大的值,记它为P(max1),依次类推,最后一个数就是recall大于1.0时,precision最大的值,记为P(max1.0);然后把这11个数加起来,再除以11,就得到了AP值,是不是很简单?
二.另一种方法
不取11个数了,取M个数,每个数由之前的0,0.1,0.2,…1,变为1/M,2/M,3/M…,1,把M个precision最大的值加起来,然后除以M。(M是什么后面说)
这样就算了一个AP,然后根据不同的图,算出不同的AP,最后求个均值,就变成了mAP。
下面说一下上面那个图是如何得来的,以及M是什么。
我们首先观察到横轴叫做precision,纵轴叫做recall。这个图的学名就叫做PR曲线。
我们假设有一个算法,它的作用是识别图片是否为男女:
输入:图片像素值
输出:是男人的概率
| 编号 | 真实值 | 预测概率 |
|---|---|---|
| 1 | 男 | 0.97 |
| 2 | 女 | 0.43 |
| 3 | 男 | 0.68 |
| 4 | 女 | 0.76 |
| 5 | 男 | 0.39 |
我们还要设定一个阈值,这个阈值的作用就是:对于我们的算法,如果预测概率大于它,就预测它是个男人,如果概率小于它,就预测她是个女人。
首先假设阈值为0.5,则上表又就变为。
| 编号 | 真实值 | 预测概率 | 预测结果 |
|---|---|---|---|
| 1 | 男 | 0.97 | 男 |
| 2 | 女 | 0.43 | 女 |
| 3 | 男 | 0.68 | 男 |
| 4 | 女 | 0.76 | 男 |
| 5 | 男 | 0.39 | 女 |
我们可以看到,4和5预测错误。
然后根据这个结果,我们可以算出来一组PR值,其中:
precision = 预测是男人对的结果个数/(预测是男人对的结果个数+预测是男人错的结果个数) 即 :2/(2+1) = 2/3
recall = 预测是男人对的结果个数/(预测是男人对的结果个数+没预测出来的男人个数) 即:2/(2+1) = 2/3
这样,得到了PR曲线的一个点。
接下来,注意啦!
改变阈值,然后预测结果就会发生变化,同时precision和recall也会发生变化,会得到PR曲线不同的点。将阈值分别设置为0~1中不同的值,得到PR曲线上不同的点,最终,就可以绘出PR曲线整个图。
然后,根据PR图,就可以算出这些样本的AP值,这里补充一下,如果采用第二种算法,M为样本中正样本的个数(这里为男人的个数)。
最后,根据不同的样本集,算出不同的AP值,再取平均,就得到了mAP的值了!