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