Notes for "Object detection via a multi-region & semantic segmentation-aware CNN model"

paper链接

我觉得是一个挺有意思的paper,整体pipeline还是proposals –> feature extraction –> classification –> post processing。

那么跟RCNN有啥区别?大体有两点:1) 不同的feature,作者加入了multi-region features以及semantic segmentation-aware features,2)不同的后处理过程,作者加入了迭代式定位以及bbox voting的方式。这个方法在PASCAL VOC2007的mAP是74.9%(RCNN是66%),在VOC2012是70.7%(RCNN是63%),相当大的提升啊。

下面就从feature extraction跟post processing来讲。

Features

旨在找到更多具有判别性的特征。

Multi-Region CNN features

对物体不同区域进行建模,得到具有更丰富表现性的特征。感觉就有点DPM的感觉了(不过是手动指定parts)。作者使用的区域有以下几种:

  1. Original candidate box (a): 这个就是proposal产生的区域了,用来得到物体整体的外观信息。
  2. Half boxes (b/c/d/e): 把proposal按上下左右切半得到的区域。用来只学习一半物体的特征,可以用来处理遮挡情况。
  3. Central Regions (f/g): 这部分的regions是用来学习物体中间部分的特征。
  4. Border Regions (h/i): 这部分regions是用来学习物体边缘的特征,而且是joint来学。这部分特征对不精确定位的proposal的边缘特别敏感,因为不精确定位,比如过小,会导致丢失了边缘的信息。不过话说回来,这跟Half boxes不是有些矛盾么?
  5. Contextual Region (j): 这种region是用来学习物体周围的信息。

最外围黄色的框表示实际上截取出来的region,上面的regions有些是Rectangular rings(矩形圈): g/h/i/j,在这些矩形圈里面,内圈的信息是我们不想要的,所以实际上在截取regions的时候,要简单做个后处理,就是对内圈的信息全部置为0。

这时候很多人就会想着把regions截取出来直接扔到CNN里面训练就好了,但是这会使得预算量比RCNN多了很多,速度会超级超级慢。所以作者在截取regions出来之后并不是直接用这些regions来训练,而是用它们在全图的feature maps上对应的位置截取相应的regions来训练(这里有讲)。这种方式有几个好处是:1) 节省计算,2) 减少参数,能起到正则化的作用,3) 能一起finetune,互相约束,我在做ICCV的时候也使用了这样的想法,果然在CNN里面大家的想法都是类似的,理论性不强,局限性很强,比的就是谁先做出来了,谁的机器多,谁的数据多。

那么就得出了下面的网络结构:

网络就可以分为两部分:activation maps module和region adaptation modules,region adaptation modules用了hekaiming的spatial pooling layer,能够防止了RCNN里面的强制变形,也能在一起程度上处理multi-scale(后面有时间会写一个RCNN/SPP-NET/Fast RCNN的对比)。

网络用的是VGG,在训练的时候,所有convolution layers的参数都是固定的,每个region modules各自finetune所有的全链接层。finetune方法跟各家都类似了,把1000类的softmax换成N+1类的,N是正样本的类别数,1是背景。proposal跟groundtruth的overlap大于0.5的认为是正样本,负样本的overlap在[0.1, 0.5),不过为何是至少要有0.1的overlap呢?

Semantic Segmentation-Aware CNN features

Motivation是分割跟检测相关性很强,是啊,我们NIPS的工作也这么想。这个CNN加了个Aware,顿时间觉得好高大上,名字很重要。

网络结构如下:

同样的,网络也分成了两部分:

  • Activation Maps Module: 就是一个FCN,不一样的地方是他们加入了降维:先在VGG上finetune,然后把fc7从4096个channels改为512,然后再finetune一次。label的设置见图,作者为了不引入额外的anntation,他把ground truth bbox里面的像素全部标记为前景,其它的为背景。训练的时候每个类单独训练二元分类器,这样就会产生跟类别数量一样的分割图,这种做法由它设置label的方式决定的,因为物体会存在互相遮挡的情况(不同bounding box有可能存在overlap),一个proposa可能会覆盖多个物体,所以存在某个像素点可以同属于不同的类别,也就是说不能单纯的按照bounding box去设置label(这种label是指0, 1, 2, 3, 4, .., N,N表示类别数),然后只用一个softmax去做分类。举个例子讲,一个像素点属于A类跟属于B类并不是互斥的,这种情况下用2个二元分类器会比用一个有3个label的softmax更靠谱。
  • Region Adaptation Module: 这个的输入是摘掉了分类层的FCN。然后训练方式就跟每个Multi-region module一样了。但是前面提到Segmentation Maps是用N个二元分类器干的,应该怎么把Activation Maps传给Region Adaptation Module?文章中没提到,我猜想是把N个二元分类器的activation maps拼接在一起然后喂到这个module里面。

最终把这两个features拼在一起就组成了下面的网络:

Object Localization

大体分为两个步骤:迭代定位(Iterative Localization)跟投票(Bounding box voting)。

Iterative Localization

在给proposals打分跟对proposals的bbox进行refine这两步进行迭代。给定proposals,对proposals进行打分,根据分数对proposals进行筛选,对剩下的proposals进行打分并筛选,如此循环,直到收敛。一开始,proposals是由selective search产生,作者说迭代两次就够了。

Bounding box voting

是一个普通nms的改进版本,普通的nms是找两个overlap大于一定阈值的proposals,然后把分数低的剔除掉,而作者使用的方法是:假设有proposals的集合为$P = \{p_1, p_2, …, p_n\}$,先找出分数最大的proposal $p_r$,然后找出跟这个proposal的overlap大于一定阈值的所有proposals $P_c$出来(假设$P_c$为空,就选次大的$p_r$,重复上面步骤),对他们进行位置信息加权平均,权值是他们的分数(要做归一化),然后得到新的proposal $p_new$,把$p_r \cap P_c$从$P$里面删掉,把$p_new$加到$P$里面,继续上面的操作指导无法合并。

示意图如下:

Results

作者对每个region adaptation module都做了单独的实验,单独的话效果都很一般般。

合起来之后,并且加上作者提到的Localization Scheme之后,效果就飞起来了:

PASCAL VOC 2007:

PASCAL VOC 2012:

pipeline里面的每个component是分离的,每一个component的性能都会影响整体的性能,为什么没人把整个pipeline(至少我目前还没看过)?当然这有一个好处是,每个component可以单独调参数。

坚持原创技术分享,您的支持将鼓励我继续创作!