CNN论文-RCNN/SPP-Net/Fast RCNN

R-CNN
直接看这篇:【目标检测】RCNN算法详解

SPP-Net论文详解
直接看这篇:SPP-Net论文详解

CNN论文-RCNN/SPP-Net/Fast RCNN_第1张图片

Fast R-CNN
I. Motivation
R-CNN的缺点
(1) 多阶段的训练流程(multi-stage pipeline),包括fine-tune卷积网络,训练SVM做分类,最后训练bounding-box regressors。
(2) 训练速度慢,占用空间大:对于每张图片的每个region proposal都需要分别提取特征,并把提取到的特征写入磁盘
(3)检测速度慢:理由同上
Fast R-CNN的解决方法:提出单阶段的训练流程,使用multi-task loss,让模型同时学习如何分类和精调bbox位置,实现端到端训练。

II. Architecture
1. Overview
   模型的输入有两个:整张图片和该图片的RoI proposals。先对整张图片提取特征,得到conv feature map,然后对每个proposal,用RoI pooling layer从特征图中提取出一个定长的特征向量,这些定长的特征向量被输入连续的几个FC layers,最终输入两个输出分支:一个用softmax来给出proposal的类别概率,一个就每个类别给出proposal的位置坐标。
   模型在ImageNet预训练网络(如VGG-net)的基础上做了改动:最后一个max pooling layer被RoI pooling layer取代,最后的FC层和softmax被换成两个输出分支。

CNN论文-RCNN/SPP-Net/Fast RCNN_第2张图片 CNN论文-RCNN/SPP-Net/Fast RCNN_第3张图片

2. RoI pooling layer (借鉴了SPPnet的spatial pyramid pooling layer)
   论文中的RoI指的是conv feature map中的一个矩形窗口,参数为(r, c, h, w),(r, c)为左上角坐标,(h, w)为窗口高度和宽度。假设输出尺寸为 H × W H \times W H×W,则原RoI会被划分成 H × W H \times W H×W个尺寸为 h / W × w / W h/W \times w/W h/W×w/W的子窗口,然后在每个子窗口上进行max-pooling。具体细节可以参考:RoI pooling
    RoI pooling layer的反向传播:对于roi max pooling,一个输入节点可能和多个输出节点相连。设 x i x_i xi为输入层的节点, y r j y_{rj} yrj为第r个候选区域的第j个输出节点。
∂ L ∂ x i = ∑ r ∑ j δ ( i , r , j ) ∂ L ∂ y r j \frac{\partial L}{\partial x_i}=\sum_r\sum_j\delta(i, r, j)\frac{\partial L}{\partial y_{rj}} xiL=rjδ(i,r,j)yrjL判决函数 δ ( i , r , j ) \delta(i, r, j) δ(i,r,j)表示i节点是否被候选区域r的第j个节点选为最大值输出。代价对于 x i x_i xi的梯度等于所有相关的后一层梯度之和。

III. Fine-tuning for detection
1. 参数初始化: 在ImageNet上训练1000类分类器。结果参数作为相应层的初始化参数。其余参数随机初始化。
2. batch设置/hierarchical sampling:在训练时,每一个mini-batch中首先加入N张完整图片,而后加入从N张图片中选取的R个候选框,每张图片选取R/N个候选框。这R个候选框可以复用N张图片前5个阶段的网络特征。
实际选择N=2, R=128。
3. Multi-task loss

CNN论文-RCNN/SPP-Net/Fast RCNN_第4张图片

loss_cls层评估分类代价。分类损失由真实分类 u u u对应的概率决定:
L c l s ( p , u ) = − l o g ( p u ) L_{cls}(p, u)=-log(p_u) Lcls(p,u)=log(pu)

loss_bbox评估检测框定位代价。比较回归边框的预测值 t u t^u tu和ground truth v v v的差别:
L l o c ( t u , v ) = ∑ i ∈ { x , y , w , h } smooth L 1 ( t i u − v i ) L_{loc}(t^u, v)=\sum_{i\in \{x,y,w,h\}} \text {smooth}_{L_1}(t_i^u-v_i) Lloc(tu,v)=i{x,y,w,h}smoothL1(tiuvi)

smooth L 1 ( x ) = { 0.5 x 2 i f   ∣ x ∣ < 1 ∣ x ∣ − 0.5 o t h e r w i s e \begin{aligned} \text{smooth}_{L_1}(x) = \begin{cases} 0.5x^2 & if\ |x|<1\\ |x|-0.5 & otherwise \end{cases} \\ \end{aligned} smoothL1(x)={0.5x2x0.5if x<1otherwise

(1) 回归边框参数 t t t v v v的求法是:(不带*的为预测值,带*的为真实值)
t x = ( x − x r o i ) / w r o i ,   t y = ( y − y r o i ) / h r o i t w = l o g ( w / w r o i ) ,   t h = l o g ( h / h r o i ) t x ∗ = ( x ∗ − x r o i ) / w r o i ,   t y ∗ = ( y ∗ − y r o i ) / h r o i t w ∗ = l o g ( w ∗ / w r o i ) ,   t h ∗ = l o g ( h ∗ / h r o i ) t_x=(x-x_{roi})/w_{roi},\ t_y=(y-y_{roi})/h_{roi}\\ t_w=log(w/w_{roi}),\ t_h=log(h/h_{roi})\\ t_x^*=(x^*-x_{roi})/w_{roi},\ t_y^*=(y^*-y_{roi})/h_{roi}\\ t_w^*=log(w^*/w_{roi}),\ t_h^*=log(h^*/h_{roi}) tx=(xxroi)/wroi, ty=(yyroi)/hroitw=log(w/wroi), th=log(h/hroi)tx=(xxroi)/wroi, ty=(yyroi)/hroitw=log(w/wroi), th=log(h/hroi)

(2) smooth L 1 \text {smooth}_{L_1} smoothL1的优点是对outlier不敏感

总代价为两者加权和,如果分类为背景则不考虑定位代价:
L t o t a l = { L c l s + λ L l o c if u is foreground L c l s if u is background \begin{aligned} L_{total} = \begin{cases} L_{cls} + \lambda L_{loc} &\text{if u is foreground}\\ L_{cls} & \text{if u is background} \end{cases} \\ \end{aligned} Ltotal={Lcls+λLlocLclsif u is foregroundif u is background

4.全连接层提速(Truncated SVD) 这部分直接看参考文章


IV.实验与结论 这部分直接看参考文章


参考:
【目标检测】Fast RCNN算法详解

注:RCNN/SPP-Net/Fast RCNN这三个模型都使用selective search来产生候选框

你可能感兴趣的:(深度学习,算法)