Fast-RCNN论文原理理解

问题提出

R-CNN、SPP-net的缺点:
1) R-CNN:
1. 训练时要经过多个阶段
2. 2. 训练时间和空间开销大。
3. 测试时间开销大。
2) SPPnet:
训练要经过多个阶段,特征也要存在磁盘中
SPP中的微调只更新spp层后面的全连接层,对很深的网络这样肯定是不行的。在微调阶段SPP-net只能更新FC层,这是因为卷积特征是线下计算的,从而无法再微调阶段反向传播误差。
而在fast-RCNN中则是通过image-centric sampling提高了卷积层特征抽取的速度,从而保证了梯度可以通过SPP层(即ROI pooling层)反向传播。

Fast-Rcnn 改进:

  1. 比R-CNN更高的检测质量(mAP);
  2. 把多个任务的损失函数写到一起,实现单级的训练过程(提取候选框过程除外);
  3. 在训练时可更新所有的层;
  4. 不需要在磁盘中存储特征。

Fast-RCNN框架

这里写图片描述
1.用selective search在一张图片中生成约2000个object proposal,即RoI。

2.把它们整体输入到全卷积的网络中,在最后一个卷积层上对每个ROI求映射关系,并用一个RoI pooling layer(简化的SPP)来统一到相同的大小-> (fc)feature vector 即->提取一个固定维度的特征表示。(借用SPP思想,不再wrap)

3.继续经过两个全连接层(FC)得到特征向量。特征向量经由各自的FC层,得到两个输出向量:第一个是分类,使用softmax,第二个是每一类的bounding box回归。

ROI pooling layer

前向传播
每个ROI窗口定义为(r,c,w,h)左上角坐标和长宽。
将即将送入FC的特征图经过 该层 pooling为固定尺寸H*W(超参,人为设定)
虽然ROI的尺寸不同(h*w),经过ROI pooling后都为H*W.
用于pooling的 子窗口计算为:
每个子窗口大小大约是h/H x w/W。(是一个一层的金字塔结构,SPP的特例)
RoI最大池化将hxw的RoI窗口分成HxW的子窗口网格,
ROI 后向传播
对于普通的maxpooling ,这里写图片描述
其中判决函数δ(i,j)表示i节点是否被j节点选为最大值输出。不被选中有两种可能:xi不在yj范围内,或者xi不是最大值。
对于roi max pooling,一个输入节点可能和多个输出节点相连。

设xi为输入层的节点,
yrj为第r个候选区域的第j个输出节点。 

所以有个累加:
这里写图片描述
判决函数δ(i,r,j)表示i节点是否被候选区域r的第j个节点选为最大值输出。代价对于xi的梯度等于所有相关的后一层梯度之和。

训练策略

权重初始化

mini-batch采样

RoI-centric sampling:从所有图片的所有RoI中均匀取样,这样每个SGD的mini-batch中包含了不同图像中的样本。(R-CNN和SPPnet采用)

image-centric sampling: mini batch是分层采样的,首先采样N张图像,然后从每张图片采样R/N个RoI。来自同一张图片的RoI在前向和后向传播中共享计算和内存。这样就可以减少mini-batch的计算量。

例如N=2,R=128(N是图片数,R是ROI的总个数,mini-batch大小128,所以一个图取64)
这个训练模式大概比从128个不同的图像采样1个RoI要快64倍。

多任务损失函数:
类别损失和坐标损失两部分,经过对坐标(0,1)归一化λ为1
这里写图片描述
其中这里写图片描述
这里写图片描述
g为Smooth L1误差,对outlier不敏感:
g为Smooth L1误差,对outlier不敏感:
缩放不变性
1. “brute force”(单一尺度,原图) 通过“暴力”学习
2. “image pyramids”(使用图像金字塔尺寸变换,算作一种图像增强手段)

虽然看起来2比较好,但是非常耗时,而且性能提高大约只有%1,所以这篇论文在实现中还是用了1

Truncated SVD检测加速

采用奇异值分解的方法来减少计算fc层的时间,对全连接层的矩阵做了一个SVD分解,mAP几乎不怎么降(0.3%),但速度提速30%
全连接层计算:

y=Wx

其中,W尺寸为u×v,计算复杂度为u×v
对W进行奇异值分解,并用前t个特征值近似:
这里写图片描述
原来的前向传播分解成两步:

 y=Wx=U⋅(Σ⋅VT)⋅x=U⋅z

计算复杂度变为u×t+v×t。
在实现时,相当于把一个全连接层拆分成两个,中间以一个低维数据相连。
提出:
倍增训练数据,能够有2%-3%的准确度提升
更多候选窗不能提升性能

REF计算复杂度变为u×t+v×t。
在实现时,相当于把一个全连接层拆分成两个,中间以一个低维数据相连。

REF

https://blog.csdn.net/shenxiaolu1984/article/details/51036677

https://blog.csdn.net/linolzhang/article/details/54344350

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值