2020-10-27

目标检测 R-CNN

目标检测除了要识别类别外,还要找到他们的位置。


R-CNN 在前人的肩膀上前行

在过去的十多年时间里,传统的机器视觉领域,通常采用特征描述子来应对目标识别任务,这些特征描述子最常见的就是 SIFT 和 HOG.而 OpenCV 有现成的 API 可供大家实现相关的操作。

SIFT 和 HOG 的王者地位最近被卷积神经网络撼动。

2012 年 Krizhevsky 等人在 ImageNet 举办的 ILSVRC 目标识别挑战大赛中一战成名,豪夺当年的第一名,Top5 错误率 15%,而他们团队提出来的网络结构以他们的导师名字命名,它就是 AlexNet。

它有 5 层卷积层,2 层全连接层。

因为 AlexNet 的出现,世人的目光重回神经网络领域,以此为契机,不断涌出各种各样的网络比如 VGG、GoogleNet、ResNet 等等。

受 AlexNet 启发,论文作者尝试将 AlexNet 在 ImageNet 目标识别的能力泛化到 PASCAL VOC 目标检测上面来。

但一切开始之前,需要解决两个主要的问题。

1、如何利用深度的神经网络去做目标的定位?

2、如何在一个小规模的数据集上训练能力强劲的网络模型?

论文作者给出了思路。

利用候选区域与 CNN 结合做目标定位

借鉴了滑动窗口思想,R-CNN 采用对区域进行识别的方案。

RCNN的框架,主要包含:

原图--》候选区域生成--》对每个候选区域利用深度学习网络进行特征提取--》特征送入每一类SVM分类器中判别--》回归器修正候选框位置


具体是:

(1). 区域推荐(region proposal)即候选区域:常见的方法有selective search和edge boxes,给定一张图片,通过选择性搜索算法产生1000~2000个候选边框,但形状和大小是不相同的,这些框之间是可以互相重叠互相包含的;利用图像中的纹理、边缘、颜色等信息,可以保证在选取较少窗口的情况下保持较高的召回率(Recall)

(2). 特征提取:利用卷积神经网络(CNN)对每一个候选边框提取深层特征;

(3). 分类:利用线性支持向量机(SVM)对卷积神经网络提取的深层特征进行分类;

(4). 去除重叠:将非极大值抑制方法应用于重叠的候选边框,挑选出支持向量机得分较高的边框(bounding box)

下面的图像来自论文本身。


R-CNN 系统分为 3 个阶段,反应到架构上由 3 个模块完成。

1、生产类别独立的候选区域,这些候选区域其中包含了 R-CNN 最终定位的结果。

2、神经网络去针对每个候选区域提取固定长度的特征向量。

3、一系列的 SVM 分类器。


下面对每一个步骤详细分析:

1.候选区域生成:

能够生成候选区域的方法很多,比如:

objectness

selective search

category-independen object proposals

constrained parametric min-cuts(CPMC)

multi-scale combinatorial grouping

Ciresan

R-CNN 采用的是 Selective Search 算法。

使用Selective Search(选择性搜索)方法从一张图片中生成许多小图,Selective Search是先用过分割手段将图片完全分割成小图(小图生成途径1),再通过一些合并规则,将小图均匀的合并,这是合并的小图相比原图还是小图(小图生成途径2),这样合并若干次,直到合并成整张原图,至此,将所有生成小图的途径过程中的小图全部输出,就产生了region proposals, 原作者很形象的说道:

关于 region proposals 详细介绍:Region proposals 是什么?如何提取?_轮子去哪儿了-CSDN博客

例:设有区域a-b-c-d-e-f-g-h。较好的合并方式是:ab-cd-ef-gh -> abcd-efgh -> abcdefgh。

不好的合并方法是:ab-c-d-e-f-g-h ->abcd-e-f-g-h ->abcdef-gh -> abcdefgh。

这里的a,b,c,d,e,f,g,h,ab,cd,ef,gh,abcd,efgh都是region proposals。这样的小图生成策略就叫做Selective Search。为尽可能不遗漏候选区域,上述操作在多个颜色空间中同时进行(RGB,HSV,Lab等)。在一个颜色空间中,使用上述四条规则的不同组合进行合并。所有颜色空间与所有规则的全部结果,在去除重复后,都作为候选区域输出。作者提供了Selective Search的源码。

区域推荐(候选区域):不同于图像的分类,对于图像的检测问题,我们不仅要对图像中的物体提供类别信息,还要提供其定位信息。通常,对于卷积神经网络模型,研究中较多都采用滑动窗口提供候选区域。但对于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。

网络架构我们有两个可选方案:第一选择经典的Alexnet;第二选择VGG16。经过测试Alexnet精度为58.5%,VGG16精度为66%。VGG这个模型的特点是选择比较小的卷积核、选择较小的跨步,这个网络的精度高,不过计算量是Alexnet的7倍。后面为了简单起见,我们就直接选用Alexnet,并进行讲解;Alexnet特征提取部分包含了5个卷积层、2个全连接层,在Alexnet中p5层神经元个数为9216、 f6、f7的神经元个数都是4096,通过这个网络训练完毕后,最后提取特征每个输入候选框图片都能得到一个4096维的特征向量。所以paper在设计网络结构的时候,是直接用Alexnet的网络,然后连参数也是直接采用它的参数,作为初始的参数值,然后再fine-tuning训练。

支持向量机(SVM)分类:R-CNN是线性支持向量机与卷积神经网络的结合,卷积神经网络在解决高维问题时容易陷入局部最优,而支持向量机通过使分类间隔最大化来得到最优的分类面,其算法会转化成一个凸二次规划的问题,故其能得到全局最优解,卷积神经网络和支持向量机进行互补,为最终算法的效果提升提供了保证。

SVM分类器的训练:

我们都知道SVM分类器是需要正负样本的,但这里由于负样本远远大于正样本的数量,所以采用hard negative mining的方法,其中,正样本就是原图中真正标定bounding box的样本,而负样本是通过考察每一个候选框,如果和本类所有标定框的重叠都小于0.3,认定其为负样本。

SVM类别判断:

从特征提取步骤中,生成一个4096维特征,将这个向量分别放入每一个SVM分类器中进行二值分类,并输出对每一个region proposal的4096维特征的得分.(这里的详细过程为:当我们用CNN提取2000个候选框,可以得到2000*4096这样的特征向量矩阵,然后我们只需要把这样的一个矩阵与svm权值矩阵4096*N矩阵乘,得到2000*N的矩阵,就是每一个类对2000个候选框的打分,N为分类类别数目,就可以得到结果了)

最后将得到所有region proposals的对于每一类的分数,再使用贪心的非极大值抑制方法对每一个SVM分类器类去除相交的多余的框。


非极大值抑制(Non-maximum Suppression, NMS):在物体检测中应用十分广泛,主要目的是为了消除多余的边框,获得最佳的物体检测的位置,非极大值抑制可以看作是局部最大值的搜索问题。其具体做法为:对于相邻的候选边框,R-CNN会将边框的位置和以其深度图像特征为输入的支持向量机分类得分给出,然后根据支持向量机的分类得分进行降序排列,最后,对每一种类别,从重叠比例(IoU, Intersection over Union)超过设定阈值的候选边框中选取支持向量机分类得分最高的边框当作预测边框,而其他与之重叠的边框会因为得分较小而被舍弃。该方法对R-CNN而言至关重要,因为,通过选择性搜索每张图像会产生大约两千个候选边框,在实际应用中往往会远超过这个数值,虽然支持向量机分类得分小于-1的边框会被舍弃,但还是会存在大量的重叠边框,通过非极大值抑制消除多余的边框,使得最终的检测结果更加简洁有效。


SVM分类器的每一类,会从一张图片中找出n多个可能是物体的矩形框,然后为每个矩形框打分:

就像上面的图片一样,定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制:先假设有6个矩形框,根据分类器类别分类概率做排序,从小到大分别属于车辆的概率分别为A、B、C、D、E、F。

(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;

(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。

(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。

就这样一直重复,找到所有被保留下来的矩形框。

非极大值抑制,顾名思义就是抑制不是极大值的元素,搜索局部的极大值。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。这里不讨论通用的NMS算法,而是用于在目标检测中用于提取分数最高的窗口的。例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。

利用回归器进行bounding box的修复

目标检测问题的衡量标准是重叠面积(IoU),许多看似准确的检测结果,往往因为候选框不够准确,重叠面积很小。故需要一个位置精修步骤。 

交并比 :IOU=(A∩B)/(A∪B)

回归器

对每一类目标,使用一个线性脊回归器进行精修。正则项λ=10000。

输入为深度网络pool5层的4096维特征,输出为xy方向的缩放和平移。

训练样本

判定为本类的候选框中,和真值重叠面积大于0.6的候选框。

R-CNN网络结构如下图所示:R-CNN算法采用的是8层卷积神经网络对图像进行特征提取,其中前5层是卷积层,其中第一层、第二层、第五层之后跟有最大池化层,后3层是全连接层。这种层次深度是很重要的,因为移去网络中个任何卷积层都会导致网络的性能变差。在输入网络前需要把图像归一化为227*227的固定大小。即输入层为候选区域边框缩放填充得到,输出为该候选区域边框的分类结果。


alexnet

输入是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 RCNN--目标检测 - 7岁 - 博客园

2 目标检测算法R-CNN简介_网络资源是无限的-CSDN博客

GitHub:https://github.com/fengbingchun/NN_Test

你可能感兴趣的:(2020-10-27)