本文最后更新于:2020年8月7日 中午

上一次的总结主要针对One-Stage的YOLO系列目标检测算法,本次主要学习了Two-Stage的R-CNN系列基于候选窗口的目标检测算法,包括:R-CNN[2]、Fast R-CNN[4]、Faster R-CNN[5]。

R-CNN系列算法由以下三个独立的步骤组成:产生候选窗口、特征提取、SVM分类及窗口回归。由于R-CNN和Fast R-CNN使用Selective Search方法来提取候选窗口,遂找来Selective Search的论文进行学习[1]。此外,Fast R-CNN提出了一个ROI池化层,其实质上是SPP-Net的一个特殊情况,故扩展阅读了SPP-Net的论文[3]。

代码方面:下载了YOLO的权重进行了运行测试,开始学习PyTorch。

阅读文献:

[1] Uijlings J R R, Van De Sande K E A, Gevers T, et al. Selective search for object recognition[J]. International journal of computer vision, 2013, 104(2): 154-171.

[2] Girshick R, Donahue J, Darrell T, et al. Rich feature hierarchies for accurate object detection and semantic segmentation[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2014: 580-587.

[3] He K, Zhang X, Ren S, et al. Spatial pyramid pooling in deep convolutional networks for visual recognition[J]. IEEE transactions on pattern analysis and machine intelligence, 2015, 37(9): 1904-1916.

[4] Girshick R. Fast r-cnn[C]//Proceedings of the IEEE international conference on computer vision. 2015: 1440-1448.

[5] Ren S, He K, Girshick R, et al. Faster r-cnn: Towards real-time object detection with region proposal networks[C]//Advances in neural information processing systems. 2015: 91-99.

1.Selective Search

传统的目标检测算法大多数以图像识别为基础。在图片上使用穷举法或者滑动窗口选出所有物体可能出现的区域框,对这些区域框提取特征并进行使用图像识别分类方法,得到所有分类成功的区域后,通过非极大值抑制输出结果。

穷举法或滑动窗口法就是在原始图片上使用不同尺度不同大小的滑窗,获取每个可能的位置。缺点是复杂度太高,产生了很多的冗余候选区域,而且由于不可能每个尺度都兼顾到,因此得到的目标位置也不准。选择性搜索有效地去除冗余候选区域,使得计算量大大的减小。

selective search首先通过基于图的图像分割方法初始化原始区域,将图像分割成很多的小块。然后使用贪心策略,计算每两个相邻的区域的相似度,然后每次合并最相似的两块,直到最终只剩下一块完整的图片。将其中每次产生的图像块包括合并的图像块都保存下来,这样就得到图像的分层表示了。

Selective Search算法框架:

  • 输入:彩色图片。
  • 输出:物体可能的位置,实际上是很多的矩形坐标。
  • 首先,将图片初始化为很多小区域R。初始化一个相似集合为空集:S
  • 计算所有相邻区域之间的相似度(考虑了颜色、纹理、尺寸和空间交叠4个参数),放入集合 S 中,集合 S 保存的是一个区域对以及它们之间的相似度。
  • 找出 S 中相似度最高的区域对,将它们合并,并从 S 中删除与它们相关的所有相似度和区域对。重新计算这个新区域与周围区域的相似度,放入集合 S 中,并将这个新合并的区域放入集合 R 中。重复这个步骤直到 S 为空。
  • 从 R 中找出所有区域的 bounding box(即包围该区域的最小矩形框),这些 box 就是物体可能的区域。

2.R-CNN

img

R-CNN总体思路: 通过Selective Search检测出Region proposals ——> 使用CNN提取Region特征——>使用SVM对提取到的特征进行分类 ——>执行非极大值抑制得到Bbox及其类别

由于卷积神经网络的输入为227*227大小的正方形图像,而Selective Search算法搜索到的是2000个大小不一的矩形候选框。因此需要对搜索到的矩形选框进行缩放处理,文章试验了两种不同的处理方法:

(1) 各向异性缩放:即忽略原始图像的长宽比,直接将其扭曲缩放至227*227

(2) 各向同性缩放:由于扭曲的图片会对后续CNN的训练精度产生影响,作者测试了两种各向同性缩放方案。

a) 直接在原始图片中将Bounding Box的边界延展为正方形,如果已经延伸到原始图片的边界,则使用Bounding Box中的颜色均值填充。

b) 先将Bounding Box的裁剪出来,使用其颜色均值将背景填充为正方形图片。

当缺乏大量的标注数据时,作者提出了一个比较好的可行手段,即进行神经网络的迁移学习。先在其他大型数据集预训练神经网络,然后在小规模特定的数据集中进行 fine-tune 微调。在使用Selective Search提取候选区域并进行Resize后,接下来使用CNN为每个候选区域提取特征,本文训练CNN的方法主要包括两步:

(1) 预训练阶段。由于物体标签训练数据少,如果要直接采用随机初始化CNN参数的方法是不足以从零开始训练出一个好的CNN模型。基于此,本文采用的是有监督的预训练,使用一个大的数据集(ImageNet ILSVC 2012)来训练AlexNet,得到一个分类的预训练模型(需要预测1000个类别)。注意:在ImageNet上训练的是模型识别物体类型的能力,而不是预测bbox位置的的能力。

(2) Fine-tuning阶段:在PASCAL VOC上对预训练模型进行fine-tuning。将预训练阶段的CNN模型最后一层全连接层的1000个神经元,替换成21个神经元的分类层(20类物体+背景)(这一层采用随机初始化),然后计算每个候选区域和ground truth 的IoU,对于IoU>0.5的候选区域被视为正样本,否则为负样本(即背景)。在每次迭代的过程中,batch size大小选择128,包括32个正样本和96个负样本(正负比:1:3)。使用0.001的学习率和随机梯度下降(SGD)来进行训练。

本文为每一个类训练一个SVM分类器,故共有21个分类器,每个SVM分类器的输入包括两个部分:

(1) CNN Feature:CNN网络为每个候选区域提取的特征,大小为2000*4096

(2) Ground Truth Labels:在训练时为每个候选区域附上一个label。

在SVM分类过程中,当IoU<0.3时为负样本,其余为正样本。

总结:

  • R-CNN采用AlexNet网络架构
  • R-CNN采用Selective Search生成候选区域
  • R-CNN先在ImageNet上进行预训练,然后利用成熟的权重参数在PASCAL VOC上进行fine-tune.
  • R-CNN使用CNN抽取特征,然后使用一系列的SVM做类别预测
  • R-CNN在Pascal VOC 2012 的数据集上,能够将目标检测的验证指标 mAP 提升到 53.3%,这相对于之前最好的结果提升了 30%。

R-CNN的缺点:

  • 训练时间长:分阶段多次训练,而且对每个候选区域都要单独计算一次Feature map。
  • 占用空间大:每个候选区域的Feature map都要写入磁盘保存。
  • 步骤繁多:整个模型包括多个模块,且每个模块是相互独立的。
  • 重复计算:多数候选区域是互相重叠的,重叠部分会被多次提取Feature。

3.SPP-Net

CNN一般都含有卷积层和全连接层,其中卷积层无需固定尺寸的图像,而全连接层则需要固定大小的输入。

在R-CNN网络结构模型中,由于卷积神经网络的全连接层对于输入的图像尺寸有限制,所以所有候选区域的图像都必须经过变形转换后才能交由卷积神经网络模型进行特征提取,但是无论采用剪切(crop)还是采用变形(warp)的方式,都无法完整保留原始图像信息,何凯明等人提出的空间金字塔池化层(Spatial Pyramid Pooling Layer)有效地解决了传统卷积神经网络对输入图像的尺寸的限制。

SPP-Net在最后一个卷积层后,加入了一个空间金字塔池化层,用来保证传到下一层全连接层的输入固定。在普通的CNN机构中,输入图像的尺寸往往是固定的(比如224*224像素),输出则是一个固定维数的向量。SPP Net在普通的CNN结构中加入了ROI池化层(ROI Pooling),使得网络的输入图像可以是任意尺寸的,输出则不变,同样是一个固定维数的向量。ROI池化层一般跟在卷积层后面,此时网络的输入可以是任意尺度的,在SPP layer中每一个pooling的filter会根据输入调整大小,而SPP的输出则是固定维数的向量,然后给到全连接层。

此外,SPP-net也解决了R-CNN重复计算的问题。SPP-net的思路是由于原图与经过卷积层后得到的特征图在空间位置上存在一定的对应关系,所以只需对整张图像进行一次卷积层特征提取然后将候选区域在原图的位置映射到卷积层的特征图上得到该候选区域的特征,最后将得到每个候选区域的卷积层特征输入到全连接层进行后续操作。R-CNN要对每个区域计算卷积,而SPPNet只需要计算一次卷积,从而节省了大量的计算时间,比R-CNN有一百倍左右的提速。

SPP-net网络结构如下图所示,输入一副任意尺度的待测图像,用CNN可以提取得到卷积层特征(例如VGG16最后的卷积层为Conv5_3,得到256幅特征图)。然后将不同大小候选区域的坐标投影到特征图上得到对应的窗口(window),将每个window均匀划分为44, 22, 11的块,然后对每个块使用Max-Pooling下采样,这样无论window大小如何,经过SPP层之后都得到了一个固定长度为(44+22+1)256维的特征向量,将这个特征向量作为全连接层的输入进行后续操作。这样就能保证只对图像提取一次卷积层特征,同时全连接层的输入维度固定。

img

SPP-Net整体流程:

(1) 输入一幅待检测图像

(2) 提取候选区域:利用Selective Search算法从输入图像中提取约2000个候选框。

(3) 候选区域尺度缩放:以候选区域长宽中的较短边进行统一。

(4) 特征提取:利用SPP-net网络结构提取特征。

(5) 分类与回归:根据提取的特征利用SVM进行分类,用边框回归器微调候选框的位置。

总结:

  • SPP-Net使得任意大小的特征图都能够转换成固定大小的特征向量。
  • R-CNN要对每个候选区域计算卷积,而SPP-Net只需要对原图计算一次卷积,从而节省了大量的计算时间,比R-CNN有一百倍左右的提速。
  • SPP-Net解决了R-CNN重复提取候选区域特征的问题,同时允许各种尺寸图像作为输入,解决了图像畸变的问题,但R-CNN的其它问题,如训练步骤繁琐、磁盘空间开销大等依然有待解决。

4. Fast R-CNN

针对R-CNN存在的问题,Fast R-CNN逐一进行了解决:

(1) 训练、测试速度慢:R-CNN中用CNN对候选区域提取特征,而一张图片的2000个候选区域有大量重叠部分,重叠部分会被多次重复提取特征,造成大量的计算开销。Fast R-CNN将整个图像归一化后直接送入CNN网络,卷积层不进行候选区域的特征提取,而是在最后一个池化层中加入候选区域坐标信息,进行特征提取的计算。

(2) 训练所需空间大:R-CNN中目标分类与候选框回归是两个独立的操作,并且需要大量特征作为训练样本。Fast R-CNN将目标分类与候选框回归统一到CNN网络中,不需要将每个候选区域的Feature map写入磁盘保存。

Fast R-CNN的网络结构如下图所示:

img

Fast R-CNN的输入由两部分组成:一是待处理的整张图像;二是候选区域(region proposal)。Fast R-CNN处理的第一步是对图像进行多次卷积核池化处理来获取卷积特征图。由于存在多个候选区域,系统会有一个甄别,判断出感兴趣区域,也就是Region of Interest, RoI。RoI池化层是SSP(Spatial Pyramid Pooling)层的特殊情况,它可以从特征图中提取一个固定长度的特征向量。每个特征向量,都会被输送到全连接层序列中,这个全连接层分支成两个同级输出层。其中一层的功能是进行分类,对目标关于K个对象类(包括全部“背景background”类)输出每一个RoI的概率分布,也就是产生softmax概率估计;另一层是为了输出K个对象中每一个类的四个实数值(bbox regression)。每4个值编码K个类中的每个类的精确边界框(bounding-box)位置。整个结构是使用多任务损失的端到端训练 (除去Region Proposal提取阶段)。

与R-CNN框架图对比,可以发现主要有两处不同:一是最后一个卷积层后加了一个ROI池化层,二是损失函数使用了多任务损失函数(multi-task loss),将边框回归Bounding Box Regression直接加入到CNN网络中训练

(1) ROI池化层实际上是SPP-NET的一个精简版,可以看成是SPP层的一个特殊情况。SPP-Net对每个候选区域使用了不同大小的金字塔映射,而ROI池化层只需要下采样到一个7x7的特征图。对于VGG16网络conv5_3有512个特征图,这样所有候选区域对应了一个77512维度的特征向量作为全连接层的输入。ROI池化层与SPP-Net的效果一样,可以将不同大小的输入映射到一个固定尺度的特征向量。卷积、池化、relu等操作都不要求固定的size,在原始图片上进行这些操作后,因输入图片的size不同,就会导致得到的feature map的尺寸也不相同,不能直接连接到全连接层进行分类。因此加入ROI池化层后,对每个候选区域都提取出一个固定维度的特征表示,再通过softmax进行分类。

(2) Fast R-CNN使用softmax替代R-CNN的SVM进行分类,同时利用多任务损失函数将边框回归直接加入到CNN网络中训练,这样整个训练过程只包含提取候选区域和CNN训练两个阶段。整个训练过程是端到端的(除去提取候选区域阶段)。此前R-CNN的训练过程分为四步:提取候选区域、使用CNN提取特征、使用SVM分类器、回归Bbox。而在Fast R-CNN中,作者将最后一步回归Bbox放进了CNN内部,与Region分类合并为一个multi-task模型。实验也证明,这两个任务能共享卷积特征,并且可以相互促进。

主要创新点:

  • 借助多任务损失函数,将物体识别和位置修正合并到一个网络中,不再进行分步训练。
  • 共享卷积层,不再像R-CNN一样每个候选框都使用CNN提取特征,而是输入一张完整的图片,在第五个卷积层再得到每个候选框的特征。
  • 不需要在硬盘中存储训练过程中的特征数据。
  • 用ROI层代替SPP层,可以使用BP算法更高效的训练更新整个网络。
  • 相较于R-CNN和SPP-Net,检测结果的精确度更高
  • 对全连接层提出了SVD奇异值分解的优化方法,降低了全连接层需要学习的参数数目,节省计算时间。

缺点:

  • 仍然使用Selective Search方法提取候选框,耗费时间大。

5. Faster R-CNN

针对Fast R-CNN依然使用选择搜索方法提取候选框耗时较大的问题,Faster R-CNN加入了一个提取边缘的神经网络,即将搜索候选框的工作也交由神经网络。具体来说,Faster R-CNN引入了Region Proposal Network(RPN)替代Selective Search,同时引入anchor box以应对目标形状变化问题。(Anchor box就是位置和大小固定的box,可理解为实现设定好的固定的proposal)Faster R-CNN将RPN放在最后一个卷积层后面,RPN直接训练得到候选区域。Faster RCNN抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。

img

各层功能:

(1) Conv layers卷积层提取特征图:Faster R-CNN首先使用一组基础的conv+relu+pooling层提取输入图像的特征图,该特征图会用于后续的RPN层和全连接层。

(2) RPN(Region Proposal Networks)层:RPN网络主要用于生成候选区域,首先生成一堆Anchor Box,对其进行裁剪过滤后使用Softmax来判断该Anchor Box是属于前景或者背景(即是物体或不是物体),是一个二分类问题。同时另一分支的边界框回归来修正Anchor Box,形成更精确的proposal.

(3) ROI池化层:该层利用RPN生成的Proposals和VGG16最后一层得到的Feature map得到固定大小的Proposal Feature map,以供后续利用全连接操作进行目标识别和定位。

(4) Classifier:将Roi Pooling层形成固定大小的feature map进行全连接操作,利用Softmax进行具体类别的分类,同时,利用L1 Loss完成bounding box regression回归操作获得物体的精确位置。

img

上图中RPN网络实际分为2条线,上面的网络分支通过softmax分类anchors获得前景和背景(实际应用过程中,我们将目标默认为前景);下面的网络分支用于计算对于anchors的边界框回归的偏移量,以获得较精确的目标候选区。(注:这里的较精确是相对于后面全连接层的再一次box regression而言)。之后的Proposal层综合前景锚点和边界框回归偏移量获取目标的候选区,同时剔除太小和超出边界的目标区域。RPN实际就是实现了目标定位功能。

RPN网络:

img

(1) RPN网络的作用就是将候选区域的提取也整合到了神经网络中,而且RPN网络和Fast R-CNN共用卷积网络,几乎没有增加计算量。

(2) RPN提取候选框的方法是对conv feature map上的每个点为中心取9种不同比例大小的anchors(3种尺度,3种比例),再按照比例映射到原图中即为提取的region proposals。具体的实现方法如上图,先用一个256维的33卷积核以步长为1进行特征提取,这样就可以得到一个2561的特征向量,将这个256长度的特征向量分别输入两个全连接层,其中一个输出长度为29=18表示9个anchors是物体和不是物体的概率,另一个输出长度为49=36表示每个proposals的四个坐标。

(3) 在得到了概率和bbox的坐标之后映射到原图中得到region proposals,再进行一次非极大值抑制(NMS)得到最终输入ROI池化层的proposals。

创新点:

  • 设计了RPN网络,利用CNN卷积后的特征图生成候选区域,取代了SS和EB等方法,极大地提升了生成候选区域的速度。
  • 训练RPN与Fast R-CNN共享部分卷积层,极大地提升了检测速度。

6.总结:

  • R-CNN(Selective Search + CNN + SVM)

    • 使用Selective Search提取候选区域。
    • 使用CNN抽取特征,然后使用一系列的SVM做类别预测。
    • 创新点:提出了Region Proposal并与CNN、SVM结合,实现目标检测。
    • 缺点:训练时间长、占用空间大、步骤繁多、重复计算。
  • SPP-net(ROI Pooling)

    • 使得任意大小的特征图都能够转换成固定大小的特征向量。
    • R-CNN要对每个候选区域计算卷积,而SPP-Net只需要对原图计算一次卷积,节省了大量的计算时间。
    • SPP-Net解决了R-CNN重复提取候选区域特征的问题,同时允许各种尺寸图像作为输入。
    • 解决了图像畸变的问题。
  • Fast R-CNN(Selective Search + CNN + ROI)

    • 借助多任务损失函数,将物体识别和位置修正合并到一个网络中,不再进行分步训练。
    • 共享卷积层
    • 无需在硬盘中存储训练过程中的特征数据。
    • 用ROI层代替SPP层,可以使用BP算法更高效的训练更新整个网络。
    • 相较于R-CNN和SPP-Net,检测结果的精确度更高
    • 对全连接层提出了SVD奇异值分解的优化方法,降低了全连接层需要学习的参数数目,节省计算时间。
    • 缺点:仍然使用Selective Search方法提取候选框,耗费时间大。
  • Faster R-CNN(RPN + CNN + ROI)

    • 引入RPN替代Selective Search,极大提升了生成候选区域的速度。
    • 将候选区域的提取也整合到了神经网络中。引入anchor box以应对目标形状变化问题。

基于候选区域的R-CNN系列目标检测方法是当前目标检测领域最主要的一个分支,从R-CNN, SPP-NET, Fast R-CNN, 到Faster R-CNN,算法流程变得越来越精简,精度越来越高,速度也越来越快。

附:YOLO算法运行结果

img
img