理解目标检测算法之R-FCN
在上一篇博文中,笔者写到了对Roi Pooling和Roi Align的区别的理解,当时不禁觉得Mask rcnn引入了Roi Align操作,进一步优化了目标检测任务的定位精度,然后在想,如果想继续优化,又有什么可供优化的方向呢,百思不得其解。后来又一次跟同事交流这个问题,然后无意间了解到凯明大神后面又联合提出了R-FCN。然后笔者查阅了一些资料和原论文,有了自己的一些理解和体会,故这里记录下来,也希望对大家能有所帮助。
1 动机
R-FCN,全称为“Region-based fully convolutional network”,该文章的发表时间可以参见下图,
作为Two-stage的目标检测算法,它是对Faster R-CNN所做的优化。大家可能会比较好奇,Faster R-CNN是凯明大神提出来的,检测精度已经很好了,还有什么可选的优化点呢,R-FCN关注点并不是检测精度,而是检测速度。可以参见下面的图来理解这个问题,
由图可见,Faster RCNN对每一个Roi区域,分别经过一个subnetwork,这个subnetwork包含了一次global average pool操作,两次FC操作。因为每一个Roi的计算并没有共享,所以这种网络结构是比较耗时的。
为了解决这个问题,比较直接的想法是,把这两层FC操作放到Roi pooling前面,这样的话,每一个Roi区域只需要经过global average pool操作即可,节约了计算量。但是,这样做带来了另外一个问题,由于global average pool操作得到的特征缺失了很多的空间域信息,如果直接用来回归坐标会导致定位精度不准。为了保留更多的空间域位置信息,R-FCN中提出了“position-sensitive score map”的概念。
2 R-FCN网络结构
R-FCN的网络结构如下图,同Faster RCNN比起来,它有2点不同,
(1)Shared convolutional subnetwork不同。Faster RCNN是把RPN得到的RoI直接映射到Resnet101的最后一个卷积层(2048个channels),而R-FCN将Resnet101的最后一个卷积层映射到具有 个channels的特征层,作者将该特征层称之为"position-sensitive score maps",然后把RoI映射到该特征层;
(2)RoI-wise subnetwork不同。Faster RCNN的subnetwork经过了全连接层做特征组合,然后执行分类和坐标回归的双任务,R-FCN基于pool和vote操作后得到的特征向量,执行分类任务。
具体的参数对比如下表,
下面分别解释这两点,
2.1 position-sensitive score maps
“position-sensitive score maps”,翻译过来为“位置敏感打分图”,从名字上就可以看出,该层feature maps是对位置信息具有敏感性的,有助于后面的定位任务。那么如何得到位置敏感的feature maps呢,可以参见下图,
若一个RoI的尺寸为,为了对该RoI的信息进行编码,作者将其划分成大小为的bins,因此每个bin的尺寸为,图中3x3 的网格立方体表示编码后的RoI投影到该位置敏感feature maps上的位置,不同颜色代表不同位置的信息,从黄色到浅蓝色依次为top-left、top-center、bottom-right。假设我们想得到当前RoI预测为“人”的概率,要先从top-left、、、bottom-right中分别挑选出预测为人的不同部位的概率值,然后将这些概率值拼接成的feature map,若总共有C个类别,则得到的热力图维度为 。
2.2 RoI-wise subnetwork
关于分类任务,对于每一个RoI区域,得到了热力图尺寸为,对于每一个channel,使用average pooling操作得到总的打分,从而得到了维度为
的特征向量,然后使用softmax函数对特征值进行归一化操作,从而得到当前RoI属于所有类别的scores。
关于回归任务,同上,对于每一个RoI区域,得到了热力图,区别在于该热力图的尺寸为。
3 R-FCN网络存在的问题
网络中的"position-sensitive score maps"的维度较大,比如当k=7,类别数为80(coco数据集)时,该打分图的channels维度为,所以该卷积层占用了较多的参数和内存,导致推理速度变慢,然后,有学者就在想,能否减少该打分图的channels维度呢,于是催生了另一篇目标检测文章“Light-Head R-CNN: In Defense of Two-Stage Object Detector”,感兴趣的读者可以参见下一篇博文。
参考资料: