RCNN系列总结(RCNN,SPPNET,Fast RCNN,Faster RCNN)

传统的目标检测方法大概分为区域选择、特征提取(SIFT、HOG等)、分类器(SVM等)三个部分,其主要问题有两方面:一是区域选择策略没有针对性、时间复杂度高,窗口冗余;另一方面手工设计的特征鲁棒性较差。以下介绍基于Region Proposal的深度学习目标检测算法R-CNN->SPP-NET->Fast R-CNN->Faster R-CNN.


R-CNN

创新点

  1. 采用CNN网络提取图像特征,从经验驱动的人造特征范式HOG、SIFT到数据驱动的表示学习范式,提高特征对样本的表示能力;
  2. 采用大样本下有监督预训练+小样本微调的方式解决小样本难以训练甚至过拟合等问题(迁移学习)。

整体流程框架

  1. 生成region proposal: 方法选用selective search,大约2K个/图,并wrap到固定尺寸(227x227,各向同性缩放)
  2. 特征提取:CNN从每个region proposal中提取出一个4096维的特征(Alexnet等,5卷积层,2全连接层),输出大致为2000x4096
  3. 类别分类:SVM对4096维特征进行分类,得到一个2000x20的矩阵(20种类别),然后对每一列进行NMS非极大值抑制
  4. 位置修正:回归器校正非极大值抑制后剩下的region proposal,输入CNN网络pool5层的特征,输出为xy方向的缩放和平移,具体公式见参考1

训练方法

  1. 对CNN的有监督预训练:在ILSVRC样本集(只有分类标签)上对CNN网络进行有监督预训练,此时网络最后的输出是4096维特征->1000类分类的映射,并不完全是R-CNN的部分。
  2. 特定样本下CNN的微调:即domain specific fine-tuning, 在本文中是在PASCAL VOC 2007上进行,学习率是第1步预训练学习率的1/10,将第1步中的1000类分类输出改为21类(20类+背景),注意此处仍然是softmax,而不是SVM。
    • 正样本:Ground Truth+与Ground Truth相交IoU>0.5的Region proposal
    • 负样本:与Ground Truth相交IoU≤0.5的建议框
  3. 每一类的SVM的训练:输入正负样本在CNN网络计算下的4096维特征(fc7层)
    • 正样本:Ground Truth
    • 负样本:与Ground Truth相交IoU<0.3的建议框,由于负样本太多,采用hard negative mining的方法在负样本中选取有代表性的负样本
  4. 每一类的Bounding-box regression训练:
    • 正样本:与Ground Truth的IoU最大,且IoU>0.6的Region Proposal

补充

  1. NMS非极大值抑制是什么?
    选择一类(即SVM输出的某一列),对该类下每一个bounding box根据score排序,把score最大的bounding box作为选定的框,计算其余bounding box与当前最大score对应的box的IoU,去除IoU大于设定的阈值的bounding box(说明两者重复了)。然后重复上面的过程,直至候选bounding box为空,最后再将score小于一定阈值的选定框删除得到这一类的结果(然后继续进行下一个分类)。
  2. 为什么微调时和训练SVM时所采用的正负样本阈值(0.5 vs. 0.3】不一致?
    微调阶段是由于CNN对小样本容易过拟合,需要大量训练数据,故对IoU限制宽松;SVM由于其适用于小样本训练,故对样本IoU限制严格。这也可以解释为什么要先微调CNN,然后利用微调后的CNN进行特征提取,再用来训练SVM,而不是直接训练联合训练,因为两者对正负样本的定义方式有区别。

SPP-NET

创新点

R-CNN中单幅图片大约有2000个region proposal,重复用CNN为每个region proposal提取特征是极其费时的,因此SPP-net提出:能否在feature map上提取ROI(即region proposal)特征,这样就只需要在整幅图像上做一次卷积,大大提高了速度。这样就要求SPP-NET解决两个问题:
1. 原始图像的ROI如何映射到特征图(一系列卷积层的最后输出)
2. ROI在特征图上的对应的特征区域的维度不满足全连接层的输入要求怎么办(又不可能像R-CNN一样在输入CNN之前对原始ROI图像上那样进行wrap)

整体流程框架

事实上,CNN的卷积层不需要固定尺寸的图像,全连接层是需要固定大小输入的,因此提出了SPP层放到卷积层的后面,全连接层的前面改进后的网络如下图所示:
RCNN系列总结(RCNN,SPPNET,Fast RCNN,Faster RCNN)_第1张图片
1. 首先解决第一个问题,如何映射原始图像的ROI到卷积后得到的feature map上。
下面从感受野、感受野上面的坐标映射及原始图像的ROI如何映射三方面阐述(参考2)。
1.1 感受野
CNN中,感受野的定义是卷积神经网络每一层的feature map上的像素点在原始图像上映射的区域大小。计算方法:

output field size = ( input field size - kernel size + 2*padding ) / stride + 1

反过来就是感受野大小的计算公式:

input field size = (output field size - 1)* stride - 2*padding + kernel size

1.2 感受野上面的坐标映射
RCNN系列总结(RCNN,SPPNET,Fast RCNN,Faster RCNN)_第2张图片
1.3 原始图像的ROI如何映射
SPP-NET是把原始ROI的左上角和右下角 映射到Feature Map上的两个对应点。 有了Feature Map上的两个角点就确定了对应的Feature Map 区域。
2. 再解决第二个问题,如何使feature map上的ROI对应的维度满足全连接层固定输入维度的要求。
RCNN系列总结(RCNN,SPPNET,Fast RCNN,Faster RCNN)_第3张图片
使用空间金字塔池化层(Spatial Pyramid Pooling)替代原来的pool5,思路是对于任意大小的feature map(将原图任意大小的ROI映射到全图卷积后的feature map上得到的不同尺寸的小feature map),例如首先将其分成16、4、1个块(window size),然后在每个块上最大池化,池化后的特征拼接得到一个固定维度的输出,以满足全连接层的需要。
假设原图输入是224x224,对于conv5出来后的输出是13x13x256的,。如果像上图那样将reponse map分成1x1,2x2,4x4三张子图,分别做max pooling后,出来的特征就是(16+4+1)x256 维度。如果原图的输入不是224x224,出来的特征依然是(16+4+1)x256维度。这样就实现了不管图像尺寸如何,SPP池化的输出永远是 (16+4+1)x256 维度。 实际运用中只需要根据全连接层的输入维度要求设计好空间金字塔即可。

训练方法

CNN理论上说,SPP-NET支持直接以多尺度的原始图片作为输入后直接BP即可。实际上,caffe等实现中,为了计算的方便,输入是固定了尺度了的。
文献中采用两种不同的方式,单一尺寸训练和多尺寸训练。实验结果表明使用多训练得到的SPP-Net效果更好。其中,多尺寸训练利用两种尺度图像对网络进行了训练,224x224的图片通过随机crop得到,180x180的图片通过缩放224x224的图片得到。为了降低从一个尺寸向另一个尺寸切换的开销,文章在每个尺寸上训练一个完整的epoch,然后在下一个epoch再切换到另一个尺寸(权重保留)。
注意,上面的单尺寸或多尺寸只用于训练。在测试阶段,是直接对各种尺寸的图像应用SPP-NET的。
对SVM及BoundingBox回归的训练同R-CNN一致,此处不再赘述。

存在的问题

  1. 同R-CNN一样分开训练CNN和SVM、BB回归器,训练SVM的特征需要提前保存在磁盘需要巨大的存储空间;多段训练实现较复杂
  2. CNN和SVM的训练独立导致SVM的训练Loss无法更新SPP-Layer之前的卷积层参数,因此即使采用更深的CNN网络进行特征提取,也无法保证SVMs分类器的准确率一定能够提升(参考3)
  3. 使用selective search的方法提取region proposal,是在CPU上进行的,较GPU慢

Fast R-CNN

创新点

直接使用Softmax替代了R-CNN中SVM进行分类,同时在网络中加入了多任务函数边框回归,实现了端到端的训练(除SS Region Proposal阶段)

整体流程框架

RCNN系列总结(RCNN,SPPNET,Fast RCNN,Faster RCNN)_第4张图片
1. 生成region proposal: 方法选用selective search,大约2K个/图,即ROI(同R-CNN和SPP-NET)
2. 把它们整体输入到CNN中,在最后一个卷积层上对每个ROI求映射关系(同SPP-NET),并用一个ROI pooling layer来统一到相同的大小(替代掉最后一个pooling层)。
这里ROI pooling layer实际就是单层SPP layer,具体实现将ROI对应的feature map区域下采样到7x7。
3. 经过两个全连接层得到特征向量。分别输入到用于分类的softmax和bounding box回归。
利用SoftMax Loss和Smooth L1 Loss对分类概率和边框回归(Bounding Box Regression)联合训练(详见参考4)。
Joint training
其中边框回归Loss使用SmoothL1Loss:
RCNN系列总结(RCNN,SPPNET,Fast RCNN,Faster RCNN)_第5张图片

训练方法

  1. 预训练
    用了3种预训练的ImageNet网络(VGG16等)初始化Fast RCNN:
    • 最后一个max pooling层替换为RoI pooling层,设置为与第一个全连接层兼容
    • 最后一个全连接层和softmax(原本是1000个类)替换为softmax的对K+1个类别的分类层(1为背景),和bounding box 回归层。
  2. 微调
    在SPP-NET中,微调采用RoI-centric sampling,从所有图片的所有RoI中均匀取样,由于BP需要计算每一个RoI感受野的卷积层,通常会覆盖整个图像,这样就会导致速度太慢,只能微调SPP层后面的全连接层,无法同时微调前面的卷积层。
    而Fast R-CNN采用image-centric sampling,每个mini-batch由N个图片(N=2)中的R个Proposal(R=128)组成,同一图像的RoI共享计算和内存,这种方式比从128张不同图片中提取1个Proposal的方式块64倍,可以同时微调卷积层和全连接层,注意,实验发现太浅层的卷积层不需要微调,可以减少训练时间,而且mAP基本没有差别。

补充

  1. 在分类中,计算全连接层比卷积层快,而在检测中由于一个图中要提取2000个RoI,所以大量时间都用在计算全连接层了。文中采用Truncated SVD奇异值分解的方法来减少计算全连接层的时间(详见参考5)。
  2. 多尺度图像训练Fast R-CNN与单尺度图像训练相比只能提升微小的mAP,但是时间成本却增加了很多,不建议
  3. 过多region proposal不能提升性能

Faster R-CNN

创新点

  1. 提出Region Proposal Network(RPN),实现了一个完全的End-To-End的CNN目标检测模型
  2. 共享RPN与Fast R-CNN的特征

整体流程框架

RCNN系列总结(RCNN,SPPNET,Fast RCNN,Faster RCNN)_第6张图片
1. Faster-RCNN把整张图片送入CNN,进行特征提取。
2. 在最后一层卷积feature map上生成region proposal(通过RPN),每张图片大约300个建议窗口。
RCNN系列总结(RCNN,SPPNET,Fast RCNN,Faster RCNN)_第7张图片
RPN网络的设计:用n×n的滑动窗口在特征图上滑动扫描(代替了从原始图滑窗获取特征),每个滑窗位置通过卷积层1映射到一个低维的特征向量后采用ReLU,并为每个滑窗位置考虑k=9种可能的参考窗口(论文中称为anchors,见下解释),对于一个W×H的特征图,就会产生W×H×k个区域建议。低维特征向量输入两个并行连接的卷积层2,分别用于回归区域建议产生bounding-box和对区域建议是否为前景或背景打分,这里由于每个滑窗位置产生k个区域建议,所以reg层有4k个输出来编码(平移缩放参数)k个区域建议的坐标,cls层有2k个得分估计k个区域建议为前景或者背景的概率。
Anchors:锚点,位于n*n的滑动窗的中心,对应每个锚点都可以提出k个reference boxes(文中是9个,3中scale*3种尺寸)。Anchors具有平移不变性。
3. 通过RoI pooling层(其实是单层的SPP layer)使得每个建议窗口生成固定大小的feature map。
4. 经过两个全连接层得到特征向量。分别输入到用于分类的softmax和bounding box回归。

训练方法

首先对RPN的Loss function进行定义:
由classification loss (即softmax loss)和regression loss (即L1 loss)按一定比重组成。计算softmax loss需要的是anchors对应的groundtruth标定结果和预测结果,计算regression loss需要三组信息:1.预测框,即RPN网络预测出的proposal的中心位置坐标x,y和宽高w,h;2.锚点reference box:之前的9个锚点对应9个不同scale和aspect_ratio的reference boxes,每一个reference boxes都有一个中心点位置坐标x_a,y_a和宽高w_a,h_a。3.ground truth:标定的框也对应一个中心点位置坐标x*,y*和宽高w*,h*。(这里个人理解不是非常清楚,参考自王博的博客)。
1. RPN网络预训练与微调
ImageNet网络(ZF或VGG-16)进行有监督预训练,利用其训练好的网络参数初始化RPN。以区域建议为目的的RPN网络end-to-end微调训练(上文中的RPN网络的loss function)。
2. Fast R-CNN网络预训练与微调
同样使用ImageNet网络初始化,使用上一步RPN网络产生的region proposal作为输入微调Fast R-CNN网络。
3. 使用第2步中微调后的Fast R-CNN网络重新初始化RPN网络,固定共享卷积层(设置学习率为0),仅微调RPN网络独有的层。
4. 固定共享卷积层,利用第3步中得到的region proposal,仅微调Fast R-CNN独有的层,实现特征共享训练。

补充

  1. 文中anchors的数目:对于1000×600的一张图像,大约有20000(~60×40×9)个anchors,忽略超出边界的还剩下6000个,利用非极大值抑制去掉重叠区域,剩2000个用于训练(一个epoch,随机从一幅图的2000个anchors采样256个作为一个Mini-batch训练RPN网络,正负样本比例约为1:1); 测试时在2000个区域建议中选择Top-N【文中为300】个区域建议用于Fast R-CNN检测。

你可能感兴趣的:(RCNN系列总结(RCNN,SPPNET,Fast RCNN,Faster RCNN))