mmdetection最小复刻版(十):mAP和PISA深入分析——#mmdetection学习

举报
lutianfei 发表于 2021/09/02 21:22:11 2021/09/02
【摘要】 本文转载自https://www.zybuluo.com/huanghaian/note/1749740github: https://github.com/hhaAndroid/mmdetection-mini欢迎star部分内容有删改 0 摘要论文名称:Prime Sample Attention in Object Detection论文地址:https://arxiv.org/pdf...

本文转载自
https://www.zybuluo.com/huanghaian/note/1749740
github: https://github.com/hhaAndroid/mmdetection-mini
欢迎star

部分内容有删改


0 摘要

论文名称:Prime Sample Attention in Object Detection
论文地址:https://arxiv.org/pdf/1904.04821.pdf

本文关注一个问题:在训练目标检测器的mini-batch中哪些样本才是最重要的? 难样本吗?

到目前的研究为止,我们已经得到了一些通识:

  1. 在训练过程中mini-batch内样本不一定是同等重要的,在很多论文中都有分析例如focal loss、ssd或者ghm中
  2. 分类和检测分支其实是有相互关系的,并不是完全独立的,对于最终的性能来说希望得到预测高分类值位置对应的bbox也是高iou的

本文从上述所提问题着手并结合mAP计算过程分析,得到结论:应该要特意关注主样本Prime Sample(对mAP有巨大影响的样本),也就是主样本的权重应该要大,而不是按照难样本来定义权重。

之前在很多论文中发现由于负样本往往很多,而提出了难负样本采样策略OHEM;而在focal loss中发现对易学习样本(基本上都是负样本)进行指数级降低权重可以实现比OHEM更好的效果;接着在GHM算法中提出虽然focal loss效果不错,但是其会放大外点噪声影响,故提出了梯度自动均衡机制;然后在 Libra R-CNN算法中提出了iou平衡采样规则,利用iou进行平衡采样可以保证采样到有代表性的样本。而在本文中另辟蹊径,换了一个角度重新审视了样本不平衡的问题,指出对性能影响最重要的样本不在难样本,而在于主要样本(Prime Sample),毕竟难样本里面也存在外点噪声数据。

举一个简单例子:
image.png

虚线是gt bbox,红色框和蓝色框是两个最终预测bbox,很明显对于mAP有巨大影响的肯定是红框,即使篮色bbox再靠近,要么被nms抑制要么也是当做FP处理。但是在训练过程中,不管是OHEM还是Focal loss都是在努力把蓝色bbox权重调高,而把红色bbox权重降低,从loss角度来理解好像很有道理,因为红色框已经学的很好了,但是从mAP角度出发,我其实希望红色框更准确一些,而没有必要重点关注蓝色框。

这其实说明一个简单道理:目前而言,在训练过程中ohem和focal loss其实采用的是类似平均效应,因为你学的不好所以我要重点关注,你学的好我就不用太关注,从而实现平衡,但是在目标检测中特别是采用mAP评估而言就不合适。在某些工业场景要求:物体尽量不要漏检,bbox也无需预测非常高的iou情况下可能本文做法就不合适了。也就是说本文做法和mAP评估指标息息相关,一旦换了一个评估指标,那么本文就不一定适合。

总之:本文从样本重要性问题出发,结合目标检测常用评估指标mAP,提出了主样本的概念。如果最终性能不是用mAP评估,那就不一定适合。

1 mAP深入分析

要理解mAP,需要先理解AP,那么就需要先理解召回率和精准率以及PR曲线,也就是说必须要理解混淆矩阵含义。

1.1 混淆矩阵

以二分类问题为例:
image.png

在目标检测中,正例为gt bbox,负例为背景

  • 把有gt bbox正确地分类为有gt bbox,表示为TP(true positive)
  • 把有gt bbox错误地分类为背景区域,表示为FN(false negative),也就是漏报
  • 把背景区域正确地分类为背景,表示为TN(true negative)
  • 把背景区域错误地分类为有gt bbox,表示为FP(false positive),也就是误报

由tp/tn/fp和fn就可以构成二分类的混淆矩阵,如上所示。在二分类问题中通过打印混淆矩阵,可以直观的看出正确率、误报和漏报个数。tp/tn/fp/fn如何记忆?其实非常简单,首先看第二个字母n或者p表示预测的类别,而前面的t或者f表示预测正确还是预测错误,如果是fp就表示预测为正样本,但是很可惜预测错误为false,那么就很容易看出这个样本是背景样本,你错误预测为正样本了。

1.2 PR曲线

PR曲线的计算首先需要了解召回率recall和精确率precision的计算公式:

precision = TP/(TP + FP) 
recall = TP/(TP +FN)

注意分子都是tp,仅仅分母不同。

  • 精准率: 表示在所有检测为正例的样本里面,真正是正例的比例,也叫作查准率
  • 召回率: 表示在所有正例样本里面,召回了多少正例的比例,也叫做查全率

精准率衡量在所有检测为gt bbox的样本中有多少是真正的gt bbox,衡量检测精度,而召回率衡量正确找到的gt bbox占所有gt bbox的比例。

PR曲线是以precision和recall这两个为变量而做出的曲线,其中recall为横坐标,precision为纵坐标。对于任何一个长度为n的样本,其混淆矩阵肯定是唯一的,那么recall和precision肯定就是一个数,那么如何变成变量呢?其计算过程可以举例如下:

假设一个二分类问题,预测为正例的概率分别为pred=[0.1,0.4,0.2,0.8,0.5,0.7],对应的label为[0,1,0,1,1,1],也就是实际上一共有4个正样本,2个背景样本

  1. 对pred按照从大到小分值进行排序,并且按照同样顺序对label进行排序,变成:
    pred=[0.8,0.7,0.5,0.4,0.2,0.1],label=[1,1,1,1,0,0]

  2. 遍历pred,将pred切分为正负样本,当前以及前面所有位置设置为1,索引后面位置全部为0,此时就可以的非0即1的列表,然后就可以计算recall和precision了,两者都是list

(2-1) i=0,pred=[1,0,0,0,0,0],此时tp=1,fp=0,fn=3,recall=1/4,precision=1/(1+0)=1
(2-2) i=1 pred=[1,1,0,0,0,0],此时tp=2,fp=0,fn=2,recall=2/4,precision=2/(2+0)=1
(2-3) i=2 pred=[1,1,1,0,0,0],此时tp=3,fp=0,fn=1,recall=3/4,precision=3/(3+0)=1
(2-4) i=3 pred=[1,1,1,1,0,0],此时tp=4,fp=0,fn=0,recall=4/4,precision=4/(4+0)=1
(2-5) i=4 pred=[1,1,1,1,1,0],此时tp=4,fp=1,fn=0,recall=4/4,precision=4/(4+1)
(2-6) i=5 pred=[1,1,1,1,1,1],此时tp=4,fp=2,fn=0,recall=4/4,precision=4/(4+2)

故recall=[1/4,2/4,3/4,1,1,1],precision=[1,1,1,1,4/5,4/6],
可以发现tp、fp和recall的分母非常好算,只要label[i]=1,那么tp直接加1,否则fp加1就行,而recall的分母就是正样本个数,固定的,也就是说fn其实不需要算。

基于上述理解,代码其实非常简单:

image.png

  1. 以recall列表作为横坐标,precision为纵坐标绘制曲线即为PR曲线

1.3 AP和mAP

AP其实就是曲线下面积,如上代码所示,前面考虑的AP都是二分类问题,如果是多分类问题,则需要遍历每个类别分别计算AP,然后取平均得到mAP。

1.4 目标检测中的mAP

针对目标检测,mAP算法思路和上面类似,但是略有不同。首先最核心的是需要计算tp和fp,这里涉及到如何定义tp的问题,做法是基于iou阈值,当某个预测bbox和gt bbox的iou大于阈值,则有可能将其认为是tp,为啥是有可能?因为在目标检测中可能存在一对一、一对多、0对一的场合,具体分析如下:

对于任何一个gt bbox,可能出现没有预测框;只有一个预测框;和多个预测框。

  1. 如果没有预测框,则表示漏报,FN+1
  2. 如果只有一个预测框且iou大于阈值,则TP+1,否则当做漏报FN+1
  3. 如果有多个框,则需要根据实际需要来定了,在voc和coco评估指标中,预测概率分值最大且iou大于阈值认为是TP,此时TP+1,其余框算FP误报。但是在实际场合中,可能不会算误报,因为毕竟还是命中了

通过上述规则,可以得到pr曲线,从而得到AP值。但是为了更加合理的评估检测性能,常用的评估做法包括三个:voc2007、voc2012和coco评估。

  1. voc2007
    也就是常说的11点法,iou阈值设定为0.5,选取recall >= 0, 0.1, …, 1的11处Percision的最大值(相当于曲线平滑处理),计算AP=11点处的精度最大值和,然后除以11。可以发现其算法没有遍历整个recall横坐标,而是属于抽样做法,在某些特定的点处进行计算。
    image.png

绿线C是平滑后的PR曲线,然后在上面采样11个点即可:
image.png

简要代码如下所示:
image.png

  1. voc2012
    上述11点插值的办法由于插值点数过少,容易导致结果不准,一个解决办法就是内插所有点。所谓内插所有点,其实就是对上述平滑之后的曲线算曲线下面积,示意图如下:
    image.png

可以发现其算法比voc2007还简单,只需要计算平滑后曲线下面积就可以,上图所示,其实就划分了3个区间块,计算每个区间块的面积加起来就行。

image.png

  1. coco
    coco评估做法更加合理,其首先采用了可变Iou阈值(voc系列都是固定的iou=0.5),范围是0.5-0.95间隔是0.05;然后对于任何一个阈值采用平滑PR曲线上101点的采样计算策略;最后对于每个类都要算mAP,然后再进行类别方向求平均得到最终的mAP。

总之:coco的mAP计算准则更加复杂,但是更加合理,并且为了满足PR曲线单调递减的形状,都会先进行平滑处理。 上述代码都在mmdet/det_core/utils/mAP_utils.py,属于示例代码。

参考链接:https://medium.com/@jonathan_hui/map-mean-average-precision-for-object-detection-45c121a31173

1.5 mAP评估指标特性

在掌握mAP计算规则后,才好深入分析mAP的特性。

  1. 在与gt bbox重叠的所有预测边界框中,具有最高IoU的边界框最为重要,因为其IoU值直接影响召回率recall

论文中是如上表述的,但是可能不太对,应该说在与gt bbox重叠的所有预测边界框中,具有最高预测分值且iou大于阈值的边界框最为重要,因为其预测bbox会直接决定tp,而recall分母是固定的,分子增加,那么recall也会增加。这个特性要求预测的bbox中必须存在某个bbox,和gt bbox重合率iou要高,且分类预测分值也要大才行,这种样本就是本文所说的主样本。虽然iou很高但是不是最高分类分值的话算作fp的。

  1. 在所有针对不同对象的IoU最高bbox中,具有更高IoU的bbox更为重要,因为随着iou阈值θ的增大,它们是最后一个低于θ的bbox,因此对整体precision产生重大影响

第一个条件要求对于某个物体,需要存在分类分值最高且iou也非常高的预测bbox,第二个条件要求对于不同的多个物体,需要对每个物体的分类分值最高预测结果中的iou都要尽可能高。举例来说:对于某个gt bbox,由于只有分类分值最高且iou大于阈值的预测bbox(假设是A)才算tp,其余都算fp,所以A我们要重点关注;对于有3个gt bbox的场合,每个gt bbox都会预测任意多个bbox,但是算tp的时候都是看分类分值最高且iou大于阈值的预测bbox(假设是B、C和D),那么BCD这三个预测框也是非常重要的。但是BCD重要性如何排序呢?应该按照iou大小排序才是最合理的,因为随着iou阈值增加,iou最大那个bbox是最后认为是fp的。

以上分析可得ABCD就是我们要的主样本,训练时候权重应该大一些。

前面还没有分析误报对mAP性能的影响,误报主要来源之一是将负样本误分类为正样本,这种误分类对精度有害并且会降低mAP,但是并非所有分类错误的样本都直接影响最终结果。在前向推理过程中,如果存在多个彼此高度重叠的负样本,由于nms作用,则会仅保留得分最高的样本。也就是说:

  1. 在局部区域内的所有负样本中,得分最高的样本最重要
  2. 在多个负区域所有得分最高的样本中,得分较高的样本更为重要,因为它们是第一个降低精度的样本

(3)和(4)条件比较难理解,举例来说:由于负样本是不参与mAP计算的,所以只有当误报时候才会降低精度(也就是精确率分母),假设某个位置没有任何物体,但是预测出了一大堆bbox属于该类,此时由于nms作用可能只会保留分值最高的bbox,这个bbox才是会最终影响mAP的,所以这个负样本的权重应该要大。假设在3个位置都预测了一大堆bbox,经过nms后保留了各自分离的3个最高分值的预测bbox,此时这三个误报bbox中,最重要的是分值最高的那个,因为它的存在会第一个降低精度。

上面4个条件其实可以归纳为两个条件,分别是locally关系即在每个gt bbox周围或某些局部区域;globally 关系即在整个图像或mini-batch上,并且都前两个条件关注正样本的重要性,后两个条件关注负样本的重要性。

1.6 仿真分析

前面说的过于空洞,下面我们采用仿真的手段来分析不同情况下mAP变化,以voc2012评估指标为例进行分析。

  1. 在与gt bbox重叠的所有预测边界框中,具有最高预测分值且iou大于阈值的边界框最为重要,因为其IoU值直接影响召回率recall

假设就一个gt bbox,设置为[10.0, 20, 40, 60],然后假设预测出了3个bbox,如下:

[11.0, 17, 44, 65, 0.9],
[10, 27, 60, 60, 0.8],
[5, 20, 45, 85, 0.45]])

其和gt bbox的iou分别是[0.71 0.53 0.46],此时mAP=1.0 非常完美。因为gt bbox就是1个,并且分值最大的bbox的iou大于0.5,此时recalls=[1,1,1],precisions=[1.,0.5,0.33333334]。其实只要分值最大bbox的iou大于0.5,那么不管其他两个bbox咋样预测(FP),mAP始终为1.0。

一旦把预测bbox的第一行数据改为:[11.0, 17, 44, 85, 0.9],使其iou低于0.5,那么此时mAP=0.5,下降了一半,此时recalls=[0,1,1]。可以明显mAP性能下降剧烈,原因就是计算时候只考虑了tp样本,第一个预测bbox就是我们说的主样本,不管其余bbox预测情况咋样,我们只要保证分值最高的预测框iou尽可能大就行。这也反映出了分类分值和iou分值要一致的现象了,如果你分类分值最高,但是iou比较低,那么mAP也是比较低的。

换个角度分析也可以,假设gt bbox就一个且为[10.0, 20, 40, 60],预测了三个bbox:

[11.0, 17, 64, 85, 0.9],
[10, 27, 60, 70, 0.8],
[5, 20, 45, 85, 0.45],

其和gt bbox的iou是0.32,0.41,0.46,由于三个预测bbox的iou都小于0.5,故mAP=0也就是三个预测bbox都是误报。如果我把[10, 27, 60, 70, 0.8],修改为[10, 27, 40, 50, 0.8],此时其iou=0.66大于0.5,mAP变成0.5,但是如果我其他不变,把[11.0, 17, 64, 85, 0.9],修改为[11.0, 17, 48, 65, 0.9],,此时其iou=0.64,mAP=1.0,可以发现规律,当把分值为0.9处的bbox预测更好后mAP提升比把分值0.8处的bbox大很多。

从这里大家可以发现,假设我就一个gt bbox,并且在预测的所有bbox中,分值最大的bbox且iou大于阈值,那么不管你是预测100个bbox还是10000个bbox,mAP都是1,始终不变。这也就是为啥在很多比赛时候大家把confidence的阈值设置的非常低可以提高mAP的原因,因为confidence降低,可以提高小物体召回率,但是由于分值最大的bbox且iou大于阈值的bbox始终在,所以mAP是会升高的。所以这个指标仅仅适合评估算法,不适合在工业界目标检测中评估。

  1. 在所有针对不同对象的IoU最高bbox中,具有更高IoU的bbox更为重要
    假设两个不重合的gt bbox,设置为[10.0, 20, 40, 60]和[50.0, 70, 90, 95],然后每个gt bbox预测出3个bbox:
[11.0, 17, 44, 85, 0.9],
[10, 27, 60, 80, 0.8],
[5, 20, 45, 85, 0.45],

[50, 70, 80, 95, 0.8],
[40, 60, 60, 91, 0.6],
[45, 67, 88, 90, 0.3],

其和各自gt bbox的iou为0.51,0.34,0.46,0.75,0.14,0.62,此时mAP=0.83,因为和gt bbox分别预测分支最高且iou均大于0.5,mAP自然很高。但是把iou阈值设置为0.55,此时mAP=0.17,下降非常多,再设置iou为0.8,则mAP=0,当iou 设置为0.55后第一个gt bbox预测框全部是fp,只有[50, 70, 80, 95, 0.8]撑门面了,这里可以看出在不同对象的IoU最高bbox中,具有更高IoU的bbox更为重要,因为他是最后一层屏障。

第一个条件可以保证每个最大分值的预测bbox的iou要尽可能高,第二个条件可以保证在都是topk1的预测bbox中,具有最高iou的bbox更为重要。

  1. 在局部区域内的所有负样本中,得分最高的样本最重要
    这个不需要举例,非常容易理解,假设存在一大堆误报样本,通过nms后保留了几个bbox,此时分值最大的bbox对性能影响最大,如果对其重点关注也就是想办法降低其分值,可以抑制误报(预测分值最大的bbox都不算误报,那么比他低分值的bbox更不算误报了),这部分样本其实是loss非常大的难样本。

  2. 在多个负区域所有得分最高的样本中,得分较高的样本更为重要,因为它们是第一个降低精度的样本
    这个道理和(3)其实是一个道理。

通过上面的一系列分析,可以大概知道对于任何一个gt bbox,其正样本的主样本是分类预测分值最大的样本(作者假设分类分值和iou分值是一致的,故主样本是iou最大的样本),应该重点关注使其iou尽可能高,主样本很大部分都是易学习样本;对于负样本而言,其主样本也是分类预测分值最大的样本,但是其目的是希望其分值尽可能下降,主样本大部分是难负样本。



2 PISA算法分析

2.1 核心思想

基于上述4条准则,我们需要找出正负样本对应的主样本,其中正样本的主样本通常是iou很高且分类分值也很高的样本,负样本的主样本通常是分类为正样本且iou很低的样本,为此作者采用了分层排序操作,分别是 IoU Hierarchical Local Rank (IoU-HLR)和Score Hierarchical Local Rank (Score-HLR)来对mini-batch内部的样本重要性进行排序。

  1. IoU-HLR
    其应用于正样本。
    image.png

对于n个正样本,我们可以得到其和gt bbox的iou分值

  1. 可以gt bbox对n个正样本进行分组,m个gt bbox就有m个组
  2. 首先在每个组内按照iou值从大到小排序,考虑的是局部样本重要性
  3. 然后在不同组间按照top1、top2…进行排序,考虑的是全局样本重要性,注意所有同一级别的topk权重相同的,而不是按照其iou大小进行排序,也就是D和C权重相同,并不是D权重比C大
  4. 最后按照所有top1、top2…的顺序排列即可
    可以明显看出,这个策略不仅仅考虑了组内的重要性(也就是第一条规则),还考虑了组件重要性(也就是第二条规则)。

image.png

上述实线是在不同iou阈值下的pr曲线,top5是指对前面排序的top5重要样本增加分值(应该是通过提高Iou实现),此时可以发现RP曲线都有很大改善,这说明我们选择的top5样本确实是主样本,整体思路是没有问题的。

  1. Score-HLR
    其应用于负样本。
    image.png

此处的负样本分值是对于分类的n个类别中取最大分值(不包括背景),也就是说分值越大,loss也就越大,错的越严重。由于负样本没有gt bbox那么好的分值属性,故作者采用nms进行分组,然后采用了IoU-HLR一样的策略进行重要性排序,目的和上面一样。

image.png

上图很容易说明问题。pos-random是指的正样本随机采样图,pos_hard是基于loss进行采样,而pos-prime是基于主样本进行采样的,可以明显发现分布是不一样的,pos-prime是倾向于采样iou高且分类分值高的易学习样本。同样的neg的采样策略分布也不一样,其不仅仅具有难负样本采样特性还会额外采样一些iou低且分类分值高的样本。这说明基于主样本重要性采样的策略和随机和难样本采样策略所得分布是不一样的。

2.2 具体实现

上述策略反映在代码层面,其实就是样本重加权而已。我们要基于样本重要性进行加权,实际做法也非常简单:

  1. 假设一共n个样本,n_max表示在每个类别中样本数最多的数目,先按照类别分组,在每个组内对正样本进行IoU-HLR操作,对负样本进行Score-HLR操作,得到重要性排序

  2. 利用公式进行线性变换
    image.png
    r_i是在每个类别里面的排序位置,可以看出r_i越靠前,值越小,权重u越大,除以n_max是为了保证不同类别的topk样本相同

  3. 对u进行指数映射,变成loss权重w
    image.png

其中beta是用于对最小权重进行偏移的。
(4) 应用于分类Loss上
image.png

其为了保证total loss值不变,还会进行归一化操作,i和j分别代表正负样本索引。

请注意:前面分析mAP时候说过对于正样本而言,iou高不一定有用,还必须分类分值最高才能发挥作用。故为了加强分类和回归分值一致性,还额外提出了Classification-Aware Regression Loss,其实就是把分类分值的权重想办法引入到回归smooth l1中,加强一致性。

image.png
pi是分类分值对应类别预测概率,这个比较容易理解。

2.3 代码分析

以retinanet为例,其仅仅是修改了样本加权策略而已,训练配置如下:

# bias是最小权重偏移值,k是指数系数
train_cfg = dict(isr=dict(k=2., bias=0.), carl=dict(k=1., bias=0.2))

就是引入了两个超参而已。

(1) 正样本重要性加权

对应代码在mmdet/models/losses/pisa_loss.py的isr_p函数。

1.首先计算所有正样本预测bbox和对应gt bbox的iou
image.png

2.在所有正样本中,先遍历所有类别;然后遍历每个gt bbox,找出哪些预测bbox是负责预测它的,然后对这些位置的iou值进行排序,得到每个样本在该组内的序号t_iou_rank,然后max_l_num - t_iou_rank.float()就可以得到该样本的权重,t_iou_rank值越低,排名越靠前,则表示权重越大

image.png

3.在第2步算完后,可以得到每个样本在组内的权重,现在开始计算组间的全局排名
image.png

此时就已经得到了所有样本的权重了,特点是所有topk等级相同的样本其权重相同。

4.下面开始进行指数转化
image.png

5.为了保存total loss值不变,故需要进行归一化然后重加权
image.png

最终的效果就是改变了label_weights值,里面存储的是每个样本的新权重,且仅仅处理了正样本,负样本没有做处理。

可以发现作者没有实现负样本处的权重重排ISR-N。

(2) Classification-Aware Regression Loss

在得到上面权重后就可以计算分类和回归loss,但是为了加强一致性,作者还引入了一个额外的Classification-Aware Regression Loss(carl_loss),其计算更加简单:
image.png

3 结果分析
image.png

可以发现PISA相当于在loss方面做文章,可以应用于所有目标检测算法,在不同的算法上面都有提升。

image.png

4 总结
纵观整个论文,其是从mAP评估指标角度入手,提出了主样本才是影响mAP最大的样本,而不一定是难样本。基于4点原则,提出了基于层次重排样本重加权策略,将该权重应用于分类和回归loss,可以现在提升最终的mAP性能,思路比较新颖。

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。