问题提出
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 改进:
- 比R-CNN更高的检测质量(mAP);
- 把多个任务的损失函数写到一起,实现单级的训练过程(提取候选框过程除外);
- 在训练时可更新所有的层;
- 不需要在磁盘中存储特征。
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不敏感:
缩放不变性
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