1. 前言
在前面两篇帖子《R-CNN》和《Spatial Pyramid Pooling》中,经典的R-CNN存在以下几个问题:
(1)训练分多步骤(先在分类数据集上预训练,再进行fine-tune训练,然后再针对每个类别都训练一个线性SVM分类器,最后再用regressors对bounding box进行回归,并且bounding box还需要通过selective search生成)
(2)时间和空间开销大(在训练SVM和回归的时候需要用网络训练的特征作为输入,特征保存在磁盘上再读入的时间开销较大)
(3)测试比较慢(每张图片的每个region proposal都要做卷积,重复操作太多)
在Fast RCNN之前提出过SPPnet来解决R-CNN中重复卷积问题,但SPPnet仍然存在与R-CNN类似的缺陷:
(1)训练分多步骤(需要SVM分类器,额外的regressors)
(2)空间开销大
因此,该文提出的Fast RCNN便是解决上述不足,在保证效果的同时提高效率。基于VGG16的Fast RCNN模型在训练速度上比R-CNN快大约9倍,比SPPnet快大约3倍;测试速度比R-CNN快大约213倍,比SPPnet快大约10倍,在VOC2012数据集上的mAP大约为66%。
2. 框架介绍
框架介绍:一张包含多个RoI(regions of interest)的图片(上图便于说明只显示一个RoI,灰色部分)输入一个多层的卷积网络中,获得Conv feature map,然后每一个RoI被池化成一个固定大小的feature map,feature map被全连接层拉伸成一个特征向量。对于每一个RoI,经过FC层后得到的feature vector最终被分享:一个进行全连接之后用来做softmax回归,用来对RoI区域做物体识别,另一个经过全连接之后用来做b-box regression做修正定位,使得定位框更加精准。
- 输入是224×224的固定大小图片
- 经过5个卷积层+2个降采样层(分别跟在第一和第二个卷积层后面)
- 进入ROIPooling层(其输入是conv5层的输出和region proposal,region proposal个数大约为2000个)
- 再经过两个output都为4096维的全连接层
- 分别经过output各为21和84维的全连接层(并列的,前者是分类输出,后者是回归输出)
- 最后接上两个损失层(分类是softmax,回归是smoothL1)
Fast R-CNN模型的流程图如下:
现在就按照上图的流程进行讲解。首先是读入一张图像,这里有两个分支,一路送入FCN,输出 feature maps,另一路通过selective search提取region proposals(注意,Fast R-CNN论文中并没有明确说明使用selective search提取region proposals,但是Fast R-CNN是基于R-CNN的,姑且默认采用selective search提取region proposals吧。),提取的每个region proposal 都有一个对应的Ground-truth Bounding Box和Ground-truth class label。其中每个region proposals用四元数组进行定义,即(r, c, h, w),即窗口的左上行列坐标与高和宽。值得注意的是,这里的坐标均是对应原图像的,而不是输出的feature maps。因此,还需要把原图像的坐标系映射到feature maps上。这一点也很简单,比如采用的是pre-trained 网络模型为VGG16的话,RoIPooling替换掉最后一个max pooling层的话,则原图像要经过4个max pooling层,输出的feature maps是原图像的1/16,因此,将原图像对应的四元数组转换到feature maps上就是每个值都除以16,并量化到最接近的整数。那么将region proposal的四元组坐标映射到feature maps上之后接下干什么呢?接下来就是把region proposal窗口框起来的那部分feature maps输入到RoIPooling(R-CNN是将其缩放到224x224,然后送入经过Fine-tuning的网络模型),得到固定大小的输出maps。
3. 主要内容
3.1 RoI pooling layer
不同于前面的SPP,在Fast RCNN网络中,RoI来完成SPP层的作用。RoI指的是在一张图片上完成Selective Search后得到的“候选框”在特征图上的一个映射,RoI层的作用:
考虑到感兴趣区域(RoI)尺寸不一,但是输入图中后面FC层的大小是一个统一的固定值,因为ROI池化层的作用类似于SPP-net中的SPP层,即将不同尺寸的RoI feature map池化成一个固定大小的feature map。具体操作:假设经过RoI池化后的固定大小为是一个超参数HxW,因为输入的RoI feature map大小不一样,假设为hxw,需要对这个feature map进行池化来减小尺寸,那么可以计算出池化窗口的尺寸为:(hxw)/HxW,即用这个计算出的窗口对RoI feature map做max pooling,Pooling对每一个feature map通道都是独立的。
其次RoI有四个参数(r, c, h, w)除了尺寸参数h,w外,还有两个位置参数r,c表示RoI的左上角在整个图片中的坐标。
3.2 从预训练网络中初始化
作者使用有5个最大池化层和5到13个不等的卷积层的三种网络进行预训练:CaffeNet,VGG_CNN_M_1024,VGG-16,使用这些网络初始化Fast R-CNN前,需要以下修改:
①用RoI pooling layer取代网络的最后一个池化层
②最后一个FC层和softmax被替换成fast R-CNN框架图介绍的两个并列层
③输入两组数据到网络:一组图片和每一个图片的一组RoIs
3.3 微调网络用来检测
不同于SPP-net,Fast R-CNN整个网络可以被使用BP算法训练是一个极大的优点,论文中作者提到SPP层中的感受也非常大,使用BP算法训练时效率低。作者利用特征分享的优势,提出一个更加有效的训练方法:SGD mini_batch分层采样方法。
概念快速扫盲:
(1)BGD:也叫做批量梯度下降(Batch Gradient Descent),对于参数的更新,需要计算所有的样本然后求平均,其计算得到的是一个标准梯度(这是一次迭代,我们其实需要做n次迭代直至其收敛)。因而理论上来说一次更新的幅度是比较大的。
(2)SGD:与BGD相比,随机也就是说我每次随机采用样本中的一个例子来近似我所有的样本,用这一个随机采用的例子来计算梯度并用这个梯度来更新参数,即SGD每次迭代仅对一个随机样本计算梯度,直至收敛。
(3)mini-batch SGD:他用了一些小样本来近似全部的,其本质就是既然SGD中1个样本的近似不一定准,那就用更大的30个或50(batch_size)个样本来近似,即mini-batch SGD每次迭代仅对n个随机样本计算题都,直至收敛。
首先随机取样N张图片,然后每张图片取样R/N个RoIs 。除此之外,网络在一次微调中将softmax分类器和bbox回归一起优化,区别于R-CNN的softmax回归,SVM,bbox回归的三步分开优化。一步优化中涉及到:多任务损失(multi-task loss)、小批量取样(mini-batch sampling)、RoI pooling层的反向传播(back-propagation through RoI pooling layers)、SGD超参数(SGD hyperparameters)
4. 训练过程/测试过程
FastR-CNN的训练和测试过程结合文中的框架图进行理解。
4.1 训练过程
对训练集中的图片,用selective search提取出每一个图片对应的一些proposal,保存图片路径和bounding box信息;
对每张图片,根据图片中bounding box的ground truth信息,给该图片的每一个proposal标记类标签,并保存。具体操作:对于每一个proposal,如果和ground truth中的proposal的IOU值超过了阈值(IOU>=0.5),则把ground truth中的proposal对应的类标签给原始产生的这个proposal,其余的proposal都标为背景;
使用mini-batch=128,25%来自非背景标签的proposal,其余来自标记为背景的proposal;
训练CNN,最后一层的结果包含分类信息和位置修正信息,用多任务的loss,一个是分类的损失函数,一个是位置的损失函数。
4.2 测试过程
用selective search方法提取图片的2000个proposal,并保存到文件;
将图片输入到已经训好的多层全卷积网络,对每一个proposal,获得对应的RoI Conv featrue map;
对每一个RoI Conv featrue map,按照3.1中的方法进行池化,得到固定大小的feture map,并将其输入到后续的FC层,最后一层输出类别相关信息和4个boundinf box的修正偏移量;
对bounding box 按照上述得到的位置偏移量进行修正,再根据nms对所有的proposal进行筛选,即可得到对该张图片的bounding box预测值以及每个bounding box对应的类和score。
5. 结果
5.1 mAP
FRCN相比其他算法表现更好,且注意到,VOC12由于数据集更大而使得模型效果提高很多。(这一角度也说明了数据对于当前深度学习的重要性不容忽视!)
5.2 多任务训练(multi-task)
由于本文提出的模型是基于R-CNN通过multi-task训练方式进行改进的,因此要说明multi-task的有效性。一共分为S/M/L三组,每组对应四列,分别为:
- 仅采用分类训练,测试也没有回归
- 采用论文中的分类+回归训练,测试没有回归
- 采用分段训练,测试没有回归
-
采用论文中的分类+回归训练,测试有回归