论文出处:http://arxiv.org/abs/1505.01749
写在前面
今天连看了Fast RCNN和这一篇,一开始以为这篇会是Fast RCNN的加强版。看了之后发现不是,这篇提出的框架更像是SPP-Net的加强版,因为这篇并没有实现joint training,不同的步骤还是分开来跑的。不禁让人想,如果能够结合这篇和Fast RCNN的所有技巧,VOC07的mAP会不会上80%了啊。。Detection进步确实太快了。
闲话少说,下面进入正题。:)
motivation
对于某个region proposal来说,如何抽取比较好的特征?是否需要context辅助?是否需要考虑遮挡问题?
上述就是作者的motivation,如Figure 1,子图1的羊需要context,子图2的船不要context,子图3的车需要考虑遮挡问题。
所以该paper的核心研究内容是,如何更好地localize一个object,并抽取好的特征。
作者做了三件事:
- 提出一个multi-region CNN 来增强特征
- 提出一个semantic segmentation-aware CNN再进一步增强特征
- 提出一个CNN-based regression方法,另外还提出2个tricks来refine最后的定位。
下面分开一点一点说。
Multi-region CNN
Figure 2所示便是Multi-region CNN(简称为MR-CNN)在single scale下的给某个object proposal提取特征的过程,用AlexNet举例,提取一个proposal的步骤是
- 用前5个卷积层提取到全图的在conv5时候的feature map
- 对于某个object proposal,将观察范围做一定的形变和修改得到不同的region,比如图中出来4个不同的region。
- 将region投影到conv5 feature map上,crop出来对应的区域,然后用一个单层的SPP layer下采样到同样的大小
- 然后各自经过两个全连接层进一步提取特征
- 最后所有特征连在一起得到一个长特征。
可以看出,跟SPP提取proposal特征的过程很像,多出来是第2步,也就是这里的主要贡献点。
作者一共提出了4种共10个region:
- 原始的region,就是原来的那个object proposal的位置,对应Figure的中a
- 截半,对应Figure3的b-e
- 中心区域,对应g和h
- 边界区域,对应i和j
作者认为这样multi region的好处有两个 - 不同的region是focus在不同的物体区域的,所以他们应该是互补的,能够增强特征的多样性
- 认为这个方法能够有效应对object proposal时候定位不准确的问题,并在6.2和6.3通过实验验证
Sematic segmentation-aware CNN
这里的motivation是通过segmentation的特征来辅助detection。然后这里训练segmention用的是很出名的FCN的流程了,不过这里不需要用segmentation的标注,而是用bbox就好了,简单粗暴地把bbox里面认为是前景,外面认为是背景即可(也就是如Figure 5的中间一列)。
就这样训练,出来的结果还不错。笔者并不惊讶,因为笔者也做过类似的实验^_^。虽然表面看似这样的标注很粗暴,很多像素都会错标,但是CNN的纠错能力是很强的,就是将那些标错的pixel都看成是噪声,CNN依然能够根据更多的标对的像素来学习出来一个还不错的模型(如Figure 5的右列)。
用上述的方法训练出来一个还不错的segmentation CNN后,摘到最后一层,也加到上面的MR-CNN上,进一步增强特征。如Figure 4所示。
Object localization
这一步,对应的是RCNN或者SPP-Net的最后一步,也就是得到结果之后,对位置重新进行一次regression,不过这里做了几点的改进:
- 使用CNN来训练regressor(在RCNN中是使用简单的函数来训练regressor的),具体来说跟Fast RCNN比较像啦,输出是4xC个值,其中C是类别个数,不过这里直接用L2 loss拟合完事。
- 迭代优化,跟DeepFace比较像,也就是,利用分类器打一个分,然后筛掉低分的,对于剩下的高分的proposal重新回归位置,之后根据这个重新回归的位置再利用分类器打个分,然后再回归一次位置。
- 投票机制,上述两步会在每个object附近都产生不少bbox,这里利用上附近的bbox进行投票打分,具体来说,取一个最高分的bbox,然后还有它附近跟他overlap超过0.5的bbox,然后最后的bbox位置是他们的加权平均(权值为overlap)。