基于Faster-rcnn算法进行目标检测
Faster-rcnn是由r-cnn不断演化得来的,重点提升部分是对于r-cnn的效率提升,占用空间的减小,首先将从r-cnn系列来介绍最初目标检测所用的方法。
二 RCNN系列的发展
2.1 R-CNN
根据以往进行目标检测的方法,在深度学习应用于目标检测时,同样首先尝试使用滑动窗口的想法,先对图片进行选取2000个候选区域,分别对这些区域进行提取特征以用来识别分割。
2.1.1 rcnn具体的步骤是:
步骤一:在imagenet分类比赛上寻找一个cnn模型,使用它用于分类的预训练权重参数;对于这个模型修改最后的分类层,分为21类,去掉最后一个全连接层,因为所用的测试集为20类,且还有一类背景类。
步骤二:根据选择性搜索来对输入的图像进行选取2000个候选区域框;
然后修改候选区域框的大小,以适应cnn的输入,然后用cnn来提取出每个候选区域的feature map。
步骤三:训练svm分类器,这个svm分类器是对于特定的某一类进行区分,是专门用来对特定敏感区域进行分类,每一个类别对应于一个SVM分类器
步骤四:使用回归器精细修正每个候选框的位置,对于每一个类,需要训练一个回归模型去判定这个框框的是否完美。
对应步骤的图片结构如下图1:
这里有几点需要补充的是:
1. 采用预训练和fine-tune来解决了标签数据不多的问题,在imagenet上训练过大规模图片集合的网络已经对图片的基本信息都有了很明确的收集,采用预训练模型后再在voc训练集上进行fine-tune会达到很好的效果。
2. 选择候选区域的几种方法:这里采用的是slective search
3. 训练过程:
在得到候选区域后,首先将候选区域跟gt(真实标注的框)来进行比较,如果iou>0.5(iou是图像分割里面对于判定两个不同区域的相似度所采用的一个标准)把这个候选区域置为正样本,否则就是负样本。Iou的取值相当重要,会对结果影响较大。
训练时候采用SGD方法来调整框的位置。
2.1.2 RCNN的缺点:
1. 训练过程太慢,需要对每一个候选区域都输入到cnn中再进行提取特征,极大的浪费了时间和精力。
2. 步骤相对较多,需要fine-tune预训练模型、训练SVM分类器、回归器进行精细的调整。
3. 占用空间大,提取出的特征以及分类器都需要占用额外的空间
4. 没有对资源进行重复利用,在使用SVM分类和对框进行回归操作的时候cnn模型的参数并没有同步修改。
2.2 Fast rcnn
针对RCNN的需要对每一个候选区域进行cnn操作这一繁琐操作进行改进,从而的到了fast-rcnn算法,
2.2.1 fast-rcnn的步骤如下:
步骤一:同样是寻找一个在imagenet上训练过的预训练cnn模型
步骤二:与rcnn一样,通过selective search在图片中提取2000个候选区域
步骤三:将一整个图片都输入cnn模型中,提取到图片的整体特征(这是相对于rcnn最大的改进的地方)
步骤四:把候选区域映射到上一步cnn模型提取到的feature map里
步骤五:采用rol pooling层对每个候选区域的特征进行下采样,从而得到固定大小的feature map,以便输入模型中
步骤六:根据softmax loss和smooth l1 loss对候选区域的特征进行分类和回归调整的过程,回归操作是对于框调整所使用的bou b reg来训练。
相比rcnn的不同处:
在得到每个候选区域的feature map后,通过rolpooling 层来进行上采样操作对尺寸进行调整以便时输入模型;
最后使用的loss函数为multi-task loss,然后是把回归操作加入到cnn权重更新的过程中去。
2.2.2优点有以下几点:
1. fast-rcnn在训练的时候,把整张图片送入cnn网络进行提取特征,不需要像rcnn那样对每一个候选区域进行输入cnn,从而在cnn的利用上提高了很大的效率。
2. 训练速度相应提升,不需要svm分类器对提取后的特征进行存储数据,把图片的特征和候选区域直接送入loss,不需要对硬盘进行读写的操作。
3. 对网络的利用效率,用于分类和回归调整的功能都用cnn网络来实现,不需要额外的分类器和回归器。
但是fast-rcnn仍然有其缺陷,对于生成候选区域仍然不够快速,所以faster-rcnn针对这一点进行改进,提出使用rpn网络来生成候选区域。同时提出的rpn网络可以与目标检测同时共享一个cnn的网络参数,减少参数的数量。
三 Faster rcnn的基本原理
3.1 faster rcnn的原理及结构
前面介绍了rcnn以及fast-rcnn,基础知识已经做好铺垫,接下来将介绍rcnn系列的最后一种算法faster-rcnn的详细内容。Faster-rcnn的主要原理如下:
Faster-rcnn是Ross B.Girshick在2016年在r-cnn和Fast-rcnn的基础上提出来的,最大的亮点之处是faster-rcnn把获取feature map,候选区域选取,回归和分类等操作全部融合在一个深层网络当中,效率较前两种提升了很多。
Faster-rcnn的基本结构如下图:
Faster-rcnn在结构上主要由一下几部分构成:
1. 卷积层,这部分卷积层就是普通的由imagenet比赛上用于分类的预训练模型所用的卷积层,它的主要功能是用来提取整张图片的feature map,卷积层结构也是卷积+激活函数+池化操作组成的。
2. RPN网络,这是整个faster-rcnn的核心部分,改善了前两种方法用选择搜索来获取候选区域的方法,这种方法不仅快速而且更加高效地利用了cnn网络。在生成候选区域的时候会生成anchors,然后内部通过判别函数判断anchors属于前景还是后景,然后通过边框回归来进行第一次调整anchors获取准确的候选区域。
3. Roi pooling,这一层的添加主要是为了解决最后输入全连接层的feature map的尺寸大小不同的问题,通过上采样来获取固定大小。
4. 分类和回归,最后通过两个分类层和回归层来分别判断物体属于哪个类别以及精细调整候选区域的位置,以获取最终目标检测的结果。
3.2 faster rcnn各个结构的详细介绍
针对这几个部分详细展开介绍faster-rcnn会更直观的理清其结构是如何设计的。
下面对于一些术语采用英文来表达,中文翻译有时不是特别准确,这里列出大致对照的部分,region proposal为候选区域,foreground,background为前景和后景,bounding box regression为边框回归,anchors为锚点,对于anchors有很多解释,后面将会详细解释其含义。
首先列出论文中原作者所提出的faster-rcnn的结构,如下图:
论文作者所采用的是vgg16模型,
不用比较新的cnn模型而采用vgg模型的原因:
若使用最新的resnet网络会使效果下降,因为输入的图像尺寸比较小,针对vgg模型会有很好的结果,若将尺寸加大的话,使用resnet网络会有更好的结果。因为resnet是非常深层的网络,需要用较大的图片来保证各种信息的完整性。
对于任何一种尺寸的图片,首先变成m*n大小的尺寸,输入进入vgg16的网络中,卷积结构是由13个卷积层加上13个relu激活层加上4个pooling池化层,经过此卷积结构后得到图片的feature map,然后下半部分是rpn网络,rpn网络分为两个部分。Rpn网络的上半部分为生成proposals的部分,下半部分为对于proposal进行第一次回归调整的部分。然后接上roipooling层来获取固定大小的尺寸,最后接入softmax网络以及bbox_pred。
每个部分的原理介绍:
1. 卷积结构
传统的conv+relu+pooling组成的卷积结构,所有的conv层都是kernelsize为3,padding为1,stride为1;所有的pooling层都是kernelsize为2,padding为0,stride为2,为何如此设计?因为再faster-rcnn中对所有的卷积都做了扩充处理,导致输入图片的尺寸变为(m+2)*(n+2),然后通过3*3的卷积核输出得到尺寸为m*n,通过这种组合是的输入和输出矩阵的大小相同。如图所示:
通过卷积层后,pooling层操作是使m*n的矩阵变为(m/2)*(n/2),所以再通过整个卷积结构之后原始图片的尺寸为M*n,变成(m/16)*(n/16)。生成的feature map将与原图对照。
2. RPN网络
Faster-rcnn的重点就是在于提出了rpn网络来生成proposals,这种方法既高效又实用。
Rpn网络的上下两层结构如图所示:
上半部分是通过sliding window来预测多个reference box,通过softmax分开正样本和负样本,然后通过下半部分的回归操作得到更加精细的proposal,而结构中的proposal则通过进一步综合操作获取proposals。
下面说下rpn网络的具体实现方式:
在由上一层得到的feature map上用一个3*3的滑动窗口生成一个256维的特征,在这个特征之后连接两个用于分类和回归的全连接层。其实现方式如图所示:
分别介绍图中的每个部分,sliding window为一个3*3的滑动窗口,其中心位置是一个锚点也就是anchor,intermediate layer为产生的256维特征,cls layer为区分正样本和负样本的分类器,reg layer为第一次获取更加精细的proposal的bounding box regression,这里的分类和回归不是最终确定某个类别以及检测框的回归,这里的回归仅仅是为了产生更加精细的proposal为下一步操作做准备。
对参数的解释:
1. 一个sliding window可以同时预测出9个proposal,对于每个proposal是根据一个scale,一个aspect_ratio和sliding window中的anchor唯一确定,这里可以预测9个的原因是由3个scale和3个aspect_ratio可以确定9个anchor,
2. 在feature map上进行卷积核的卷积操作,产生256维特征,然后采用输出分别为2*9=18以及4*9=36,卷积核大小为1*1,步长为1的卷积层实现与cls layer和reg layer的连接。
3. 对于分类层,2*9的输出,因为分类分为正负两种样本,而回归是要预测4个值,中心位置的坐标,以及宽和高,所以是4*9的输出。
Rpn网络中需要重点理解的是anchors,loss函数的计算
Anchors的详细解释
1. anchor,译为锚点,是sliding window的中心点的坐标,用于预测初步粗略的proposal,可以这样说 ,一个anchor对应于一个proposal,论文中作者说一个sliding window预测9个proposal。
2. loss函数的计算,先确定参与训练的样本为正负样本的组合,一个anchor与真实标注的ground truth的iou值>0.7,则认为是正样本,而iou<0.3是负样本,如果正样本数不足,可以采用,iou值较大的作为正样本参与训练。
对于RPN网络的Loss计算,是分为两个部分的,即classification loss和regression loss,计算分类的Loss只需要anchors的预测结果和groundtruth真实值即可,另一个regression loss需要:reference box即初步预测的候选区域(中心点坐标xa,ya,宽wa,高ha),proposal即rpn预测得到的结果(中心点坐标x,y,宽w高h),ground truth框的真实值信息(中心点坐标x*,y*,宽w*,高h*).计算总loss的方式如下:
Bounding box regression 原理
边框回归的实质就是由预测框一直不断的往真实标注的框微调,使得两者更加接近。
如图所示,红色的是由RPN网络得到的proposal,绿色的是真实标注的ground truth,
由于误差的存在,红框检测的范围较小,并没有真正标注出飞机的真实边框位置,所以我们采用bounding box regression来对红框进行调整,以达到更好的效果。
边框的参数一般是由x,y,w,h来表示,x,y是边框的中心点坐标,w是宽,h是高。我们进行bounding box regression是要通过调整proposal(A)产生一个与真实标注(G)接近的边框G`,如图所示:
它们之间的关系是:由网络预测出的proposal A=(Ax,Ay,Aw,Ah), G(Gx,Gy,Gw,Gh),根据bounding box regression得出一个变换的结果F(Ax,Ay,Aw,Ah)=(Gx`,Gy`,Gw`,Gh`)使得G`与G接近。
从A变为G`的方法为通过平移变换和缩放来达到
平移是:
缩放是:
可以看出所需要的是dx(A),dy(A),dw(A),dh(A),若预测的Proposal与GT差异较小的时候,可以认为上述操作是一种线性变换,可以通过线性回归来进行调整。
针对此问题,输入的值是feature map,定义为Φ(A),还需要输入A和GT的改变关系,(tx,ty,tw,th),线性回归得到的结果是dx(A),dy(A),dw(A),dh(A).所以,目标函数是
,Φ(A)是feature map,w为更新的权重参数,d(A)是得到的结果。所以Loss function定义为:,
最终优化结果是:
应用于Faster-rcnn中,proposal和ground truth之间的关系如下:
使用边框回归训练时,输入特征,优化目标是输出与ground truth尽可能接近。
对proposals进行bounding box regresssion
Softmax判定foreground和background分类的原理
RPN网络的训练每个batch是由256个proposal组成的,正负样本各占一半,模型的参数是前一部分为预训练模型的参数,剩下的参数通过高斯分布初始化。
3. roi pooling层
这一层的主要作用是为了修改图片的尺寸大小,以输入全连接层进行分类和回归。
这个层的思想主要是根据spp-net网络得到的,spp-net通过金字塔结构解决了图片尺寸大小不同的问题,roi pooling通过下采样、上采样操作得到相同大小的输出。
4. 分类与回归
通过由roi pooling得到的proposal feature map连接到全连接层,由softmax分类得出这个目标属于哪一个种类,然后再通过bounding box regression进行对proposal的第二次精细调整,最终得到更加准确的目标检测框。
其结构如图所示:
1. 全连接层加上softmax进行分类识别
2. 对proposal通过边框回归,获得更加准确的结果。
全连接层要求固定大小输入,所以这就是roi pooling操作的原因。
四 Faster r-cnn训练过程
由上述基本原理可知,Faster rcnn的训练是依靠预训练模型来进行的,例如VGG模型,真实训练过程大概分为六个步骤:
1. 获取预训练模型,训练RPN网络
2. 通过RPN网络得到proposals
3. 第一次训练Faster rcnn
4. 再一次训练RPN网络
5. 利用上一步得出的RPN网络,再一次得出proposals
6. 再一次训练Faster rcnn
整体过程思想是类似于迭代,但是只需要两次即可,因为迭代多次并不会由更好的结果出现。
训练步骤如图所示:
4.1训练RPN网络
训练RPN网络的步骤,先读取VGG预训练模型,通过一系列卷积结构实现对图片特征的提取。
Vgg模型的卷积结构是图中的红色框,网络最终的Loss function如下:
在图中的公式里,i是anchors,pi是前景的概率,pi*是GT Predit(如果第i个anchor和GT的iou值大于0.7,即确定为foreground,pi*=1,如果IOU值小于0.3,则判定为background,pi*=0);t是预测的回归框,t*是真实标注框。
如上文所述,loss函数分为回归Loss和分类loss两部分
1. 回归loss,是rpn_cls_loss层作用的,结果用于分类RPN网络得到的proposal是属于前景还是背景。
2. 回归Loss, 是rpn_loss_bbox层作用的,结果用于边框回归的训练过程。在训练的过程中背景部分被忽略。
在实际计算过程中发现两者loss函数相差太大,所以用一个平衡参数来均衡影响。计算公式如下:
再对照流程图里解释一下:
1. RPN训练过程,rpn_data产生anchors用于训练
2. rpn-loss_cls,输入的rpn_cls_scores_reshape和rpn_labels对照公式中的p,p*,Ncls则在p,p*的caffe blob的大小中得出。
3. Rpn_loss_bbox,输入进去rpn_bbox_pred,rpn_bbox_targets对照公式中的t,t*,rpn_bbox_inside_weigths对照p*,Nreg可以由caffe blob中得到。
4.2 通过RPN网络得出proposals
已经得到训练好的rpn网络,在这个步骤中可以得出预测的proposals,由网络结构图可以看出,foreground softmax probability同时也可以得出,如图所示,得到的数据将保存在文件中。
4.3训练Faster rcnn网络
读取上一步得到的文件,得到此步输入的proposals和foreground probability。
将得到的proposaals作为rois输入网络,下图所示蓝色框代表此步骤;
计算bbox_inside_weights+bbox_outside_weights,然后传入soomth_l1_loss layer,下图所示绿色框为此步骤;
最终得到的是分类的结果和边框回归的结果,在图中可以看出。
这是stage1的整体流程,下面的stage2过程相似,这里不重复说明。
五 实验结果
5.1实验环境
Tensorflow 1.2
Python3.5 其余Python包(cython,opencv-python)
Cuda8.0
没有较好的GPU支持,所以对于测试faster rcnn只能采用demo的小测试集进行测试。
5.2实验过程
1. 配置好基础环境
2. 下载数据集
3. 下载预训练模型
4. 修改测试数据集的路径
5. 开始训练
5.3实验结果
下面列出测试小数据集得出的目标检测结果:
原始数据集为四张图片:
如图所示:红色框标注的即为目标检测的结果。
第一幅图像的检测结果:
第二幅图像检测结果:
第三幅检测结果:
第四幅检测结果:
从这几幅测试图像中可以看出,多个目标都被准确的检测了出来。
六总结分析
对于研究Faster rcnn的最重要的意义在于RCNN系列算法的效率提升,所以研究结果的最大意义应该表明在几种算法的效率对比上。结论参考论文结果。
可以明显的看出来,faster rcnn的时间开销远远小于前两种,但是在voc2007测试集上的map与前两种相差不多。
最后总结一下几种算法的对比,优缺点,如下表格:
Faster rcnn最大的亮点之处是faster-rcnn把获取feature map,候选区域选取,回归和分类等操作全部融合在一个深层网络当中,效率较前两种提升了很多,综合性能有较大提高,在检测速度方面尤为明显。真正实现了end to end检测的框架,生成proposal仅需10ms。
可以将faster rcnn简单的当成由proposals生成网络rpns加上fastrcnn组合而成的,用rpn网络代替选择性搜索是此算法最优越的地方,它所解决的核心问题有:怎样设计生成proposals,怎样训练rpn网络,怎样让rpn和rcnn网络共享卷积层即特征提取网络,而不是分别学习两个网络。在第一次迭代的时候,用预训练模型的参数去初始化rpn网络和fast rcnn的卷积层的参数,第二次迭代时候,用fast rcnn的共享卷积层参数初始化rpn网络中的卷积层参数,微调不共享的卷积层参数,训练fast rcnn时候,两个网络共享的参数不变,微调不共享的层参数来实现两个网络共享卷积层参数。
而faster rcnn又可以通过对某些步骤的改进升级到更加精确的目标检测方法,
Faster rcnn需要对20个生成的Proposal进行判断,然后再进行目标检测,这是两个不同的步骤,最近的YOLO算法结合faster rcnn,改进地方在于将proposal生成选择以及识别进行结合,只需一步即可得出结果。而ssd算法在不同层的feature map上做检测,相对来说有了更大的覆盖面积,也有进一步的效果提升。