论文:Region Proposal by Guided Anchoring 来源:CVPR 2019
Anchor是物体检测中的一个重要概念,通常是人为设计的一组框,作为分类和边界框回归的基准框。无论是单阶段检测器还是两阶段检测器,都广泛地使用了anchor。例如,两阶段检测器的第一阶段通常采用RPN生成proposal,是对anchor进行分类和回归的过程,即anchor -> proposal -> detection bbox;大部分单阶段检测器是直接对 anchor 进行分类和回归,即anchor -> detection bbox。
常见的生成anchor的方式是滑窗(sliding window),也就是首先定义 k k k个特定尺度(scale)和宽高比(aspect ratio)的anchor,然后在全图上以一定的步长滑动。这种方式在Faster R-CNN,SSD,RetinaNet等经典检测方法中被广泛使用。
通过sliding window生成anchor的办法简单可行,但也不是完美的。 (1)anchor的尺度和宽高比需要预先定义,这是一个对性能影响比较大的超参,而且对于不同数据集和方法需要单独调整; (2)如果尺度和长宽比设置不合适,可能会导致recall不够高,或者anchor过多影响分类性能和速度。一方面,大部分的anchor都分布在背景区域,对proposal或者检测不会有任何正面作用; (3)预先定义好的anchor形状不一定能满足极端大小或者长宽比悬殊的物体。
预先定义的均匀密集且形状固定的anchor存在多个不足之处,我们期待的是稀疏且形状根据位置可变的anchor。
本文提出了一种新的anchor生成方法 —— Guided Anchoring,即通过图像特征来指导anchor的生成。通过预测anchor的位置和形状,来生成稀疏而且形状任意的anchor,并且设计了Feature Adaption模块来修正特征图使之与anchor形状更加匹配。
在使用ResNet-50-FPN作为backbone的情况下,Guided Anchoring将RPN的召回率( A R 1000 AR_{1000} AR1000)提高了 9.1%,将其用于不同的物体检测器上, A P AP AP也均有所提高。
网络以FPN为backbone,在原始RPN的特征图基础上,采用两个分支分别预测anchor位置和形状,然后结合在一起得到anchor。之后采用一个Feature Adaption模块进行anchor特征的调整,得到新的特征图供之后的预测(anchor 的分类和回归)使用。整个方法可以进行端到端的训练,而且相比之前只是增加了 3 个 1 × 1 1\times1 1×1 conv 和一个 3 × 3 3\times3 3×3 deformable conv,带来的模型参数量的变化很小。
Anchor generation模块的设计思想来源于公式 p ( x , y , w , h ∣ I ) = p ( x , y ∣ I ) p ( w , h ∣ x , y , I ) p(x,y,w,h|I)=p(x,y|I)p(w,h|x,y,I) p(x,y,w,h∣I)=p(x,y∣I)p(w,h∣x,y,I)即,给定输入图像 I I I(或图像的CNN特征图 F F F),其存在某个anchor的概率 p ( x , y , w , h ∣ I ) p(x,y,w,h|I) p(x,y,w,h∣I)等于上述两个条件概率的乘积。 p ( x , y ∣ I ) p(x,y|I) p(x,y∣I)表示给定输入图像 I I I,某个位置为该anchor中心的概率, p ( w , h ∣ x , y , I ) p(w,h|x,y,I) p(w,h∣x,y,I)表示给定输入图像 I I I和anchor中心点 ( x , y ) (x,y) (x,y),其宽高为 ( w , h ) (w,h) (w,h)的概率。在传统anchor-based方法(sliding window)中, p ( x , y ∣ I ) p(x,y|I) p(x,y∣I)可以看成是均匀分布,而 p ( w , h ∣ x , y , I ) p(w,h|x,y,I) p(w,h∣x,y,I)可以看成是冲激函数。
根据上面的公式,anchor的生成过程可以分解为两个步骤,anchor 位置预测和形状预测。将 Anchor generation模块分为2个分支, N L N_L NL分支对特征图 F I F_I FI使用一个 1 × 1 1\times1 1×1卷积+sigmoid函数,输出每个位置是否为物体中心的概率; N S N_S NS分支对特征图使用一个 1 × 1 1\times1 1×1卷积,输出每个位置的宽高偏移量。最后根据中心点概率值大小选出概率大于某阈值的中心点,与相应的宽高组成anchor。
为什么要先预测中心点概率,再预测宽和高,而不是直接输出4维变量,分别表示anchor的中心点坐标、宽和高?而且后续为什么需要做feature adaption?(2.2节将给出解释)
作者认为,anchor的设计必须满足2个准则:alignment(中心对齐) 和 consistency(特征一致)。 alignment是指anchor的中心点要和feature的位置对齐,
alignment是指anchor的中心必须与特征图的每个位置对齐。这保证了anchor box的中心与特征图元素的感受野中心与anchor box对齐,如果不对齐,那么后续使用单点特征来对anchor进行分类回归就会出现问题。传统的方法就是在特征图的每个位置 F I ( i , j ) F_I(i,j) FI(i,j)设置anchor,并将 F I ( i , j ) F_I(i,j) FI(i,j)设置为anchor的中心,自然地满足了alignment准则。如果直接由回归方法得到anchor的中心,则不满足alignment准则。而且为了设置稀疏的anchor,还需要增加一个表示该位置是否存在物体的概率图,这样实际上相当于没有anchor的RPN,这时如何设置训练标签就成了非常棘手的问题。而直接在每个位置先输出是否存在物体的概率值,并直接以此位置作为anchor的中心,一来满足alignment准则,二来该方法简单方便,训练标签的获取也比较方面。Guided Anchoring生成anchor时相当于使用anchor-free的方法进行了一次粗略的检测,消除了大量的negative anchors,生成了许多质量较高的positive anchors,后续再进行anchor的分类和回归,就相当于时多分类和精修边界框了。consistency是指anchor的特征(感受野)要和形状匹配。传统的方法在特征图的所有位置均设置了宽高比相同的anchor(尽管同一个位置设置了多个宽高比不同的anchor),当使用同一个卷积核进行预测时,所有位置的特征点所对应的感受野与各自anchor的关系都是相同的,这时,anchor的特征和形状是相匹配的。但是现在每个anchor都有自己独特的形状大小,和特征就不是特别好地匹配。另一方面,对原本的特征图来说,它并不知道形状预测分支预测的anchor形状,但是接下来的分类和回归却是基于预测出的anchor来做的,可能会比较懵。由于每个位置anchor形状不同而破坏了特征的一致性,所以需要通过feature adaption来进行修正。通过这样的操作,达到了让feature的有效范围和anchor形状更加接近的目的,同一个conv的不同位置也可以代表不同形状大小的anchor 了。从表格可以看到,Feature Adaption带来了接近 5 个点的提升。
