前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >目标检测系列之二(R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN)

目标检测系列之二(R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN)

作者头像
Minerva
修改2020-05-31 13:10:29
1.1K0
修改2020-05-31 13:10:29
举报

目标检测系列之二(R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN)

内容目录

1 R-CNN1.1 候选框提取1.2 特征向量提取1.3 SVM分类1.4 候选框修正1.5 R-CNN的缺点2 Fast R-CNN2.1 RoI Pooling Layer2.2 Multi-task loss3 Faster R-CNN3.1 RPN(Region Proposal Networks)3.2 Bounding Box Regression4 Mask R-CNN4.1 FPN(Feature Pyramid Network)4.2 RoI Align4.3 Mask Branch

1 R-CNN

论文的题目是 《Rich feature hierarchies for accurate object detection and semantic segmentation》 论文地址:https://arxiv.org/abs/1311.2524 R-CNN的结构就是Selective Search + CNN + SVM,算法流程: 1) 用Selective Search提取出2000个候选框(Region Proposal) 2) 用去掉Softmax的AlexNet网络提取特征 3) 用K(目标类个数)个SVM分类器进行训练,对前面的候选框进行测试得到每个候选框属于某一类的概率值 4) 用NMS对每个类别的候选框进行处理,删掉冗余的一些候选框 5) 对剩余的候选框进行Bounding Box回归,修正候选框的位置。

1.1 候选框提取

选择性搜索对输入图像进行分割产生很多小区域(2000个),根据这些小区域的相似性(颜色、纹理、大小等)采用子区域合并的方法进行区域迭代合并,生成外切矩形,也就是候选框。

1.2 特征向量提取

作者使用模型AlexNet(之前的文章介绍过这个模型, 深度学习系列(二)卷积神经网络模型(从LeNet-5到Inception V4))来提取候选框的特征向量,这里AlexNet的输入大小为227x227,而我们第一步提取的候选框大小不一,作者直接暴力的将所有候选框缩放到227x227。 网络的训练过程分为两步: 1) 基于ImageNet的图像分类训练,输出为1000维向量 2) 采用训练好的AlexNet模型在PASCAL VOC2017样本集下进行微调训练,输出为21维向量(20个目标类和1个背景)

1.3 SVM分类

对第二步提取的特征向量(AlexNet去除最后一个全连接层之后的输出,每个候选框为4096维特征),采用SVM分类器进行分类,得到类别得分。 1) 对每个类别分别训练SVM得到20个SVM模型,得到2000×20维矩阵,表示每个候选框属于某个类别的概率 2) 对2000×20维矩阵中每列进行NMS非极大值抑制,去除重叠的候选框,得到每类得分最高的一些候选框。 这里SVM训练过程的正样本为Ground Truth真实目标,负样本为与Ground Truth相交IOU小于0.3的候选框。

1.4 候选框修正

使用一个回归器对候选框进行边界修正,输入为AlexNet网络的4096维特征向量,输出为x、y方向缩放和平移,这里的样本为与Ground Truth相交IOU大于0.6的候选框,注意在测试时同样需要回归器进行训练。

1.5 R-CNN的缺点

两个字:耗时。不论是选择性搜索部分,还是CNN提取特征部分,以及SVM分类和边框回归修正,都非常耗时,在后面的模型(Fast RCNN)提出之后,可以解决R-CNN的大部分问题。

2 Fast R-CNN

论文的题目是 《Fast R-CNN》,论文地址:https://arxiv.org/abs/1504.08083。 考虑到R-CNN耗时的问题,Fast R-CNN被提出来,基于VGG16的Fast R-CNN在训练速度上比R-CNN快9倍,测试速度快了200多倍,思路如下: 1) 首先采用Selective Search提取2000个候选框ROI 2) 将整个图像作为输入,使用卷积神经网络进行特征提取 3) 使用一个RoI Pooling Layer提取每个候选框的特征 4) 分别经过并列的21维(用于分类)和84维(用于回归)的全连接层,得到每个候选框的类别和边界框(四个代表坐标的值)。

2.1 RoI Pooling Layer

RoI Pooling Layer 的作用是针对不同大小的候选框,经过卷积神经网络要输出固定大小的特征,是SPP层的简化版,SPP采用不同大小的金字塔映射,采用多个尺度(1x1,2x2,4x4)的池化层进行池化操作,可以得到21维(4x4+2x2+1x1=21)的特征向量。而RoI Pooling Layer只采用单一尺度进行池化(4x4),得到16维(4x4)的特征向量,这样网络对输入图像的尺寸不再有限制,之后将特征向量输入全连接层。 在实际训练中,每张图像有64个RoI,从中挑选出与Groun Truth的IOU值都大于0.5约25%的RoI,并采用随机翻转增加数据集,而测试的时候每张图像会产生2000多个RoI。

2.2 Multi-task loss

损失函数是将分类和回归的Loss整合在一起,分类任务采用Softmax来代替SVM分类器,输出类别数+背景类结果,Softmax引入了类间竞争分类效果优于SVM,回归损失输出的是4xN类别,这里的4表示候选框的中心坐标、宽、高。 Fast R-CNN尽管速度和精度上都有很大提升,但是仍然没有没有解决候选框同步提取的问题,无法做到端到端(end-to-end)的目标检测,这也是后续Faster R-CNN改进的方向之一。

3 Faster R-CNN

论文题目是《aster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks》 论文地址:https://arxiv.org/abs/1506.01497。 Faster R-CNN创造性的采用卷积神经网络(基于VGG16)自动产生候选框,并且和目标检测网络共享卷积,大大减少了冗余的候选框,将候选框数量从2000降低到300个,候选框的质量也有所提高,其思路如下: 1) 将整张图像reshape后输入卷积神经网络进行特征提取 2) 用RPN结构生成一系列anchor box,在对box进行裁剪后通过Softmax来判断这些anchor box属于前景目标(foreground)还是背景(background) 3) 用bounding box regression来修正anchor box 4) 通过RoI Pooling Layer提取每个候选框的特征 5) 分别利用Softmax Loss(用于分类)和Smooth L1 Loss(用于回归)对分类概率和边框回归进行联合训练。

3.1 RPN(Region Proposal Networks)

RPN用于生成候选区域,通过Softmax判断anchors属于正例还是负例,再利用bounding box 回归来修正anchors获得更精确的候选框。

Faster R-CNN抛弃了之前的选择性搜索方法,直接采用RPN来提取候选框,极大提升了候选框的生成速度,输入图像在经过卷积神经网络和一个3x3卷积之后得到特征向量,在上面的通道经过缩放和Softmax得到anchors属于正例还是负例的概率值,下面的通道对于anchors进行边界框回归修正,之后Proposal结构会综合正例anchors和对应的边界框修正偏移量,删除太小和超出边界的候选框,得到最后的候选框。RPN的目的是在原图中设置密密麻麻的一堆候选anchors,然后用CNN去判断哪些包含目标, Anchors的每行有4个值,分别代表矩形框的中心坐标、长和宽,共有三种尺度{128,256,512},三种长宽比为{1:1,1:2,2:1}三种,共9个矩形框。原图被缩放至800x600,经过VGG16下采样16倍,在每个点设置9个anchors,一共产生的anchors数量为:

3.2 Bounding Box Regression

我们在前面生成一系列的候选框之后,会发现很多框并不完美,Bounding Box Regression可以对这些候选框进行回归修正,使得目标候选框和实际的Ground Truth更接近,通常我们对候选框的窗口用(x,y,w,h)表示,分别表示窗口的中心点坐标和宽高,我们的目标是通过输入原始的不精确的anchor A,经过一定的映射得到更加精确的与真实窗口G更接近的回归窗口G’,思路就是先平移后缩放:

平移:

缩放:

而在模型训练的时候,回归网络的输出就是每个anchor的平移量和变换尺度,从而修正anchor的位置。

最后总结一下,作者在源代码采用的4-Step Alternating Training方法,来自于知乎用户晓雷:

  1. 第一步:用ImageNet模型初始化,独立训练一个RPN网络;
  2. 第二步:仍然用ImageNet模型初始化,但是使用上一步RPN网络产生的proposal作为输入,训练一个Fast-RCNN网络,至此,两个网络每一层的参数完全不共享;
  3. 第三步:使用第二步的Fast-RCNN网络参数初始化一个新的RPN网络,但是把RPN、Fast-RCNN共享的那些卷积层的learning rate设置为0,也就是不更新,仅仅更新RPN特有的那些网络层,重新训练,此时,两个网络已经共享了所有公共的卷积层;
  4. 第四步:仍然固定共享的那些网络层,把Fast-RCNN特有的网络层也加入进来,形成一个unified network,继续训练,fine tune Fast-RCNN特有的网络层,此时,该网络已经实现我们设想的目标,即网络内部预测proposal并实现检测的功能。 训练流程图如下:

4 Mask R-CNN

论文题目《Mask R-CNN》 论文地址:https://arxiv.org/abs/1703.06870 Mask R-CNN主要由Faster R-CNN、RoI Align和Mask三部分构成,在Faster R-CNN的基础上加入了Mask branch(FCN)来生成目标的掩模(object mask),把RoI Pooling修改为RoI Aligh来解决mask与原图目标不对齐的问题,将Faster R-CNN扩展为了实例分割框架,该框架可以实现目标分类、目标检测、实例分割、语义分割、人体姿态识别等多种任务。

算法步骤如下: 1) 将图像输入到预训练好的神经网络(ResNeXt等)中得到特征向量 2) 对特征向量图像的每个点设定给定数量的RoI来获得一系列候选的RoI 3) 将候选RoI输入RPN网络进行是否含有目标的二值分类和Bounding Box回归,删掉一部分冗余的RoI 4) 对剩余的候选RoI进行RoI Aligh操作 5) 对RoI进行分类(N类分类而不是二值分类)、Bounding Box回归和Maks生成 Mask R-CNN可以基于多种卷积神经网络进行特征提取,如VGG16、VGG19、ResNet50、ResNet101等,

4.1 FPN(Feature Pyramid Network)

FPN融合了多层不同尺度的feature maps,充分提取了卷积神经网络不同层的特征,在anchors的尺度方面,每层的尺度scale为{32,64,128,256,512},ratio长宽比为{0.5,1,2},每个像素点产生三个anchor,对应5种尺度得到15种不同大小的anchors

4.2 RoI Align

Mask R-CNN 使用RoI Align 替换了Faster R-CNN中的RoI Pooling,因为RoI Pooling出现了两次取整,还原到原图上会因为取整导致很大的偏差,这对于分类任务并不重要,但对实例分割而言,几十个像素点的偏差是很明显的,RoI Align避免了这个问题。RoI Align取消了暴力取整的方法,采用双线性插值得到四个点坐标的像素值,返回到原图时误差很小。 我们来分析一下这里如果暴力取整会导致多少误差,在特征提取过程中我们需要两次量化操作 1) 原始图像到特征图像:假如我们的输入图像大小为800x800,经过5个池化层得到的特征图像大小为800/32x800/32=25x25,假如我们的目标框实际大小为665x665,,对应一下在特征图像大小为665/32x665/32=20.78x20.78,这里的浮点数要取整到20x20,引入了第一次量化误差 2) 特征图像到RoI图像:假如我们的RoI要求固定大小7x7,我们需要将20x20的RoI转换成7x7,20/7x20/7=2.86x2.86,这里也是浮点数需要取整到2x2,引入第二次量化误差 这里的0.86误差看起来不大,但是当我们还原到原图大小时,误差就变为0.86x32=27.52,这么大的误差对于实例分割是致命的。

RoI Align直接采用双线性插值进行处理,如果我们计算出来的特征图像大小为20.78x20.78,那我们就用这个数,RoI大小为20.78/7x20.78/7=2.97x2.97,通过双线性插值直接计算虚拟坐标2.97x2.97位置的像素值。

4.3 Mask Branch

首先为了预测Mask准确率更高,将RoI Align 的输出维度扩大,输出K个Mask预测图,每个类输出一张。

参考: https://zhuanlan.zhihu.com/p/61611588 https://blog.csdn.net/fengbingchun/article/details/87091740 https://www.cnblogs.com/wangguchangqing/p/10384058.html https://zhuanlan.zhihu.com/p/31426458 https://zhuanlan.zhihu.com/p/37998710

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python编程和深度学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 内容目录
  • 1 R-CNN
    • 1.1 候选框提取
      • 1.2 特征向量提取
        • 1.3 SVM分类
          • 1.4 候选框修正
            • 1.5 R-CNN的缺点
            • 2 Fast R-CNN
              • 2.1 RoI Pooling Layer
                • 2.2 Multi-task loss
                • 3 Faster R-CNN
                  • 3.1 RPN(Region Proposal Networks)
                    • 3.2 Bounding Box Regression
                    • 4 Mask R-CNN
                      • 4.1 FPN(Feature Pyramid Network)
                        • 4.2 RoI Align
                          • 4.3 Mask Branch
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档