zoukankan      html  css  js  c++  java
  • 由MAP而起

    以你喜欢和理解起来最舒服的方式

    多标签图像分类任务为背景

    多标签图像分类(Multi-label Image Classification)任务中图片的标签不止一个,因此评价不能用普通单标签图像分类的标准,即mean accuracy。该任务采用的是和信息检索中类似的方法——MAP(Mean Average Precision)。

    MAP虽然字面意思和mean accuracy看起来差不多,但是计算方法要繁琐得多。

    一、IOU(捎带介绍)

          

    分子:两个框的交集,没有疑问。

    分母:两个框的并集,这个注意数学中交集的概念——两个框的面积之和减去它们的交集面积。

    二、接着说多标签图像分类,会涉及TP(True Positive)、FP(False Positive)、TN(True Negative)、FN(True Negative),Precision、Recall

    (1)对TP、TN、FP、FN的(很)直观解释

    假设现在有这样一个测试集,测试集中的图片只由大雁和飞机两种图片组成,如下图所示:
    这里写图片描述

    假设你的分类系统最终的目的是:能出测试集中所有飞机的图片,而不是大雁的图片。

    现在做如下的定义:
    True positives : 飞机的图片被正确的识别成了飞机。
    True negatives: 大雁的图片没有被识别出来,系统正确地认为它们是大雁。
    False positives: 大雁的图片被错误地识别成了飞机。
    False negatives: 飞机的图片没有被识别出来,系统错误地认为它们是大雁。

    假设你的分类系统使用了上述假设识别出了四个结果,如下图所示:
    这里写图片描述

    那么在识别出的这四张照片中:
    True positives : 有三个,画绿色框的飞机。
    False positives: 有一个,画红色框的大雁。

    没被识别出来的六张图片中:
    True negatives : 有四个,这四个大雁的图片,系统正确地没有把它们识别成飞机。
    False negatives: 有两个,两个飞机没有被识别出来,系统错误地认为它们是大雁。

    (2)对precision和recall的(很)直观解释:

    push一张很有意思很形象image:

    (加上一句:上面大圆圈所在四边形,左边一半都是真的(正样本),右边一半都是假的(负样本))

    Precision其实就是在识别出来的图片中,True positives所占的比率
    这里写图片描述
    其中的n代表的是(True positives + False positives),也就是系统一共识别出来多少照片 。
    在这一例子中,True positives为3,False positives为1,所以Precision值是 3/(3+1)=0.75。
    意味着在识别出的结果中,飞机的图片占75%。

    Recall 是被正确识别出来的飞机个数与测试集中所有飞机的个数的比值
    这里写图片描述
    Recall的分母是(True positives + False negatives),这两个值的和,可以理解为一共有多少张飞机的照片。
    在这一例子中,True positives为3,False negatives为2,那么Recall值是 3/(3+2)=0.6。
    意味着在所有的飞机图片中,60%的飞机被正确的识别成飞机。

    调整阈值:

    你也可以通过调整阈值,来选择让系统识别出多少图片,进而改变Precision 或 Recall 的值。
    在某种阈值的前提下(蓝色虚线),系统识别出了四张图片,如下图中所示:
    这里写图片描述
    分类系统认为大于阈值(蓝色虚线之上)的四个图片更像飞机。

    我们可以通过改变阈值(也可以看作上下移动蓝色的虚线),来选择让系统识别能出多少个图片,当然阈值的变化会导致Precision与Recall值发生变化。比如,把蓝色虚线放到第一张图片下面(TP=1,FP=0,TN=5,FN=4),也就是说让系统只识别出最上面的那张飞机图片,那么Precision的值就是100% = 1/(1+0),而Recall的值则是20% = 1/(1+4)。如果把蓝色虚线放到第二张图片下面(TP=2,FP=0, TN=5,FN=3),也就是说让系统只识别出最上面的前两张图片,那么Precision的值还是100% = 2/(2+0),而Recall的值则增长到是40% = 2/(2+3)。

    下图为不同阈值条件下,Precision与Recall的变化情况:
    这里写图片描述

    precision-recall曲线:

    如果你想评估一个分类器的性能,一个比较好的方法就是:观察当阈值变化时,Precision与Recall值的变化情况。如果一个分类器的性能比较好,那么它应该有如下的表现:

    被识别出的图片中飞机所占的比重比较大,并且在识别出大雁之前,尽可能多地正确识别出飞机,也就是让Recall值增长的同时保持Precision的值在一个很高的水平。而性能比较差的分类器可能会损失很多Precision值才能换来Recall值的提高。通常情况下,文章中都会使用Precision-recall曲线,来显示出分类器在Precision与Recall之间的权衡。

    上图就是分类器的Precision-recall 曲线,在不损失精度的条件下它能达到40%Recall。而当Recall达到100%时,Precision 降低到50%。

    ###################################################可以先忽略##########################################################

     (

    Approximated Average precision

    相比较与曲线图,在某些时候还是一个具体的数值能更直观地表现出分类器的性能。通常情况下都是用 Average Precision来作为这一度量标准,它的公式为:
    这里写图片描述
    在这一积分中,其中p代表Precision ,r代表Recall,p是一个以r为参数的函数,That is equal to taking the area under the curve.

    实际上这一积分极其接近于这一数值:对每一种阈值分别求(Precision值)乘以(Recall值的变化情况),再把所有阈值下求得的乘积值进行累加。公式如下:
    这里写图片描述
    在这一公式中,N代表测试集中所有图片的个数,P(k)表示在能识别出k个图片的时候Precision的值,而 Delta r(k) 则表示识别图片个数从k-1变化到k时(通过调整阈值)Recall值的变化情况。

    在这一例子中,Approximated Average Precision的值
    =(1 * (0.2-0)) + (1 * (0.4-0.2)) + (0.66 * (0.4-0.4)) + (0.75 * (0.6-0.4)) + (0.6 * (0.6-0.6)) + (0.66 * (0.8-0.6)) + (0.57 * (0.8-0.8)) + (0.5 * (0.8-0.8)) + (0.44 * (0.8-0.8)) + (0.5 * (1-0.8)) = 0.782.

    =(1 * 0.2) + (1 * 0.2) + (0.66 * 0) + (0.75 * 0.2) + (0.6 * 0) + (0.66 * 0.2) + (0.57 * 0) + (0.5 * 0) + (0.44 * 0) + (0.5 * 0.2) = 0.782.

    通过计算可以看到,那些Recall值没有变化的地方(红色数值),对增加Average Precision值没有贡献.

    Interpolated Average Precision

    不同于Approximated Average Precision,一些作者选择另一种度量性能的标准:Interpolated Average Precision。这一新的算法不再使用P(k),也就是说,不再使用当系统识别出k个图片的时候Precision的值与Recall变化值相乘。而是使用:
    这里写图片描述
    也就是每次使用在所有阈值的Precision中,最大值的那个Precision值与Recall的变化值相乘。公式如下:
    这里写图片描述

    下图的图片是Approximated Average Precision 与 Interpolated Average Precision相比较。
    需要注意的是,为了让特征更明显,图片中使用的参数与上面所说的例子无关。
    这里写图片描述
    很明显 Approximated Average Precision与精度曲线挨的很近,而使用Interpolated Average Precision算出的Average Precision值明显要比Approximated Average Precision的方法算出的要高。

    一些很重要的文章都是用Interpolated Average Precision 作为度量方法,并且直接称算出的值为Average Precision 。PASCAL Visual Objects Challenge从2007年开始就是用这一度量制度,他们认为这一方法能有效地减少Precision-recall 曲线中的抖动。所以在比较文章中Average Precision 值的时候,最好先弄清楚它们使用的是哪种度量方式。

    ###################################################可以先忽略##########################################################

    三. 关于AP、MAP计算

    实际多类别分类任务中,我们通常不满足只通过top-N(前面说的蓝色虚线移动的操作,即在操作top数量)来衡量一个模型的好坏,而是需要知道从top-1到top-N(N是所有测试样本个数,本文中为10)对应的precision和recall。显然随着我们选定的样本越来也多,recall一定会越来越高,而precision整体上会呈下降趋势。把recall当成横坐标,precision当成纵坐标,即可得到常用的precision-recall曲线。例如某个例子的precision-recall曲线如下:

    接下来说说AP的计算,此处参考的是PASCAL  VOC  CHALLENGE的计算方法。首先设定一组阈值,[0, 0.1, 0.2, …, 1]。然后对于recall大于每一个阈值(比如recall>=0.3),我们都会得到一个对应的最大precision。这样,我们就计算出了11个precision。AP即为这11个precision的平均值。这种方法英文叫做11-point interpolated average precision。​

    当然PASCAL VOC CHALLENGE自2010年后就换了另一种计算方法。新的计算方法假设这N个样本中有M个正例,那么我们会得到M个recall值(1/M, 2/M, ..., M/M)——这里还是不太好理解,或许是表达方式不够清晰,自己悟(结合下图每一个item多思考一下,可以针对每个top-N情况下的precision和recall进行计算)。对于每个recall值r,我们可以计算出对应r'(其中r' >= r)的最大precision,然后对这M个precision值取平均即得到最后的AP值(结合下面这张表和文章末尾的蓝色部分例子的内容,注意蓝色部分例子第二种AP的求取方式)。计算方法如下:

    相应的Precision-Recall曲线(这条曲线是单调递减的)如下:​

    another eg:

    (1)voc2007的计算方法:

    在计算AP时,首先要把结果按照置信度排序,公式如下:

    在这里插入图片描述

    (2)voc2010的计算方法:

    比起07年,10年以后的新方法是取所有真实的recall值,按照07年的方法得到所有recall/precision数据点以后,计算recall/precision曲线下的面积:

    Compute a version of the measured precision/recall curve with > precision monotonically decreasing, by setting the precision for > recall r to the maximum precision obtained for any recall r′ ≥ r.
    Compute the AP as the area under this curve by numerical integration. No approximation is involved since the curve is piecewise constant.

    举一个例子具体说明:

    对于Aeroplane类别,我们有以下输出(BB表示Bounding Box序号,IOU>0.5时GT=1):

    BB  | confidence | GT
    ----------------------
    BB1 |  0.9       | 1
    ----------------------
    BB2 |  0.9       | 1
    ----------------------
    BB1 |  0.8       | 1
    ----------------------
    BB3 |  0.7       | 0
    ----------------------
    BB4 |  0.7       | 0
    ----------------------
    BB5 |  0.7       | 1
    ----------------------
    BB6 |  0.7       | 0
    ----------------------
    BB7 |  0.7       | 0
    ----------------------
    BB8 |  0.7       | 1
    ----------------------
    BB9 |  0.7       | 1
    ----------------------
    

    因此,我们有 TP=5 (BB1, BB2, BB5, BB8, BB9), FP=5 (重复检测到的BB1也算FP)。除了表里检测到的5个GT以外,我们还有2个GT没被检测到,因此: FN = 2. 这时我们就可以按照Confidence的顺序给出各处的PR值,如下:

    rank=1  precision=1.00 and recall=0.14
    ------------------------------
    rank=2  precision=1.00 and recall=0.29
    ------------------------------
    rank=3  precision=0.66 and recall=0.29
    ------------------------------
    rank=4  precision=0.50 and recall=0.29
    ------------------------------
    rank=5  precision=0.40 and recall=0.29
    ------------------------------
    rank=6  precision=0.50 and recall=0.43
    ------------------------------
    rank=7  precision=0.43 and recall=0.43
    ------------------------------
    rank=8  precision=0.38 and recall=0.43
    ------------------------------
    rank=9  precision=0.44 and recall=0.57
    ------------------------------
    rank=10 precision=0.50 and recall=0.71
    ------------------------------
    

    在这里插入图片描述

    (1)07年的方法:我们选取Recall >={ 0, 0.1, …, 1}的11处Percision的最大值:1, 1, 1, 0.5, 0.5, 0.5, 0.5, 0.5, 0, 0, 0。AP = 5.5 / 11 = 0.5

    (2)VOC2010及以后的方法,对于Recall >= {0, 0.14, 0.29, 0.43, 0.57, 0.71, 1},我们选取此时Percision的最大值:1, 1, 1, 0.5, 0.5, 0.5, 0。计算recall/precision下的面积:AP = (0.14-0)x1 + (0.29-0.14)x1 + (0.43-0.29)x0.5 + (0.57-0.43)x0.5 + (0.71-0.57)x0.5 + (1-0.71)x0 = 0.5

    计算出每个类别的AP以后,对于所有类别的AP取均值就得到mAP了。

     AP衡量的是学出来的模型在每一个类别上的预测性能的好坏,mAP衡量的是学出来的模型在所有类别上的预测性能的好坏,得到AP后mAP的计算就很简单了,就是取所有AP的平均值。

     ref(多贴几个链接):

    https://github.com/rafaelpadilla/Object-Detection-Metrics#interpolating-all-points

    https://blog.csdn.net/wc996789331/article/details/83785993

    https://www.pianshen.com/article/4176657687/

    https://blog.csdn.net/zhou4411781/article/details/105839357?utm_medium=distribute.pc_relevant_right.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param_right&depth_1-utm_source=distribute.pc_relevant_right.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param_right

  • 相关阅读:
    spring boot的@RequestParam和@RequestBody的区别
    SpringBoot 中常用注解@PathVaribale/@RequestParam/@GetMapping介绍
    Required String parameter is not present
    Spring Boot 日志记录 SLF4J
    400错误,Required String parameter 'paramter' is not present
    初学 Spring boot 报错 Whitelabel Error Page 404
    Powershell获取WMI设备清单
    Powershell快速入门
    perl的Sys::Syslog模块(openlog,syslog,closelog函数,setlogsock)-自定义日志
    制作Windows10政府版的小白教程
  • 原文地址:https://www.cnblogs.com/ariel-dreamland/p/13604117.html
Copyright © 2011-2022 走看看