前言
我们知道,R-CNN存在着以下几个问题:
- 分步骤进行,过程繁琐。Selective Search生成候选区域region proposal->fine tune预训练网络->针对每个类别都训练一个SVM分类器->用regressors对bounding-box进行回归。
- 时间和内存消耗比较大。在训练SVM和回归的时候需要用CNN网络训练的特征作为输入,特征保存在磁盘上再读入的时间消耗比较大。
- 重叠区域特征重复计算。测试时每个region proposal都要做卷积。
SPP-net算法解决了R-CNN中重复卷积的问题,但是R-CNN的其他缺点在SPP-net上依旧存在。
馨意:深度学习目标检测SPP-net论文解读zhuanlan.zhihu.comFast R-CNN是R-CNN作者对RCNN的改进版。Fast R-CNN只进行一次特征提取,并将RCNN的SVMs使用softmax所替代,并将分类目标函数和框预测目标函数合并为多任务目标函数,速度和精度都大大提高。
论文名称:
Fast R-CNN
论文下载:
https://www.cv-foundation.org/openaccess/content_iccv_2015/papers/Girshick_Fast_R-CNN_ICCV_2015_paper.pdfwww.cv-foundation.org论文解读:
上图即为Fast R-CNN架构,具体流程为:
- Fast R-CNN网络将整个图像和所有RoI(也就是R-CNN中所说的proposal)作为输入。
- 网络首先使用几个卷积层和最大池化层处理整个图像,以生成特征图feature map。
- 然后在最后一个卷积层上对每个ROI求取映射关系,并用一个RoI pooling layer(也就是一个单层的SPP layer)来统一到相同的大小。
- 之后经过两个全连接层FCs生成一个固定尺寸的特征向量RoI feature vector。
- 特征向量RoI feature vector连接两个新的全连接层FC,得到两个输出向量:第一个是分类,使用softmax,第二个是每一类的bounding box回归。
RoI pooling layer
RoI pooling layer是在SPP-net中使用的空间金字塔池化层SPP的特例,SPP有三层,而在RoI pooling layer中金字塔层只有一个。
Pre-trained networks
用了3个预训练的ImageNet网络(CaffeNet/VGG_CNN_M_1024/VGG16)。
预训练的网络初始化Fast R-CNN要经过三次变形:
- 最后一个max pooling层替换为RoI pooling层。
- 最后一个全连接层和softmax(原本是1000个类)替换为softmax的对K+1个类别的分类层,和bounding box 回归层。
- 输入修改为两种数据: 图像列表和这些图像中的RoI列表。
Fine-tuning
我们知道,SPPnet只能微调SPP层后面的全连接层,所以SPPnet就可以采用随机梯度下降(SGD)来训练。
SPPnet采用的RoI-centric sampling:从所有图片的所有RoI中均匀取样,这样每个SGD的mini-batch中包含了不同图像中的样本。
反向传播需要计算每一个RoI感受野的卷积层,通常会覆盖整个图像,如果一个一个用RoI-centric sampling的话就又慢又耗内存。
Fast R-CNN采用的image-centric sampling:mini-batch采用层次取样,先对图像取样,再对RoI取样,同一图像的RoI共享计算和内存。 另外,Fast R-CNN在一次微调中联合优化softmax分类器和bbox回归。
看似一步,实际包含了:多任务损失(multi-task loss)、小批量取样(mini-batch sampling)、RoI pooling层的反向传播(backpropagation through RoI pooling layers)、SGD超参数(SGD hyperparameters)。
Multi-task loss
两个输出层,一个对每个RoI输出离散概率分布:
一个输出bounding box回归的位移:
k表示类别的索引,前两个参数是指相对于object proposal尺度不变的平移,后两个参数是指对数空间中相对于object proposal的高与宽。把这两个输出的损失写到一起:
k*是真实类别,式中第一项是分类损失,第二项是定位损失,L由R个输出取均值而来。
Mini-batch sampling
在微调时,每个SGD的mini-batch是随机找两个图片,R为128,因此每个图上取样64个RoI。从object proposal中选25%的RoI,就是和ground-truth交叠至少为0.5的。剩下的作为背景。
在调优训练时,每一个mini-batch中首先加入N张完整图片,而后加入从N张图片中选取的R个候选框。这R个候选框可以复用N张图片前5个阶段的网络特征。
实际选择N=2, R=128-> 每一个mini-batch中首先加入2张完整图片,而后加入从2张图片中选取的128个候选框。这128个候选框可以复用2张图片前5个阶段的网络特征。
总结
- 最后一层的softmax换成两个:一个是对区域的分类,另一个是对Bounding box的微调。
- 训练时所有特征不在存到硬盘中,提升了速度。
- 添加ROI pooling层,实现了不同大小区域特征图的pooling。