zoukankan      html  css  js  c++  java
  • Fast R-CNN

    这次讨论的是RCNN的升级版,Fast R-CNN,作者还是rbg。

    Fast RCNN是RCNN的改进,那么首先要知道RCNN有哪些地方可以改进的。

    首先 ,RCNN模型中CNN模型的分类和SVM模型的分类是一前一后的,也正是这种关系,使得模型有了断层。具体说来SVM参数的更新对于CNN网络模型的更新是没有影响的。这在Fast RCNN中的改进是使用一个end-to-end的方式来进行整体结构优化(当然region proposals还是使用SS生成的,这也是Faster RCNN的一个改进的地方),这也是为什么Fast RCNN中最后会有两个输出结构的分支。

    其次,在RCNN后面更新的版本中(version5),提到使用Bounding-box regression的方式来对候选框进行一个修正,这个改进彻底的引入到了Faster RCNN模型当中,最后输出的一个分支结构就是具体的体现。

    最后一个就是共享层的提出,这个我觉得是最棒的了,因为大大降低了模型的计算量。在RCNN中,是先从image中crop出SS出来的图像,然后在送到网络中得到对应的特征向量,因此,对于一张图片来讲要进行2k次这样的计算,这是因此这个crop操作实在网络的输入处,如果将这个操作移到网络的输出处(论文中说的是pool5),那么就可以只计算一次就可以,然后再从对应的特征中crop出来。

    大体来讲整个模型的主要改进就是这样的。

    因此网络模型分为两步:

    第一步,生成对应的候选框,region proposals,在这篇文章中也叫做RoI。

    第二步,将图片以及对应的RoI输入到网络中,得到图片的类别信息和需要修正RoI的信息(并不是直接生成物体所在的边框的位置,而是生成对SS出来的边框的一个修正值),最后在进行和RCNN中后面类似的操作就可以了。

    END ^_^


    细节部分

    RoI 是什么?

    论文中RoI是一个4元组,表示的是region proposals在原始图像中的位置,从左到右的含义依次为,左上角的x,左上角的y,高度h,和宽度w。

    RoI和RoI层是相关联的,RoI层的输入就是从feature中crop出来的RoI。文章提出RoI层的目的是为了对于不同尺寸的RoI对应的Feature map(也是不同尺寸)生成同样尺寸的Feature map(这里继承了SPNet的思想,采用的是最大池化的方式)。具体实现就是预先定义好要生成的尺寸大小(文中是作为一种超参数存在的),然后按照根据这个尺寸大小求出对应池化大小的尺寸,这样就可以了。

    网络模型:

    这次使用的是预训练好的网络模型权重,因此不用像RCNN中那样,自己训练一个网络模型。

    然后就是进行网络结构的调整,具体步骤如下:

    首先,网络模型最后的池化层被RoI层给取代了。接着将全连接层以及最后的softmax层用两个分支层来替换,一个层来输入对应类别概率,另一个是用来输出对于RoI的bounding-box regressors。最后将模型单输入修改成为多输入,一个输入原始图片信息,另一个输入对一个RoI(也就是那个四元组)。

    接下来是什么呢?那就是最最重要的微调了。

    第一:对数据的采样方式。每次输入2张图片(随机采样)和64个RoI(每张图片),这样可以尽可能的利用sharing features。

    第二:采用多任务损失函数来联合训练。

    然后采用SGD的方式进行训练就可以了,这部分用语言描述太微弱了,还是看原文是如何来进行陈述的吧,最考验技巧性的时候到了。

    这里插一句话,总感觉Fast RCNN这种实现方式,像极了将深度学习当作一个黑箱,比方说,在图像尺度方面的描述称让网络自己来学习其中的尺度不变性,以及在RCNN中还使用线性回归的方式来进行bbos-regression,这里直接使用神经网络来实现了,可能两者是等效的吧,我对这里的研究还不是太深。总之这篇文章中有太多的不可描述。过几天写Faster RCNN的时候会显得更加机械化,也就是说不出道理来,这样会使得效果很好,解释性就显得微弱一些,回到正题吧。

    测试阶段:

    上面的网络模型已经训练好了,接下来就是将测试的图片输入到网络中,输入一张图片以及2k左右的RoI,网络会得到一个2K*(C+1)的概率矩阵,同时还会得到2k*4k(这里的k表示的是类别信息)的region refine,然后进行non-maximum suppression independently for each class,这里只要对列进行操作就行了,因为每一列都是同一个类别的。

    感觉自己理解的也不是特别深刻,就这样吧。

  • 相关阅读:
    PAT Advanced 1067 Sort with Swap(0, i) (25分)
    PAT Advanced 1048 Find Coins (25分)
    PAT Advanced 1060 Are They Equal (25分)
    PAT Advanced 1088 Rational Arithmetic (20分)
    PAT Advanced 1032 Sharing (25分)
    Linux的at命令
    Sublime Text3使用指南
    IntelliJ IDEA创建第一个Groovy工程
    Sublime Text3 安装ftp插件
    Sublime Text3配置Groovy运行环境
  • 原文地址:https://www.cnblogs.com/andyniu/p/7411602.html
Copyright © 2011-2022 走看看