Fast-R-CNN论文解读

Fast-r-cnn是Ross在2015年发表的一篇论文,其网络全称为: Fast Region-based Convolutional Network method–用于目标检测的基于区域的快速卷积网络算法。
Fast-R-CNN论文解读_第1张图片

在于先前的网络R-CNN对比之下,其训练速度要快9倍,检测时间快出来213倍(R-CNN的检测时间GPU工作下为47s一张图片),同时在检测精度上也作了进一步的提升。
一、任务简介
在介绍中,作者提出目标检测任务相比分类来说更为复杂和困难,首先计算机要处理众多的候选目标区域(也就是proposals)、其次这些候选框只提供了检测目标的大概位置,也就是说他所框中的物体可能并不是物体的全部,或者框内有很多不属于物体的部分,这个时候还要对候选框进行位置修正,使其更加精确。
然后作者简单介绍了一下R-CNN网络和SPPnet,将这两个于Fast-RCNN网络经对比,来突出Fast-R-CNN的优势所在。
1、更高的检测质量
2、训练使用了单价段算法,损失函数使用多项损失
3、训练可以更新所有网络层参数
4、缓存特征不再需要磁盘存储(在R-CNN网络中训练一张图片需要非常大的磁盘存储空间)

二、网络整体架构
Fast-R-CNN论文解读_第2张图片
上图就是原论文给出的网络整体架构。该网络将整张图片作为输入,然后经过卷积层和最大池化层得到特征图,然后ROI池化层会从特征图上提取到适合尺寸的物体候选特征向量、然后将提取到的特征向量送进去两个全连接层后,将其作为同级输出送入两个全连接层,也就是图片右上角的两个FC(fully-connected layer),第一个链接softmax层输出,第二个输出四个真实的数字值来精细化对检测物体框的位置。简单点讲就是一个输出该框内的物体到底属于哪一类,另外的一个输出调整候选框的位置,让候选框可以更加准确的框住被测目标。
1、ROI pooling层
该层使用最大池化层来将特征图中感兴趣的区域提取出来成固定HxW的尺寸特征图,其尺寸H和W都是超参数,这一步人为决定该使用哪种大小的特征图。也就是说原图经过卷积和池化后变成了特征图,然后ROI负责在特征图中框选出来感兴趣的区域,并使用池化操作将其变为固定尺寸的新特征图, 每个特征图都包含一个含四个参数的元组----(r, c, h, w)。 r,c表示ROI区域左上角的坐标,h表示ROI区域的高, w表示宽。
其实在这一步就可以看作是目标检测的最终框的参数,左上角的点的坐标作为索引,然后指定长宽来形成一个矩形。
Fast-R-CNN论文解读_第3张图片
作者也提到了其实ROI层就相当于SPPnet里面的图像图像金字塔的特例,只不过其只含有一个层级而已。
2、网络模型
训练网络的主体采用在ImageNet上的预训练模型,然后在这上面进行修改。修改主要有三个过程:最后一个最大池化层被替换成ROIpooling层,这样做的目的是使其与后面的全连接层参数匹配;网络最后的全连接层和softmax层被拆分为平行的一个全链接层和softmax层(对于上面图片中的最后两个层),其中softmax层具有K+1个类别,K为类别总数,多出来的一个为背景标签;最后,该网络被修改为接受两个数据作为输入–用于训练的图片序列和图片上的ROI区域。
3、精细修正检测框
首先,作者说反向传播训练训练所有网络参数是非常重要的,然后解释了为什么SPPnet不能更新空间金字塔以后的权重参数—最根本的原因是在反向传播时,当训练样本来自不同图片时,SPP层的效率是非常低的。这个问题的来源是每个ROI都可能有很大的感受野,所以训练时网络输入会非常大,经常是整张图片。
于是作者提出了一种更为有效的训练方式,即训练时采用特征共享。具体的做法就是从N张图片中挑选出来R/N个ROI区域,然后在前向传播与反向传播时,同一张图片的ROI区域共享计算和内存(无需重复存储了)。

三、损失函数
损失函数在网络训练中非常重要,因为他为计算机提供了一个依靠指标,来使得计算机可以通过迭代调整参数来获取我们想要的输出结果。
在Fast-R-CNN中,损失函数由两项组成:
L ( p , u , t u , v ) = L c l s ( p , u ) + λ [ u ≥ 1 ] L l o c ( t u , v ) L(p, u, t^u, v)=L_{cls}(p,u)+λ[u≥1]L_{loc}(t^u,v) L(p,u,tu,v)=Lcls(p,u)+λ[u1]Lloc(tu,v)
其中第一项是预测类别与真实类别的交叉熵损失,多分类中其公式原型为为:
H = − ∑ i o i ∗ l o g ( o i ) H=-\sum_{i}^{}o_i^*log(o_i) H=ioilog(oi)
但是由于真是标签采用one-hot编码,因此除了当下类别为1,其余类别标签均为0.此时的交叉熵也就变成了论文中:
L c l s = − l o g ( p u ) L_{cls}=-log(p_u) Lcls=log(pu)
pu表示softmax输出当前类别的概率分数。
第二项为边界框回归损失函数,论文也说了t^u表示预测的一组边界框位置参数,u表示真实的边界框位置参数,其都包含一个含四个参数的元组–(x, y, h, w)。
其中:
L l o c ( t u , v ) = ∑ i ∈ { x , y , w , h } s m o o t h L 1 ( t i u − v i ) L_{loc}(t^u,v)=\sum_{i\in\{x,y,w,h\}}smooth_{{L_1}}(t_i^u-v_i) Lloc(tu,v)=i{x,y,w,h}smoothL1(tiuvi)
s m o o t h L 1 ( x ) = = { 0.5 x 2 , if |x| < 1 ∣ x ∣ − 0.5 , otherwise smooth_{{L_1}}(x)== \begin{cases} 0.5x^2,& \text{if |x| < 1} \\ |x|-0.5, & \text{otherwise} \end{cases} smoothL1(x)=={0.5x2,x0.5,if |x| < 1otherwise
λ是一个平衡系数,u是当下框内物体的标签,当u≥1时取值1,否则取值0.这里的意思也就是当下的框内物体的确是属于被检测物体时,λ等于1.否则λ等于0,此时这项的计算值将被丢弃。论文中作者阐述:对于只有背景图的ROI区域来说,λ等于0.此时这项计算值将被忽略。

最后再梳理一遍Fast-R-CNN的算法流程:
首先将整张图片作为输入,通过卷积层和池化层获得特征图
使用ROI pooling层获取ROIs
传入网络主体架构中,然后其输出将送去两个平行分支,先经过全连接层,然后一个通过softmax层输出分类,另外一个通过reg获得候选框的精细修正。
使用的损失函数由两部分组成
优化器使用分层采样的小批量随机梯度下降法 (stochastic gradient descent (SGD) mini batches)

你可能感兴趣的:(深度学习论文研读,cnn,r语言,深度学习)