SPP-Net:
一张图总结:
改进:
- 整张图输入CNN得到特征图
- 特征图不需要缩放,经过金字塔池化(SPP)后直接输入到分类和回归模型中
RoI Pooling:
优缺点:
优点:
- 解决了rcnn的推理慢的问题
缺点:
- 在训练的时候不能更新SPP层的参数
- 继承了RCNN的问题,训练较慢,需要大量的硬盘空间
相比于RCNN的改进:
- Fast RCNN将原始图片输入卷积网络中得到特征图,再使用建议框对特征图提取特征框,大大减少了计算量
- 建议框大小不一,通过ROI池化层将特征框转化为相同大小;
- Fast RCNN里没有SVM分类器和回归器了,分类和预测框的位置通过卷积神经网络输出
- 为了提高计算速度,网络最后使用SVD代替全连接层
算法流程:
- 输入一张图片,通过Selective Search得到候选建议框;
- 将原始图片输入到CNN中得到特征图,并且根据建议框,得到候选框在特征图中对应的位置(ROI);
- 使用ROI pooling(single-level SPP)将ROI转化成固定大小的 H × W H\times{W} H×W的特征图;
- 将特征图拉长成一个向量(ROI特征向量),通过一个全连接层;
- 然后经过两个输出,一个是softmax目标分类,另一个是边界框回归(bbox regressor)
5.1 目标分类:经过softmax函数得到21个类别的得分(概率);
5.2 边界框回归:输出 21 × 4 = 84 21\times{4}=84 21×4=84个神经元,21个类别,每个类别4个参数; - 使用NMS得到少数候选框,选择概率最大的类,作为标注类
PS:使用SVD来进行全连接层计算加速 其实可以认为是将一个大的全连接层换成两个小的全连接层
一张图总结:
详细训练过程:
损失函数:
- fast RCNN的损失函数是一个多任务损失函数,是目标分类损失和边界框损失的加权和:
L ( p , u , t u , v ) = L c l s ( p , u ) + λ [ u ≥ 1 ] L l o c ( t u , v ) L\left(p, u, t^{u}, v\right)=L_{\mathrm{cls}}(p, u)+\lambda[u \geq 1] L_{\mathrm{loc}}\left(t^{u}, v\right) L(p,u,tu,v)=Lcls(p,u)+λ[u≥1]Lloc(tu,v)
符号解释:- u u u:每个ROI在 K + 1 K+1 K+1 个类别上的真值
- p = ( p 0 , p 1 , . . . p K ) p=(p_0, p_1,...p_K) p=(p0,p1,...pK):每个RoI在 K + 1 K+1 K+1 个类别上的离散概率分布
- v v v:真值边界框的回归参数
- t u = ( t x u , t y u , t w u , t h u ) t^u = (t^u_x, t^u_y, t^u_w, t^u_h) tu=(txu,tyu,twu,thu):预测边界框的回归参数
- λ [ u ≥ 1 ] \lambda[u \geq 1] λ[u≥1] 判决函数:
λ [ u > = 1 ] = { 1 if u ≥ 1 0 otherwise \lambda[u>=1]=\left\{\begin{array}{ll} 1 & \text { if } u \geq 1 \\ 0 & \text { otherwise } \end{array}\right. λ[u>=1]={10 if u≥1 otherwise
-
目标分类损失:
L c l s ( p , u ) = − l o g p u L_{cls}(p,u) = -log p_u Lcls(p,u)=−logpu -
边界框回归损失:
L b o x ( t u , v ) = ∑ i ∈ { x , y , w , h } L 1 s m o o t h ( t i u − v i ) \mathcal{L}_{\mathrm{box}}\left(t^{u}, v\right)=\sum_{i \in\{x, y, w, h\}} L_{1}^{\mathrm{smooth}}\left(t_{i}^{u}-v_{i}\right) Lbox(tu,v)=i∈{x,y,w,h}∑L1smooth(tiu−vi)
L 1 s m o o t h ( x ) = { 0.5 x 2 if ∣ x ∣ < 1 ∣ x ∣ − 0.5 otherwise L_{1}^{\mathrm{smooth}}(x)=\left\{\begin{array}{ll} 0.5 x^{2} & \text { if }|x|<1 \\ |x|-0.5 & \text { otherwise } \end{array}\right. L1smooth(x)={0.5x2∣x∣−0.5 if ∣x∣<1 otherwise
- 回归参数:
相对平移量: ( t x u , t y u ) (t^u_x, t^u_y) (txu,tyu):
t x u = ( G x − P x ) / P w t^u_x = (G_x - P_x)/P_w txu=(Gx−Px)/Pw
t y u = ( G y − P y ) / P h t^u_y = (G_y - P_y)/P_h tyu=(Gy−Py)/Ph
尺寸缩放量: t w u , t h u t^u_w, t^u_h twu,thu
t w u = l o g ( G w / P w ) t^u_w = log(G_w/P_w) twu=log(Gw/Pw)
t h u = l o g ( G h / P h ) t^u_h = log(G_h/P_h) thu=log(Gh/Ph)
ROI如何进行反向求导:
普通max pooling求导:
前向传播: 即把窗口内的最大值传递给下一层;
反向传播: 把梯度值传递给前一层窗口内最大值对应的 ID(max id)
ROI max pooling求导:
设
x
i
x_i
xi 为输入层的节点,
y
r
j
y_{rj}
yrj为第
r
r
r个候选区域的第
j
j
j个输出节点。
一个输入节点可能和多个输出节点相关连,所以损失函数
L
L
L对输入节点
x
i
x_i
xi的梯度为
L
L
L对各个有可能的RoI的输出节点
y
r
j
y_{rj}
yrj梯度的累加:
∂
L
∂
x
i
=
∑
r
∑
j
[
i
=
i
∗
(
r
,
j
)
]
∂
L
∂
y
r
j
\frac{\partial L}{\partial x_{i}}=\sum_{r} \sum_{j}\left[i=i^{*}(r, j)\right] \frac{\partial L}{\partial y_{r j}}
∂xi∂L=r∑j∑[i=i∗(r,j)]∂yrj∂L
判决函数 [ i = i ∗ ( r , j ) ] [i=i^*(r,j)] [i=i∗(r,j)]:表示 i i i节点是否被第 r r r个RoI的第 j j j个输出节点选为最大值输出