Faster RCNN
前言
前段时间看了论文《基于Faster R-CNN深度网络的遥感影像目标识别方法研究》认识到了faster r-cnn深度网络,想进一步学习下,争取能够在智能板子上跑起来他的demo。
faster-rcnn Python版本源码地址:https://github.com/rbgirshick/py-faster-rcnn
新的改变
从RCNN到fast RCNN,再到Faster RCNN,目标检测的四个基本步骤(候选区域生成,特征提取,分类,位置精修)终于被统一到一个深度网络框架之内。Faster-RCNN引入了Region Proposal Network (RPN) ,它和检测网络共享整个的卷积特征,这样使得候选框的计算几乎不额外占用时间。RPN 网络是一个全卷积网络,在特征提取网络 CNN上增加了2个卷积层,可以完成端对端建议区域生成任务,预测出目标的建议框位置以及得分。Faster-RCNN通过共享卷积特征,进一步融合RPN和Fast R-CNN为一个网络——使用最近流行的基于注意力机制的网络技术,RPN单元指引统一后的网络查看的地方。
Faster-RCNN
这个图自己用visio画的,有点丑,见谅见谅
卷积层(Conv layer)
如上图所示,以VGG16为例子,conv layer中包含了conv, relu ,pooling三种层,VGG16有13个conv层,13个relu层,4个pooling层。
在conv layer中:
1.所有的conv层都是kernel_size=3,pad=1
2.所有的pooling层都是kernel_size=2,stride=2
所以,一个MxN大小的矩阵经过conv_layers固定变为(M/16)x(N/16)!这样conv_layers生成的featuure map中都可以和原图对应起来。最后得到51x39x256
区域建议网络(Region Proposal Networks)
RPN 网络是一个全卷积网络(Fully Convolutional Network,FCN),是在特征提取网络 CNN上增加了2个卷积层,因此可以完成端对端地 建议区域生成任务,同时能够预测出目标的建议框 位置和得分.以 VGG16 网络模型为例,初始图像 经过第 5 个卷积模块(卷积层+激活层+池化层)后 得到512个特征图,然后区域建议网络(RPN)根据 共享的特征图,生成候选区域并进行分类(前景或 背景),流程结构如图2所示。
从图2可看出,RPN具有2个分支,2个平行的 全连接层:① 窗口回归层,这个分支是根据特征图的 每一位置来预测对应原始图片上的建议区域;② 分 类层,用来预测该建议区域属于前景和背景(正负 样本)的概率,实现对每个建议区域的分类。
RPN的核心思想是使用CNN卷积神经网络直 接产生建议区域,使用的方法本质上就是滑动窗口,只需要在卷积层的最后一层上进行一次滑动, 接下来的 anchor 机制和边框回归可以得到多尺度 的建议区域.anchor机制的过程为:首先把每个特 征点映射回原图的感受野中心当成一个基准点, 然后围绕这个基准点选取k个不同面积,不同长宽 比的 anchor,anchor 的面积大小为 1282,2562,5122, 长宽比分别取值为 1,0.5,2.关于正负样本的划 分,需要考察训练集中的每张图片的所有 anchor。 划分流程为:
① 对每个标定的真实区域,与其重叠比例最大的 anchor 记为正样本,保证每个区域至 少对应一个正样本 anchor;
② 对剩余的 anchor,如 果其与每个标定区域重叠比例大于 0.7,记为正样 本,每个真实区域可能会对应多个正样本 anchor, 但每个正样本 anchor 只可能对应一个所标定的真 实区域;如果其与任意一个标定区域的重叠比例 都小于 0.3,记为负样本;
③ 丢弃未被标记的 anchor,并且跨越图像边界的anchor也弃去不用。
不是所有的 anchor 都用来训练,每张图像中随机抽 取256个anchor,前景样本和背景样本均取128个, 达到正负比例为1:1.如果一个图像中的正样本数 小于 128,则多用一些负样本以满足有 256 个建议区用于训练。
- 候选区域(anchor)
特征可以看做一个尺度5139的256通道图像,对于该图像的每一个位置,考虑9个可能的候选窗口:三种面积{1282,2562,5122}×三种比例{1:1,1:2,2:1}。这些候选窗口称为anchors。下图示出5139个anchor中心,以及9种anchor示例。
ROI Pooling
ROI pooling层能实现training和testing的显著加速,并提高检测accuracy。该层有两个输入:
- 从具有多个卷积核池化的深度网络中获得的固定大小的feature maps;
- 一个表示所有ROI的N*5的矩阵,其中N表示ROI的数目。第一列表示图像index,其余四列表示其余的左上角和右下角坐标;
ROI pooling具体操作如下:
(1)根据输入image,将ROI映射到feature map对应位置;
(2)将映射后的区域划分为相同大小的sections(sections数量与输出的维度相同);
(3)对每个sections进行max pooling操作;
这样我们就可以从不同大小的方框得到固定大小的相应 的feature maps。值得一提的是,输出的feature maps的大小不取决于ROI和卷积feature maps大小。ROI pooling 最大的好处就在于极大地提高了处理速度。
分类
利用已经获得的proposal featuer map,通过全连接层与softmax计算每个proposal具体属于哪个类别,输出cls_prob概率向量;同时再次利用Bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。classification部分网络结构如下:
从RIO Pooling获取到77=49大小的proposal feature maps后,送入后续的网络,可以看到做了如下2件事:
1:通过全连接层和softmax对proposal进行分类,这实际上已经是识别的范畴了
2:再次对proposals进行bounding box regression,获取更高精度的rect box*
Faster-RCNN 的训练
-
第一步:用ImageNet模型初始化,独立训练一个RPN网络;
-
第二步:仍然用ImageNet模型初始化,但是使用上一步RPN网络产生的proposal作为输入,训练一个Fast-RCNN网络,至此,两个网络每一层的参数完全不共享;
-
第三步:使用第二步的Fast-RCNN网络参数初始化一个新的RPN网络,但是把RPN、Fast-RCNN共享的那些卷积层的learning rate设置为0,也就是不更新,仅仅更新RPN特有的那些网络层,重新训练,此时,两个网络已经共享了所有公共的卷积层;
-
第四步:仍然固定共享的那些网络层,把Fast-RCNN特有的网络层也加入进来,形成一个unified network,继续训练,fine tune Fast-RCNN特有的网络层,此时,该网络已经实现我们设想的目标,即网络内部预测proposal并实现检测的功能。
Faster-RCNN 的实现
faster-rcnn Python版本源码地址: faster-rcnn.
我是在Ubuntu16.04里安装的,按照readme里的步骤来,遇到什么错误上网搜索解决一下。安装且编译成功之后可以对他自带的demo进行测试
就是对这上面几张图进行目标检测
最后会得到类似的检测结果,并且在终端会输出每一张图片检测所有建议区域的耗时,如下图所示
这里收集到的耗时时长其实还是挺久的,可能我的是cpu版的原因。