参考链接:https://blog.csdn.net/wopawn/article/details/52223282
paper链接:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
Breakthrough
Fast R-CNN和Faster R-CNN是R-CNN的升级版本,在准确率和实时性方面都得到了较大提升。Fast R-CNN使用Selective Search的方法提取图像的候选目标区域,Faster R-CNN引入了RPN网络(Region Proposal Network),将Proposal的提取部分嵌入到内部网络,实现了卷积层特征共享,因此整个网络模型可以完成端到端的检测任务,而不需要先执行特定的候选框搜索算法,显著提升了算法模型的实时性。
区别于SSD,Faster R-CNN是基于区域提名(Region Proposal)的方法。其核心改进是设计了一个Region Proposal Network(RPN),代替了Selective Search、EdgeBoxes等方法,速度上提升明显;在每个图像位置输出一个预测的object bounding box和objectness score,这个网络与原来的Fast R-CNN共享conv feature map,几乎不增加计算量,能够大幅提高网络的检测速度。
rcnn家族算法的步骤:
一、RCNN
1.在图像中确定约1000-2000个候选框 (selective search);
2.每个候选框内图像块缩放至相同大小,并输入到CNN内进行特征提取 ;
3.对候选框中提取出的特征,使用分类器判别是否属于一个特定类 ;
4.对于属于某一特征的候选框,用回归器进一步调整其位置。
二、Fast RCNN
1.在图像中确定约1000-2000个候选框 (ss);
2.对整张图片输进CNN,得到feature map;
3.找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层;
4.对候选框中提取出的特征,使用分类器判别是否属于一个特定类 ;
5.对于属于某一特征的候选框,用回归器进一步调整其位置。
三、Faster RCNN
1.对整张图片输进CNN,得到feature map;
2.卷积特征输入到RPN,得到候选框的特征信息;
3.对候选框中提取出的特征,使用分类器判别是否属于一个特定类 ;
4.对于属于某一特征的候选框,用回归器进一步调整其位置。
R-CNN、Fast R-CNN、Faster R-CNN三者之间的关系:
速度对比
Faster R-CNN的主要贡献是设计了提取候选区域的网络RPN,代替了费时的选择性搜索,使得检测速度大幅提高。如果选用VGG16网络进行特征提取,在训练阶段,Fast-R-CNN的速度相比RCNN和SPP-Net可以分别提升9倍和3倍;在测试阶段,Fast-R-CNN的速度相比RCNN和SPP-Net可以分别提升213倍和10倍。
Fast-R-CNN优点
1.Fast-R-CNN检测效果优于R-CNN和SPP-Net
2.训练方式简单,基于多任务Loss,不需要SVM训练分类器。
3.Fast-R-CNN可以更新所有层的网络参数(采用ROI Layer将不再需要使用SVM分类器,从而可以实现整个网络端到端训练)
4.不需要将特征缓存到磁盘。
总的来说,从R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN一路走来,基于深度学习目标检测的流程变得越来越精简,精度越来越高,速度也越来越快。可以说基于region proposal的R-CNN系列目标检测方法是当前目标检测技术领域最主要的一个分支。
网络结构
Faster R-CNN模型主要由两个模块组成:RPN候选框提取模块和Fast R-CNN检测模块,如下图所示,又可细分为4个部分;Conv Layer,Region Proposal Network(RPN),RoI Pooling,Classification and Regression。
notice:上图Fast R-CNN中含特有卷积层,个人认为不是所有卷积层都参与共享。
大体流程:
1.首先向CNN网络【ZF或VGG-16】输入任意大小图片;
2.经过CNN网络前向传播至最后共享的卷积层,一方面得到供RPN网络输入的特征图,另一方面继续前向传播至特有卷积层,产生更高维特征图;
3.供RPN网络输入的特征图经过RPN网络得到区域建议和区域得分,并对区域得分采用非极大值抑制【阈值为0.7】,输出其Top-N【文中为300】得分的区域建议给RoI池化层;
4.第2步得到的高维特征图和第3步输出的区域建议同时输入RoI池化层,提取对应区域建议的特征;
5.第4步得到的区域建议特征通过全连接层后,输出该区域的分类得分以及回归后的bounding-box。
anchor机制
anchor是RPN网络的核心,用来确定每个滑窗中心对应感受野内是否存在目标,由于目标大小和长宽比例不一,需要多个尺度的窗。传统的检测方法中为了能够得到多尺度的检测框,需要通过建立图像金字塔的方式,对图像或者滤波器(滑动窗口)进行多尺度采样。Anchor给出一个基准窗大小,按照倍数和长宽比例得到不同大小的窗。如论文中基准窗大小为16,给了(8,16,32)三种倍数和(0.5,1,2)三种比例,这样能够得到一共9种尺度的anchor。
具体过程为RPN使用一个3×3的卷积核,在最后一个特征图(conv5-3)上滑动,将卷积核中心对应位置映射回输入图像,生成3种尺度(scale){128^2,256^2,512^2}和3种长宽比(aspect ratio){1:1,1:2,2:1}共9种Anchor,特征图conv5-3每个像素点都对应9个anchors,如果feature map的大小为W×H,则一共有W×H×9个anchors,滑动窗口的方式保证能够关联conv5-3的全部特征空间,最后在原图上得到多尺度多长宽比的anchors,并后向输出512维的特征向量,全连接层后须接两个子连接层---分类层(cls)和回归层(reg),分类层用于判断anchors属于目标还是背景,向量维数为2k,回归层用于计算anchors的偏移量和缩放量,共4个参数[dx,dy,dw,dh],向量维数为4k。继而根据图像大小计算滑窗中心点对应原图区域的中心点,通过中心点和size就可以得到滑窗位置和原图位置的映射关系,由此原图位置并根据与Ground Truth重复率贴上正负标签,让RPN学习该Anchors是否有物体即可。
作者在文中表示采用anchors这种方法具有平移不变性,就是说在图像中平移了物体,窗口建议也会跟着平移。同时这种方式也减少了整个模型的size,输出层512×(4+2)×9=2.8×10^4个参数【512是前一层特征维度,(4+2)×9是9个Anchors的前景背景得分和平移缩放参数】,而MultiBox有1536×(4+1)×800=6.1×10^6个参数,而较小的参数可以在小数据集上减少过拟合风险。当然,在RPN网络中我们只需要找到大致的地方,无论是位置还是尺寸,后面的工作都可以完成,这样的话采用小网络进行简单的学习【估计和猜差不多,反正有50%概率】,还不如用深度网络【还可以实现卷积共享】,固定尺度变化,固定长宽比变化,固定采样方式来大致判断是否是物体以及所对应的位置并降低任务复杂度。
Anchors为什么考虑以上三种尺度和长宽比? 文中对Anchors的尺度以及长宽比选取进行了实验,如下图所示:
RPN
Region Proposal Network。SPPnet和Fast R-CNN虽然减少了检测网络运行的时间,但计算区域建议依然耗时较大。RBG和Kaiming He将Region Proposal也交给CNN,提出RPN区域建议网络,它能和整个检测网络共享全图的卷积特征,使得区域建议几乎不花时间。
RPN的目的是实现"attention"机制,告诉Fast-RCNN后续的检测、识别、分类过程需要注意哪些区域,其核心思想是使用CNN直接产生Region Proposal,RPN在最后的卷积层上滑动一遍,生成两个卷积层完成区域建议功能,第一个卷积层将特征图每个滑窗位置编码成一个特征向量,第二个卷积层对应每个滑窗位置输出k个区域得分和k个回归后的区域建议,并对得分区域进行非极大值抑制后输出得分Top-N【文中为300】区域,告诉检测网络应该注意哪些区域,本质上实现了Selective Search、EdgeBoxes等方法的功能。
RCNN解决的是,“为什么不用CNN做classification呢?”
Fast R-CNN解决的是,“为什么不一起输出bounding box和label呢?”
Faster R-CNN解决的是,“为什么还要用selective search呢?”
训练过程
1.将原图P×Q缩放至固定大小M×N(源码中是要求长边不超过1000,短边不超过600);
2.缩放后的图像经VGG16,用其网络的部分卷积层产生原始图像的特征图,最后一个feature map为conv5-3,特征数(channels)为512,经过CNN网络前向传播至最后共享的卷积层,一方面得到供RPN网络输入的特征图,另一方面继续前向传播至特有卷积层,产生更高维特征图;
3.RPN网络在特征图conv5-3上执行3×3【n=3看起来很小,但是要考虑到这是非常高层的feature map,其size本身也没有多大,因此9个矩形中,每个矩形窗框都是可以感知到很大范围的】卷积操作,后接512维的全连接层,后再接两个子连接层,分别用于anchors的分类和回归,再通过计算筛选得到proposals,供RPN网络输入的特征图经过RPN网络得到区域建议和区域得分,并对区域得分采用非极大值抑制【0.7】,输出其Top-N【300】得分的区域建议给RoI池化层;
4.第2步得到的高维特征图和第3步输出的区域建议同时输入RoI池化层,提取对应区域建议的特征;
5.第4步得到的区域建议特征通过全连接层后,输出该区域的分类得分以及回归后的bounding-box。然后将RoIs Pooling层则利用Proposal从feature maps中提取Proposal feature进行池化操作,送入后续的Fast R-CNN网络做分类和回归。RPN网络和Fast R-CNN网络中均有分类和回归,但两者有所不同,RPN中分类是判断conv5-3中对应的anchors属于目标和背景的概率(score),并通过回归获取anchors的偏移和缩放尺度,根据目标得分值筛选用于后续检测识别的Proposal;Fast R-CNN是对RPN网络提取的Proposal做分类识别,并通过回归参数调整得到目标(Object)的精确位置。
train RPN
generate proposals
train Fast R-CNN
采样
每一个mini-batch包含从一张图像中随机提取的256个anchor(注意,不是所有的anchor都用来训练),前景样本和背景样本均取128个,达到正负比例为1:1。如果一个图像中的正样本数小于128,则多用一些负样本以满足有256个Proposal可以用于训练。
Bounding-Box regression
边框回归。目的是微调后的region proposal跟ground truth 更接近,正确的检测出物体。如下图绿色的框为飞机的Ground Truth,红色的框是提取的region proposal。那么即便红色的框被分类器识别为飞机,但是由于红色的框定位不准(IoU<0.5),那么这张图相当于没有正确的检测出飞机。所以,bounding-box regression就是用来微调这个窗口的,使得经过微调后的窗口跟ground truth更接近,这样岂不是定位会更准确。
RPN与Fast R-CNN特征共享
RPN和Fast R-CNN都是独立训练的,要用不同方式修改它们的卷积层。因此需要开发一种允许两个网络间共享卷积层的技术,而不是分别学习两个网络。注意到这不是仅仅定义一个包含了RPN和Fast R-CNN的单独网络,然后用反向传播联合优化它那么简单。原因是Fast R-CNN训练依赖于固定的目标建议框,而且并不清楚当同时改变建议机制时,学习Fast R-CNN会不会收敛。
RPN在提取得到proposals后,作者选择使用Fast-R-CNN实现最终目标的检测和识别。RPN和Fast-R-CNN共用了13个VGG的卷积层,显然将这两个网络完全孤立训练不是明智的选择,作者采用交替训练(Alternating training)阶段卷积层特征共享:
第一步,训练RPN,用ImageNet预训练的模型初始化,并端到端微调用于区域建议任务;
第二步,我们利用第一步的RPN生成的建议框,由Fast R-CNN训练一个单独的检测网络,这个检测网络同样是由ImageNet预训练的模型初始化的,这时候两个网络还没有共享卷积层;
第三步,用检测网络初始化RPN训练,但我们固定共享的卷积层,并且只微调RPN独有的层,现在两个网络共享卷积层了;
第四步,保持共享的卷积层固定,微调Fast R-CNN的fc层。这样,两个网络共享相同的卷积层,构成一个统一的网络。
注意:
第一次迭代时,用ImageNet得到的模型初始化RPN和Fast-R-CNN中卷积层的参数;从第二次迭代开始,训练RPN时,用Fast-R-CNN的共享卷积层参数初始化RPN中的共享卷积层参数,然后只Fine-tune不共享的卷积层和其他层的相应参数。训练Fast-RCNN时,保持其与RPN共享的卷积层参数不变,只Fine-tune不共享的层对应的参数。这样就可以实现两个网络卷积层特征共享训练。
转载原文:https://blog.csdn.net/JH0lmes/article/details/80019236