目标检测经典模型(二)--fast rcnn
相比于RCNN的改进:Fast RCNN将原始图片输入卷积网络中得到特征图,再使用建议框对特征图提取特征框,大大减少了计算量建议框大小不一,通过ROI池化层将特征框转化为相同大小;Fast RCNN里没有SVM分类器和回归器了,分类和预测框的位置通过卷积神经网络输出为了提高计算速度,网络最后使用SVD代替全连接层算法流程:输入一张图片,通过Selective Search得到候选建议框;将原始图片
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×WH\times{W}H×W的特征图;
- 将特征图拉长成一个向量(ROI特征向量),通过一个全连接层;
- 然后经过两个输出,一个是softmax目标分类,另一个是边界框回归(bbox regressor)
5.1 目标分类:经过softmax函数得到21个类别的得分(概率);
5.2 边界框回归:输出21×4=8421\times{4}=8421×4=84个神经元,21个类别,每个类别4个参数; - 使用NMS得到少数候选框,选择概率最大的类,作为标注类
PS:使用SVD来进行全连接层计算加速 其实可以认为是将一个大的全连接层换成两个小的全连接层
一张图总结:
详细训练过程:
损失函数:
- fast RCNN的损失函数是一个多任务损失函数,是目标分类损失和边界框损失的加权和:
L(p,u,tu,v)=Lcls(p,u)+λ[u≥1]Lloc(tu,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)
符号解释:- uuu:每个ROI在 K+1K+1K+1 个类别上的真值
- p=(p0,p1,...pK)p=(p_0, p_1,...p_K)p=(p0,p1,...pK):每个RoI在 K+1K+1K+1 个类别上的离散概率分布
- vvv:真值边界框的回归参数
- tu=(txu,tyu,twu,thu)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≥10 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
-
目标分类损失:
Lcls(p,u)=−logpuL_{cls}(p,u) = -log p_uLcls(p,u)=−logpu -
边界框回归损失:
Lbox(tu,v)=∑i∈{x,y,w,h}L1smooth(tiu−vi)\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)
L1smooth(x)={0.5x2 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
- 回归参数:
相对平移量:(txu,tyu)(t^u_x, t^u_y)(txu,tyu):
txu=(Gx−Px)/Pwt^u_x = (G_x - P_x)/P_wtxu=(Gx−Px)/Pw
tyu=(Gy−Py)/Pht^u_y = (G_y - P_y)/P_htyu=(Gy−Py)/Ph
尺寸缩放量:twu,thut^u_w, t^u_htwu,thu
twu=log(Gw/Pw)t^u_w = log(G_w/P_w)twu=log(Gw/Pw)
thu=log(Gh/Ph)t^u_h = log(G_h/P_h)thu=log(Gh/Ph)
ROI如何进行反向求导:
普通max pooling求导:
前向传播: 即把窗口内的最大值传递给下一层;
反向传播: 把梯度值传递给前一层窗口内最大值对应的 ID(max id)
ROI max pooling求导:
设xix_ixi 为输入层的节点,yrjy_{rj}yrj为第rrr个候选区域的第jjj个输出节点。
一个输入节点可能和多个输出节点相关连,所以损失函数LLL对输入节点xix_ixi的梯度为LLL对各个有可能的RoI的输出节点yrjy_{rj}yrj梯度的累加:
∂L∂xi=∑r∑j[i=i∗(r,j)]∂L∂yrj\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)]:表示iii节点是否被第rrr个RoI的第jjj个输出节点选为最大值输出
更多推荐
所有评论(0)