过两年的沉淀,rbg大神于2016年提出了R-CNN系列的封神之作——Faster-RCNN,全称:《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks》,同时何凯明博士也是这篇论文的作者之一。
话不多说,上论文(百度云链接:https://pan.baidu.com/s/13luKlGF1RAHp29bp3KPoFw ,提取码:n6j2 )。
R-CNN系列,或者说以R-CNN名字命名的目标检测算法主线上包括最开始的R-CNN、Fast-RCNN以及本算法Faster-RCNN(他们真的不是很会起名字,如果再有下一篇岂不是Fastest-RCNN了)。Faster-RCNN 顾名思义,就是更快的RCNN模型。
在前面几个模型中,我们可以发现,检测速度在逐步变快、检测精度在逐步变高,当我们再重新审视Fast-RCNN模型的时候,发现在整个卷积神经网络中我们已经做得很好了:添加了空间金字塔池化层,避免了图像的过度拉伸,同时也不再需要将每一个候选区域均走一遍特征提取;更换了分类和回归算法,将分类和回归纳入卷积网络之中。如果再要加速的话,那么就是需要修改候选区域的提取方式了(我猜,这可能也是何凯明大神和rbg大神的心路历程)。
一. 论文解读
Abstract
最先进的物体检测网络依赖于SS算法来推测物体的位置。像SPPnet和Fast R-CNN,减少了这些检测网络的运行时间,暴露了候选区域的计算是一个瓶颈。在这项工作中,我们介绍一个区域建议网络(RPN)与检测共享全图像卷积特征网络(此处为重要创新点!)。一个RPN是一个全卷积网络,同时在每个位置上预测对象边界和对象分数。 RPN是端对端训练,用来产生高质量候选区域用于Fast R-CNN检测。用一个简单交替优化,可以训练RPN和Fast R-CNN进行共享卷积特征(又是一个重点!)。对于VGG-16模型,我们的检测系统在GPU上的帧速率为5fps,在PASCAL VOC 2007数据集上的检测精度为73.2%mAP,在2012上的检测精度是70.4%。
1. Introduction
目标检测的最新进展是由region proposal 方法和基于区域的卷积神经网络(R-CNN)所带来的的。Fast R-CNN ,使用深度神经网络实现接近实时的速率。现在,proposal 是最限制发展的计算瓶颈。
region proposal方法通常依赖廉价的特征和经济的推理方案。选择性搜索(SS)是最流行的方法之一。 然而,与有效的检测网络相比,选择性搜索速度慢一个数量级,在CPU实现中每个图像的速度为2s。EdgeBoxes每张图像为0.2s。尽管如此,region proposal仍然是限制速度的关键。
利用GPU实现region proposal是加速的关键。
Faster-RCNN引入了RPN(重点!!!)与最先进的物体检测网络共享卷积层。
基于区域的检测器所使用的卷积(conv)特征映射就像Fast-RCNN也可用于生成region proposal。 在这些转换功能之上,我们通过添加两个附加的转换层构建RPN:一个编码每个转换映射位置(例如,256-d)特征矢量,第二个在每个conv地图位置输出一个对于不同尺度和方面的k区域提案的对象得分和回归界限在该位置的比率(k = 9是典型值)。
因此,我们的RPN是一种全卷积网络(FCN)[14],他们可以训练端到端专门用于生成region proposal的任务。 为了将Fast-RCNN与RPN统一起来实现目标检测,我们提出一个简单的训练方案。(后面提到,通过四步共享参数!)
2. Related Work
卷积的共享计算已经越来越受到关注,有效而准确的视觉识别。OverFeat从一个图像金字塔进行分类,定位和检测。 SPP为了有效的基于区域的对象检测和语义,提出了共享转换特征映射分割。 Fast-RCNN可以在共享转换功能和端点上实现端到端的检测器培训。
3. Region Proposal Networks(RPN)
(以下内容并没有翻译原论文,介意请绕行)
Fast-RCNN 网络模型中仍然是利用 SS 算法进行候选区域的获取,并没有将候选区域的提取纳入到深度卷积网络之中,如此操作使得网络模型的整体优化受到限制。Faster-RCNN 中优化了特征提取方式,提出了 RPN 网络进行感兴趣区域的获取。
RPN 网络利用了 SPP-Net 网络中的映射机制,从 conv5 上进行滑窗操作替换从原始图像上进行滑窗操作。RPN 从构建原理上而言是一个全卷积网络,其主要作用是用来预测候选区对象的分类得分以及边界位置。
如图,RPN 通过在 CONV5 上进行滑窗来提取候选区,并将其每个窗口映射到一个较低维度的向量上(VGG_16 的低维度映射向量是 512 维)。在这里引入一个 anchor 的概念,在每个滑动窗口的位置,选取 k 个建议区域(本课题采用k=9),这 k 个建议区域相对于 k 个建议框的参数化,被称之为 anchor。对于每一个 anchor 都是以当的前滑动窗口中心作为其中心点,并且同时对应一种大小和长宽比。因此将每个滑动窗口映射得到的降维向量输入到两个全连接层后得到的 reg 层有 4k 个输出,cls 层有 2k 个输出,其分别是中心点的横纵坐标以及候选框的长宽值以及每个建议框是或者不是目标的概率。
4. A Loss Function for Learning Region Proposals
为了训练RPN,我们为每个锚点分配一个二进制类标签(作为一个对象或不)。 我们给两种锚点分配一个正面的标签:(i)具有最高交叉口的IoU与实际框重叠,或(ii)具有较高的IoU重叠的锚比任何实际框都要高0.7。 请注意,单个实际框可能会分配正面的标签多个锚点。 如果其IoU比率低于正值,则将负标签分配给非正向锚点0.3为所有实际框。
根据这些定义,我们将Fast RCNN中的多任务丢失后的目标函数最小化。 我们对图像的损失函数被定义为:
在这里,I是一个小批量锚点的指数,pi是我作为一个对象的锚点的预测概率。 如果锚为正,则地面真值标签为1,如果锚为负,则为0。 ti是表示预测边界框的4个参数化坐标的矢量,是与正锚点相关的地面实况框的坐标。 分类损失Lcls是两个类(对象与非对象)的对数损失。
对于回归,我们采用4个坐标的参数化:
其中x,y,w和h表示框中心,宽度和高度的两个坐标。 变量x,xa和x *分别针对预测框,锚点框和地面实况框(同样针对y,w,h)。 这可以被认为是从锚箱到附近的地面真值箱的边界框回归。
独立训练的RPN和Fast R-CNN将以不同的方式修改自己的conv层。因此,我们需要开发一种允许在两个网络之间共享转发层的技术,而不是学习两个单独的网络。 请注意,这不像简单定义那样容易包含RPN和Fast R-CNN的单一网络,然后与反向传播一起进行优化。原因在于快速R-CNN训练依赖于固定的对象提议,并且在同时改变提议机制的情况下学习快速R-CNN并不先验证将会收敛。 虽然这种联合优化对于未来的工作来说是一个有趣的问题,实用的4步训练算法,通过交替优化学习共享特征。
(下面就是Faster-RCNN典型的四步训练法!)
第一步,我们如上所述训练RPN。 这个网络是用ImageNetpre训练的初始化的模型和微调端到端的地区提案任务。
在第二步,我们通过Fast R-CNN使用Step-1 RPN生成的建议来训练单独的检测网络。该检测网络也由ImageNet预先训练的模型初始化。 在这两点网络不共享转发层。
第三步,我们使用探测器网络来初始化RPN培训,但是我们修复了共享的转换层,并且只对RPN特有的层进行了微调。 现在两个网络共享转发层。
最后,保持共享的转换层固定,我们微调fc层Fast R-CNN。 因此,两个网络共享相同的转发层并形成统一的网络。
二. 训练
Faster-RCNN 可以看做是 Fast-RCNN 和 RPN 的结合体,即吸收了前者的针对候选框归一化的操作以及后者的针对候选框的提取方法。Faster-RCNN 算法实现了将整个目标检测过程统一吸收进深度神经网络之中,成为了真正意义上的基于深度神经网络的目标检测模型。
首先将经过预处理过后的遥感图像利用深度神经网络获取其卷积特征,利用 RPN 生成网络生成候选区域。然后经过感兴趣区域池化层归一化后,将固定大小的特征向量输出到全连接层。最后将特征向量利用 Softmax 分类获得目标分类,利用 Bbox 回归获得感兴趣区域的精准位置。
通过利用自己的数据集,利用该模型进行训练。并获得训练模型后,检测自己的数据集有较好的效果。
我所使用的机器是华为的刀片服务器,K40M的显卡。每张图片大概500K左右,共计约8000张图片。分别利用基于ZF的模型和基于VGG-16的模型进行训练。训练所用的时间分别是30个小时和70个小时左右。
检测时使用CPU的检测速度大约每秒检测4张图片,使用GPU时大约13张图片每秒。
我的数据集共计4类,每一类的检测精度均在0.75以上,平均检测精度为0.79。
在训练的过程中,还是有各种各样的坑的,有机会以后再详细说明。
到此为止,已经简单的介绍了R-CNN系列的模型。毫无疑问,这个系列的检测模型一步步走来,无论其检测精度还是检测速度都有了极大的提升。但是,人是贪得无厌的,如何才能检测的更快的?还有没有什么方法来提速呢?于是乎,出现了YOLO系列和SSD系列。
未完待续。。。