当前位置:   article > 正文

目标检测经典模型(二)--fast rcnn_用fast_r-cnn训练好的模型

用fast_r-cnn训练好的模型

SPP-Net:

一张图总结:

改进:

  1. 整张图输入CNN得到特征图
  2. 特征图不需要缩放,经过金字塔池化(SPP)后直接输入到分类和回归模型中

RoI Pooling:

在这里插入图片描述

优缺点:

优点:

  • 解决了rcnn的推理慢的问题

缺点:

  • 在训练的时候不能更新SPP层的参数
  • 继承了RCNN的问题,训练较慢,需要大量的硬盘空间

相比于RCNN的改进:

  • Fast RCNN将原始图片输入卷积网络中得到特征图,再使用建议框对特征图提取特征框,大大减少了计算量
  • 建议框大小不一,通过ROI池化层将特征框转化为相同大小;
  • Fast RCNN里没有SVM分类器和回归器了,分类和预测框的位置通过卷积神经网络输出
  • 为了提高计算速度,网络最后使用SVD代替全连接层

算法流程:

  1. 输入一张图片,通过Selective Search得到候选建议框;
  2. 将原始图片输入到CNN中得到特征图,并且根据建议框,得到候选框在特征图中对应的位置(ROI);
  3. 使用ROI pooling(single-level SPP)将ROI转化成固定大小的 H × W H\times{W} H×W的特征图;
  4. 将特征图拉长成一个向量(ROI特征向量),通过一个全连接层;
  5. 然后经过两个输出,一个是softmax目标分类,另一个是边界框回归(bbox regressor)
    5.1 目标分类:经过softmax函数得到21个类别的得分(概率);
    5.2 边界框回归:输出 21 × 4 = 84 21\times{4}=84 21×4=84个神经元,21个类别,每个类别4个参数;
  6. 使用NMS得到少数候选框,选择概率最大的类,作为标注类

PS:使用SVD来进行全连接层计算加速 其实可以认为是将一个大的全连接层换成两个小的全连接层

一张图总结:

在这里插入图片描述

详细训练过程:

损失函数:

  1. 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)+λ[u1]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] λ[u1] 判决函数:

λ [ u > = 1 ] = { 1  if  u ≥ 1 0  otherwise  \lambda[u>=1]=\left\{

1 if u10 otherwise 
\right. λ[u>=1]={10 if u1 otherwise 

  1. 目标分类损失
    L c l s ( p , u ) = − l o g p u L_{cls}(p,u) = -log p_u Lcls(p,u)=logpu

  2. 边界框回归损失:
    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(tiuvi)

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\{

0.5x2 if |x|<1|x|0.5 otherwise 
\right. L1smooth(x)={0.5x2x0.5 if x<1 otherwise 

  1. 回归参数:
    相对平移量: ( 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=(GxPx)/Pw
    t y u = ( G y − P y ) / P h t^u_y = (G_y - P_y)/P_h tyu=(GyPy)/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}} xiL=rj[i=i(r,j)]yrjL

判决函数 [ i = i ∗ ( r , j ) ] [i=i^*(r,j)] [i=i(r,j)]:表示 i i i节点是否被第 r r r个RoI的第 j j j个输出节点选为最大值输出

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号