【目标检测系列:二】Faster RCNN 论文阅读+解析+pytorch实现

Introduce

Faster RCNN 组成

(1)基础特征提取网络(2)RPN (Region Proposal Network) (3)Fast-RCNN

共享:RPN和Fast-RCNN共享特征提取卷积层
思路:提取proposal + 分类

Faster RCNN 和 SPPNet

  • 不同于SPP层的是,没有多尺度的pooling,只有一个尺度的pooling(可以理解为特殊的SPP层)
  • 其次引入了多任务损失函数,用于同时计算bbox回归和分类的损失。
【目标检测系列:二】Faster RCNN 论文阅读+解析+pytorch实现_第1张图片

Net

【目标检测系列:二】Faster RCNN 论文阅读+解析+pytorch实现_第2张图片

我们先整体的介绍下上图中各层主要的功能

  1. Conv layers提取特征图:
    提取图片的特征
  • 作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取input image的feature maps,该feature maps会用于后续的RPN层和全连接层
  1. RPN(Region Proposal Networks):

    RPN网络主要用于生成 region proposals

    • 首先生成一堆 Anchor box,对其进行裁剪过滤后通过softmax判断anchors属于前景(foreground)或者后景(background),即是物体or不是物体,所以这是一个二分类;同时,另一分支bounding box regression修正anchor box,形成较精确的proposal(注:这里的较精确是相对于后面全连接层的再一次box regression而言)

    • RPN网络为CNN后面接一个3*3的卷积层,再接两个1*1的卷积层(原文称这两个卷积层的关系为sibling),其中一个是用来给 softmax 层进行分类,另一个用于给候选区域精确定位

    • 代替之前的 search selective

  2. Roi Pooling:

该层利用RPN生成的proposals和VGG16最后一层得到的feature map,得到固定大小的proposal feature map,进入到后面可利用全连接操作来进行目标识别和定位

  • 和Fast R-CNN一样,将不同大小的输入转换为固定长度的输出,输入输出和Fast R-CNN中RoI pooling一样。
  1. Classifier:

输出候选区域所属的类,和候选区域在图像中的精确位置。

  • 会将Roi Pooling层形成固定大小的feature map进行全连接操作,利用Softmax进行具体类别的分类,
  • 利用L1 Loss完成 bounding box regression 回归操作获得物体的精确位置.

【目标检测系列:二】Faster RCNN 论文阅读+解析+pytorch实现_第3张图片

【目标检测系列:二】Faster RCNN 论文阅读+解析+pytorch实现_第4张图片

Anchor

  • 可以理解为一些预设大小的框
  • anchor 种类 k = 9
    分别是三个面积尺寸(128 × 128,256 × 256,512 × 512)
    三种不同的长宽比例(1:1,1:2,2:1)
  • 每个anchor对应原图的一个区域,我们要学习这个区域的分类(2分类前景/背景)和框回归微调(4个x,y,w,h)
  • 两个Loss,每个anchor分类有2个输出,回归有4个输出
    一共k个anchor,即一共2k和分类score和4k各回归坐标

【目标检测系列:二】Faster RCNN 论文阅读+解析+pytorch实现_第5张图片

Multi-task Loss Function

多任务损失函数(Multi-task Loss Function)

  • Softmax Classification Loss
  • Bounding Box Regression Loss

Anchors的生成规则

  • 经过Conv layers后,图片大小变成了原来的1/16

  • 在生成Anchors时,我们先定义一个base_anchor,大小为1616的box
    (因为特征图(60
    40)上的一个点,可以对应到原图(1000600)上一个1616大小的区域)

  • 源码中转化为[0,0,15,15]的数组,参数ratios=[0.5, 1, 2],scales=[8, 16, 32]

    • 先看[0,0,15,15],面积保持不变,长、宽比分别为[0.5, 1, 2] 产生的Anchors box
      【目标检测系列:二】Faster RCNN 论文阅读+解析+pytorch实现_第6张图片

    • 经过scales变化,即长、宽分别均为 (168=128)、(1616=256)、(16*32=512),对应anchor box如图
      【目标检测系列:二】Faster RCNN 论文阅读+解析+pytorch实现_第7张图片

    • 综合以上两种变换,最后生成9个Anchor box

    【目标检测系列:二】Faster RCNN 论文阅读+解析+pytorch实现_第8张图片

最终base_anchor=[0,0,15,15]生成的9个Anchor box坐标如下:

[[ -84.  -40.   99.   55.]  
[-176.  -88.  191.  103.]  
[-360. -184.  375.  199.]  
[ -56.  -56.   71.   71.]  
[-120. -120.  135.  135.]  
[-248. -248.  263.  263.]  
[ -36.  -80.   51.   95.]  
[ -80. -168.   95.  183.]  
[-168. -344.  183.  359.]]

具体计算过程见 Pytorch - Anchor

  • 特征图大小为6040,所以会一共生成6040*9=21600个Anchor box
    源码中,通过width:(060)*16,height(040)*16建立shift偏移量数组,再和base_ancho基准坐标数组累加,得到特征图上所有像素对应的Anchors的坐标值,是一个[216000,4]的数组

这21600 个anchor怎么筛选呢??这就用到下面的 RPN 了

RPN

RPN

  • 是 Faster R-CNN与Fast R-CNN最大的区别
  • 可以理解为一种全卷积网络,该网络可以进行end-to-end的训练
  • 最终目的是为了推荐候选区域
【目标检测系列:二】Faster RCNN 论文阅读+解析+pytorch实现_第9张图片

Network

  • 最后的conv5层num_output=256,对应生成256张特征图(feature maps)
  • 在conv5之后,做了rpn_conv/3x3卷积且num_output=256,相当于每个点又融合了周围3x3的空间信息),同时256-d不变
  • 假设在conv5 feature map中每个点上有k个anchor(原文如上k=9),而每个anchor要分foreground和background,所以每个点由256d feature转化为cls=2k scores;而每个anchor都有[x, y, w, h]对应4个偏移量,所以reg=4k coordinates(scores和coordinates为RPN的最终输出)
    【目标检测系列:二】Faster RCNN 论文阅读+解析+pytorch实现_第10张图片

【目标检测系列:二】Faster RCNN 论文阅读+解析+pytorch实现_第11张图片

RPN网络与Fast R-CNN网络的权值共享

  • 先训练RPN,然后使用得到的候选区域训练Fast R-CNN
  • 再使用得到的Fast R-CNN中的CNN去初始化RPN的CNN
  • 再次训练RPN(这里不更新CNN,仅更新RPN特有的层)
  • 最后再次训练Fast R-CNN(这里不更新CNN,仅更新Fast R-CNN特有的层)。
【目标检测系列:二】Faster RCNN 论文阅读+解析+pytorch实现_第12张图片 【目标检测系列:二】Faster RCNN 论文阅读+解析+pytorch实现_第13张图片

RPN 工作原理

【目标检测系列:二】Faster RCNN 论文阅读+解析+pytorch实现_第14张图片

  • 对照 net 图
    【目标检测系列:二】Faster RCNN 论文阅读+解析+pytorch实现_第15张图片
    rpn_conv/33 是33的卷积(进一步集中特征信息)
    rpn_cls_scorerpn_bbox_pred 1*1的全卷积

  • rpn-data

    • 这一层主要是为特征图60*40上的每个像素生成9个Anchor box,并且对生成的Anchor box进行过滤和标记,参照源码,过滤和标记规则如下:

      • 去除掉超过1000*600这原图的边界的anchor box
      • 如果anchor box与ground truth的IoU值最大,标记为正样本,label=1
      • 如果anchor box与ground truth的IoU>0.7,标记为正样本,label=1
      • 如果anchor box与ground truth的IoU<0.3,标记为负样本,label=0
      • 剩下的既不是正样本也不是负样本,不用于最终训练,label=-1
    • 计算anchor box与ground truth之间的偏移量

    ground truth:标定的框也对应一个中心点位置坐标x*,y和宽高w,h*

    anchor box: 中心点位置坐标x_a,y_a和宽高w_a,h_a

    所以,偏移量:

    △ x = ( x ∗ − x a ) / w a △x=(x^*-x_a)/w_a x=(xxa)/wa △ y = ( y ∗ − y a ) / h a △y=(y^*-y_a)/h_a y=(yya)/ha

    △ w = l o g ( w ∗ / w a ) △w=log(w^*/w_a) w=log(w/wa) △ h = l o g ( h ∗ / h a ) △h=log(h^*/h_a) h=log(h/ha)

    通过 ground truth box 与预测的 anchor box 之间的差异来进行学习

  • Loss

    • rpn_loss_cls
      softmax 计算各分类的概率值

    • rpn_loss_bbox
      smooth L1计算损失函数

    • rpn_cls_prob
      计算概率值(可用于下一层的nms非最大值抑制操作)

    • 在’rpn-data’中已经为预测框anchor box进行了标记,并且计算出与gt_boxes之间的偏移量,利用RPN网络进行训练。

    • 在训练RPN时,一个Mini-batch是由一幅图像中任意选取的256个proposal组成的,其中正负样本的比例为1:1。如果正样本不足128,则多用一些负样本以满足有256个Proposal可以用于训练,反之亦然

      • 全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练

      与ground truth box有最大的IoU的anchors作为正样本;
      与ground truth box的IoU大于0.7的作为正样本。

  • proposal

    • rpn_cls_prob_reshape
      [1,18,40,60]==> [batch_size, channel,height,width]
      Caffe的数据格式,anchor box分类的概率

    • rpn_bbox_pred
      记录训练好的四个回归值△x, △y, △w, △h

    • 训练

    源码中,会重新生成60409个anchor box,然后累加上训练好的△x, △y, △w, △h,从而得到了相较于之前更加准确的预测框region proposal
    进一步对预测框进行越界剔除和使用nms非最大值抑制,剔除掉重叠的框
    比如,设定IoU为0.7的阈值,即仅保留覆盖率 不超过 0.7的局部最大分数的box(粗筛)。最后留下大约2000个anchor,然后再取前N个box(比如300个);这样,进入到下一层ROI Pooling时region proposal大约只有300个

    • NMS 示例

    【目标检测系列:二】Faster RCNN 论文阅读+解析+pytorch实现_第16张图片

    一共有6个识别为人的框,每一个框有一个置信率。

    按置信率排序: 0.95, 0.9, 0.85, 0.8 ,0.7,0.6

    • 取最大0.95的框为一个物体框

    • 剩余5个框中,去掉与 0.95 框重叠率IoU大于0.7(可以另行设置)
      去掉 0.85 , 0.7
      则保留0.9, 0.8, 0.6三个框

    • 重复上面的步骤,直到没有框
      取最大 0.9 框
      剩余2个框,去掉与 0.9 框重叠率IoU大于0.7(可以另行设置)
      去掉 0.8, 0.6
      没有框了,结束

    • 选出来的为: 0.95, 0.9

    整个过程,可以用下图形象的表示出来

    【目标检测系列:二】Faster RCNN 论文阅读+解析+pytorch实现_第17张图片

    红色的A框是生成的anchor box
    蓝色的G’框就是经过RPN网络训练后得到的较精确的预测框
    绿色的G是ground truth box

  • roi_data
    将经过 proposal 后的预测框称为 region proposal
    (其实,RPN层的任务其实已经完成,roi_data 属于为下一层准备数据)

ROI Pooling

  • 输入的是RPN层产生的region proposal(假定有300个region proposal box)和VGG16最后一层产生的特征图(60*40 512-d)

  • 遍历每个region proposal,将其坐标值缩小16倍,这样就可以将在原图(1000600)基础上产生的region proposal映射到6040的特征图上,从而将在feature map上确定一个区域(定义为RB*)。

  • 在feature map上确定的区域RB*,根据参数pooled_w:7,pooled_h:7,将这个RB区域划分为**77**,即49个相同大小的小区域,对于每个小区域,使用max pooling方式从中选取最大的像素点作为输出
    这样,就形成了一个7*7的feature map

  • 参照上述方法,300个region proposal遍历完后,会产生很多个7*7大小的feature map,故而输出的数组是:[300,512,7,7],作为下一层的全连接的输入

FC

【目标检测系列:二】Faster RCNN 论文阅读+解析+pytorch实现_第18张图片

  • 通过全连接和 softmax 对region proposals进行具体类别的分类

  • 再次对region proposals进行bounding box regression,获取更高精度的 box

4-step alternating training

  • faster rcnn = rpn + fast rcnn
    rpn和fast rcnn 共享卷积层

  • 训练过程

    • 单独训练rpn(ImageNet-pre_train + fine-tune),得到rpn1,CNN1
    • 单独训练fast rcnn(ImageNet-pre_train + fine-tune),结合第一步的region proposal,得到fast-rcnn1,CNN2
    • fine-tune rpn1 on CNN2,得到rpn2(共享卷积层)
    • fine-tune fast-rcnn1 on CNN2,结合第三步的region proposal,得到fast rcnn2(共享卷积层)

train RPN

【目标检测系列:二】Faster RCNN 论文阅读+解析+pytorch实现_第19张图片

generate proposals

【目标检测系列:二】Faster RCNN 论文阅读+解析+pytorch实现_第20张图片

train Fast R-CNN

【目标检测系列:二】Faster RCNN 论文阅读+解析+pytorch实现_第21张图片

Pytorch

为了避免文章过长,pytorch 解析 在 【目标检测系列:三】Faster RCNN 论文pytorch实现详解

Reference

https://www.cnblogs.com/wangyong/p/8513563.html 写的非常好,推荐 ++++
https://blog.csdn.net/liuxiaoheng1992/article/details/81843363
https://blog.csdn.net/zziahgf/article/details/79311275
https://blog.csdn.net/Zachary_Co/article/details/78890768
https://blog.csdn.net/Quincuntial/article/details/79132243
https://blog.csdn.net/zchang81/article/details/73176497
https://tryolabs.com/blog/2018/01/18/faster-r-cnn-down-the-rabbit-hole-of-modern-object-detection/

你可能感兴趣的:(Object,Detection)