作者:来自读者投稿
来源:Python数据之道
Faster RCNN 目标检测算法解析
随着大数据时代的到来和计算机视觉的发展,近几年来目标检测领域取得了突破性的进展。
目标检测的问题就是分类和定位一张图片中的多个物体,早期的算法有RCNN、Fast R-CNN等,但这些算法在产生区域建议的问题上时间消耗都很大。因此对于目标检测问题推荐采用Faster R-CNN算法,它是从提高区域建议的速度出发,引入了区域建议网络(RPN)去推测目标位置,解决了区域建议计算的瓶颈问题。
文章的最后会以检测汽车为例说明Faster R-CNN检测的全过程。
传统的物体识别方法是直接使用卷积神经网络,通过分类或者回归的方法进行物体的识别。
回归是用来判定目标的具体位置,但由于卷积神经网络是需要固定输出的值(由于全连接层的存在),对于多目标的情况就无法通过回归进行;分类是用于确定目标的种类,通过滑动窗口对图像进行滑动,确定每一个窗口是否属于目标,但这个方法非常费时,根本无法达到实时检测。
于是后来就提出了Region Proposal(区域建议)的方法,用于改进直接使用CNN的缺点,即事先给定一些候选窗口,在这些候选框中进行检测。Region Proposal是一类算法的统称,它们都是在卷积神经网络的基础上进行的。
在目标检测领域中,基于区域建议的卷积神经网络的发展是非常迅速的。Faster R-CNN算法在2015年COCO(常见物体图像识别)检测大赛一举夺冠,并且在PASCAL VOC 2007和PASCAL VOC 2012上实现了目前最高的目标检测准确率。
现如今,Faster R-CNN不仅用于物体的检测,还可以用于许多商业的领域,如服装检测,人脸识别等,已经成为了通用的检测框架。
上图是Faster R-CNN的整体网络结构,它将特征抽取,区域建议,边界回归和分类都整合在一个网络中,真正实现了end-to-end。使其综合性能有了较大提高。
对于Faster RCNN算法,小编也为大家总结了一些基本知识供大家学习参考:
1、IoU
Region Proposal,就是预先要找出图片中目标可能出现的位置,然后通过利用图像中的边缘、纹理、颜色等信息,保证在选取较少窗口的情况下保持较高的召回率(IoU,Interp-over-Union)。
IoU是目标检测评价体系中的一个参数,简单来说就是网络模型产生的目标候选窗口和原来标记的真实窗口之间的重叠率,计算公式为检测结果(DR)与真实标记(GT)的交集比上它们的并集。公式表示如下所示:
IoU值越高说明检测结果与真实边框的重合度越高,理想情况就是DR与GT完全重合,即IOU=1。一般来说,IoU的值大于0.5就可以认为是不错的结果。
2、非极大值抑制
非极大值抑制,顾名思义就是把那些较小的值过滤掉,在这里,抑制即忽略,也就是忽略掉那些重叠率IoU值高于给定阈值的候选框,抑制的过程是一个迭代、遍历、消除的过程。
举例说明,定位一辆汽车的具体存在位置,首先通过算法找出了很多个候选框,需要判别哪些候选框是没用的,采用NMS方法,首先假设产生了6个候选框,根据分类器类别分类概率做排序,从大到小分别属于汽车的概率依次为:A,B,C,D,E,F。
从最大概率候选框A开始,分别判断B到F与A的重叠率IoU是否大于某个设定的阈值,假设B、C与A的重叠率超过阈值,就过滤掉B和C,标记第一个候选框A并保留下来。
从剩下的候选框D、E、F中选择概率最大的D,然后判断D与E、F的重叠率,重叠率大于阈值就过滤掉,标记D是保留下来的第二个候选框,如此重复,就找到所有被保留下来的候选框。
下面我们来对Faster RCNN进行一个详细解析
>>首先是算法的网络结构
Faster R-CNN的网络结构如下图所示。
在Faster R-CNN算法中,待检测图像没有固定的尺寸要求,网络结构中的ROI Pooling层用来将输入图像的尺寸转换为固定尺寸,以满足后续全连接网络层的要求。
待检测图像首先通过深度神经网络来生成图像特征,这些特征既被候选的RPN使用,又被后续的检测过程使用,即实现了两个不同目的的特征共享,这也就是图中被称为共享神经网络的原因。
>>网络的核心部分是生成候选区域的RPN
Faster R-CNN提出了一种加速区域建议计算的方法,即建立RPN网络。RPN是Faster R-CNN中的核心部分,它是一个基于全卷积的网络,能够同时预测输入图片的每个位置目标区域框和是否是目标的得分。
Faster R-CNN的整体结构可以看做是“RPN+Fast R-CNN”的集合,RPN网络用于生成高质量的区域建议框,Fast R-CNN用于学习高质量区域建议特征以及分类的作用。
RPN层连接的是CNN产生的特征图,通过计算来产生一些候选框,并对这些候选框进行二分类,判断是物体还是背景,把判断为物体的那些候选框进行微调,尽可能使这些框跟离它最近的那些标签(GT)重叠,找到合适的边框回归位置。
RPN的网络结构如下图。其输入数据是来自共享卷积网络的输出,维度是1*512*38*50,即1张图片,512个特征图(feature map),每个feature map的尺寸是38*50。
用一个滑动窗口(3*3的卷积核)在一个卷积特征图上进行滑动,这个卷积特征图是由共享卷积网络得到,滑动操作可以获得一个512维的向量,将这个向量送入到两个平行的全连接层,即分类层(cls layer)和位置回归层(reg layer),用来得到分类信息和位置信息。
每个滑动窗口的中心会对应k个锚点(anchor)。每个anchor都会对应不同种的尺寸和长宽比(如图12右侧所示)。RPN使用3种尺寸{128*128,256*256,512*512}和3种长宽比{1:1,1:2,2:1},所以每个滑动窗口就有3*3=9个anchor。相应的,在每个滑动窗口的位置同时预测9个区域建议,所以位置回归层有4*9个输出,代表9个区域建议框的位置坐标;分类层有2*9个输出,代表对每个建议框是否是目标的概率。
具体过程如下:
输入图像经过VGGNet之后将得到一个特征图(即CNN的输出),用滑动窗口在这个特征图上进行滑动,又会得到一个新的特征图,把这个特征图上的每一个点映射到原始输入图像上,每个单个元素其值对于原始图像中的某个区域,对原始区域按事先定义的规则进行缩放和偏移,就可以得到k个新的区域,这k个新的区域就被叫做anchor(这里k=9),之后再把这些区域进行分类和回归。
分类层经过一个卷积层后,维度变为1*18*38*50。这里18个feature map是有具体物理意义的,它对应9个anchor的得分,每个anchor有两个得分,分别是存在目标和不存在目标的得分,这两个得分概率之和为1。位置回归层经过一个卷积层之后,维度变为1*36*38*50,共36个feature map,这36个feature map对应9个anchor的调整参数,每个anchor有4个调整参数。
>>网络的训练过程
由于Faster R-CNN算法使用了RPN和Fast R-CNN两种网络,若直接采用反向传播算法进行训练会很不方便,RPN和Fast R-CNN都是独立训练的,要用不同的方式去修改它们的卷积核。
因此在训练时,采用交替训练的方法,训练RPN-->Fast R-CNN-->RPN-->Fast R-CNN,即先训练RPN,然后使用RPN产生的目标建议框去训练Fast R-CNN,Fast R-CNN网络被调整之后,再被用来初始化RPN,整个过程交替进行,允许两个网络间共享卷积层。
网络的训练迭代每次选择一张图片,一张图片中包含很多正负样本,随机选择256个anchor,即每个mini-batch包含从一张图片中提取的256个anchor。但由于一张图片所产生的anchor有两万多个,因此需要对anchor来进行过滤操作。即先去除那些越界的候选框,如果anchor的边界超过了图片的边界,就将这些越界的anchor去除掉。剩下的anchor之间肯定有很多重叠的区域,然后采用NMS将IoU大于0.7的区域全部合并,以减少候选框数量。
非极大值抑制不会影响最终检测的准确率,但是这种做法可以大幅度的减少区域建议框的数量。NMS之后,再随机选取256个框进行检测。
>>Faster RCNN用到的特征提取网络:
这里使用的是预先训练好的VGG16网络(VGG16是训练在图像分类上的,有大量的数据集进行训练,训练的效果已经非常好了,可以用来提取对物体敏感的特征,所以这里直接用已经训练好的VGG16网络模型),然后对网络用均值为0,标准差为0.01的高斯分布进行初始化操作。该网络有5个卷积层,4个池化层,没有全连接层。
由于卷积层并不改变图像的大小,只有池化层会影响图像大小,所以连接多少个池化层,也就意味着输入图像会被压缩到一个多大的范围区间。VGG16中有4个池化层,则W*H的图片经过VGG16提取特征之后将得到(W/16)*(H/16)的特征图。
下面是一些汽车目标的结果展示,也可以看出对于汽车目标的检测结果,准确性是非常好的。
---------End---------
关注后回复“w”,加我私人微信
推荐阅读: