Object Detection 学习笔记 (2) Fast R-CNN

Fast R-CNN 在R-CNN基础上做了改进,提高了检测速度和准确率,也提高了训练的时间、降低了存储量。

 

R-CNN速度慢的原因在于它对每个 region proposal 都分别放入卷积网络中计算,没有利用这些候选框之间重叠的部分来共享计算量,SPPnets(spatial pyramid pooling networks)针对 R-CNN 这个缺陷做的改进就是 把一整张图片放入卷积网络后得到全局的 feature map , 再针对每个 region proposal 在全局 feature map 上对应的位置做一个 max pooling ,再送给后面的全连接层处理,来利用共享计算量提高速度。(SPPnets在 max pooling 的具体输出格式博主还不清楚,后续再补充吧)。

但是SPPnets仍然是使用 log loss 函数对网络 fine tuning 之后,再另外训练一个 SVM 作为分类器以及 bbox 回归,这些与 R-CNN 相同。并且,在处理不同图片时,由于 region proposal 的感受野( receptive field )大小常常可以与整张图片相比,所以在 forward pass 时必须处理感受野内所有像素点,运算量太大,导致 back propagation 效率低下(说实话这里关于 SPPnets 反向传播效率低的原因没有看太懂,猜测应该是由于“运算量太大”)。

文中说 SPPnets 在 fine tuning 阶段的算法没有办法更新 spatial pyramid pooling 层之前的卷积层权重(fixed convolutional layers),当网络很深时,模型的准确度就会受限。

 

先放出 Fast R-CNN的总体框架

(图片来自https://blog.csdn.net/shenxiaolu1984/article/details/51036677

图1 这是众多网络中的一种,比较详细,作为参考。论文配图概括性更好

 

 

图2 论文配图

 

 

RoI pooling 层

可以看到,Fast R-CNN 把一整张图片放入卷积网络后得到 feature map 之后,针对每个 region proposal 的对应区域使用 RoI pooling 层处理。

每个 RoI 的长宽都不一定相同。对此的处理是把每一个 RoI 分成长宽数量固定的网格矩阵。假设RoI 大小是 h × w,预先设定的网格矩阵大小是 H × W,那么每一个网格的大小大概就是 h/H × w/W 。然后在每个网格对应的 RoI 的区域做 standard max pooling(取最大的数)。对 feature map 的每个通道操作相同(都使用标准 max pooling)。

图3

(图片来自https://blog.csdn.net/shenxiaolu1984/article/details/51036677

预处理依然是在 ImageNet 做1000-way的分类训练。

当用于 Fast R-CNN 时,网络上有三处改变

  1. 把 pool5 换成 RoI pooling layer 并且设置 H × W (H 和 W 的含义在上面),H 和 W 要和紧接着的全连接层相匹配
  2. 把 fc8 和 1000-way 的分类层换成并行的 一个全连接层 + softmax 分类层 以及 一个全连接层 + bbox 回归层(见图1)
  3. 网络输入有两个数据:所有的图像,所有的RoI。(RoI只利用其边框位置??这条还不太懂)

调优 fine tuning

计算量共享

前面说到 SPPnets 在 back propagation 时感受野太大的问题。作者由此想到利用训练时 特征共享(feature sharing)来解决。具体来说就是在使用 SGD (stochastic gradient descent , 随机梯度下降) 时,对 mini batch 层次化取样。

比如,先抽取 N 张图片,再在每张图片上抽取 R/N 个 RoI,这样,N 越小,计算 RoI 所用的计算量重叠度也就越高,因而计算量越小。

当 N=2, R=128 就比 N=128 , R=128 的计算量小大约 64 倍。(想象极端情况,N=2 情况下,每张图片对应的 64 个 RoI 严格重叠,只需要计算 2 “次”,而后者需要计算 128 “次”)。

多任务代价函数

作者把分类和定位的损失放在一个函数里体现,从而实现用一步 fine tuning 来优化 softmax分类器 和 bbox回归。

对一个 RoI ,

cls_score 全连接层产生一个 1×(K+1) 的向量,分别对应 K 类目标以及背景的可能性大小;

bbox_predict 产生一个 (K+1)×4 的矩阵??(博主对这里理解还不清晰)。总之第 K 类对应的一行是

                                                                       t^k = (t_{x}^{k} ,t_{y}^{k} ,t_{w}^{k} ,t_{h}^{k} )

表示对第K类预测的位置

对每个 RoI 都有下面这个损失函数

                                                                      L(p,u,t^u,v)=L_l_c_s(p,u)+\lambda [u\geq 1]L_l_o_c(t^u,v)

其中

                                                                      L_c_l_s=-log(p_u)

                                                                      L_l_o_c(t^u,v)=\sum_{i={\left \{ x,y,w,h\right \}}}smooth_{L_1} {(t_i^u-v_i),}

 

                                                                     {} $$ smooth_{L_1}(x)= \left\{ \begin{aligned} 0.5x^2 & \ \ \ \if \left | x \right |<1\\ \left | x \right |-0.5 & \ \ \ \ otherwise \ \end{aligned} \right. $$

在误差极大的情况下,smooth函数表现不敏感,(读者可以画出smooth L1 函数的草图)。

[u\geq 1] 只有在 u\geq 1 时等于1,其余情况均等于0。只有分类为背景时,u 才等于 0 ,所以这里的含义是对背景不计算 location 损失。

\lambda代表 定位误差 和 分类误差 对损失函数影响大小,整个实验过程均设置为 1 。

 

 

此外,文章提到,在训练过程中对每张图片有50%的概率做水平翻转,还不懂为什么这么做。

关于SVD(奇异值分解)这一块,貌似是为了减少最后两个全连接层的计算量,但目前还没看懂数学原理(嘤嘤嘤。。。)

 

关于 反向传播更新 是从这篇博客看明白的,关于Fast R-CNN 其他部分也讲的比较详细,大家可以参考一下。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值