https://arxiv.org/abs/1504.08083
三遍论文法
本文(Fast R-CNN)在之前RCNN的基础上应用了多种创新,提升了训练和测试的速度,同时也提升了检测的准确率。
首先,作者说明目标检测任务需要对物体进行精准的定位,从而产生两个问题:首先大量的候选proposal需要被处理,其次这些proposal只能提供粗略的定位,必须对其进行refine得到更精确的定位。而要解决这些问题,通常会降低模型的速度、准确度或简单性,因此本文提出了一个single-stage训练算法,可以同时学习分类object proposal以及refine空间位置。
作者指出RCNN存在以下几个缺点:
同时,本文也提到了SPPnet,SPPnet的核心思想就是计算整个输入图像的feature map,从这个共享feature map上提取每个object proposal所对应的特征向量进行分类。SPP会对proposal内的feature map特定区域进行max-pool操作,使其变为固定大小输出(例如. 6x6)。在spatial pyramid pooling中得到不同尺度的输出后,将其串联作为最后的特征(固定尺寸)。SPP的好处是只需要对全图提取一次feature map,并且可以接受任意大小的输入,如下图所示:
关于SPPNet详情可参考这篇博客:https://blog.csdn.net/v1_vivian/article/details/73275259
但SPPNet的缺点也类似于RCNN:训练过程也是多阶段的,fine-tune CNN+SVM+Bounding-box回归;CNN提取的特征也需要存入磁盘,并且其在fine-tuning过程中没有更新SSP之前的卷积层(固定的卷积层也限制了SPPNet的准确性)。
本文的贡献可以归纳为以下几点:
Fast R-CNN的整个流程如上图所示:网络以一张完整图像和一组object proposals作为输入,网络首先处理整幅图像从而产生Conv feature map(经过卷积+池化),对于每个object proposal,利用Region of Interest(RoI) Pooling层从对应的feature map提取固定长度的特征向量。随后,特征向量送入一系列的全连接层并得到两个输出层:一个用于预测类别的softmax层(K+1类),另一层为K类中的每一类object输出四个值(用于refine bounding-box的位置)
ROI pooling层主要使用max pool将每个ROI的feature转换为一个固定尺寸(H x W)的feature map,本文中ROI就是Conv feature map中的一个矩形窗口,每个ROI可以由一个四元组确定(x,y,h,w),(x,y)为左上角坐标,h为高,w为宽。
ROI pooling就是将h * w的ROI窗口分为H * W个子窗口,对每个子窗口进行max-pooling操作,最后就得到了H*W大小的固定输出。ROI pooling为SPP的一个特例,因为只用了一种尺寸(HxW)的子窗口。
预训练网络要初始化为Fast R-CNN的backbone需要经历三个阶段:
首先说明SPPNet在fine-tuning阶段为什么不对SPP之前的卷积层更新,根本原因是由于SPPNet中每个训练样本(即RoI)来自不同图片,这导致反向传播过程非常低效:每个ROI可能有很大的感受野(通常覆盖整幅图),并且前向传递必须处理整个接收场,因此训练输入很大(通常是整个图像),反向传播算法计算时需要用到正向传递过程的数据,这导致需要存储的数据量巨大。
本文提出了一个更高效的训练策略:SGD的mini-batch为层次采样,采样N个图像,然后每幅图像采用R/N个ROI,这样来自于同一幅图像的ROIs可以在前向和后向传播中共享权重和内存(其中N越小计算量越小,比如N=2,R=128比ROI来自128幅不同图像的训练策略快了64x,这也是RNN和SPPNet所用的策略)。
除了层次采样,Fast RCNN使用one fine-tuning stage (RCNN为3阶段),同时优化softmax分类器以及bounding box回归器。
本文有两个任务分支,一个是分类,另一个是用于bounding-box回归,因此使用了多任务loss:
其中,第一个Lcls 用于衡量类别预测的log loss:
式(1)中第二个部分用来衡量对真实类别u预测的bounding-box与groundtruth间的差距,其中[·]为指示函数,意为不考虑类别u为背景的情况(u=0代表背景类,因为对于背景类的bounding-box没有真正的groundtruth),λ为超参数用于平衡loss间尺度差异。
对于类别u来说,其bounding-box回归的ground-truth为以下元组:
从bounding-boxregression支路预测出来的输出为:
预测元组中每个元素能够指定与object proposal相关的scale-invariant translation和log-space height/width shift (并不直接为坐标、长宽值)
其中,Lloc 的具体形式为:
其中,smooth的具体形式为:
在fine-tuning阶段,N=2,R=128,每幅图像选取64个ROI。所选的ROI中IoU>0.5的占25%,这ROIs包含了前景(u≥1);剩余的75%在[0.1, 0.5)之间选取(从大到小依次选择);小于0.1的ROI可作为hard example mining。在训练阶段,使用概率为0.5的随机水平翻转用于数据增广。
本文使用了两种方式来学习目标检测中的尺度不变性(不同尺度的图像都能被正确预测):
Fast R-CNN经过fine-tuned之后,检测的过程实际就是做一次forward pass(假设proposal已经计算好)。以一张图片(或者是Image Pyramid,编码了一组图片)和一组object proposal(大小为R,为2000)作为输入,当使用Image Pyramid时,在Pyramid中选择ROI最接近2242 的feature map提取对应的ROI feature(例如Image Pyramid中image scale为{480, 576, 688, 864, 1200, itself}, 找到图像中proposal最接近224x224的feature map)。
对于每个ROI r,送入网络会得到类别概率p和与r相关的bounding-box offset,使用与R-CNN中的非极大值抑制算法对每个类的ROI进行筛选。
对于Fast RCNN来说,每张图都有大概2k个proposal,这样在前向计算时,全连接层计算会浪费很多时间,但它可以通过截断SVD进行压缩从而提升速度。
全连接层权重矩阵W的维度为u x v
,可以使用SVD近似分解为:
其中U为一个u x t
的矩阵(压缩了W的前t个左奇异向量),∑t 为t x t
矩阵(包含W的前t个奇异值),V是一个v x t
矩阵(压缩了W的前t个右奇异向量)。截断SVD将计算量由uv
减少为t(u+v)
。压缩后的网络,与W对应的全连接层变为两个全连接层,如下图所示:
主要的实验结果如下:
这里就不贴实验结果了,有兴趣的可以参看原文对应段落
为了更好地证明Fast RCNN结构设计的合理性,设计了一系列实验。
多任务训练可以提升性能,因为任务之间可以通过shared representation(CNN)相互影响,协同学习。
比较single scale(brute)和multi-scale(Image Pyramid)两者对于测试性能的区别:
对于Large的深度模型,权衡速度-准确率,只使用single-scale方案。
答案是毋庸置疑的,训练数据对于深度学习任务来说就是多多益善。
在Fast RCNN框架上,softmax比SVM要好一些,作者认为这是由于softmax在进行scoring ROI时引入了类别间竞争,并且使用softmax代替SVM能避免大量的内存消耗(不需要将feature map存入磁盘)。
Fast RCNN发表于ICCV2015,为RCNN系列的第二版,其在RCNN的基础上提升了不少精度以及速度。其与RCNN的主要区别为:
虽然还有很多细节没有总结,但完全可以看出Fast RCNN在RCNN的基础上改进了不少,并且融入了新的结构与想法,在性能上也得到了很大提高。
本文所用方法较老,这里就不贴代码链接以及复现了,大家有兴趣可以自行去github上搜素。
以上为个人的浅见,水平有限,如有不对,望大佬们指点。
未经本人同意,请勿转载,谢谢。