• 『计算机视觉』经典RCNN_其一:从RCNN到Faster-RCNN


    RCNN介绍

    目标检测-RCNN系列

    一文读懂Faster RCNN

    一、目标检测

    1、两个任务

    目标检测可以拆分成两个任务:识别和定位

    图像识别(classification)
    输入:图片
    输出:物体的类别
    评估方法:准确率

    定位(localization)
    输入:图片
    输出:方框在图片中的位置(x,y,w,h)
    评估方法:检测评价函数 intersection-over-union ( IOU )

    对于识别任务,卷积神经网络可以很好的帮助我们完成,但是定位任务则更加麻烦一些,我们接下来讨论一下定位任务的解决思路。

    2、两种思路

    看做回归问题

    我们需要预测出(x,y,w,h)四个参数的值,从而得出方框的位置。



    步骤1:
      • 先解决简单问题, 搭一个识别图像的神经网络
      • 在AlexNet VGG GoogleLenet上fine-tuning一下

    步骤2:
      • 在上述神经网络的尾部展开(也就说CNN前面保持不变,我们对CNN的结尾处作出改进:加了两个头:“分类头”和“回归头”)
      • 成为classification + regression模式


    步骤3:
      • Regression那个部分用欧氏距离损失
      • 使用SGD训练

    步骤4:
      • 预测阶段把2个头部拼上
      • 完成不同的功能

     
    这里需要进行两次fine-tuning
    第一次在ALexNet上做,第二次将头部改成regression head,前面不变,做一次fine-tuning

    Regression的部分加在哪?

    有两种处理方法:
      • 加在最后一个卷积层后面(如VGG)
      • 加在最后一个全连接层后面(如R-CNN)

    regression太难做了,应想方设法转换为classification问题。
    regression的训练参数收敛的时间要长得多,所以上面的网络采取了用classification的网络来计算出网络共同部分的连接权值。

    取图像窗口

      • 还是刚才的classification + regression思路
      • 我们预先划好不同大小的“框”
      • 让框出现在不同的位置,得出这个框的判定得分
      • 取得分最高的那个框


    左上角的黑框:得分0.5

    右上角的黑框:得分0.75

    左下角的黑框:得分0.6

    右下角的黑框:得分0.8

    根据得分的高低,我们选择了右下角的黑框作为目标位置的预测。
    注:有的时候也会选择得分最高的两个框,然后取两框的交集作为最终的位置预测。

    如何选区候选框?
    取不同的框,依次从左上角扫到右下角。

    总结一下思路:
    对一张图片,用各种大小的框(遍历整张图片)将图片截取出来,输入到CNN,然后CNN会输出这个框的得分(classification)以及这个框图片对应的x,y,h,w(regression)。


    这方法实在太耗时间了,做个优化。
    原来网络是这样的(overfeat的全卷积结构思路):



    优化成这样:把全连接层改为卷积层,这样可以提提速。

    二、RCNN谱系

    1、R-CNN

    (1)输入测试图像;

    (2)利用selective search 算法在图像中从上到下提取2000个左右的Region Proposal;

    (3)将每个Region Proposal缩放(warp)成227*227的大小并输入到CNN,将CNN的fc7层的输出作为特征(原文会funtune如下图);

    (4)将每个Region Proposal提取的CNN特征输入到SVM进行分类(原文将特征保存到磁盘,再分别使用SVM处理,如下图);

    (5)对于SVM分好类的Region Proposal做边框回归,用Bounding box回归值校正原来的建议窗口,生成预测窗口坐标.

    缺陷

    (1)     训练分为多个阶段,步骤繁琐:微调网络+训练SVM+训练边框回归器;

    (2)     训练耗时,占用磁盘空间大;5000张图像产生几百G的特征文件;

    (3)     速度慢:使用GPU,VGG16模型处理一张图像需要47s;

    (4)     测试速度慢:每个候选区域需要运行整个前向CNN计算;

    (5)     SVM和回归是事后操作,在SVM和回归过程中CNN特征没有被学习更新.

    2、FAST-RCNN

    (1)输入测试图像;

    (2)利用selective search 算法在图像中从上到下提取2000个左右的建议窗口(Region Proposal);

    (3)将整张图片输入CNN,进行特征提取;

    (4)把建议窗口映射到CNN的最后一层卷积feature map上;

    (5)通过RoI pooling层使每个建议窗口生成固定尺寸的feature map;

    (6)利用Softmax Loss(探测分类概率) 和Smooth L1 Loss(探测边框回归)对分类概率和边框回归(Bounding box regression)联合训练.

    相比R-CNN,主要两处不同

    (1)  最后一层卷积层后加了一个ROI pooling layer;

    (2)  损失函数使用了多任务损失函数(multi-task loss),将边框回归直接加入到CNN网络中训练

    改进

    测试时速度慢:R-CNN把一张图像分解成大量的建议框,每个建议框拉伸形成的图像都会单独通过CNN提取特征.实际上这些建议框之间大量重叠,特征值之间完全可以共享,造成了运算能力的浪费.

    FAST-RCNN将整张图像归一化后直接送入CNN,在最后的卷积层输出的feature map上,加入建议框信息,使得在此之前的CNN运算得以共享.

    效果提升明显

    3、FASTER -RCNN

    (1)输入测试图像;

    (2)将整张图片输入CNN,进行特征提取;

    (3)用RPN生成建议窗口(proposals),每张图片保留约300个建议窗口;

    (4)把建议窗口映射到CNN的最后一层卷积feature map上;

    (5)通过RoI pooling层使每个RoI生成固定尺寸的feature map;

    (6)利用Softmax Loss(探测分类概率) 和Smooth L1 Loss(探测边框回归)对分类概率和边框回归(Bounding box regression)联合训练.

    相比FAST-RCNN,主要两处不同

    (1)使用RPN(Region Proposal Network)代替原来的Selective Search方法产生建议窗口;

    (2)产生建议窗口的CNN和目标检测的CNN共享

    改进

    快速产生建议框:FASTER-RCNN创造性地采用卷积网络自行产生建议框,并且和目标检测网络共享卷积网络,使得建议框数目从原有的约2000个减少为300个,且建议框的质量也有本质的提高.

    RPN简介
      • 在feature map上滑动窗口
      • 建一个神经网络用于物体分类+框位置的回归
      • 滑动窗口的位置提供了物体的大体位置信息
      • 框的回归提供了框更精确的位置

    PRN的构成和SSD中特征层的处理极为相似。

     

    放到整体网络中如下,

    使用3*3的滑窗,每个滑动窗口位置生成9个候选窗口(不同尺度、不同宽高),对应36个坐标、18个分类。

    训练过程中,

    1)丢弃跨越边界的anchor;

    2)与样本重叠区域大于0.7的anchor标记为前景,重叠区域小于0.3的标定为背景;

    与FastRCNN类似。目标分类只需要区分候选框内特征为前景或者背景。 边框回归确定更精确的目标位置,基本网络结构如下图所示:

    故一个网络,四个损失函数;
      • RPN calssification(anchor good.bad)
      • RPN regression(anchor->propoasal)
      • Fast R-CNN classification(over classes)
      • Fast R-CNN regression(proposal ->box)

    4、回顾演进路线

    附一、回归/微调的对象是什么? 

    (4)   Bounding-box regression(边框回归) 
    那么经过何种变换才能从图11中的窗口P变为窗口呢?比较简单的思路就是: 
     


    注意:只有当Proposal和Ground Truth比较接近时(线性问题),我们才能将其作为训练样本训练我们的线性回归模型,否则会导致训练的回归模型不work(当Proposal跟GT离得较远,就是复杂的非线性问题了,此时用线性回归建模显然不合理).这个也是G-CNN: an Iterative Grid Based Object Detector多次迭代实现目标准确定位的关键. 
    线性回归就是给定输入的特征向量X,学习一组参数W,使得经过线性回归后的值跟真实值Y(Ground Truth)非常接近.即.那么Bounding-box中我们的输入以及输出分别是什么呢? 

         

    附录二、损失函数设计

    在计算Loss值之前,作者设置了anchors的标定方法.正样本标定规则:

    1)   如果Anchor对应的reference box与ground truth的IoU值最大,标记为正样本;

    2)   如果Anchor对应的reference box与ground truth的IoU>0.7,标记为正样本.事实上,采用第2个规则基本上可以找到足够的正样本,但是对于一些极端情况,例如所有的Anchor对应的reference box与groud truth的IoU不大于0.7,可以采用第一种规则生成.

    3)   负样本标定规则:如果Anchor对应的reference box与ground truth的IoU<0.3,标记为负样本.

    4)   剩下的既不是正样本也不是负样本,不用于最终训练.

    5)   训练RPN的Loss是有classification loss (即softmax loss)和regression loss (即L1 loss)按一定比重组成的.

    计算softmax loss需要的是anchors对应的groundtruth标定结果和预测结果,计算regression loss需要三组信息:

    i.     预测框,即RPN网络预测出的proposal的中心位置坐标x,y和宽高w,h;

    ii.      锚点reference box:

            之前的9个锚点对应9个不同scale和aspect_ratio的reference boxes,每一个reference boxes都有一个中心点位置坐标x_a,y_a和宽高w_a,h_a;

    iii.  ground truth:标定的框也对应一个中心点位置坐标x*,y*和宽高w*,h*.因此计算regression loss和总Loss方式如下: 

     

  • 相关阅读:
    每日一练4
    每日一练3
    每日一练2 字符串逆序输出
    每日一练1
    python全局变量
    python __file__ 与argv[0]
    python 静态方法和类方法
    常用的python库(不断更新)
    django 自定义用户user模型的三种方法
    实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(三)
  • 原文地址:https://www.cnblogs.com/hellcat/p/9629942.html
Copyright © 2020-2023  润新知