在博文 中对R-CNN进行了简单介绍,这里在R-CNN的基础上简单介绍下Fast R-CNN。
在R-CNN网络结构模型中,由于卷积神经网络的全连接层对于输入的图像尺寸有限制,所以所有候选区域的图像都必须经过变形转换后才能交由卷积神经网络模型进行特征提取,但是无论采用剪切(crop)还是采用变形(warp)的方式,都无法完整保留原始图像信息,何凯明等人提出的空间金字塔池化层(Spatial Pyramid Pooling Layer)有效地解决了传统卷积神经网络对输入图像的尺寸的限制。
SPP-net:R-CNN候选区域缩放后的畸变问题和提取特征时的重复计算导致了模型性能和速度的瓶颈。为了解决这些问题,2015年,何凯明等人提出了SPP-net,在保证性能的同时,检测速度也有了较大的提升,论文名字为” Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition”, 可从https://arxiv.org/pdf/1406.4729.pdf 直接下载。
R-CNN需要对候选区域进行缩放的原因是全连接层的输入维度必须固定。整个网络包含底部的卷积层和顶部的全连接层,卷积层能够适应任意尺寸的输入图像,产生相应维度的特征图,但是全连接层不同,全连接层的参数是神经元对于所有输入的连接权重,即如果输入维度不固定,全连接层的参数数量也无法确定,网络将无法训练。为了既能固定全连接层的输入维度又不让候选区域产生畸变,很自然的想法就是在卷积层和全连接层的衔接处加入一个新的网络层,使得通过该层后特征的维度可以固定,在SPP-net中引入的空间金字塔池化层(Spatial Pyramid Pooling Layer, SPP Layer)就是这样一种网络层,SPP-net也因此得名。
此外,SPP-net也解决了R-CNN重复计算的问题。SPP-net的思路是由于原图与经过卷积层后得到的特征图在空间位置上存在一定的对应关系,所以只需对整张图像进行一次卷积层特征提取,然后将候选区域在原图的位置映射到卷积层的特征图上得到该候选区域的特征,最后将得到每个候选区域的卷积层特征输入到全连接层进行后续操作。
SPP-net网络结构如下图所示,输入一副任意尺度的待测图像,用CNN可以提取得到卷积层特征(例如VGG16最后的卷积层为Conv5_3,得到512幅特征图)。然后将不同大小候选区域的坐标投影到特征图上得到对应的窗口(window),将每个window均匀划分为4*4, 2*2, 1*1的块,然后对每个块使用Max-Pooling下采样,这样无论window大小如何,经过SPP层之后都得到了一个固定长度为(4*4+2*2+1)*512维的特征向量,将这个特征向量作为全连接层的输入进行后续操作。这样就能保证只对图像提取一次卷积层特征,同时全连接层的输入维度固定。
空间金字塔池化层与传统的池化层的不同在于空间金字塔池化层由不同尺度的池化层构成,并且池化层的大小是与输入的特征图矩阵的大小成正比。设输入特征图矩阵的尺寸为 a*a,输入特征图矩阵的数目为k,池化层的分割尺度为n*n,则该池化层的窗口大小为「a/n],移动步长为[a/n」,输出的池化后的特征向量长度为n*n*k维,n可以取多个值,构成多个尺度上的池化层,这样空间金字塔池化层的输出特征向量的维度只与输入特征图矩阵的数目与池化层的分割尺度有关,因此不再对网络模型的输入图像有尺寸限制。
SPP-net的目标检测整体流程:
(1). 输入一幅待检测图像;
(2). 提取候选区域:利用Selective Search算法在输入图像中提取出约2000个最有可能包含目标实例的候选框;
(3). 候选区域尺度缩放:候选区域长宽中的较短边长度进行统一,即min(w, h)=s, s∈{480, 576, 688, 864, 1200},s取值标准是使得统一后的候选区域尺寸与224*224最接近;
(4). 特征提取:利用SPP-net网络结构提取特征;
(5). 分类与回归:根据所提特征,利用SVM进行分类,用边框回归器微调候选框的位置。
空间金字塔池化操作有许多明显的优点:一是实现了任意尺寸输入,固定大小输出。层多可对任意尺度提取的特征进行池化。二是大大降低了计算时间。将某一大小的图片输入到卷积神经网络中,结果特征值提取处理得到了特征图(feature maps),然后利用空间金字塔池化对所有的候选框进行处理可以得到长度固定的特征向量。相比之下,R-CNN是将所有的候选框一一输入之后再进入CNN来处理,在R-CNN中,一般使用Selective Search方法将一种图片生成多个(2000左右)候选区,再对于每个候选框内图像块提取特征,使用分类器判别对候选框中提取出的这些特征是否属于一个特定类。对于属于某一特征的候选框,用回归器进一步调整其位置。使用过分割的方法将数据分割成小区域,然后不断地重复合并可能性最高的两个区域直到整张图像上合并成一个区域为止。因为空间金字塔池化操作对整张图片的特征提取过程是操作了一次。R-CNN遍历一个CNN 2000次,而SPP-net只遍历了1次,而两者最后都是采用SVM算法进行特征向量分类识别,所以整体计算速度提高了很多倍。
SPP layer一般跟在卷积层后面,此时网络的输入可以是任意尺度的,在SPP layer中每一个pooling的filter会根据输入调整大小,而SPP的输出则是固定维数的向量,然后给到全连接FC层。
SPP-net解决了R-CNN重复提取候选区域特征的问题,同时允许各种尺寸图像作为输入,解决了图像畸变的问题,但R-CNN的其它问题,如训练步骤繁琐、磁盘空间开销大等依然有待解决。
为了解决R-CNN训练速度慢、训练所需空间大的问题,R-CNN的原作者Ross Girshick对R-CNN做出了改进,提出了Fast R-CNN,该网络吸收了SPP-net的特点,使得目标检测的速度大幅提升,论文名字为”Fast R-CNN”,可以从https://www.cv-foundation.org/openaccess/content_iccv_2015/papers/Girshick_Fast_R-CNN_ICCV_2015_paper.pdf 直接下载。
Fast R-CNN的网络结构如下图所示:Fast R-CNN的输入由两部分组成:一是待处理的整张图像;二是候选区域(region proposal)。Fast R-CNN处理的第一步是对图像进行多次卷积核池化处理来获取卷积特征图。由于存在多个候选区域,系统会有一个甄别,判断出感兴趣区域,也就是Region of Interest, RoI。RoI池化层是SSP(Spatial Pyramid Pooling)层的特殊情况,它可以从特征图中提取一个固定长度的特征向量。每个特征向量,都会被输送到全连接(FC)层序列中,这个FC分支成两个同级输出层。其中一层的功能是进行分类,对目标关于K个对象类(包括全部”背景background”类)输出每一个RoI的概率分布,也就是产生softmax概率估计;另一层是为了输出K个对象中每一个类的四个实数值(bbox regression)。每4个值编码K个类中的每个类的精确边界框(bounding-box)位置。整个结构是使用多任务损失的端到端训练(trained end-to-end with a multi-task loss)(除去Region Proposal提取阶段)。
Fast R-CNN的主要创新点有:将最后一个卷积层的SSP Layer改为RoI Pooling Layer;另外提出了多任务损失函数(Multi-task Loss),将边框回归直接加入到CNN网络中训练,同时包含了候选区域分类损失和位置回归损失。
RoI Pooling Layer:实际上是SPP Layer的简化版,SPP Layer对每个候选区域使用了不同大小的金字塔映射,即SPP Layer采用多个尺度的池化层进行池化操作;而RoI Pooling Layer只需将不同尺度的特征图下采样到一个固定的尺度(例如7*7)。例如对于VGG16网络conv5_3有512个特征图,虽然输入图像的尺寸是任意的,但是通过RoI Pooling Layer后,均会产生一个7*7*512维度的特征向量作为全连接层的输入,即RoI Pooling Layer只采用单一尺度进行池化。如下图所示:
对于每一个虚线窗口内的卷积特征,SPP层采用3种尺度池化层进行下采样,将每个虚线框分别分成1*1bin, 2*2bin, 4*4bin,对每个bin内的特征分别采用max pooling,这样一共21个bin共得到21维的特征向量,然后将该特征向量送入全连接层中。而对于RoI pooling层则采用一种尺度的池化层进行下采样,将每个RoI区域的卷积特征分成4*4个bin,然后对每个bin内采用max pooling,这样就得到一共16维的特征向量。SPP层和RoI pooling层使得网络对输入图像的尺寸不再有限制,同时RoI pooling解决了SPP无法进行权值更新的问题。RoI pooling层有两个主要作用:第一个:将图像中的RoI区域定位到卷积特征中的对应位置;第二个:将这个对应后的卷积特征区域通过池化操作固定到特定长度的特征,然后将该特征送入全连接层。
Region-of-Interest(RoI) Pooling: It is a type of pooling layer which performs max pooling on inputs (here, convnet feature maps) of non-uniform sizes and produces a small feature map of fixed size (say 7x7). The choice of this fixed size is a network hyper-parameter and is predefined. The main purpose of doing such a pooling is to speed up the training and test time and also to train the whole system from end-to-end (in a joint manner). It's because of the usage of this pooling layer the training & test time is faster compared to original(vanilla?) R-CNN architecture and hence the name Fast R-CNN.
多任务损失函数(Multi-task Loss):Fast R-CNN统一了类别输出任务和候选框回归任务,有两个损失函数:分类损失和回归损失。分类采用softmax代替SVM进行分类,共输出N(类别)+1(背景)类。softmax由于引入了类间竞争,所以分类效果优于SVM,SVM在R-CNN中用于二分类。回归损失输出的是4*N(类别),4表示的是(x,y,w,h分别表示候选框的中心坐标和宽、高)。
SVD对全连接层进行分解:由于一张图像约产生2000个RoI,将近一半多的时间用在全连接层计算,为了提高运算速度,可以用SVD(奇异值分解)对全连接层进行变换来提高运算速度。一个大的矩阵可以近似分解为三个小矩阵的乘积,分解后的矩阵的元素数目远小于原始矩阵的元素数目,从而达到减少计算量的目的。通过对全连接层的权值矩阵进行SVD分解,使得处理一张图像的速度明显提升。
为了减少繁琐的目标检测步骤,Fast R-CNN直接使用Softmax替代SVM分类,同时利用多任务损失函数边框回归也加入到了网络中,这样整个的训练过程只包含提取候选区域和CNN训练两个阶段。此外,Fast R-CNN在网络微调的过程中,不仅微调全连接层,对部分卷积层也进行了微调,得到了更好的检测结果。
Fast R-CNN目标检测主要流程如下:
(1). 输入一张待检测图像;
(2). 提取候选区域:利用Selective Search算法在输入图像中提取出候选区域,并把这些候选区域按照空间位置关系映射到最后的卷积特征层;
(3). 区域归一化:对于卷积特征层上的每个候选区域进行RoI Pooling操作,得到固定维度的特征;
(4). 分类与回归:将提取到的特征输入全连接层,然后用Softmax进行分类,对候选区域的位置进行回归。
Fast R-CNN尽管速度和精度上都有了很大的提升,但仍然未能实现端到端(end-to-end)的目标检测,比如候选区域的获得不能同步进行,速度上还有提升空间。
以上内容均来自网络,主要参考文献如下:
1. 《深度学习及其在工业缺陷自动检测中的应用研究》,华南理工大学,硕论,2016
2. 《复杂场景监控视频个体时间检测》,北京邮电大学,硕论,2017
3. 《基于Faster R-CNN的工业CT图像缺陷检测研究》,南州交通大学,硕论,2018