Faster RCNN 论文入门学习笔记

(一) 整体框架

在这里插入图片描述
整体介绍图中各层主要的功能

  1. Conv layers提取特征图:

    作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取input image的feature maps,该feature maps会用于后续的RPN层和全连接层

  2. RPN(Region Proposal Networks):

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

  3. Roi Pooling:

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

  4. Classifier:

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

(二) 网络结构

在这里插入图片描述

2.1 Conv layers

Faster RCNN首先是支持输入任意大小的图片的,比如上图中输入的 P ∗ Q P*Q PQ,进入网络之前对图片进行了规整化尺度的设定,如可设定图像短边不超过600,图像长边不超过1000,我们可以假定 M ∗ N = 1000 ∗ 600 M*N=1000*600 MN=1000600(如果图片少于该尺寸,可以边缘补0,即图像会有黑色边缘)

  1. 13个conv层:kernel_size=3,pad=1,stride=1;

卷积公式:在这里插入图片描述

所以,conv层不会改变图片大小(即:输入的图片大小=输出的图片大小)

  1. 13个relu层:激活函数,不改变图片大小

  2. 4个pooling层:kernel_size=2,stride=2;pooling层会让输出图片是输入图片的1/2

经过Conv layers,图片大小变成 ( M / 16 ) ∗ ( N / 16 ) (M/16)*(N/16) (M/16)(N/16),即: 60 ∗ 40 60*40 6040(1000/16≈60,600/16≈40);则,Feature Map就是 60 ∗ 40 ∗ 512 60*40*512 6040512-d(注:VGG16是512-d,ZF是256-d),表示特征图的大小为 60 ∗ 40 60*40 6040,数量为512)

2.2 RPN(Region Proposal Networks):

feature Map进入RPN后,先经过一次 3 ∗ 3 3*3 33的卷积,同样,特征图大小依然是 60 ∗ 40 60*40 6040,数量512,这样做的目的应该是进一步集中特征信息,接着看到两个全卷积,即kernel_size= 1 ∗ 1 1*1 11,p=0,stride=1;

在这里插入图片描述

  1. rpn_cls: 60 ∗ 40 ∗ 512 60*40*512 6040512-d ⊕ 1 ∗ 1 ∗ 512 ∗ 18 1*1*512*18 1151218 ==> 60 ∗ 40 ∗ 9 ∗ 2 60*40*9*2 604092

    逐像素对其9个Anchor box进行二分类

  2. rpn_bbox: 60 ∗ 40 ∗ 512 60*40*512 6040512-d ⊕ 1 ∗ 1 ∗ 512 ∗ 36 1*1*512*36 1151236==> 60 ∗ 40 ∗ 9 ∗ 4 60*40*9*4 604094

    逐像素得到其9个Anchor box四个坐标信息(偏移量)

即:
在这里插入图片描述

2.2.1 Anchors的生成规则

前面提到经过Conv layers后,图片大小变成了原来的1/16,令feat_stride=16,在生成Anchors时,我们先定义一个base_anchor,大小为 16 ∗ 16 16*16 1616的box(因为特征图(60*40)上的一个点,可以对应到原图( 1000 ∗ 600 1000*600 1000600)上一个 16 ∗ 16 16*16 1616大小的区域),源码中转化为[0,0,15,15]的数组,参数ratios=[0.5, 1, 2] ,scales=[8, 16, 32]

先看[0,0,15,15],面积保持不变,长、宽比分别为[0.5, 1, 2]是产生的Anchors box
在这里插入图片描述
如果经过scales变化,即长、宽分别均为 ( 16 ∗ 8 = 128 16*8=128 168=128)、( 16 ∗ 16 = 256 16*16=256 1616=256)、( 16 ∗ 32 = 512 16*32=512 1632=512),对应anchor box:

在这里插入图片描述
综合以上两种变换,最后生成9个Anchor box:
在这里插入图片描述

所以,最终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.]]

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

2.3 RPN工作原理解析

在这里插入图片描述
图中框住的‘RPN’部分的网络图,其中 ‘rpn_conv/ 3 ∗ 3 ’ 3*3’ 33 3 ∗ 3 3*3 33的卷积,上面有提到过,接着是两个 1 ∗ 1 1*1 11的全卷积,分别是图中的‘rpn_cls_score’和‘rpn_bbox_pred’,在上面同样有提到过。接下来,分析网络图中其他各部分的含义

  1. rpn-data
.     layer {
.      name: 'rpn-data'
.      type: 'Python'
.      bottom: 'rpn_cls_score'   #仅提供特征图的height和width的参数大小
.      bottom: 'gt_boxes'        #ground truth box
.      bottom: 'im_info'         #包含图片大小和缩放比例,可供过滤anchor box
.      bottom: 'data'
.      top: 'rpn_labels'
.      top: 'rpn_bbox_targets'
.      top: 'rpn_bbox_inside_weights'
.      top: 'rpn_bbox_outside_weights'
.      python_param {
.        module: 'rpn.anchor_target_layer'
.        layer: 'AnchorTargetLayer'
.        param_str: "'feat_stride': 16 \n'scales': !!python/tuple [8, 16, 32]"
.      }
.    }

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

  1. 去除掉超过 1000 ∗ 600 1000*600 1000600这原图的边界的anchor box

  2. 如果anchor box与ground truth的IoU值最大,标记为正样本,label=1

  3. 如果anchor box与ground truth的IoU>0.7,标记为正样本,label=1

  4. 如果anchor box与ground truth的IoU<0.3,标记为负样本,label=0

剩下的既不是正样本也不是负样本,不用于最终训练,label=-1

除了对anchor box进行标记外,另一件事情就是计算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 △y=(y*-y_a)/h_a

△w=log(w*/w_a) △h=log(h*/h_a)

通过ground truth box与预测的anchor box之间的差异来进行学习,从而是RPN网络中的权重能够学习到预测box的能力

  1. rpn_loss_cls、rpn_loss_bbox、rpn_cls_prob

下面集体看下这三个,其中‘rpn_loss_cls’、‘rpn_loss_bbox’是分别对应softmax,smooth L1计算损失函数,‘rpn_cls_prob’计算概率值(可用于下一层的nms非最大值抑制操作)

补充:

  1. Softmax公式,计算各分类的概率值

在这里插入图片描述

  1. Softmax Loss公式,RPN进行分类时,即寻找最小Loss值

    在这里插入图片描述

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

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

2.4 proposal

.    layer {
.      name: 'proposal'
.      type: 'Python'
.      bottom: 'rpn_cls_prob_reshape' #[1,18,40,60]==> [batch_size, channel,height,width]Caffe的数据格式,anchor box分类的概率
.      bottom: 'rpn_bbox_pred'  # 记录训练好的四个回归值△x, △y, △w, △h
.      bottom: 'im_info'
.      top: 'rpn_rois'
.      python_param {
.        module: 'rpn.proposal_layer'
.        layer: 'ProposalLayer'
.        param_str: "'feat_stride': 16 \n'scales': !!python/tuple [4, 8, 16, 32]"
.      }
.    }

在输入中我们看到’rpn_bbox_pred’,记录着训练好的四个回归值 △ x , △ y , △ w , △ h △x, △y, △w, △h x,y,w,h

源码中,会重新生成 60 ∗ 40 ∗ 9 60*40*9 60409个anchor box,然后累加上训练好的 △ x , △ y , △ w , △ h △x, △y, △w, △h x,y,w,h,从而得到了相较于之前更加准确的预测框region proposal,进一步对预测框进行越界剔除和使用nms非最大值抑制,剔除掉重叠的框;

比如,设定IoU为0.7的阈值,即仅保留覆盖率不超过0.7的局部最大分数的box(粗筛)。最后留下大约2000个anchor,然后再取前N个box(比如300个);这样,进入到下一层ROI Pooling时region proposal大约只有300个

2.5 roi_data

.      layer {
.      name: 'roi-data'
.      type: 'Python'
.      bottom: 'rpn_rois'
.      bottom: 'gt_boxes'
.      top: 'rois'
.      top: 'labels'
.      top: 'bbox_targets'
.      top: 'bbox_inside_weights'
.      top: 'bbox_outside_weights'
.      python_param {
.        module: 'rpn.proposal_target_layer'
.        layer: 'ProposalTargetLayer'
.        param_str: "'num_classes': 81"
.      }
.    }

为了避免定义上的误解,我们将经过‘proposal’后的预测框称为region proposal(其实,RPN层的任务其实已经完成,roi_data属于为下一层准备数据)

主要作用:

  1. RPN层只是来确定region proposal是否是物体(是/否),这里根据region proposal和ground truth
    box的最大重叠指定具体的标签(就不再是二分类问题了,参数中指定的是81类)
  2. 计算region proposal与ground truth boxes的偏移量,计算方法和之前的偏移量计算公式相同

经过这一步后的数据输入到ROI Pooling层进行进一步的分类和定位.

(三) ROI Pooling

 .    layer {
.      name: "roi_pool5"
.      type: "ROIPooling"
.      bottom: "conv5_3"   #输入特征图大小
.      bottom: "rois"      #输入region proposal
.      top: "pool5"     #输出固定大小的feature map
.      roi_pooling_param {
.        pooled_w: 7
.        pooled_h: 7
.        spatial_scale: 0.0625 # 1/16
.      }
.    }

从上述的Caffe代码中可以看到,输入的是RPN层产生的region proposal(假定有300个region proposal box)和VGG16最后一层产生的特征图 ( 60 ∗ 40 60*40 6040 512-d),遍历每个region proposal,将其坐标值缩小16倍,这样就可以将在原图( 1000 ∗ 600 1000*600 1000600)基础上产生的region proposal映射到 60 ∗ 40 60*40 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 7*7 77大小的feature map,故而输出的数组是:[300,512,7,7],作为下一层的全连接的输入

(四) Classifier

全连接层:

经过roi pooling层之后,batch_size=300, proposal feature map的大小是 7 ∗ 7 7*7 77,512-d,对特征图进行全连接,参照下图,最后同样利用Softmax Loss和L1 Loss完成分类和定位

在这里插入图片描述
通过full connect层与softmax计算每个region proposal具体属于哪个类别(如人,马,车等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个region proposal的位置偏移量bbox_pred,用于回归获得更加精确的目标检测框

即从PoI Pooling获取到7x7大小的proposal feature maps后,通过全连接主要做了:

  1. 通过全连接和softmax对region proposals进行具体类别的分类
  2. 再次对region proposals进行bounding box regression,获取更高精度的rectangle box
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值