zoukankan      html  css  js  c++  java
  • 带你一文读懂Faster RCNN论文

    Faster RCNN论文解读

     最近看了Faster RCNN的论文, 又参考了一篇写很好的中文博客, 现在将Faster RCNN的总体思路和实现细节记录在这篇博客, 方便以后复习。
     Faster RCNN在RCNN和Fast RCNN的基础之上, 统一了特征抽取、候选区域提取、边界回归、分类, 让这个模型成为了一个端到端的模型, 并且在速度上得到了极大的提升, 让RCNN家族真正实现了Real-Time Detection。

    参考文章: 一文读懂Faster RCNN

    0. Faster RCNN概览

    在这里插入图片描述
     从论文的这个图上可以看出来, Faster RCNN主要分为了四个部分:

    1. Conv layers: Faster RCNN先是使用了一个基础的backbone实现特征提取, 得到feature maps。该feature maps将会被共享用于后续RPN网络和全连接层。
    2. Region Proposal Network: RPN这个网络主要用来生成region proposals, 取代了以前selective search这种生成方式。并且这个层通过softmax来判断anchors属于positive还是negative, 再利用bounding box regression修整anchors获得精确的proposals。
    3. Roi Pooling: 这个层在Fast RCNN中被提出, 主要用于收集输入的feature maps和proposals将候选区域对应的feature变换到固定尺度, 送入后续的全连接层判定目标类别。
    4. Classification: 利用proposal feature maps计算proposals的类别, 同时再次进行bounding box regression。

     下面我将详细介绍这四个部分的实现细节。

    1. Conv layers

     一般Conv layers包括了conv、pooling、relu三种层。在论文中提到的两种Conv layers的网络分别是VGG16和ZF model。
     这个部分有个细节需要特别注意, 两个Conv layers的模型在conv的时候都采用了same padding, 而relu也不会改变feature maps的大小。这就意味着只有pooling层才会改变feature maps的大小。例如:输入一个 M × N M imes N M×N大小的图像, 经过了Conv layers的四层 2 × 2 2 imes 2 2×2的pooling之后, 得到了一个固定为 M 16 × N 16 frac{M}{16} imes frac{N}{16} 16M×16N大小的feature maps, 由于只是放缩变换, 所以feature maps中的点是很容易对应到原图的点的。这一点对后续根据feature maps中的点计算其原图位置十分重要

    2. Region Proposal Networks

    RPN1

    RPN2
     上图1是论文中的原图。上图2是我在参考文章中截的, 感觉把RPN画的很清楚, 就拿过来了。从上图2可以看出来, 再经过Conv layers提取特征之后,feature maps将会被送入RPN网络。这个网络分为两条线, 上面那条线通过一个 1 × 1 1 imes 1 1×1的卷积将feature maps的channel转换到一个固定尺度(即2k, k就是anchors数目, 论文中用的是9),然后通过softmax等操作判断anchors的positive和negative(一个anchor同时输出positive和negative的概率, 所以这里是2k);下面那条线则是用来预测bounding box regression中anchors的偏移量, 同样是利用了 1 × 1 1 imes 1 1×1的卷积生成了4k固定channel的feature maps, 代表了anchor在x、y、w、h这四个部分的偏移量。

    3. RoI pooling

     RoI Pooling层则负责收集proposal,并计算出proposal feature maps,送入后续网络。从图2中可以看到RoI pooling层有两个输入:

    • 原始的featurue maps
    • RPN输出的region proposals(大小不同

     下面说一下RoI Pooling layer forward的过程:

    1. 由于proposals对应的是 M × N M imes N M×N尺度的,所以首先需要把它映射到 M 16 × N 16 frac{M}{16} imes frac{N}{16} 16M×16N这个feature maps的尺度。
    2. 再将每一个proposal划分为 p o o l e d _ w × p o o l e d _ h pooled\_w imes pooled\_h pooled_w×pooled_h的网格。
    3. 对每一个网格都进行max pooling操作。

     这样处理之后, 大小不同的region proposals在feature maps的尺度之下, 都被统一到了 p o o l e d _ w × p o o l e d _ h pooled\_w imes pooled\_h pooled_w×pooled_h大小。

    4. Classification

     Classification部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别,输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。

    5. Faster RCNN训练

     Faster RCNN的训练步骤主要分为4个步骤:

    1. 利用pre-trained model,训练RPN网络
    2. 把pre-trained model和RPN结合起来成为Faster RCNN网络,再进行训练。
    3. 第二次训练RPN网络。
    4. 把第二次训练的RPN网络和2中再训练的pre-trained model合成Faster RCNN再进行训练。
  • 相关阅读:
    RxJava Android(RxAndroid) 开发全家桶
    Android Retrofit RxJava实现缓存
    Android Touch事件传递机制详解 下
    Android Touch事件传递机制详解 上
    Android Framework 记录之二
    XMind 8 Update 7 Pro 激活码
    leetcode 2-> Add Two Numbers
    leetcode 1 -> Two Sum
    leetcode 3-> Longest Substring Without Repeating Characters
    Python enumerate() 函数
  • 原文地址:https://www.cnblogs.com/lsl1229840757/p/14122574.html
Copyright © 2011-2022 走看看