Fast R-CNN

Paper : Fast R-CNN
Code : official

摘要

Fast R-CNN主要解决的是R-CNN结构中的多阶段训练的问题,R-CNN在训练SVM分类和bounding box回归时,需要从磁盘中读取CNN网络提取出来的特征,在时间和空间消耗上都是非常大的。Object detection的测试过程速度也比较慢。SPP结构只改进了重复卷积问题,但是多阶段训练,需要额外的回归器,特征保存在磁盘上等缺点依旧存在。Fast R-CNN通过对网络结构的修改来解决这些问题,加速训练和测试速度的同时还可以提高算法准确率。

算法

Fast R-CNN具有以下几个特点

  • 更高的检测质量
  • 单阶段训练,多任务损失
  • 训练过程中可以更新所有层的参数
  • 特征缓存不需要占用磁盘

算法的整体结构如下所示

在这里插入图片描述
RoI(Region of Interest)表示候选区域,由Selective Search 算法生成。对于输入图片,Fast R-CNN首先将图片经过卷积层生成feature map,然后根据RoI得到feature map上对应的候选框位置,使用RoI 池化层将任意形状的feature map上的子区域转化为固定大小的特征向量,经过FC层后分成两个分支分别进行分类任务和回归任务。其中RoI池化层可以看作是SPP层的特例,对比如下

在这里插入图片描述
可以看到,RoI池化层相当于只在单一尺度上进行SPP操作。

在SPP-Net中,作者只对SPP层之后的FC层进行finetune操作,作者认为对于SPP-Net的训练方法,也就是每一批次将若干个RoI对应的来自不同图片的区域传入到网络中,反向传播是无效的。这是因为每一个RoI可能有一个很大的感受野,经常跨越整张图像。

Training all network weights with back-propagation is an important capability of Fast R-CNN. First, let’s elucidate why SPPnet is unable to update weights below the spatial pyramid pooling layer.
The root cause is that back-propagation through the SPP layer is highly inefficient when each training sample (i.e. RoI) comes from a different image, which is exactly how R-CNN and SPPnet networks are trained. The inefficiency stems from the fact that each RoI may have a very large receptive field, often spanning the entire input image. Since the forward pass must process the entire receptive field, the training inputs are large (often the entire image).

因此,作者提出了一种新的训练方式,设batch size 大小为B,假设这个Batch中有N张图片,那么我们对于每张图片采样 B/N 个RoI区域。来自相同图片的RoI可以在正向传播和反向传播的过程中共享计算力和内存。使用较小的N进行训练的坏处是可能会使收敛速度下降,不过作者说我们通过实验表明这个事情没发生。在实际训练中,每个mini-batch包含2张图像和128个ROI,也就是每张图像有64个ROI。然后从这些ROI中挑选约25%的ROI,这些ROI和ground truth的IOU值都大于0.5。另外只采用随机水平翻转的方式增加数据集。测试的时候则每张图像大约2000个ROI。

多任务的损失函数定义如下

L = L cls ( y pred , y true ) + λ [ y true ≥ 1 ] L loc \mathcal L =\mathcal L_{\textrm{cls}}(y_{\textrm{pred}},y_{\textrm{true}}) + \lambda[y_{\textrm{true}}\geq 1] \mathcal L_{\textrm{loc}} L=Lcls(ypred,ytrue)+λ[ytrue1]Lloc

其中, y true = 0 y_{\textrm{true}} =0 ytrue=0 表示背景,而 L loc \mathcal L_{\textrm{loc}} Lloc 定义为

L loc ( t u , v ) = ∑ i ∈ { x , y , w , h } smooth L 1 ( t i u − v i ) smooth L 1 ( x ) = { 0.5 x 2 ∣ x ∣ < 1 ∣ x ∣ − 0.5 otherwise \\\mathcal L_{\textrm{loc}}(t^u,v) = \sum_{i\in\{x,y,w,h\}} \textrm{smooth}_{L_1}(t^u_i-v_i) \\\textrm{smooth}_{L_1}(x) = \left\{\begin{matrix} 0.5x^2 & |x|<1\\ |x|-0.5 & \textrm{otherwise} \end{matrix}\right. Lloc(tu,v)=i{x,y,w,h}smoothL1(tiuvi)smoothL1(x)={0.5x2x0.5x<1otherwise

可以使用两种数据尺寸对Fast R-CNN进行训练,第一种是在训练和测试阶段都使用固定尺寸的输入,第二种是类似SPP-Net使用图片金字塔进行训练,测试时对于每个RoI区域找到放缩比例最接近224*224的进行计算。最后使用NMS进行RoI的过滤。

如果是一个普通的分类网络,那么全连接层的计算应该远不及卷积层的计算,但是针对object detection,Fast RCNN在ROI pooling后每个RoI都要经过几个全连接层,这使得全连接层的计算占网络的计算将近一半,所以作者采用SVD来简化全连接层的计算。

最后,作者从以下几个方面进行了更加深入的讨论,这也是写论文值得学习的地方

  • Which layers to fine-tune?
    SPP-Net只对SPP层之后的FC层的参数进行了finetune,作者通过实验证明对于足够深的网络,finetune卷积层的参数对结果的改善是很大的。作者通过进一步的实验得到了一个符合直觉的结论:越是靠后的Conv层参数,与具体任务关系越大,前几层Conv层的参数对于不同的任务是通用的。
  • Does multi-task training help?
    作者通过实验证明多任务训练对单个任务的结果是有提升的
  • Scale invariance: to brute force or finesse?
    单一尺度检测表现上几乎和多尺度检测相当,这是因为深度卷积网络善于学习图片内容的尺度不变性
  • Do we need more training data?
    需要,更大的数据集使准确率显著上升
  • Do SVMs outperform softmax?
    实验结果表明softmax与SVM相当甚至更好一点,说明finetune是有效的
  • Are more proposals always better?
    实验结果表明更多的候选框的生成对结果没什么作用,甚至会轻微损害模型表现。

总结

Fast R-CNN将RCNN众多步骤整合在一起,不仅大大提高了检测速度,也提高了检测准确率。Fast R-CNN算法核心包括多任务学习,RoI pooling,以及尽量从同一张图片中选取RoI的新的训练方式。个人认为这篇文章告诉了我从哪些地方进行深入的思考和讨论,尽管有些地方没有理论分析,但是有助于发散思路。当然Fast RCNN的主要缺点在于RoI的提取使用selective search,目标检测时间大多消耗在这上面,这也是后续Faster RCNN的改进方向之一。多阶段转化到端到端,传统特征提取转化到卷积操作是计算机视觉的大发展趋势。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值