未完待续,持续更新中。
一、前言
本文浅谈目标检测的概念,发展过程以及RCNN系列的发展。为了实现基于Faster-RCNN算法的目标检测,初步了解了RCNN和Fast-RCNN实现目标检测的具体步骤及其优缺点。在深刻理解Faster-RCNN的基本原理、详细分析其结构后,开始进行对Faster-RCNN的训练。其训练过程包含对RPN网络的训练得到proposals和训练Faster-RCNN。整体过程思想是类似于迭代,但不需要迭代多次。最终得到了较好的实验结果,经分析可知,Faster-RCNN算法与RCNN和Fast-RCNN相比,效率最高。
二、目标检测是什么
目标检测就是将对目标的分割和识别合二为一,是一种基于目标几何和统计特征的图像分割。当需要在一个复杂场景中对多个目标进行实时处理时,目标的自动提取和识别就尤其重要。简而言之,目标检测与识别就是指从一张图片或一个场景中找出目标,而这其中包含检测和识别两个过程。
近几年,随着目标检测的兴起,越来越多的相关研究成果被发表在各大期刊,研究该领域的人逐渐增多,目标检测也相应地不断发展。由于传统的目标检测方法复杂度较高,窗口冗余,且手工设计的特征对于多样性的变化没有很好的鲁棒性。正好,基于深度学习的目标检测和识别能较好的解决这些问题,因此,该方法更受人推广和应用,是目标检测的主流方法。其中主要涉及到深度神经网络模型以及卷积神经网络CNN。目前大致可将现有的基于深度学习的目标检测算法大致分为以下三类:
(1)基于候选区域的深度学习目标检测算法,如RCNN、 Fast-RCNN、 Faster-RCNN;
(2)基于回归的深度学习目标检测算法,如YOLO、SSD;
(3)基于搜索的深度学习目标检测算法,如基于视觉注意的AttentionNet,基于强化学习的算法。
由于深度学习的广泛运用,目标检测算法得到了较为快速的发展。当前,YOLO、SSD和RFPN属于较新且效果较好的方法,RFCN的准确度最高,但是速度最快的还是YOLO和SSD一体化的方法。本文对目标检测的研究主要采用基于候选区域建议的深度学习目标检测算法,该类算法中较知名的为RCNN、 Fast-RCNN和 Faster-RCNN。从顺序上,Fast-RCNN弥补了RCNN的一些不足之处,而Faster-RCNN则是基于Fast-RCNN进行了改进,三者在非实时水平上,精度和速度明显得到了提高。Faster-RCNN和YOLO、SSD相比,鲁棒性更强,但是速度会比较慢。Faster-RCNN是由RCNN不断演化得来的,重点提升部分是对于RCNN的效率提升,占用空间的减小,本文首先将从RCNN系列来介绍最初目标检测所用的方法。
三、RCNN系列的发展
1. RCNN
根据以往进行目标检测的方法,在深度学习应用于目标检测时,同样首先尝试使用滑动窗口的想法,先对图片进行选取2000个候选区域,分别对这些区域进行提取特征以用来识别分割。
1) RCNN的步骤
步骤一:在imagenet分类比赛上寻找一个cnn模型,使用它用于分类的预训练权重参数;对于这个模型修改最后的分类层,分为21类,去掉最后一个全连接层,因为所用的测试集为20类,且还有一类背景类。
步骤二:根据选择性搜索来对输入的图像进行选取2000个候选区域框;然后修改候选区域框的大小,以适应cnn的输入,然后用cnn来提取出每个候选区域的feature map。
步骤三:训练svm分类器,这个svm分类器是对于特定的某一类进行区分,是专门用来对特定敏感区域进行分类,每一个类别对应于一个SVM分类器
步骤四:使用回归器精细修正每个候选框的位置,对于每一个类,需要训练一个回归模型去判定这个框框的是否完美。
对应步骤的图片结构如下图:
2) 补充说明
a) 采用预训练和fine-tune来解决了标签数据不多的问题,在imagenet上训练过大规模图片集合的网络已经对图片的基本信息都有了很明确的收集,采用预训练模型后再在voc训练集上进行fine-tune会达到很好的效果。
b) 选择候选区域的几种方法:这里采用的是slective search
c) 训练过程:在得到候选区域后,首先将候选区域跟gt(真实标注的框)来进行比较,如果iou>0.5(iou是图像分割里面对于判定两个不同区域的相似度所采用的一个标准)把这个候选区域置为正样本,否则就是负样本。Iou的取值相当重要,会对结果影响较大。训练时候采用SGD方法来调整框的位置。
3) RCNN的缺点:
a) 训练过程太慢,需要对每一个候选区域都输入到cnn中再进行提取特征,极大的浪费了时间和精力。
b) 步骤相对较多,需要fine-tune预训练模型、训练SVM分类器、回归器进行精细的调整。
c) 占用空间大,提取出的特征以及分类器都需要占用额外的空间
d) 没有对资源进行重复利用,在使用SVM分类和对框进行回归操作的时候cnn模型的参数并没有同步修改。
2. Fast-RCNN
针对RCNN的需要对每一个候选区域进行cnn操作这一繁琐操作进行改进,从而的到了fast-rcnn算法。
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来训练。
2) 相比RCNN的不同
在得到每个候选区域的feature map后,通过rolpooling 层来进行上采样操作对尺寸进行调整以便时输入模型;最后使用的loss函数为multi-task loss,然后是把回归操作加入到cnn权重更新的过程中去。
3) 优点
1. fast-rcnn在训练的时候,把整张图片送入cnn网络进行提取特征,不需要像rcnn那样对每一个候选区域进行输入cnn,从而在cnn的利用上提高了很大的效率。
2. 训练速度相应提升,不需要svm分类器对提取后的特征进行存储数据,把图片的特征和候选区域直接送入loss,不需要对硬盘进行读写的操作。
3. 对网络的利用效率,用于分类和回归调整的功能都用cnn网络来实现,不需要额外的分类器和回归器。
但是Fast-RCNN仍然有其缺陷,对于生成候选区域仍然不够快速,所以Faster-RCNN针对这一点进行改进,提出使用RPN网络来生成候选区域。同时提出的RPN网络可以与目标检测同时共享一个CNN的网络参数,减少参数的数量。
前面介绍了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. 分类和回归,最后通过两个分类层和回归层来分别判断物体属于哪个类别以及精细调整候选区域的位置,以获取最终目标检测的结果。
2.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网络的上下两层结构如图所示:
1*1的卷积是为了确定输出的num_output,上面是num_out=18(2*9),对应bg\fg每个anchor,这里输出的图像为(m/16)*(n/16)*18;下面是num_output=36(4*9),对应4个坐标每个anchor。
上半部分是通过sliding window来预测多个reference box,通过softmax分开正样本和负样本,然后通过下半部分的回归操作得到更加精细的proposal,而结构中的proposal则通过进一步综合操作获取proposals。
下面说下rpn网络的具体实现方式:
在由上一层得到的feature map上用一个3*3的滑动窗口(这个滑动窗口就是3*3卷积核)生成一个256维的特征,这样同样使每个点融合了周围3*3的空间信息
在这个特征之后连接两个用于分类和回归的全连接层。其实现方式如图所示:
分别介绍图中的每个部分,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的输出。
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的公式如下:
图7 目标检测飞机
边框回归的实质就是由预测框一直不断的往真实标注的框微调,使得两者更加接近。如图7所示,红色的是由RPN网络得到的proposal,绿色的是真实标注的ground truth,由于误差的存在,红框检测的范围较小,并没有真正标注出飞机的真实边框位置,所以我们采用bounding box regression来对红框进行调整,以达到更好的效果。
边框的参数一般是由x,y,w,h来表示,x,y是边框的中心点坐标,w是宽,h是高。我们进行bounding box regression是要通过调整proposal(A)产生一个与真实标注(G)接近的边框G`,如图8所示:
图8 调整边框
它们之间的关系是:由网络预测出的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尽可能接近。
前文已经大致理解了bounding box regression的原理,图9为RPN网络的第二条线路。
图9 RPN网络的bounding box regression
由图10可知,WxHx36即为经过该卷积的输出图像,因此caffe blob中的存储就是[1, 36, H, W]。相当于feature maps的每个点有9个anchors,其中每一个anchors又有4个用于回归的[dx(A),dy(A),dw(A),dh(A)]变换量。从前文中的计算公式可以从foreground anchors回归出proposals。
图10 1x1卷积的caffe prototxt定义
图 11 RPN中判定fg/bg网络结构
如图11所示,把一个M*N大小的矩阵送入到Faster-RCNN网络,由于它到RPN网络时会变成(M/16)*&(N/16)。因此,假设W=M/16,H=N/16。再如图12所示,完成1x1卷积后再进入reshape与softmax。
图12 1x1卷积定义
从图12可知,WxHx18是经过该卷积的输出图像大小。对应着feature maps中每一个点有9个anchors,而每一个anchors又有可能是foreground和background,而全部信息中都会保存WxHx(9x2)大小的矩阵。为了方便softmax分类,在它的前后接一个reshape layer,而它的具体原因则是是因为在caffe基本数据结构blob中,采用blob=[batch_size, channel,height,width]的形式保存数据。正好前面保存bg/fg anchors的矩阵,[1, 2*9, H, W]是caffe blob中的存储形式。因为当softmax分类时要进行fg/bg二分类(单独tent出一个唯独来用于softmax分类,之后再回复原样),所以reshape layer会把它变成[1, 2, 9*H, W]大小。
因此,anchors和softmax在RPN网络中用于初步提取出foreground anchors作为候选区域。
proposal层forward的过程:
1.生成anchors,做bbox_reg
2.排序,在softmax层得到的fg anchor分数进行排序之后提取前6000个anchors
3.映射回原图,限定边界
4.nms筛选,排序,二次提取得到proposal.
RPN网络的训练每个batch是由256个proposal组成的,正负样本各占一半,模型的参数是前一部分为预训练模型的参数,剩下的参数通过高斯分布初始化。
- roi pooling层
这一层的主要作用是为了修改图片的尺寸大小,以输入全连接层进行分类和回归。
这个层的思想主要是根据spp-net网络得到的,spp-net通过金字塔结构解决了图片尺寸大小不同的问题,roi pooling通过下采样把不同大小的proposal变为相同大小的输出。
原理是:
RoI Pooling layer forward过程:在之前有明确提到: 是对应MxN尺度的,所以首先使用spatial_scale参数将其映射回(M/16)x(N/16)大小的feature maps尺度;之后将每个proposal水平和竖直分为pooled_w和pooled_h份,对每一份都进行max pooling处理。这样处理后,即使大小不同的proposal,输出结果都是 大小,实现了fixed-length output(固定长度输出)。
- 分类与回归
通过由roi pooling得到的proposal feature map连接到全连接层,由softmax分类得出这个目标属于哪一个种类,然后再通过bounding box regression进行对proposal的第二次精细调整,最终得到更加准确的目标检测框。
其结构如图所示:
图13 分类的网络结构图
- 全连接层加上softmax进行分类识别
- 对proposal通过边框回归,获得更加准确的结果。
全连接层要求固定大小输入,所以这就是roi pooling操作的原因。
由上述基本原理可知,Faster-RCNN的训练是依靠预训练模型来进行的,例如VGG模型,真实训练过程大概分为六个步骤:
- 获取预训练模型,训练RPN网络
- 通过RPN网络得到proposals
- 第一次训练Faster-RCNN
- 再一次训练RPN网络
- 利用上一步得出的RPN网络,再一次得出proposals
- 再一次训练Faster-RCNN
整体过程思想是类似于迭代,但是只需要两次即可,因为迭代多次并不会有更好的结果出现。
训练步骤如图14所示:
图14 训练步骤
训练RPN网络的步骤,先读取VGG预训练模型,通过一系列卷积结构实现对图片特征的提取。
图15 网络结构
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两部分
- 回归loss,是rpn_cls_loss层作用的,结果用于分类RPN网络得到的proposal是属于前景还是背景。
- 回归Loss, 是rpn_loss_bbox层作用的,结果用于边框回归的训练过程。在训练的过程中背景部分被忽略。
在实际计算过程中发现两者loss函数相差太大,所以用一个平衡参数来均衡影响。计算公式如下:
再对照流程图里解释一下:
- RPN训练过程,rpn_data产生anchors用于训练
- rpn-loss_cls,输入的rpn_cls_scores_reshape和rpn_labels对照公式中的p,p*,Ncls则在p,p*的caffe blob的大小中得出。
- Rpn_loss_bbox,输入进去rpn_bbox_pred,rpn_bbox_targets对照公式中的t,t*,rpn_bbox_inside_weigths对照p*,Nreg可以由caffe blob中得到。
已经得到训练好的rpn网络,在这个步骤中可以得出预测的proposals,由网络结构图可以看出,foreground softmax probability同时也可以得出,如图所示,得到的数据将保存在文件中。
图16 网络结构
读取上一步得到的文件,得到此步输入的proposals和foreground probability。
将得到的proposaals作为rois输入网络,下图所示蓝色框代表此步骤;
计算bbox_inside_weights+bbox_outside_weights,然后传入soomth_l1_loss layer,下图所示绿色框为此步骤;
最终得到的是分类的结果和边框回归的结果,在图中可以看出。
图17 训练Faster-RCNN网络结构
这是stage1的整体流程,下面的stage2过程相似,这里不重复说明。
4.1实验环境
Tensorflow 1.2
Python 3.5 其余Python包(cython,opencv-python)
Cuda 8.0
没有较好的GPU支持,所以对于测试faster rcnn只能采用demo的小测试集进行测试。
4.2实验过程
1. 配置好基础环境
2. 下载数据集
3. 下载预训练模型
4. 修改测试数据集的路径
5. 开始训练
4.3实验结果
下面列出测试小数据集得出的目标检测结果:
原始数据集为四张图片:
如图所示:红色框标注的即为目标检测的结果。
第一幅图像的检测结果:
第二幅图像检测结果:
第三幅检测结果:
第四幅检测结果:
从这几幅测试图像中可以看出,多个目标都被准确的检测了出来。
对于研究Faster rcnn的最重要的意义在于RCNN系列算法的效率提升,所以研究结果的最大意义应该表明在几种算法的效率对比上。结论参考论文结果。
可以明显的看出来,faster rcnn的时间开销远远小于前两种,但是在voc2007测试集上的map与前两种相差不多。
最后总结一下几种算法的对比,优缺点,如下表格:
算法 | 特点 | 每张图片所费时间 | 缺点 |
RCNN | 通过选择性搜索获取proposals,每张图片提取2000个区域 | 40-50s | 计算量大 |
FAST RCNN | 每张图片只需要通过一次cnn即可得出特征映射,通过选择性搜索生成proposals | 2s | 选择性搜索较慢,计算量大 |
FASTER RCNN | 通过rpn网络产生proposals,网络重复利用性高 | 0.2s | Object proposal需要花费较多时间 |
Faster rcnn最大的亮点之处是faster-rcnn把获取feature map,候选区域选取,回归和分类等操作全部融合在一个深层网络当中,效率较前两种提升了很多,综合性能有较大提高,在检测速度方面尤为明显。真正实现了end to end检测的框架,生成proposal仅需10ms。
可以将faster rcnn简单的当成由proposals生成网络rpns加上fast rcnn组合而成的,用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上做检测,相对来说有了更大的覆盖面积,也有进一步的效果提升。
总体来说,Faster-RCNN创造性的提出了rpn网络使得整体算法效率提高了很多,但仍存在缺点,接下来一定会产生结合Faster-RCNN而产生的更优秀的算法来进行目标检测
参考
[1] https://www.cnblogs.com/ywheunji/p/10375890.html
未完待续。持续更新中