【论文阅读笔记】Fast R-CNN
论文地址:http://arxiv.org/abs/1504.08083
作者:Ross Girshick
发布时间:2015年4月发布,2015年9月最后修改
前言
是单一尺度的模型,输入需要强扭曲成指定大小;且需要单独训练三个目标;因其训练复杂,提取的候选区域有大量的重复计算;检测时间长;训练分类器和回归器又是在提取特征之后离线进行的。
所以试图解决这几个问题,通过如下方式:使用多尺度模型(使用池化层);将分类器和回归器放在网络模型之中,使用多任务学习模型;将一个设置为一(几)张图片,从其特征图中提取候选区域以满足大小,同时共享了计算卷积层的操作;检测时使用截断式代替全连接层的权重,以加快检测速度。
可以看出,虽然模型基本满足端到端的要求,但从特征图中提取候选区域的操作仍是线下进行的,这将耗费大量时间(提取大概需要2~3秒,而前向传播一次模型不足1秒),因此仍达不到实时的要求。
概要
论文的CNN实验架构从 。该论文的架构的训练速度、测试速度、精确度比 都要好。
引言
目标检测的困难点在于检测目标定位的准确性上,这导致两个问题:⑴ 需要处理大量候选区域;⑵ 这些候选区域需要调整以达到精确定位。目标检测的解决方案需要在速度、准确性、复杂程度上折中。
本文综合了两大当时最先进的目标检测方法(-),提炼了一套较为精简的训练过程,同时把目标候选的分类以及回归一起结合起来了(使用多任务学习)。
本文可以在一个非常深的网络中训练(),训练速度是的倍,的倍,同时从的提升到了。
的缺点
- 训练时分多个阶段:先预训练CNN网络,再微调CNN网络,再训练SVM分类器替代softmax分类器;同时,候选区域还需要经过变换以精确定位
- 训练花费大量时间和“空间”:对于SVM分类和候选区域回归阶段,需要从每张图片中提取每个候选区域并写入磁盘中。
- 训练完的模型在检测目标时很慢:在测试时,需要从每张图片提取多个候选区域以定位
- 候选区域截取的图片需要经过扭曲的resize
慢的原因是每个候选区域都要进行一次CNN网络的前向传播操作,其中包含大量的重复计算。SPPnet可以通过共享计算来加快,的输入是整张图片(而不是一个个候选区域),候选区域的分类通过在共享的特征上提取区域特征上完成(比如在金字塔池化层前有的特征图,其中是我们想要的候选区域的“映射”,而后将其变成固定长度的特征向量如)。可以在测试时加快 倍,在训练时可以加速 倍(提取特征更快)。
的缺点
- 训练分多阶段进行:和RCNN一样,只是提取候选区域特征快一些
- 训练耗费空间:特征需要写入到硬盘上(分类以及bounding-box回归分别需要用到特征,都是离线训练的)
- 微调CNN网络时,卷积层不能微调:金字塔池化层之前的卷积层都不能更新参数,这种固定参数限制了网络的精确度
-综合了两个网络的特点,并得到如此结果:
- 提高了检测质量();
- 训练成为了单阶段的,使用多任务损失;
- 不像,该网络可以更新所有参数;
- 特征不需要存储到磁盘中;【直接在网络模型上训练,在线训练分类层和回归层,不需要存储特征】
架构及其训练
Fast RCNN的训练过程如下:
- 网络输入整张图片以经历前向传播,输入候选区域等待后续选择特征;
- 整张图片经历前向传播得到特征图,利用候选区域与原图的映射选择目标特征向量;
- 目标特征向量经过池化层,化成固定大小的特征向量【VGG16网络是】;
- 目标特征向量经过全连接层得到最终的特征向量表示【R-CNN实验表明,全连接层的特征向量实现的性能更好】;
- 最终的特征向量传向两个目标:softmax层和bounding-box回归层【这是个多任务学习网络】;
- 利用softmax层得到的窗口分数,对每一个类别的窗口执行一次非最大值抑制。
RoI池化层
,RoI池化层就是提取感兴趣的区域的池化操作。
层的计算过程和SPPnet的spp层(spatial pyramid pooling)一样,不同的地方在于 层只用了一个尺度的区域选择。层将从特征图计算出来的感兴趣区域经过操作得到固定大小的的感兴趣区域特征(H,W是超参数,如7,7)。截取出来的感兴趣的区域用表示,其中表示区域左上角的位置,表示区域的长宽,因此池化层的池化大小为
池化感兴趣区域的计算就和spp网络一样(每个区域块就和max pooling一样,选一个最大值);
感兴趣区域与原图上的候选区域的对应如下:
左、上角:
右、下角:
检测中的微调
为什么的金字塔池化层之前的参数不能更新?
作者认为根本原因在于反向传播在通过层之后太低效了,这种低效在于每个训练样本都来源于不同图片(这也是R-CNN所做的,大概就是选择一个候选区域,然后遍历所有图片的做法);这种低效也源于金字塔层的感受野太大了(对于SPP来说,有不同尺度的,其中甚至有的池化层,也就是处理整张图片的大小)。
作者提出一种加速的做法:对于的来说,先随机选择数量为的图片,再对这张图片选择个。这种做法的优势在于:对于每张图片而言,前向传播的计算和内存是共享的,只是在RoI池化层前的操作不同。其劣势在于:同一个图片的不同样本(不同RoI)是相关联的,这样做之后,模型可能很难收敛,但实验表明这并不是实际需要担心的问题。【作者没提到的另一个操作是,不像SPP pooling一样使用多尺度的最大池,该论文只使用一个尺度的最大池。相对于上面的感受野尺寸太大,这个也是一个改善,不知道是不是可以更新的另一个原因。但是每个ROI的池化层池化的子区域大小也不一样。】
另外,作者精简了模型过程,使得之前需要独立训练的三个目标:softmax,SVM分类层,bounding-box回归层,变成了多任务学习的softmax分类层 & class-special的bounding-box回归层。这样做的优势在于特征是在线使用的,而不需要离线存入磁盘中。
多任务损失
多任务损失函数图
我们的分类目标是分出个类,使用的损失函数为对数损失函数,对于分类目标类别的损失函数如下:
因此,多任务学习的损失函数如下:
采样
前面提过,每个SGD的Mini-batch都是从张图片中随机取得,每个的类别样本标记如下:选择的区域作为正样本(前景),即;选择的区域作为负样本(背景),即。这里选择负样本的下限为是因为负样本很多,我们采用较为“有用”的负样本,即硬负样本。
反向传播
其实RoI pooling的反向传播和max pooling的反向传播的计算是一样的,就是对应区域的最大值才有传递,否则导数为0。该反向传播稍微不同的地方在于前向传播的时候是N张图片,经过RoI Pooling层的时候,是,所以整个反向传播的公式在RoI Pooling层是稍微有些不同,为 其中,为判断是否是传递的那个最大值,是为1,不是为0。
检测
经过微调的 网络,检测的前向传播比训练要快。网络输入一张图片以及一个关于个候选区域的列表。在测试阶段,作者一般把设定为2000。
对于每一个测试的候选区域 ,前向传播的输出为一个类别的后验概率 ,以及关于 的预测边框偏移量(每个类别都单独有一个)。同时,边框执行度标记为后验概率,对其执行非最大值抑制操作。
同时,作者使用截断的SVD代替全连接层的参数,以减少检验(测试)的时间。这是因为参数大量减少,导致计算量减少,因此速度加快,这是一种压缩(compression)的思想。