R-FCN论文名称:R-FCN: Object Detection via Region-based Fully Convolutional Networks
R-FCN论文链接:https://arxiv.org/abs/1605.06409
文章提出了一个基于区域的全卷积网络,用于准确高效的目标检测。与之前的区域检测算法,例如Fast/
Faster R-CNN相比,之前的目标检测算法都分为两部分:(1)由共享参数的全卷积网络;(2)以及RoI Pooling层之后的带有两个支路的全连接网络,即RoI wise子网络。而RoI wise子网络不共享参数,对于每一个区域都需要重复计算,会花费大量的时间。因此提出了全卷积网络R-FCN,可以共享参数。
R-FCN算法的优点:
将RoI Pooling层插入到两个卷积子网络之间,是为了打破translation invariance。
由于R-FCN神经网络是全卷积神经网络,因此可采用最新的ResNet神经网络结构,随着网络层数的增加,检测准确度会随之增加,同时由于共享参数,检测速度也得到大幅度提高。使用101层ResNet神经网络结构在PASCAL VOC2007数据集上进行实验,可得到83.6% mAP的准确度,同时每张图片的测试速度为170ms,比Faster R-CNN快2.5~20倍。
由于之前使用的神经网络结构都是由后接空间池化层的卷积层与全连接层组成的,如AlexNet,,VGG-Nets,都是由两个子网络构成的。但随着ResNet,GoogLeNets的提出,我们可以(1)使用全卷积层结构;(2)同时(最后层)空间池化层被RoI Pooling层替代。
R-CNN | Faster R-CNN | R-FCN | |
---|---|---|---|
共享卷积子网络的深度 | 0 | 91 | 101 |
RoI-wise子网络的深度 | 101 | 10 | 0 |
position-sensitive score maps:
使用R-FCN算法,使用共享参数的全卷积神经网络,在FCN中包含平移变换性,建造了一个position-sensitive score maps,通过使用一系列的特色卷积层作为FCN的输出。每一个打分映射对于每一个相对空间位置(如:目标的左侧)编码位置信息。在FCN的顶部,加入了一个position-sensitive RoI Pooling层从这些映射中领导信息,没有卷积层和全连接层跟着,全部结构都是端到端的,所有的层都是共享参数的卷积层,目标检测要求编码空间信息。
使用了RPN的候选区域提取方法,通过共享的卷积层得到特征映射,然后经过一个全卷积的结构得到候选区域,与之前的Faster RCNN相同。之前的卷积层均相同,得到特征映射后,最后接的一层卷积层采用kk(C+1)-d的卷积核,会生成kk个position-sensitive score maps,C代表目标类别数,1代表背景,kk代表k*k spatial grid,每一层都与位置相关。从上至下,从左至右的顺序排列。
we divide each RoI rectangle into k×k bins by a regular grid.
For an RoI rectangleofasize w×h,abinisofasize≈ (w/k) × (h/k) .
the last convolutional layer is constructed to produce k2 score maps for each category.
Inside the (i,j)-th bin (0 ≤ i,j ≤ k−1), we define a position-sensitive RoI pooling operation that pools only over the (i,j)-th score map:
Here rc(i,j) is the pooled response in the (i,j)-th bin for the c-th category,
z(i,j,c) is one score map out of the k2(C + 1) score maps,
(x0,y0) denotes the top-left corner of an RoI,
n is the number of pixels in the bin,
and Θ denotes all learnable parameters of the network.
kk(C+1)-d卷积层用于分类,对于每一个RoI生成(C+1)-d的向量,Position-sensitive RoI pooling相当于平均卷积,最后用softmax层对C个类别进行分类。
4kk-d卷积层用于边界框回归,对于每一个RoI生成4kk-d的向量,然后通过平均投票得到一个4-d的向量,4个参数代表边界框的4个值,t = (tx, ty, tw, th)。对于类别数确定的目标检测,会输出4kkC-d层。
L ( s , t x , y , w , h ) = L c l s ( s c ∗ ) + λ [ c ∗ > 0 ] L r e g ( t , t ∗ ) . L(s, t_{x,y,w,h}) = L_{cls}(s_{c^*}) + \lambda[c^* > 0]L_{reg}(t, t^*). L(s,tx,y,w,h)=Lcls(sc∗)+λ[c∗>0]Lreg(t,t∗).
分类:使用交叉熵损失函数:
L c l s ( s c ∗ ) = − l o g ( s c ∗ ) . L_{cls}(s_{c^*}) = -log(s_{c^*}). Lcls(sc∗)=−log(sc∗).
定位:IoU > 0.5为正样本,IoU < 0.5为负样本。 λ = 1 \lambda = 1 λ=1
所有的可以学习的层都是卷积层,使用 Online Hard Example Mining (OHEM) ,几乎不会增加训练时间。假定每张图片有N个proposals,一个直接的方法是,我们计算所有N个proposals的损失。然后我们对所有ROI按照损失进行排序。然后挑选B个具有最高损失的ROI。
选用权重下降率为0.0005,momentum为0.9,输入是单一尺寸的图片(短边为600 pixel),每一张图片选取128个RoI用于反向传播,微调的学习率为0.001用于20k个mini-batch,然后0.0001用于10k个mini-batch,并且在RPN与R-FCN之间的四个步骤交替进行。之后使用阈值为0.3的非极大值抑值。