zoukankan      html  css  js  c++  java
  • faster-rcnn自己的理解总结(包括它的前世今身R-CNN和fast R-CNN)

    1、grandfather:  R-CNN网络

    结构如下:

    工作流程:

     Input(an image)   Proposals(~2K个,在使用CNN提取特征之前还要先resize)  feature maps  每类得分,再经过NMS筛选,再使用手工设计的回归器进行box regression;

     缺点:

    (1)速度慢,2K多个proposals都要经过CNN提取特征;

    (2)先分类在再回归,没有实现end to end;

    2、father:  fast R-CNN网络

     结构如下:

    工作流程:

    Input(an Image,同时已经用SS提取了proposals,知道了它们的位置)  整图的feature map(同时将proposals映射到了feature map上)(经过Rol Pooling的resize操作)再使用softmax分类以及box regssion

    改进:

    (1)不用再对每一个proposal单独提取特征,大大提高了速度;

    (2)引入了ROI Pooling层;

    (3)将分类和回归加入了网络,且共享卷积层,不用再像R-CNN中那样单独训练SVM和回归器了;

     缺点:

    (1)依然在使用SS(selective search)提取候选框,很耗时;

    为了摒弃SS,我们取而代之使用RPN网络,即用CNN实现提取特征框的功能,这样一来所有的操作都可以通过CNN实现了,真正实现了end to end,然后我们的猪脚登场了:

    3、son : faster-rcnn的网络结构如下:

    如上图所示,(im_info = [M , N , scale_factor]),说一下它的前向传播流程:

    (1)一般对于输入的图像,P*Q的原图先统一缩放为M*N,并且在前面的特征提取层(也可称“共享卷积层”)中,由于stride = 1 , pad = 1 , kernel size = 3 * 3,所以卷积前后图像大小不变,只有四个Pool层起到了作用,因此原始图像经过提取层后的feature map大小为(M / 16)* (N /16),这样做也是为了使原始图像到feature map的缩放系数为整数从而使得feature map上的每个特征点和M*N的原始图像的区域坐标更方便地实现一一映射关系,这对后面生成proposal会有帮助;

    (2)RPN结构中第一个层是一个3*3的卷积层,它作用在经过特征提取层后的feature map上,我觉得这个3*3的卷积作用是为了增加目标附近区域的语义理解;然后再经过两条支路,每条都首先经过一个1*1的卷积。先看上面一条,这条的作用是对“foreground”和"background"进行二分类,所以经过1*1之后的深度为18(9*2,对应每个点生成9个anchors和每个anchor两个类别),再看下面一条,也是经过一个1*1的卷积,深度为36(9*4)进行矩形框回归,然后这两条支路汇合,首先去除掉background类别,然后对于剩下的forground类别,利用im_info先将anchors放大到M*N的原始图像上,这些放大后在原始图像上的区域就是一开始的proposals,数量很多所以我们还要进行两次筛选:第一次,判断这些proposals是否大范围超出图像边界,剔除严重超出边界的;第二次,对剩下的proposals进行nms,然后对nms后的proposals根据cls scores进行排序,选取top-N个作为最终的proposals(一般在600个左右),其实到这里检测任务差不多就完成了,但作者后面还加另一步,相当于一个refine;

    (3)之后就涉及到ROI Pooling层了,由于RPN输出的proposals对应的M*N的输入图像,所以我们先通过im_info中的scale_factor将其映射到特征提取层的feature map上,但由于后面需要经过全连接层,而这里每个proposals映射到feature map上的大小均不同,所以我们使用了ROI Pooling层将这些proposals映射后的大小固定(7*7或者6*6,好像论文和实现里稍微有点不同,看代码就知道了),然后这块固定的区域再经过全连接层进行分类和坐标框回归;

     关于如何训练,参考这个:https://www.cnblogs.com/zf-blog/p/7142463.html

    补充:

    (1)bounding box regression:

  • 相关阅读:
    Linux中的用户和用户组
    GCC编译过程
    C++设计模式——单例模式(转)
    快速排序之python
    归并排序之python
    计数排序之python
    希尔排序之python
    插入排序之python
    选择排序之python
    冒泡排序之python
  • 原文地址:https://www.cnblogs.com/zf-blog/p/10095126.html
Copyright © 2011-2022 走看看