2014年Ross B. Girshick(RBG)等人在CNN的基础上设计了R-CNN模型,R-CNN(Region-based Convolution Neural Networks, 或Regions with CNN features, R-CNN)摒弃了传统的滑动窗口(通过多尺度滑动窗口确定所有可能的目标区域)和人工选取特征的方法如HOG和SIFT,将候选区域算法Selective Search和卷积神经网络相结合,使得检测速度和精度明显提升。论文发表在2014年的CVPR上,论文名字为” Rich feature hierarchies for accurate object detection and semantic segmentation”,可从https://www.cv-foundation.org/openaccess/content_cvpr_2014/papers/Girshick_Rich_Feature_Hierarchies_2014_CVPR_paper.pdf 直接下载。
R-CNN是一种基于区域的卷积神经网络算法,它在卷积神经网络上应用区域推荐的策略,形成自底向上的目标定位模型。R-CNN的框架如下图所示,左侧为所涉及到的技术,右侧为主要的检测步骤,检测步骤如下:
(1). 区域推荐(region proposal)即候选区域:常见的方法有selective search和edge boxes,给定一张图片,通过选择性搜索算法产生1000~2000个候选边框,但形状和大小是不相同的,这些框之间是可以互相重叠互相包含的;利用图像中的纹理、边缘、颜色等信息,可以保证在选取较少窗口的情况下保持较高的召回率(Recall);
(2). 特征提取:利用卷积神经网络(CNN)对每一个候选边框提取深层特征;
(3). 分类:利用线性支持向量机(SVM)对卷积神经网络提取的深层特征进行分类;
(4). 去除重叠:将非极大值抑制方法应用于重叠的候选边框,挑选出支持向量机得分较高的边框(bounding box)。
区域推荐(候选区域):不同于图像的分类,对于图像的检测问题,我们不仅要对图像中的物体提供类别信息,还要提供其定位信息。通常,对于卷积神经网络模型,研究中较多都采用滑动窗口提供候选区域。但对于R-CNN中采用的深层卷积神经网络而言,其拥有的五层卷积层将会导致巨大的局部感受野(Receptive Field)和步长(Stride),若使用滑动窗口对候选区域进行提取,则对定位的准确性是个挑战。所以,R-CNN采用选择性搜索算法提供区域推荐。
选择性搜索算法:一种基于分层区域合并的图像分割方法,平均每张图片会产生大约 2000 个尺寸不一的候选区域边框,此算法的优点如下:
(1). 能够适应适应图像中不同尺寸的物体:选择性搜索采用图像分割和层次性算法,有效的解决了图像中物体不同尺寸的问题;
(2). 多元的区域合并策略:单一策略无法应对多种类别的图像,选择性搜索使用颜色、纹理、大小等多种策略对分割好的区域进行合并;
(3). 计算速度快:相较于穷举搜索(Exhaustive Search)方法,基于区域合并的选择性搜索算法在速度方面占有绝对的优势。
选择性搜索首先通过使用Felzenszwalb等人的区域分割算法获取原始分割区域,然后通过计算区域之间的相似度不断对区域进行合并,最后形成候选区域边框。
区域合并:由于图像中区域包含的信息比像素多,更能够有效的代表物体的特征,所以,越来越多的物体检测算法采用基于区域的方法,选择性搜索算法便是其中之一。选择性搜索中区域的合并方式采取的是层次式的合并方法,其合并过程类似于哈夫曼树的构造过程,通过计算相似度将区域划分算法获取的原始分割区域进行层次性的合并。具体方法如下:
(1). 根据图像分割算法获取原始分割区域集合R={r1,r2,…,rn};
(2). 初始化相似度集合S=Ø;
(3). 计算两两相邻区域之间的相似度,并将其添加到相似度集合S中;
(4). 从相似度集合S中取出具有最大相似度的两个区域ri和rj,将这两个区域合并为rt,并且从集合S中清除掉ri和rj相关的数据。计算与区域rt相邻的其它区域的相似度并将相似度添加到集合S中,同时更新区域集合R,使得R=R∪rt;
(5). 重复步骤(4)直到相似度集合S为空。
区域相似度计算:选择性搜索会根据区域之间的相似度进行合并,它主要采用以下几种方法对相似度进行计算:
(1). 颜色相似度:选择性搜索共对八种常用的颜色模型进行了研究,如RGB模型、HSV模型等。以RGB模型为例,使用第一范数(L1-norm)归一化获取每个颜色通道的25个区域的直方图,每个区域都有三个通道,故对应于每个区域,将得到一个75维的向量Ci。则不同区域之间通过公式对颜色相似度进行计算。选择性搜索会将相似度最高的一组区域进行合并以组成新的区域,在区域合并过程中需要对新的区域计算其直方图;
(2). 纹理相似度:选择性搜索中纹理相似度计算采用类尺度不变特征转换的特征提取方法。该方法将计算每个颜色通道的八个不同方向方差为σ=1的高斯微分,然后对每个通道中的每个颜色通过第一范数归一化获取10个格(Bin)的直方图,最终可以获得一个240维的向量Ti,然后通过公式计算区域之间纹理相似度;
(3). 大小相似度:这里的大小用区域中像素点的个数来表征,大小相似度则由两区域共同占有的像素量表征。使用大小相似度计算主要是为了尽量让小的区域先进行合并,防止一个区域不断将其余区域吞并,要合并的区域越小并且合并后重叠度越高,则相似度越高;
(4). 吻合相似度:主要是为了衡量两个区域是否重叠度更高,即合并后的区域的边框越小其吻合度越高。
为了得到综合的相似度计算公式,可将以上四种计算方法进行加权求和。
特征提取:指将原始特征转换成一组有明显物理意义的特征,使得构建出的模型效果更好。在物体检测领域的实际应用中,特征数量往往较多,特征之间也可能存在互相依赖,比如深层特征便是从浅层特征中提取加工得来的。好的特征提取算法对于构建优秀的物体检测模型至关重要。特征出现在物体检测的前后多个步骤中,也就是说图像特征是多层次的,而不应仅仅使用某一层次的特征。卷积神经网络便是基于特征层次传递的模型,它的特点是特征提取逐层进行并且逐步抽象。在特征提取时首先把候选区域归一化成同一尺寸227*227。
支持向量机(SVM)分类:R-CNN是线性支持向量机与卷积神经网络的结合,卷积神经网络在解决高维问题时容易陷入局部最优,而支持向量机通过使分类间隔最大化来得到最优的分类面,其算法会转化成一个凸二次规划的问题,故其能得到全局最优解,卷积神经网络和支持向量机进行互补,为最终算法的效果提升提供了保证。
非极大值抑制(Non-maximum Suppression, NMS):在物体检测中应用十分广泛,主要目的是为了消除多余的边框,获得最佳的物体检测的位置,非极大值抑制可以看作是局部最大值的搜索问题。其具体做法为:对于相邻的候选边框,R-CNN会将边框的位置和以其深度图像特征为输入的支持向量机分类得分给出,然后根据支持向量机的分类得分进行降序排列,最后,对每一种类别,从重叠比例(IoU, Intersection over Union)超过设定阈值的候选边框中选取支持向量机分类得分最高的边框当作预测边框,而其他与之重叠的边框会因为得分较小而被舍弃。该方法对R-CNN而言至关重要,因为,通过选择性搜索每张图像会产生大约两千个候选边框,在实际应用中往往会远超过这个数值,虽然支持向量机分类得分小于-1的边框会被舍弃,但还是会存在大量的重叠边框,通过非极大值抑制消除多余的边框,使得最终的检测结果更加简洁有效。
R-CNN网络结构如下图所示:R-CNN算法采用的是8层卷积神经网络对图像进行特征提取,其中前5层是卷积层,其中第一层、第二层、第五层之后跟有最大池化层,后3层是全连接层。这种层次深度是很重要的,因为移去网络中个任何卷积层都会导致网络的性能变差。在输入网络前需要把图像归一化为227*227的固定大小。即输入层为候选区域边框缩放填充得到,输出为该候选区域边框的分类结果。
输入是227*227的RGB图像,共计227*227*3维度的信息。输入图像分别与96个11*11*3的卷积核进行卷积,步长为4,共得到96张特征图,每张特征图大小为55*55。
池化层对第一层卷积层得到的55*55*96的特征图进行池化,池化窗口大小为3*3,步长为2,池化后得到96张大小为27*27的特征图。
池化之后的特征图会被送入第二层卷积层,横向与纵向分别填充2个像素,实际的特征图变为31*31*96,与256个5*5*96的卷积核卷积,卷积核步长为1,得到256张大小为27*27的特征图。
继续进行池化,池化窗口大小为3*3,池化的步长为2。则256张大小为27*27特征图经过池化操作后,将得到256张大小为13*13的特征图。
以此类推,最后便是三个全连接层。将最后一层池化的输出连接成为一个一维向量,作为全连接层的输入,输出则为分类的结果。最后一层全连接层的分类结果是一个n维向量,向量的每一个分量表示属于某一个类别的概率,向量的n个分量之和为1,n个分量中概率值最大的作为样本所属的类别。
可以看出,卷积层中卷积核的数量在逐层增加,其目的是为了消减池化层对特性信息的丢失。池化层虽然在减少计算量和增加平移不变性上有较大的贡献,但其采用的降采样操作会导致图像特征的损失,通过增加卷积核的数量能较好的解决该问题。
R-CNN训练集使用到两个数据库:
(1). ImageNet ILSVRC 2012:一个较大的识别库,标定每张图像中物体的类别,一千万张图像,分为1000类;
(2). PASCAL VOC 2007:一个较小的检测库,标定每张图像中物体的类别和位置,一万张图像,分为20类。
R-CNN训练步骤如下:
(1). 训练(或下载)一个分类模型(比如AlexNet),预训练;
(2). 对(1)中生成的模型做fine-tuning,将分类从1000改为20,比如20个物体类别+1个背景;去掉最后一个全连接层;
(3). 特征提取:提取图像的所有候选框;对于每一个区域,修正区域大小以适合CNN的输入,做一次前向运算,将第5个卷积层后池化层的输出(就是对候选框提取到的特征)保存到硬盘;
(4). 训练一个SVM分类器(二分类)来判断这个候选框里物体的类别,每个类别对应一个SVM,判断是不是属于这个类别,即需要训练多个向量机对目标分类;
(5). 使用回归器精细修正候选框位置:对于每一个类,训练一个线性回归模型去判定这个框是否框的完美。
R-CNN测试步骤如下图所示:
R-CNN缺点:
(1). 重复计算:重复为每个候选框提取特征是非常耗时的。Selective Search为每张图像产生大约2000个候选框,那么每张图像需要经过2000次的完整的CNN前向传播得到特征,而且这2000个候选框有很多重叠的部分,造成很多计算都是重复的,这将导致计算量大幅上升,相当耗时;
(2). 性能瓶颈:由于所有的候选框会被放缩到固定的尺寸,这将导致图像的畸变,不符合物体的常见比例,而且由于重复计算的问题,时间上难以容忍多尺度多比例的数据增强(data augmentation)方法去训练模型,使得模型的性能很难有进一步的提升;
(3). 步骤繁琐:整个训练过程分为多个步骤,步骤繁琐不易操作,而且每个阶段分开训练,不利于取得最优的解。此外,每个阶段得到的结果都需要保存,消耗大量的磁盘空间;
(4). 训练占用内存大:对于每一类分类器和回归器,都需要大量的特征作为训练样本;
(5). 训练过程是多阶段的:首先对卷积神经网络微调训练;然后提取全连接层特征作为SVM的输入,训练得到目标检测器;最后训练边框回归器;
(6). 目标检测速度慢;
(7). 输入CNN网络的图像大小固定为227*227,在输入网络前需要对候选区域图像进行归一化,容易使物体产生截断或拉伸,会导致输入CNN的信息丢失。
涉及到的其它技术点可参考对应博文:
(1). 卷积神经网络(CNN):https://blog.csdn.net/fengbingchun/article/details/50529500
(2). 支持向量机(SVM):https://blog.csdn.net/fengbingchun/article/details/78326704
以上内容均来自网络,主要参考文献如下:
1. 《基于卷积神经网络的多部位人体检测》,北京工业大学,硕论,2016
2. https://blog.csdn.net/shenxiaolu1984/article/details/51066975
3. https://blog.csdn.net/v_JULY_v/article/details/80170182
4. https://blog.csdn.net/u014380165/article/details/72851035
GitHub: https://github.com/fengbingchun/NN_Test
————————————————
原文链接:https://blog.csdn.net/fengbingchun/article/details/87007598