LargeFishPKU / paper_records

to record detect related papers
4 stars 0 forks source link

paper_records_1-10 #1

Open LargeFishPKU opened 5 years ago

LargeFishPKU commented 5 years ago

to record my efforts

LargeFishPKU commented 5 years ago

paper records

1.An Analysis of Scale Invariance in Object Detection – SNIP

本篇论文主要是基于数据集中object的尺寸分析来撰写的——object尺寸比较大或者比较小的检测效果比较差。

通过对比实验对于image classification的分析主要有下几点: image

  1. 如果测试集中和训练集中的图像清晰程度不一样的话,最起码对于分类来说是要损伤的(domain-shift的影响)。如上图a所示,横坐标表示模型训练时候的图像精度,所有的模型都用224*224精度的图像测试
  2. 一个在高精度图片中训练的网络的fileter对于识别低精度的图像是有帮助的。论文中,对于同样输入的低精度图片,在高精度图片训练的网络经过低精度图片fine-tune的网络是比只在低精度图片中训练的网络效果要好。 如上图b和c,其中CNN-B是在高精度图片训练的,CNN-S是在低精度图片上训练的,CNN-B-FT是在高精度上训练并用低精度的图片fine-tune。

另外通过进行object尺寸变化的实验也得出了一下结论

  1. 在高精度的图片上训练网络可以放大小物体以便更好的对小物体进行识别,但是会使得中大型的物体尺寸爆炸,从而降低了这些物体的识别。
  2. 如果只检测小物体,忽略中大型物体,对于小物体检测也是不好的,主要原因是中大型物体出现的一些外观和姿势的变化学不到,所以对于所有的物体的外观和姿势不鲁棒,最终的检测结果也是不好的。
  3. MST方法对于小物体的检测也不是很理想,得出的结论是,训练具有适当缩放对象的探测器,同时捕获尽可能多的物体变化是很重要的。

于是,基于种种以上的发现,作者提出了SNIP:

SNIP借鉴了Multi-Scale Training(MST)的思想,在MST方法中,由于训练数据中object尺寸极大或极小的目标会影响实验结果,所以训练的时候只对尺寸在指定范围内的目标回传损失(该范围需接近预训练模型的训练数据尺寸),也就是说训练过程实际上只是针对这些目标进行的,这样就能减少domain-shift带来的影响。又因为训练过程采用了类似MST的做法,所以每个目标在训练时都会有几个不同的尺寸,那么总有一个尺寸在指定的尺寸范围内(一个理想的假设)。这样的一个好处就是无论你ROI中的object多么大,都将尺寸限制在一个提前定义好的范围内。

SNIP的网络模型如下:
image

可以看出,有多个分支,每个RPN分支分别对应处理不同的图像的精度大小,图像比较大的时候可以检测比较小的物体,那么当图像尺寸比较小的时候可以检测比较大的物体。这样的好处可以使得不同尺寸大小的物体出来的RoI尺寸在一个相对一样的size下。 为什么有效,还需要提一下之前RPN的anchor,一个anchor被设定为positive需要满足两个条件:1.该anchor和某个ground truth的IOU超过某个阈值(阈值默认采用是0.7),那么该ancho就是正样本。2.一个ground truth和所有anchor的IOU都没超过该阈值,那么和该ground truth的IOU最大的那个anchor就是正样本。据统计,只有30%的正样本是符合第一条规则的,哪怕阈值为0.5,那也有40%的正样本因为不符合第一条符合第二条才成为了正样本。显然这样的正样本质量并不是很高,从而引入了很多的噪音。而SNIP很巧妙的通过将所有的ROI的大小限制在一个阈值内解决了这个问题。

效果虽好,但是缺点也显然易见,那就是速度,,,太慢了,,,

相关实验结果为:
image

LargeFishPKU commented 5 years ago

2.Deformable Convolutional Networks

3.Deformable ConvNets v2 More Deformable, Better Results

以上两篇见附件ppt 2019.02.22_paper reading.pptx

LargeFishPKU commented 5 years ago

4.Cascade R-CNN Delving into High Quality Object Detection

整篇文章是围绕IoU进行探索的,根据随着IoU的增大,检测效果会下降有个了以下几个发现:
image

  1. 容易发生过拟合。根据上图,在IoU超过0.7的时候,proposal的数量就非常少了,显然容易过拟合
  2. 另外就是mismatch的问题。什么mismatch?对于一个网络模型来说,都有两个阶段——training和inference,那么对于检测网络来说,bbox回归器的输入在这两个阶段分布是不一样的。training阶段的proposals显然质量是更好的,因为在training阶段有gt的参考会进行采样,但是inference阶段就没有这个过程。
  3. 另外还有一个基本思想是单个探测器只能在单个质量水平上达到最佳。

基于以上种种,作者做了3组实验去寻找解决的方法,分别取值IoU为0.5,0.6,0.7,去看相应的定位和检测情况。
image

  1. 通过上图c可以看出,bbox回归器只有在输入的proposal的阈值跟训练时候阈值相同的时候效果才是最好的
  2. 上图d表明,对于低IoU样例,u = 0.5的检测器优于u = 0.6的检测器,在较高的IoU水平下表现不佳。这也验证了,通常,在单个IoU级别优化的检测器在其他级别上不一定是最佳的。
  3. 同时也可也看出,对于一个proposal,经过回归之后,这个proposal的IoU会变的更优秀,更接近gt。

既然单一一个阈值训练出来的检测器效果有限,随着bbox的回归,proposal的质量更好,所以作者提出了cascade-rcnn,一个muti-stage的结构,每个stage都一个不同的IoU阈值,结构图如下:
image

上图中的H类型的节点是代表region-of-interest detection sub-network,C类型节点代表分类,B类型节点代表边框回归。可以看出,是一个串联的结构,总体思想就是通过多个阶段的bbox的回归,proposal的质量就会越来越好,可以通过下图Figure4看出。那么,IoU大的占比也会越来越好,那么通过设定比较大的IoU就可以让检测达到一个比较好的效果。其中三个stage的IoU设置分别为:0.5,0.6,0.7 image

最终的实验效果:
image

LargeFishPKU commented 5 years ago

5.Scale-Aware Trident Networks for Object Detection

本文章主要在感受野上进行创新,解决的问题就是目标检测中scale_variation的问题。
之前解决上述问题比较常用的方法无非可以分成两种:

  1. image pyramid(下图a):直接对图像进行不同尺度的缩放,把处理后的图像放到网络中进行检测,目前这样的方法是很有效的,比较新的代表作SNIP(直接参考楼上的论文讲解),精度很高,但是这种方法也有一个很明显的缺点就是时间太慢。
  2. feature pyramid是另一种常见的方法(下图b):最有代表性的就是FPN了,思想跟image pyramid类型,但是在feature层面上做文章,速度比较快,但是性能和image pyramid却有较大的差距。
    image

文章中说明对于一个检测模型来说,影响backbone的因素无非就是:network depth、downsample rate和receptive field三个因素。之前还没有工作单独的去测试receptive field对检测模型的影响,因此,作者进行了相关的实验,分别使用ResNet-50和ResNet-101作为backbone,探索receptive field这个因素的作用(大小通过dilation rate的变化实现),实验结果如下:
image
上图结果可以比较明显的看出,物体尺度的检测效果和dilation rate(receptive field size)属于正相关关系。 所以作者提出了可不可以把不同大小的receptive field 结合在一起对物体进行检测呢?由此提出了TridentNet,结构如下:
image

乍一看,跟SNIP有点像啊。可以看出就是在一个backbone上面加入接个分支,因为几个分支只是区别于dilation rate,所以可以共享参数,这样还避免了加入过多的参数从而产生overfitting的风险;另外,之前经验可以知道,mismatch这个问题会对检测产生比较大的不利影响,所以,作者对于每一个分支只是挑选适合本scale的物体进行训练。

参考知乎作者的话就是:
总结一下,我们的TridentNet在原始的backbone上做了三点变化:第一点是构造了不同receptive field的parallel multi-branch,第二点是对于trident block中每一个branch的weight是share的。第三点是对于每个branch,训练和测试都只负责一定尺度范围内的样本,也就是所谓的scale-aware。这三点在任何一个深度学习框架中都是非常容易实现的。

也是根据上面三点,作者进行了相关的对比实验,结果如下图所示:
image
另外还跟FPN进行了比较:
image
结果也很明显,是优于FPN的

LargeFishPKU commented 5 years ago

6.Path Aggregation Network for Instance Segmentation

本篇文章主要是围绕特征的融合进行了一系列创新,提出了PANet,也是COCO2017实例分割的第一名和目标检测的第二名。

本篇创新点的发现来源主要有以下几点:

  1. 信息的传递在Mask R-CNN中可以优化:在低层次中的feature可以有效的帮助大物体的识别,但是经过了几十上百层的传递到达底层的feature后,低层次的特征损失比较严重。
  2. 另外,每个proposal是依赖于单层的feature层进行预测的,但是其他feature层的feature也有利于该层的预测(下面会说)
  3. 最后,mask预测是在单个视图上进行的,不能有效的融合更多不同的信息。

PANet网络结构下图(Figure1)所示: image

可以看出,网络主要包含了FPN,Bottom-up path augmentation, Adaptive feature pooling, Full-connected fusion, Box branch5个部分。本篇文章主要的创新点集中在:Bottom-up path augmentation, Adaptive feature pooling,Full-connected fusion3个部分。以下主要讲解这三个部分。

  1. Bottom-up path augmentation:在FPN中信息的传递是一个top-down过程,为了融合更高层次的feature。在这里是一个bottom-up过程,很容易联想到是为了融合低层次的feature,但是动机是什么?FPN的诞生是因为高层次的feature包含了更多的语义信息,并且对整个物体有着很高的响应;但是低层次的feature却对物体的一些边或者部分有着很高的响应,可以更好的定位一个物体,于是借鉴FPN的思路,一个Bottom-up path诞生了。结构如下图(Figure2)所示:
    image

    在Bottom-up path过程中,每一层用Ni表示,对应FPN中的Pi。由图Figure2可以看出,其中{N2, N3, N4, N5}分别对应由{P2, P3,P4, P5}计算产生。具体为,Ni经过33,stride=2的卷积降维,然后跟Pi相加,融合的feature再经过33的卷积层产生Ni+1。Bottom-up path 主要就是引入浅层的feature,因为边缘形状特征对实力分割很重要。

  2. Adaptive Feature Pooling:这一步主要做的就是特征融合。在Faster R-CNN中,RPN得到的RoIs要经过RoI Pooling提取特征,这一步每个RoI都是基于单层特征。在Adaptive Featrue Pooling中,将单层特征也换成了多层特征,每个RoI都要跟所有的特征层进行Pooling得到融合的特征。具体可见下图(Figure 6):
    image

    (在此引入博客“PANet算法笔记,AI之路”一段话)之所以引入adaptive feature pooling其实是基于FPN中提取ROI特征的思考,虽然FPN网络基于多层特征做预测,但是每个ROI提取特征时依然是基于单层特征,然而单层特征就足够了吗?于是作者做了Figure3这个实验,Figure3中有4条曲线,对应FPN网络中基于4层特征做预测,每一层都会经过RPN网络得到ROI,所以这4条曲线就对应4个ROI集合。横坐标则表示每个ROI集合所提取的不同层特征的占比。比如蓝色曲线代表level1,应该是尺度比较小的ROI集合,这一类型的ROI所提取的特征仅有30%是来自于level1的特征,剩下的70%都来自其他level的特征,leve2、leve3、leve4曲线也是同理,这说明原来RPN网络的做法(level x的ROI所提取的特征100%来自于leve x的特征,x可取1、2、3、4)并不是最佳的。因此就有了特征融合的思考,也就是每个ROI提取不同层的特征并做融合,这对于提升模型效果显然是有利无害。

image

  1. Fully-connected Fusion:fc和FCN相比产生的属性是不同的,FCN是在每一像素处的预测是基于局部感受野和不同空间位置共享的参数;而对于fc,它是位置敏感的,因为通过改变参数组来实现不同空间位置处的预测。所以作者在原有FCN的基础上加入了一个全连接的支路,主要进行二分类预测区分背景和物体。通过融合FCN和fc的输出的融合达到一个更好的结果。

实验部分:

  1. 关于COCO分割结果:

image

通过multiscale-train和singlescale-test,已经比Mask R-CNN+FPN和2016的冠军都要好了,而且从图中也可以看出,multiscale训练非常的必要。

  1. 关于COCO目标检测结果:
    image

  2. 最后看一下比较关键的Component Ablation Studies,先贴出图:

image

可以看出,加上multiscale-train,对于小物体的提高非常明显;加上sync bn对于APbb提升比较明显;加上bottom-up path augmentation,都有所提升,但是提升不是很大,基本在一个点以内; 加上adaptive feature pooling 也可以提升不到一个点;最后的 fully-connected fusion也可以提升一个点以内。

LargeFishPKU commented 5 years ago

7.Hybrid Task Cascade for Instance Segmentation

本篇文章主要是follow了Cascade-RCNN,发现了在Cascade-Mask-RCNN中mask分支对图像分割提升不大的问题,探索了feature的进一步融合和利用,提出了新的用于图像分割的网络结构——HTC。

本文章主要的两个创新点:

  1. 检测和分割不是各自串联起来,而是将他们交织在一起作为一个联合的多阶段处理。
  2. 应用了一个全连接卷积提供一个空间上下文,可以帮助区分背景和全景

主要探索了一个问题:简单的将Cascade R-CNN和Mask R-CNN结合起来相对bboxAP来说,maskAP只提高了一点点(1.2%)。文章把这个原因归结为:Mask分支在串联起来的时候,只会受益于不断优化的bbox,但是Mask和Mask之间并没有直接连接,导致信息的流动是次优的(具体可见下图a)。接下来就怎么使得串联的Mask之间可以更充分的利用信息开展工作提出了Hybrid Task Cascade(HTC)。
image

Multi-task Cascade分析:

  1. Cascade Mask R-CNN:具体结构可见上图a,整个pipeline可以描述为:
    image X表示CNN的features;左边上下的x分别表示box和mask的features;右上r和右下m分别表示相应的box和mask 的预测;P()表示pooling操作;B()、M()表示boxhead和maskhead;所有的下坐标t表示第几阶段。通过串联对box的不断优化以及bbox和mask之间的互相影响(multi-task),对boxAP有了提升相比只有Mask R-CNN和Cascade R-CNN。但是对mask预测的提升却不是让人很满意。
    image
  2. Interleaved Execution:具体结构见上图b,整个pipeline可以描述为:
    image 1中设计很大的一个缺点就是两个分支(box和mask)是并行执行的,每个分支都是用上一个分支优化的框进行操作,但是同一个阶段中,两个分支并没有直接交互。基于上述缺点,作者提出了新的结构(b)。这样的话对于mask分支,可以利用当前最好的box进行预测,也就是同一个stage的mask预测同一个stage出来的框,这样两个分支就不是简单的并行了,而是加上了串行的部分,效果有所提升。 image
  3. Mask Information Flow:具体结构可见上图c,整个pipeline可以描述为: image 同样,2中的设计也是有缺陷的,很明显就是每个stage,mask预测只是依赖于ROI feature和box的预测,mask分支在不同的stage中并没有直接的关联,导致了在mask预测的准确度上没有进一步的提升。所以作者又提出了结构(c)。可以看出,在2的基础上增加了mask分支每个stage之间的直接关联。具体体现在上述公式图片的右下角,多了一个mt-1,这个就是上一个阶段产生的mask,那么F函数怎么定义呢?由下述公式(4)给出: image
    式子中后面那一项表示使用上一阶段在deconvolutional layer之前的ROI feature,也就是14*14,参考下图figure2(还不明白的参考mask rcnn论文)。
    image 通过这样的改变,每个mask分支之间的feature就不再是互相孤立的了,而是冗余的,随着stage增加,冗余度越高。至此主要的模型就出来了,但是这样就完了吗。并没有,作者还增加了空间上下文信息来进一步增强监督信息——spatial context from segmentation。
  4. Spatial Contexts from Segmentation:作者之所以使用spatial context是为了进一步帮助区分前景和背景。加上了这一部分,最终的网络结构是长这样的(图d): image 相对c来说,加上的s分支是一个全连接卷积网络,用来预测每个像素点的语义信息,因为语义分割信息对于box和mask的feature有个很好的补充作用,所以作者就又把他们融合在了一起,公式(6)如下:
    image
    其中S就是semantic segmentation head,根据之前的公式可以知道,在预测mask和box 的时候,使用的feature在之前的基础上进行了S的element-wise的相加。现在具体说一下S是怎么工作的。
    从图中可以看出,S的输入也是基于FPN的,因为对于语义信息来说,单层的feature不足以产生足够的区分能力。S分支具体结构如下图Figure3: image 首先FPN的5层feature经过1*1的卷积进行维度的改变,再根据中间层feature map的大小其他层进行上采样和下采样进行相加。之后的4层卷积层是为了消除每个feature map之间的语义差异(文章中是这么写的)。
    最终的实验效果(Table1):
    image
LargeFishPKU commented 5 years ago

8.R-FCN: Object Detection via Region-based Fully Convolutional Networks

R-FCN相对来说是一篇比较老的文章了,为什么要拿出来讲呢,因为我觉得这篇文章比较新颖,是为数不多的在pooling的时候分channel拼接的,之前一开始读这篇论文的时候还没有怎么读懂,具体原因应该是说服不了去接受这样的方法,但是通过一段时间的积累再回头看这篇文章,还是觉得很有意思,也看的更懂了,也在处理feature map的方式方面有了很大的启发,那接下来就看看这篇文章到底是做了个什么事。
从文章的abstract部分可以看出,作者主要是根据Faster R-CNN在RoI pooling之后需要巨大的运算量这个问题提出了一个可以减少大量计算量的网络结构,但是其实还有一个原因,这个大家应该看到过很多次:translation invariance VS translation variance, 众所周知,大家在做检测的时候都喜欢用pretrain的model,但是在imageNet上pretrain的model是用来做分类的,如果一张图片中有只鸟,model识别出这是只鸟,并且希望如果这只鸟在图中的位置有变化的话那么model依然可以识别出这是个鸟,这就是translation invariance。但是检测就不行了,如果一个物体发生了移动,我们希望model可以检测到这个变化,要不怎么去框出来这就是translation variance。另外,检测不仅仅是把物体框出来,还要识别出来,这对于model来说是相对矛盾的,既要translation variance也要translation invariance。为了解决这个问题,在目标检测中才用了各种各样的pooling去做到对位置敏感,因为只是单纯的网络,并不对物体的位置敏感的。那么本文中也提出了自己的Position-sensitive score maps & Position-sensitive RoI pooling方法。
首先对于Faster R-CNN来说,在RoI pooling之后所有的RoI都要进过两层fc再进行相应的分类和回归,这就非常耗时,因为一般来说RoI的数量是非常大的,在训练的时候大概在2000左右,并且还有一个很大的缺点就是fc层是对位置不敏感的,这显然对于检测来说不是什么好事。于是为了节省计算量和做到对位置的敏感,文中提出了这么一个东西:position-sensitive score maps。结构图如下(Figure1):
image 可以看到,经过一系列卷积之后,出来了一个超级大的feature map,为什么说超级大,因为,从图中很明了的可以看出,这个feature map的大小是跟种类的个数以及之后进行RoI pooling出来的bin的个数成正比。
那么整个R-FCN除去RPN的分支就是长上图这个样子,可以看出,在进行了pooling之后,再没有什么卷积层和fc层,所以对比Faster R-CNN来说计算量大大减少,所有的操作都是在这个position-sensitive score maps进行的,具体跟R-CNN、Faster R-CNN的区别由下表(Table1)给出:
image 那么,为什么position-sensitive score maps相对Faster R-CNN就能保留位置敏感的信息呢?给出整个R-FCN的结构图(Figure2):
image
可以看出,对于通过RoI pooling出来的所有RoI,都映射到position-sensitive score maps进行feature的提取,为什么说R-FCN有意思,从图中可以看出,进行pooling 的时候,每个bin是通过feature map的不同channel拼接起来的,每个bin都负责RoI的一个位置部分,比如图中的就是一个33的pooling,一共9个bin,分别对应物体的top-left,top-center,top-rght...bottom-right。每个bin都有(c+1)个channel,c代表物体种类数量,+1是代表还有一个背景。每个bin都是从相应位置的position-sensitive score maps的channel中提出来的。所以这就是我觉得很有意思的地方,原来feature map还可以这么利用,拆分着用,给了自己很大的启发。
那么在进行pooling 的时候,每个bin的feature怎么计算,假设RoI的大小是w
h,分成kk,那么每个bin的大小约等于w/k,h/k。出于方便直接贴图:
image 之后会对每个类做一个softmax,那么谁最大,这个RoI就标记成谁。这是分类,那么框回归呢?同样的道理,只不过position-sensitive score maps不再是k
k(c+1)了,而是4kk*c(背景不用算坐标)。之后的操作一摸一样。
贴出一个例子(Figure3、Figure4):
image 对比两张图,可以看到,只有每个bin都能对上之后,才会把这个物体种类分配到这个RoI。 实验结果:
image 从实验结果上看,R-FCN在精度上只能说可以跟Faster R-CNN进行一拼,但是在test time上却很占优势,原因很明显,R-FCN没有那两层fc。但是有个问题值得思考那就是,为什么在RoI pooling之后保留了位置敏感信息的R-FCN在精度上却没有比用会损失位置信息的fc层的Faster R-CNN要高,,,这个,,目前我觉得是个可以思考的东西。

LargeFishPKU commented 5 years ago

9.Light-Head R-CNN: In Defense of Two-Stage Object Detector

本篇论文主要是为了解决Two-Stage检测器速度和精度之间tradeoff的问题。最终实现了Light-Head R-CNN,可以使得在速度和精度上都能超过R-FCN和Faster R-CNN,并且速度跟SSD,YOLO网络具有很强的竞争力参考。下图Figure1: image

首先,先探讨一下,为什么two-stage的方法就是比one-stage的方法慢呢?以Faster R-CNN和R-FCN R-CNN为例,Faster RCNN在识别ROI的时候运用了两层的全连接层,而R-FCN产生了一个非常大的sorce map。因此,由于heavy-head的设计,two-stage的网络速度会很慢,即使把base model减小,计算的代价依然很大(如果用了resnet101等大型网络另说)。 找到了以上原因,作者就提出了Light-Head R-CNN,主要是把head变的尽可能的轻,主要方法就是减少了feature map的channel数量和使用了R-CNN网络的一部分。以下主要讨论如何约减网络并且不会让精度下降甚至提升。
首先head定义为除了backbone base network之外的部分,主要包括两个元素:R-CNN subnet, ROI warping。

R-CNN subnet: 对于Faster R-CNN来说,使用了两层的全连接网络,虽然提高了精度,但是计算量却是巨大的,特别是proposal比较多的时候(每一个proposal都要过一遍)。对于R-FCN,首先是对每个redion产生了一系列score maps,但是整个的channel数量达到了classespp,calsses是种类数量,p是pooling的大小,之后用一个average vote产生最后的预测。可以看出,不论Faster R-CNN还是R-FCN,都有一个heavy head,但是在不同的位置。对于Light-Head R-CNN,作者用了非常简单的一个全连接网络作为R-CNN的subnet,在精度和计算速度上做了一个权衡。具体三者的比较见下图Figure2.
image Thin feature maps for RoI warping:Light-Head R-CNN中,在进行ROI warping之前产生的feature maps的channel数量是比较少的,但是发现经过ROI warping不但是节省了空间还提高了精度。那么channel数量少的feature map是怎么产生的呢?我们知道如果减少channel数量其实就是在减少整个feature map的表达能力,单纯的减少效果肯定不会好,那么就需要用其他的trick来弥补,作者就用了large separable convolution layers来产生thin feature map,简单的就是说把卷积核扩大,这样虽然是channel数量减少了,但是每个feature map能表达的信息多了(因为卷积核扩大了)。具体见下图Figure3:
image
实验结果:
首先介绍B1和B2,B1就是代表普通的R-FCN,B2在B1的基础上增加了一些trick,比如使用5种不同size的anchor;对classification loss和regression loss进行了balance;给出baseline(Table1):
image
对于Thin feature maps:文中对PSRoI pooling的feature map channel降低到了490(1077),之前是3969(8177);并且加了一个全连接网络(单纯的减少channel数量会使得后面的网络不对应,需要加一个全连接网络过渡)。得到的结果Table2:
image 可以看到,虽然channel数量大幅度的降低,但是精度却只减少了一点。
对于Large separable convolution:对应之前的图Figure3,文中使用了k=15,Cmid=256,Cout=490,得到结果Table3:
image 可以看到提升了0.7个点, 那将thin feature map 和 large separabel convolution融合一下得到下图结果Table4:
image 效果是很不错的。
贴出最后与其他网络对比实验结果 Table 5:
image

LargeFishPKU commented 5 years ago

10.Region Proposal by Guided Anchoring

这篇是2019年CVPR刚出的一篇关于检测的论文,也是自己之前想做的一个东西,但是不知道怎么搞,结果今年paper就出来了,正好参考一下别人是怎么做到的。
说了半天,是要解决什么问题呢?就是怎么提高质量的anchor。
众所周知,目前所有的two-stage的检测器,在RPN提anchor的时候是密集提的,也就是对于一个feature map逐个像素点进行提aspect ratio不同的anchor。这样提出来的anchor其实是非常冗余而且是数量惊人的,比如现在一般backbone都是使用了FPN,FPN是有5层的,那么这5层都会提anchor,那么大概数量是多少呢,差不多是20w这个数量,虽然之后进行了取样或者nms使得最后输出的框没那么多,但是资源消耗确实巨大的,而且每个框的aspect ratio还是事先定义好的,导致,就算这么多框,也不一定能很好的覆盖object,那如果有一种方法,可以指导网络从哪里提取anchor,并且提取aspect ratio、size多大的anchor,那不仅可以极大的降低anchor 的数量同时也可以保证anchor的质量,不像密集提anchor那样,提出了非常多没有用的anchor。那本文就是干的这个事,对我有很大的启发,同时也打算follow这个工作,看能不能提出更好的方法。 首先启发作者的是物体在图像平面上并不是均匀分布的,物体的比例也与图像内容,场景的位置和几何形状密切相关。所以作者将产生稀疏anchor的方法分成了两部分:1.首先辨别出哪些位置可能包含物体;2.在1的基础上决定该anchor的大小和纵横比。
在这里要提一下作者说的设计anchor的两个规则:对齐和一致性。 首先,要使用卷积特征作为锚表示,锚点中心需要与特征映射像素很好地对齐。 其次,感受野和语义范围在特征图的不同区域是一致的,因此不同位置的锚的尺度和形状应该是一致的。(其实这段话自己不是很理解)
首先作者提出了一个物体的位置和形状对于一张图的分布公式:
image 其中_I_表示的就是一张图。根据这个公式,可以将方法分成上面说的两步(个人感觉,这是作者为了解释方法的两个stage强行写出来的公式)。
具体实现:首先根据给出的图生成一个feature map,在feature map的基础上,location prediction的分支获取一个可能性的映射图,代表哪些位置可能含有物体;然后shape prediction分支预测独立与位置的shapes。另外,作者还提出了一个feature adaption 模块,用来根据anchor的形状调整特征。
首先贴出整体的框架图(Figure1),之后的讲解都会根据这个图:
image

  1. Anchor Location Prediction: 看考上图首先该分支会获取一个跟feature map一样大的概率图F,该网络将1×1卷积应用于基本特征映射F以获得对象性分数的映射,然后通过element-wise sigmoid函数将其转换为概率值。作者之所以只用了一个1x1的卷积并在之后直接加了sigmoid函数,是因为在efficiency和accuracy之间做了一个权衡。得到了概率图F之后,会在概率大于一个阈值的位置上预测anchor。这样就会尽可能多的关注物体而不像密集提anchor那样大量的提了很多包含背景的anchor。

  2. Anchor Shape Prediction
    知道了在哪些位置提anchor之后,下一步就要决定anchor的shape。这一步就是通过Anchor Shape Prediction分支来解决的。如图Fig.1(c),不同于传统的边框回归,因为不需要改变anchor的位置,所以要确定shape(w, h)来保证可以gt有着最大的IoU。但是不能直接去预测w和h(为什么不能,参考R-CNN的边框回归),所以作者提出了以下形式:
    image 这样,就预测dw和dh(跟R-CNN类似),sigma是经验参数,s是步长,这样就可以将[0, 1000]数值的w和h映射到[-1, 1]了,如此,训练就容易了很多。该分支也是应用了一个1x1的卷积之后,再进行了element-wise transform得到了dw和dh。

如此预测,好处显然易见,不仅可以更有效的预测anchor的位置,还能适应各种纵横比的物体,比传统的密集提框要有效的多(即使密集,有个物体依然不能覆盖的很好,原因就是anchor的纵横比是提前固定好的,不能动态的改变)。

整体的目标函数如下:
image

实验结果:

  1. 首先是跟普通的RPN提出来的框做了一个对比,效果图如下:
    image 可以看出,对比RPN,提出的anchor数量明显减少,而质量却更高。

  2. 在MS COCO 2017 test-dev上,加不加GA进行对比实验:
    image

  3. 跟各个method进行对比结果如下: image

PS:直接贴一下论文作者讲解的上面我不怎么理解的alignment和consistency问题:
image