Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

论文地址
一文读懂Faster RCNN
a-PyTorch-Tutorial-to-Object-Detection


本文主要是 《一文读懂Faster RCNN》 的内容,旨在学习Faster RCNN算法整体思路,加上了一点理解


0. 前言

Faster R-CNN网络结构图。
在这里插入图片描述

在文中,白裳认为Faster RCNN其实可以分为4个主要内容:

  1. Conv Layer,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
  2. Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals。
  3. RoI Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
  4. Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。

在这里插入图片描述
在上图中,对于一副任意大小PxQ的图像:

  1. 首先缩放至固定大小MxN,然后将MxN图像送入网络;
  2. RPN(红框部分),经过3x3卷积,再分别生成positive anchors和对应bounding box regression偏移量,然后计算出proposals
  3. Roi Pooling层则利用proposals从feature maps中提取proposal feature送入后续全连接和softmax网络作classification(即分类proposal到底是什么object)。

1. Conv Layers

Conv layers包含了conv,pooling,relu三种层。以python版本中的VGG16模型中的faster_rcnn_test.pt的网络结构为例,如图2,Conv layers部分共有13个conv层,13个relu层,4个pooling层。这里有一个非常容易被忽略但是又无比重要的信息,在Conv layers中:
在这里插入图片描述
在Faster RCNN Conv layers中对所有的卷积都做了扩边处理( pad=1,即填充一圈0),导致原图变为 (M+2)x(N+2)大小,再做3x3卷积后输出MxN 。正是这种设置,导致Conv layers中的conv层不改变输入和输出矩阵大小。

在这里插入图片描述
Conv layers中的pooling层kernel_size=2,stride=2。这样每个经过pooling层的MxN矩阵,都会变为(M/2)x(N/2)大小。综上所述,在整个Conv layers中,conv和relu层不改变输入输出大小,只有pooling层使输出长宽都变为输入的1/2。

一个MxN大小的矩阵经过Conv layers固定变为(M/16)x(N/16)!因为有4个pooling层这样Conv layers生成的feature map中都可以和原图对应起来。

1.1 conv后的Fully Connect层(选看)

其实Conv层运用的思想是迁移学习的思想,所以该部分的网络可以替换为任意一个目标效果比较好的网络,既然如此,难免需要对这些网络结构进行改进。

有的网络倒数几层可能是Fully Connect层,那么,我们怎样将FC层替换成Conv层,还要保证不损失其信息呢

在传统的分类模型中,不能直接对卷积层直接进行分类操作,都需要将其flatten成1维的结构。

  • 方式1:
    在下图中,一个3通道的 2 ∗ 2 2*2 22的图片在FC层展开(黄色部分)。由于最后分成两类,所以FC层又被展开成了两个大小相同的Vector(灰色部分),每一个Vector是12dim。
    在这里插入图片描述

  • 方式2:
    在下图中,一个3通道的 2 ∗ 2 2*2 22的图片不需要被flatten,卷积层使用了2个有12个元素的滤波器(filters)完成了点积操作(灰色的部分)
    在这里插入图片描述

实际上,方式1和方式2是完全相等的。一个有 I I I个通道,高和宽分别为 H , W H,W H,W的图片,通过FC层的输出为 N N N个类别,实际上等同于有同样卷积核,高和宽分别为 H , W H,W H,W的N个output通道的操作
在这里插入图片描述
在这里插入图片描述

2. Region Proposal Networks(RPN)

提出RPN网络的原因
作者想要解决Fast R-CNN在选择proposal 区域时计算不共享的问题。

  • RPN 网络的功能
    RPN 网络能够把任何尺寸的图像作为输入,输出一个矩形的提议区域。这一过程使用 fully convolutional network 。

  • 怎么样设计RPN网络?
    为了产生提议区域, 作者在卷积特征的输出上加了一层“滑动的小型网络???”

we slide a small network over the convolutional feature map output by the last shared convolutional layer
在这里插入图片描述
上图展示了RPN网络的具体结构。可以看到RPN网络实际分为2条线:

  1. 上面一条通过softmax二分类anchor获得该目标区域是背景还是分类。故而选用0,1分类。
  2. 下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。
  3. Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。

其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。

2.1 多通道图像卷积基础知识介绍

  1. 单通道图像+单卷积核做卷积
    在这里插入图片描述
  2. 多通道图像+多卷积核做卷积
    在这里插入图片描述
    在上图中,输入有3个通道,同时有2个卷积核。

每个卷积核,先在输入3个通道分别作卷积,再将3个通道结果加起来得到卷积输出。

2个卷积核就输出2个通道,所以对于某个卷积层,无论输入图像有多少个通道,输出图像通道数总是等于卷积核数量!

2.2 锚框

在目前的主流算法中,都用pyramids of images 或者 pyramids of filters 这两种方法,如下图。
在这里插入图片描述

锚框由作者以某个像素为中心点,按照宽长比为: { 1 : 1 , 1 : 2 , 2 : 1 } \{1:1, 1:2, 2:1\} {1:1,1:2,2:1}生成的3种大小的矩形框。实际上通过anchors就引入了检测中常用到的多尺度方法。
在这里插入图片描述
遍历Conv layers计算获得的feature maps,为每一个点都配备这9种anchors作为初始的检测框。
在这里插入图片描述

  1. 在上图中,Conv Layers中最后的conv5层num_output=256,对应生成256张特征图,所以相当于feature map每个点都是256-dimensions
  2. 在conv5之后,做了rpn_conv/3x3卷积且num_output=256,相当于每个点又融合了周围3x3的空间信息(猜测这样做也许更鲁棒?反正我没测试),同时256-d不变(如图4和图7中的红框)
  3. 假设在conv5 feature map中每个点上有k个anchor(默认k=9),而每个anhcor要分positive和negative,所以每个点由256d feature转化为cls=2k scores;而每个anchor都有(x, y, w, h)对应4个偏移量,所以reg=4k coordinates
  4. 全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练(什么是合适的anchors下文5.1有解释)
    在这里插入图片描述
    另外,作者在论文中提到所提出的模型带有:Translation-Invariant Anchors(平移不变性)这个特性是根据锚框以及根据锚框计算提议区域的函数得来的。如果一张图片中的目标发生了转变,那么提议区计算提议区的函数也应该发生translation。作者提出的方法保证了这种平移不变性,作为对比,还使用k-means产生了800个没有平移不变性的锚框

为什么说保证了平移不变性锚框是根据目标的中心位置产生的锚框,所以随着目标的改变,锚框也会跟着发生改变。所以作者说保持了平移不变性

2.3 softmax判定positive与negative

一副MxN大小的矩阵送入Faster RCNN网络后,到RPN网络变为(M/16)x(N/16),不妨设 W=M/16,H=N/16。在进入reshape与softmax之前,先做了1x1卷积,如下图:
在这里插入图片描述
num_output=18,正好对应:feature maps每一个点都有9个anchors,同时每个anchors又有可能是positive和negative,所有这些信息都保存 W × H × ( 9 ∗ 2 ) W \times H \times (9*2) W×H×(92)大小的矩阵。

2.4 bounding box regression原理

绿色框为飞机的Ground Truth(GT),红色为提取的positive anchors,即便红色的框被分类器识别为飞机,但是由于红色的框定位不准,这张图相当于没有正确的检测出飞机。所以我们希望采用一种方法对红色的框进行微调,使得positive anchors和GT更加接近。
在这里插入图片描述
在这里插入图片描述
那么经过何种变换F才能从图10中的anchor A变为G’呢? 比较简单的思路就是:

输入是N个pairs { ( P i , G i ) } i = 1 , . . , N \{(P^i, G^i)\}_{i=1,..,N} {(Pi,Gi)}i=1,..,N。其中, P i = ( P x i , P y i , P w i , P h i , ) P^i=(P^i_x,P^i_y,P^i_w,P^i_h,) Pi=(Pxi,Pyi,Pwi,Phi,)

其中 P x i , P y i P^i_x,P^i_y Pxi,Pyi代表锚框中心点的坐标, P w i , P h i P^i_w,P^i_h Pwi,Phi代表锚框的宽和高。 G = ( G x , G y , G w , G h ) G=(G_x,G_y,G_w,G_h) G=(Gx,Gy,Gw,Gh)。我们的目标是尽可能的让P去贴近G。

首先,使用4个函数去描述 P P P d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) d_x(P), d_y(P), d_w(P),d_h(P) dx(P),dy(P),dw(P)dh(P)使用的公式为:

  • 公式(1)与公式(2)的作用为:平移;
  • 公式(3)与公式(4)的作用为:缩放
    在这里插入图片描述
    然后 d ∗ ( P ) d_{*}(P) d(P)这里的 ∗ * 指代 ( x , y , h , w ) (x,y,h,w) (x,y,h,w)。计算公式为:
    在这里插入图片描述
    而上式中, ϕ 5 ( P ) \phi_5(P) ϕ5(P)代表cnn feature map的值, W ∗ W_* W又是一个可以学习的参数,它损失函数为:
    L o s s = ∑ i N ∣ t ∗ i − W ∗ T ϕ ˙ ( P ) ∣ Loss=\sum_{i}^{N}|t_*^i-W_{*}^{T} \dot \phi(P)| Loss=iNtiWTϕ˙(P)

优化目标为:
在这里插入图片描述
其中 t ∗ t_* t被定义为:
在这里插入图片描述

锚框具体算法

2.5 对proposals进行bounding box regression

在这里插入图片描述
num_output=36,即经过该卷积输出图像为WxHx36,一个点是4个坐标,相当于有9个锚框
VGG输出 50 ∗ 38 ∗ 512 50*38*512 5038512 的特征,对应设置 50 ∗ 38 ∗ k 50*38*k 5038k个anchors,而RPN输出:

大小为 50 ∗ 38 ∗ 2 k 50*38*2k 50382k 的positive/negative softmax分类特征矩阵
大小为 50 ∗ 38 ∗ 4 k 50*38*4k 50384k 的regression坐标回归特征矩阵

2.6 Proposal Layer

Proposal Layer负责综合所有 d x ( P ) , d y ( P ) , d w ( P ) , d H ( P ) d_x(P), d_y(P), d_w(P), d_H(P) dx(P),dy(P),dw(P),dH(P) 变换量和positive anchors,计算出精准的proposal,送入后续RoI Pooling Layer。

3 RoI pooling(注意力机制)

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

  1. 原始的feature maps
  2. RPN输出的proposal boxes(大小各不相同)

3.1 为何需要RoI Pooling

对于传统的CNN(如AlexNet和VGG),当网络训练好后输入的图像尺寸必须是固定值,同时网络输出也是固定大小的vector or matrix。如果输入图像大小不定,这个问题就变得比较麻烦。一般这种情况由两个解决方法,但都会破坏图像信息:

  1. 从图像中crop一部分传入网络
  2. 将图像warp成需要的大小后传入网络
    在这里插入图片描述
    RoI Pooling layer forward过程:
  • 由于proposal是对应MXN尺度的,所以首先使用spatial_scale参数将其映射回(M/16)X(N/16)大小的feature map尺度;
  • 再将每个proposal对应的feature map区域水平分为 p o o l e d w × p o o l e d h pooled_w \times pooled_h pooledw×pooledh 的网格;
  • 对网格的每一份都进行max pooling处理。
    在这里插入图片描述

4 Classification

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

在这里插入图片描述
从RoI Pooling获取到7x7=49大小的proposal feature maps后,送入后续网络,可以看到做了如下2件事:

  1. 通过全连接和softmax对proposals进行分类,这实际上已经是识别的范畴了
  2. 再次对proposals进行bounding box regression,获取更高精度的rect box

5 Faster R-CNN训练

Faster R-CNN的训练,是在已经训练好的model(如VGG_CNN_M_1024,VGG,ZF)的基础上继续进行训练。实际中训练过程分为2个大阶段和6个步骤:
第一阶段:预训练阶段

  1. 在已经训练好的model上,训练RPN网络
  2. 利用步骤1中训练好的RPN网络,收集proposals
  3. 第一次训练Fast RCNN网络

第二阶段:全局调整

  1. 第二次训练RPN网络
  2. 再次利用步骤4中训练好的RPN网络,收集proposals
  3. 第二次训练Fast RCNN网络
    在这里插入图片描述

5.1 训练RPN网络

在该步骤中,首先读取RBG提供的预训练好的model(本文使用VGG),开始迭代训练。整个网络使用的Loss如下:
在这里插入图片描述
上述公式中:

  • i i i 表示anchors index
  • p i p_i pi表示positive softmax probability
  • p i ∗ p^*_i pi代表对应的GT predict概率(即当第i个anchor与GT间IoU>0.7,认为是该anchor是positive, p i ∗ = 1 p^*_i=1 pi=1
  • 反之IoU<0.3时,认为是该anchor是negative, p = ∗ 0 p^*_=0 p=0;至于那些0.3<IoU<0.7的anchor则不参与训练);
  • t t t 代表predict bounding box, t ∗ t^* t代表对应positive anchor对应的GT box。可以看到,整个Loss分为2部分:
  1. cls loss,即rpn_cls_loss层计算的softmax loss,用于分类anchors为positive与negative的网络训练
  2. reg loss,即rpn_loss_bbox层计算的soomth L1 loss,用于bounding box regression网络训练。注意在该loss中乘了 p i ∗ p^*_i pi,相当于只关心positive anchors的回归(其实在回归中也完全没必要去关心negative)。

由于在实际过程中, N c l s N_{cls} Ncls N r e g N_{reg} Nreg]差距过大,用参数λ平衡二者(如 N c l s = 256 N_{cls}=256 Ncls=256 N r e g = 2400 N_{reg}=2400 Nreg=2400时设置 λ = N r e g N c l s = 10 \lambda = \frac{N_{reg}}{N_{cls}}=10 λ=NclsNreg=10),使总的网络Loss计算过程中能够均匀考虑2种Loss。这里比较重要是 L r e g L_{reg} Lreg 使用的soomth L1 loss,计算公式如下:
在这里插入图片描述


Abstract

we introduce a Region Proposal Network (RPN) that shares full-image convolutional features with the detection network, thus enabling nearly cost-free region proposals.

作者提出了一种RPN算法,能够在detection网络中共享卷积特征,RPN model是一个全卷积模型,能够同时预测bounds和类别的分数。充分的利用了attention机制,每张图片只有300个提议区域。

1 Introduction

目前已有的R-CNN方法,在计算方面花费的时间都很久,优化的方法基本上都是通过 sharing convolutions across proposals完成的。现在,提议区的计算已经是测试时间的瓶颈了。

fast region-based CNNs对于proposal的选择是在CPU上进行的,如果在GPU上实现其接口,则 ignores the down-stream detection network and therefore misses important opportunities for sharing computation.

在本文中,作者做了算法上的调整,使用深度卷积神经网络计算提议区。在卷积网络的顶部,我们增加了可以同时拟合bounds和分类的卷积层——RPN。

Our scheme can be thought of as a pyramid of regression references (Figure 1, c), which avoids enumerating images or filters of multiple scales or aspect ratios.

因此,我们引入了一种叫做“锚框”的东西,该方法可以理解成 pyramid of regression 的引申,避免了不同比例和多尺度样本或通道的穷举。提出的方法主要是替代了proposal区域的选择。

3 FASTER R-CNN

faster R-CNN包括两部分:

  1. a deep fully convolutional network:产生提议区域
  2. Fast R-CNN detector :使用提议区

3.1 Region Proposal Network(RPN)

这个小网络接受一个 n × n n\times n n×n的windows,每一个sliding window 都被映射到了维度更低的特征上了。它所产生的特征输入到了两个全连接网路中——a box-regression layer (reg) and a box-classification layer (cls). 在这篇文章中作者取的值是3,而在实际的输入图片中,感知野非常大。在VGG中是228像素的。

  • 为什么采取fully-connected layers ?
    这样的话这个滑动窗口能够使得fully-connected layers 共享所有空间的位置。
Multi-Scale Anchors as Regression References

在多尺度方面,目前有两个主流的方法:

  1. image/ feature pryramids:一张图片被resize成多个尺度和特征maps,这个方法虽然有效但是耗费时间。
    在这里插入图片描述

  2. 第二种方法则是在 feature map 上使用多尺度的滑动窗口, 在一个模型中,不同的纵横比由不同的filter size训练。
    在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值