居然是这学期第一篇目标检测的论文,再不看都快忘了检测的知识了。

最近关于anchor的讨论特别多,本文就是比较新的anchor-free方法,提出的模型称为FSAF(Feature Selective Anchor-Free Module),主要包含两个内容:anchor-free的边框回归及其基于的特征层的选择。

先回顾一下anchor-based方法:anchor box是预设好的一些边框,数量固定(指的是每个像素点对应的anchor-box是有限个的),有不同的尺寸和比例(尺寸对应物体的大小,比例对应物体的形状),表现形式为四个值:中心点横纵坐标和宽高。人为设定好anchor-box对应的特征层(高层的特征具有low resolution和high feature,低层的特征有high resolution和low feature):大的anchor-box对应到高层特征,小的anchor-box对应到低层特征(因为大的box是用来检测大物体的,大物体即使在高层特征图中仍然不会被遗漏,同时还具有更好的特征;但小box用来检测小物体,小物体在高层特征图中由于不断的下采样会很难检测到,更适合在低级的特征图中检测)。这种人为设定遵循的规则可以用公式表示:

KCF目标检测_特征选择

其中

KCF目标检测_特征选择_02

表示anchor-box的宽高,

KCF目标检测_sed_03

表示224*224大小的box对应的特征层,比该尺寸小的box就会得到更小的

KCF目标检测_KCF目标检测_04

,就是被指定到更低层的特征。将所有的anchor-box对应到某一层特征后,基于anchor-box对应的特征图局部进一步提取特征,然后产生两个分支:分类和边框回归。

这种方法的结果受限于两个问题:1)anchor-box的尺寸和比例只有几种情况,并不能很好地对应真值(真正的物体大小和形状多样);2)人为设定下指定的特征层不是最优的,可能分配不合理,导致检测结果不好。

(还有一点不知道有没有用:anchor-box的产生是overlap的,每个像素点都有各自的anchor-box,数量很多,最后通过NMS去除多余的框,这个过程中也会有误差)

在此基础上,本文提出了anchor-free的方法,使用了FSAF完成检测任务,主要改变有两方面:1)不产生anchor-box,直接边框回归;2)online-assign每个物体对应的特征层,在该特征上进行检测。

结构上的改变如下图所示:

KCF目标检测_sed_05

变动其实很小,就是改变了最后分类和回归的一层卷积。以前是对每个anchor-box对应的区域进行检测,假设有

KCF目标检测_特征选择_06

个anchor-box,分类的输出有

KCF目标检测_sed_07

个特征图,每个特征图对应一个anchor-box在一个类别上的概率;边框回归输出就是

KCF目标检测_KCF目标检测_08

个特征图,对应每个anchor-box所表示区域的四个数值。anchor-free方法中,分类输出

KCF目标检测_像素点_09

个特征图,表示某物体对应于每个类别的概率;回归中也只有4个特征图,表示该物体所在区域。

基于该方法有四个问题:1)如何设计anchor-free思路下的网络结构;2)该情况下的监督信息是什么;3)如何给每个物体指定特征层;4)如何联合训练anchor-based和anchor-free。按照这个思路分别介绍:

Anchor-Free Structure

结构上的设计非常简单,设计了一个anchor-free branch,可以很方便地插入到使用了特征金字塔的检测网络中,可以单独使用,也可以和anchor-based branch共同使用。其实从上面的图中得知,这个branch其实就是两个卷积层,分类和回归各一个。在feature pyramid中的不同层,随意插入anchor-free branch就可进行检测。文中使用的backbone是RetinaNet,选取的特征层范围是

KCF目标检测_KCF目标检测_10


KCF目标检测_特征选择_11

,下标数字表示下采样倍数(

KCF目标检测_sed_12

)。这些层都有各自的分类和回归子网络(全卷积结构,就是在该特征图上继续提取特征然后得到分类和回归结果),anchor-free branch就是这两个子网络的最后一层,分类网络中是具有

KCF目标检测_像素点_09

个3*3卷积核的卷积层加上sigmoid激活,回归网络中是具有4个3*3卷积核的卷积层加上ReLU激活。

Ground-Truth and Loss

这个地方的变动是很大的,目前还不是很理解这种设计的意义。

对于一个instance,真值是一个表示类别的label和表示区域的box(

KCF目标检测_KCF目标检测_14

)。因为要在不同大小的特征图上检测instance,指定某一层后会产生该instance在该层的projected box(

KCF目标检测_像素点_15

),这是根据特征层下采样比例对应缩放后的box,即在

KCF目标检测_特征选择_16

层有

KCF目标检测_特征选择_17

。在该层基础上,还会产生该instance的effective box(

KCF目标检测_sed_18

)和ignoring box(

KCF目标检测_sed_19

),其中

KCF目标检测_KCF目标检测_20


KCF目标检测_KCF目标检测_21

,并且

KCF目标检测_特征选择_22


注意:effective box和ignoring box因为是在特定层的projected box上变化的,都是中心位置不变,只对box大小缩放。

分类网络:输出是

KCF目标检测_像素点_09

个特征图,每张特征图的真值:effective box对应区域像素值全部为1,ignoring box中除去effective box的部分为灰度图像,不参与反向传播(也就是不计算loss),instance对应特征层的相邻层中的ignoring box(

KCF目标检测_特征选择_24

)也不参加反向传播(可不可以理解为,在该层检测后,就不可能在相邻层再次被检测,所以要忽略相邻曾的box)。如果两个instance的effective box有重合,小instance优先。特征图其余位置被0填充,表示无物体存在。

loss计算采用了focal loss方法,是所有non-ignoring区域focal loss的和(non-ignoring区域包括effective box和像素值为0的无物体区域)再被effective box内像素个数normalize的结果。

回归网络:输出是4个特征图,真值:每个像素点和projected box间的坐标偏移量(

KCF目标检测_KCF目标检测_25

),其中

KCF目标检测_sed_26

分别表示像素点

KCF目标检测_像素点_27

和projected box上边界,左边界,下边界和右边界的距离,也就是每个像素点在4个特征图中对应位置的值。每张特征图中,这个值还会由

KCF目标检测_像素点_28

进行normalize。

感觉这里有点问题:偏移量到底是相对于projected box的还是effective box的。文中写的是projected box,可是在下面loss计算时,明显非ignoring的区域大小是和上面白色部分大小相同的,而且文中说的也是effective box,图中表示的也是这个区域内的边界像素值为0(黑色的),如果偏移量是相对于projected box的,effective box的边界像素值不可能为灰色,因为偏移量不可能为0。

计算loss时,effective box外的区域都视为ignoring的,不参与loss。因此regression loss就是根据effective box内的像素点偏移量计算的IoU loss。一张image的regression loss就是所有effective boxes的IoU loss的平均值(一张image中可能有多个instance,所有instance都要计入)。可以结合下图理解:

KCF目标检测_sed_29

对于car这个instance,绿色边框就是它最原始的边框

KCF目标检测_KCF目标检测_14

或者是已经对应到特定层的projected box

KCF目标检测_像素点_15

。在上半部分的分类网络中,输出中的白色部分就是effective box区域,由于0.2倍的缩放要比projected box小很多,灰色的部分就是ignoring的区域,黑色部分是无instance的区域,只有黑色和白色区域的像素点参与loss计算。下半部分的回归网络中,输出中只有两个区域,灰色的是ignoring部分,不参与loss。仔细观察非灰色的部分:就是effective box内的像素点,四个特征图的值各不同,最左侧的特征图中effective box内从上到下由黑到白,因为像素值表示该位置与effective box上边界的距离,所以最上面是黑色的,表示和effective box上边界距离为0。后面几张同理。当测试时,可以很直接地从回归网络的预测结果得到box的信息:假设预测的点

KCF目标检测_像素点_27

处的偏移量为

KCF目标检测_KCF目标检测_33

,那么预测的距离就是

KCF目标检测_特征选择_34

,预测的projected box的左上和右下角坐标分别为

KCF目标检测_sed_35


KCF目标检测_像素点_36

。再进一步scale,可以得到原图尺寸下的box边界。该box的类别就是分类网络输出的

KCF目标检测_像素点_09

个特征图中的最大值对应的类别,置信度就是最大的得分。

Online Feature Selection

文中说特征选择是基于图像内容而不是已往的图像大小,所谓内容其实就是label和box,实际操作就是在每一特征层上用anchor-free branch检测一次,取最好的结果所在层作为最终指定的特征层(感觉这里是有点麻烦的,低级特征图还是比较大的,使用anchor-free branch还是有一定计算量的。每检测一个物体,就要在所有层上试验一次有点麻烦,说不定可以后续改进一下)。

因为特征选择是针对每个instance的,和前面所讲的一张image的loss计算有略微不同,classification loss和regression loss都是对effective box区域进行平均的,具体公式如下:

KCF目标检测_KCF目标检测_38

其中

KCF目标检测_像素点_39

分别是classification和regression loss,上标

KCF目标检测_KCF目标检测_40

表示instance;

KCF目标检测_像素点_41

表示effective box内像素点个数;

KCF目标检测_KCF目标检测_42

分别表示基于像素点的focal loss和IoU loss,并且注意求和范围,只计入effective box内的点。对每一层计算如上loss后,最小值对应的特征层就是特征选择的结果:

KCF目标检测_sed_43

训练时,每一特征层都是根据分配给它的instance进行更新的,可以理解为,该层特征最适合这些instance,通过训练让其继续向这些instance的方向倾斜。测试时无需进行特征选择,因为训练后的网络一定会给适合该层的instance很高的confidence score,自然就会作为预测结果输出。

Joint Inference and Training

anchor-free branch非常简单,很容易插入到网络里。因此本文将anchor-free branch插入了RetinaNet,共同训练和测试以观察结果。就是下面这张见过的图:

KCF目标检测_特征选择_44

测试时,anchor-free branch其实只是加了两个卷积层,前向计算和之前一样简单。在anchor-free branch中,每一特征层只取threshold=0.05过滤后得分前1000的box location。这些box和anchor-based branch中的box合并,再用threshold=0.5的NMS方法留下最后的box。

训练时,整个网络的loss由两部分构成:

KCF目标检测_sed_45


KCF目标检测_特征选择_46

分别为anchor-based的loss,anchor-free中的classification loss和regression loss。

Ablation Experiments

1. Anchor-free branch:

KCF目标检测_KCF目标检测_47

anchor-free 方法中,如果仍使用人为特征选择的方法,效果是下降的;但是结合anchor-based branch后,尽管还是人为选择特征,效果也是改善很多的,说明anchor-free branch可以帮助anchor-based branch学习难的instance。

2. Online feature selection:

上表中,在仅使用anchor-free branch时,两种特征选择方法间是有差异的,online feature selection明显有提升准确率;在anchor-based和anchor-free共同作用时,该特征选择方法下的准确度提升了更多(可以理解为两个branch中都有它的作用,自然比单个branch的作用大)。

3. FSAF Module:

以上两部分结合起来就是FSAF Module,效果如下表:

KCF目标检测_特征选择_48

下图显示了FSAF Module究竟对哪些instance有改善作用:

KCF目标检测_KCF目标检测_49

可以看到检测出的都是很小或者细长形状的物体,个人理解为:一方面小物体受人工特征选择的影响比较大,如果被指定到高特征层很可能会漏检,另一方面细长的物体不符合预设anchor的形状,因此很难检测。