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:

  • 相关阅读:
    【JAVA笔记——道】JAVA对象销毁
    【JAVA笔记——道】并发编程CAS算法
    httpClientUtil的get请求
    python基础 day11 下 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业
    python基础 day11 上 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 事务 索引 python 操作mysql ORM sqlachemy学习
    Python基础 Day10 Gevent协程 SelectPollEpoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 RedisMemcached缓存 Paramiko SSH Twsited网络框架
    python基础 day9 进程、与线程区别 python GIL全局解释器锁 线程 进程
    python基础 day8 Socket语法及相关 SocketServer实现多并发
    python基础 day7 面向对象高级语法部分 异常处理 异常处理 Socket开发基础
    python基础 day6 面向对象的特性:封装、继承、多态 类、方法、
  • 原文地址:https://www.cnblogs.com/zf-blog/p/10095126.html
Copyright © 2011-2022 走看看