RCNN是最早将ConvNet引入目标检测邻域的算法,和图像分类算法不同,目标检测领域的主要任务不仅要图像进行分类还要图像中物体存在的具体位置进行框选,更正规的说法是,对于一张输入图片,合格的目标检测算法要能够框选出图中有效目标(训练时设置的类别)所在的区域, 并对其进行正确分类。
RCNN作为目标检测算法,必然需要完成框选和分类两个任务,前者通过selective search和神经网络位置精修得到,后者通过Convnet特征提取和SVM得到。其训练时的具体流程如下:
显而易见RCNN存在着许多的问题,比如RCNN的训练和测试非常耗费时间,因为对于一张图片中的每个候选区域都需要计算一次特征图样,而一张图片上通常有着2k个候选区域,这为计算带来了很大的困难。
为了解决这个问题, 何恺铭提出了SPPNet,SPPNet使用原始的整张图片作为输入得到唯一的一张特征图样,原图中不同的候选区域经网络输出实际上是该特征图样的一部分,可通过坐标映射得到。SPPNet与RCNN的对比如下:
接踵而来的问题是候选区域的size各异的限制,在RCNN中这一问题是通过对候选区域变换得到,而在SPPNet是由 spatial pyramid pooling解决。卷积神经网络中对输入同尺寸的限制并不来自于卷积层而是来自于全连接层,卷积层对于输入是一视同仁的,而全连接层要求每个输入大小必须和层权重匹配,因此SPPNet中将原始网络中最后一个池化层改进成了空间金字塔池化层,它可以将任意尺寸的特征图转化为固定大小的特征向量2。从而不同尺寸的候选区域的不同大小特征图样切片也可以转化成相同大小的特征向量以进行后续判决。其他方面,SPPNet则没对RCNN做出更多的改进。
此外RCNN的整个流程是分离的三个部分,包括训练ConvNet进行特征提取、训练SVM进行区域分类、训练bounding-box回归器来微调候选区域,整体是分立的,无法以端到端的方式来训练。Fast RCNN应运而生,在SPPNet的基础上将三个部件合为一体,同时完成特征提取、区域分类、候选区域微调三个目标。其整体框架如下:
其输入和SPPNet一样是单张图片和其上候选区域的位置,通过Roi projection得到各个候选区域经网络映射到特征图样上的区域,也就是相应区域自身的特征图样。不同尺寸的特征图样经Roi pooling layer得到定长的特征向量,这里的ROI pooling layer是空间经金字塔池化层的简化版本,空间金字塔使用了不同大小的网格以获得不同尺度下的特征,而Roi pooling layer则只使用了一种网格划分方式(e.g. 7×7)。获得了特征向量后,再分别通过两个全连接层进行区域分类和微调参数回归,对于每个输入的roi,训练的损失函数为:
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)+\lambda[u\geq 1]L_{loc}(t^u,v) L(p,u,tu,v)=Lcls(p,u)+λ[u≥1]Lloc(tu,v)
其中u为区域所属的类别,p为分类头输出概率, t u t^u tu为回归头输出的平移缩放系数,v为系数的真实值。 L { c l s } L_{cls} L{cls}为交叉损失熵函数, L l o c L_{loc} Lloc为smooth L1误差。
此外作者还使用了其他的一些trick,作者认为SPPnet不更新空间金字塔池化层前的Conv层权重,而仅仅对其后的全连接层进行finetune是因为同一批次的输入包含了来自许多不同图片的ROI,而ROI可能包含了原图很大一块感受野,在反向传播时每计算一次ROI都需要对这些区域进行计算,导致计算量很大。因此作者在训练时,同一批次只包含了2张图片,每张图片取128个ROI,在前向和反向传播时同一张图片的ROI资源是可以共享的,也就加快了计算速度。最重要的是,作者通过实验证明了对CONV层进行参数更新是很有必要的,尤其是对于参数量大的ConvNet,可以较好的提升MAP,但也不是所有的CONV层进行训练都有必要,较前几层参数细调的意义不大。
为了更进一步的加快计算速度,作者使用了truncated SVD对全连接层进行优化,也就是将原本的全连接权重矩阵 W W W使用SVD分解为 U , Σ t V T U,\Sigma_t V^T U,ΣtVT两个部分3,当输入为大小为v,输出大小为u时,计算量由uv变成了t(u+v),如过t
总体而言,Fast RCNN的主要共享就是快和准确,实现了检测网络的端到端训练;使用truncated SVD加快运算速度;证明了conv层参数更新的有效性。
Fast RCNN虽然将候选区域提取完成后所有步骤的一体化,但初始候选区域的提取仍然采用的是selective search,而SS方法非常的耗时,是目标检测实时化的一个重要阻碍。因此作者提出了Region Proposal Network来利用卷积神经网络框选候选区域,同时将RPN的前端网络和检测网络Fast RCNN进行权重共享以进一步的提升测试阶段网络的计算速率,由此诞生了Faster RCNN。
RPN利用深度卷积神经网络来计算初始的候选区域,其输入为一张图片,输出为图上许多矩形区域的坐标和区域内包含有效物体的概率。更具体的的说,RPN包含了前端共享的特征提取部分(和Fast RCNN共享)和特有的区域计算部分,区域计算部分的输入为输入图片的特征图样,其结构图如下:
首先RPN假定了输入特征图样上的每个位置都可在原图上对应着 k k k个候选区域,也就是通过逆下采样我们可以得到特征图样上某点在原图中的位置,以其为中心画矩形框即可得到候选区域。同时为了体现出多尺度特性,作者使用了不同大小,不同比例的矩形框,这样即使同一物体在图中发生了形变或是缩放,仍然有候选区域能够合适的框住它。这 k k k个候选区域被称作锚点,通过scale参数和aspect ratio参数所确定,前者定义了最长边的像素;后者定义了长宽比,中心坐标和长宽四个参数足以确定一个矩形。如下图就给出了特征图样中三个点在原图中所能框选出的不同scale参数的候选区域4。
特征图样上得到了初始的候选区域并不够,我们还要判断这些框选区域是否合理,偏差集合。因此作者在输入特征图样上进行3*3的卷积得到特征向量,此时特征向量的每个元素都可认为是一个矩形框中心周边区域的特征表征。再将这一特征向量分别进行 2 k C 1 F 2kC\ 1F 2kC 1F卷积(分类头,2k维1*1)和 4 k C 1 F 4kC\ 1F 4kC 1F卷积(回归头,4k维1*1),分类头通过sigmoid函数输出以对应位置为中心的k个矩形框中有/没有有效目标的概率,回归头则输出以对应位置为中心的k个矩形框位置微调所需要的4个参数。
通过上述步骤,我们就得到了特征图样中每个位置所对应的k个候选区域及其上有目标物体的概率(只是是否有物体,进一步的分类仍待检测网络输出)。对于这些候选区域,作者更进一步的通过去除边界部分的outliers(测试时不删除而是clip)、使用NMS去交叠的方式再筛选掉一部分以加快网络的收敛。RPN网络的损失如下:
L ( p i , t i ) = 1 N c l s ∑ i L c l s ( p i , p i ∗ ) + λ 1 N r e g ∑ i p i ∗ L r e g ( t i , t i ∗ ) L({p_i},t_i)=\frac{1}{N_{cls}}\sum_iL_{cls}(p_i,p_i^*)+\lambda\frac{1}{N_{reg}}\sum_i p_i^*L_{reg}(t_i,t_i^*) L(pi,ti)=Ncls1i∑Lcls(pi,pi∗)+λNreg1i∑pi∗Lreg(ti,ti∗)
前者为分类头的交叉熵函数,后者为回归头的smooth L1 loss和Fast RCNN中微调候选区域所使用的一样。
Faster RCNN就是将RPN和Fast RCNN拼接在一起,共享了前端的特征提取部分,为了训练这两个网络,作者提出了三种训练方式,分别是交替的训练RPN和Fast RCNN、一体化训练但是不考虑坐标微调的反向传播、一体化训练考虑坐标微调的反向传播,最终采用的是第一种模式。具体可以分为四步:
Faster RCNN提出的目的就是快,利用RPN代替原来的SS,同时RPN中的多尺度框选部分可以看出是沿用了SPPnet中的ROI projection的思路,消融实验也证明了多尺度的有效性。结果对比上来看,使用ZFnet作为骨干网络的情况下,感觉RPN相较于SS并没有特别大的优势,使用VGG做骨干网络则有较大的提升,可能主要的优势还是在于快。(代码见5)
RCNN- 将CNN引入目标检测的开山之作 ↩︎
【目标检测】SPPnet论文详解(Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition) ↩︎
【目标检测】Fast R-CNN论文详解(Fast R-CNN) ↩︎
RPN:Region Proposal Networks (区域候选网络) ↩︎
simple-faster-rcnn-pytorch
↩︎