Faster R-CNN 论文总结

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

核心是region proposal network(RPN)。本质上是把fast r-cnn当中region proposal的方法从selective search算法替换成RPN。论文提到的训练方法现在已经不用了,pytorch的官方实现当中直接进行了联合训练。

摘要

当前(faster r-cnn提出前)SOTA的目标检测网络需要region proposal算法假设目标位置。如SPPnet和Fast R-CNN都尝试减少这些检测网络的运行时间,这就暴露了region proposal的计算是目标检测的一个瓶颈。作者引入一个region proposal network(RPN),与检测网络一起共享全图的卷积特征,因此几乎可以做到无代价的region proposal。RPN网络是一个全卷积网络,可以同时预测目标在每个位置的边界以及得分。RPN可以被端到端地训练来生成高质量的region proposal,然后通过fast r-cnn进行检测。

介绍

proposal是当前SOTA检测算法的计算瓶颈。
通过深度网络来计算proposal既优雅又高效,作者引入RPN并与SOTA目标检测网络共享卷积层。计算proposal的代价很小(10ms/张)。
用faster r-cnn的提取卷积特征图同样可以用于生成region proposal。在这些卷积特征的基础上添加两层额外的卷积层:一层用于将卷积特征图编码至一个256d的特征向量,另一层在256d特征向量(原文说是在每个conv map position,但是看结构图是256d特征向量)上生成k个region proposal的目标得分以及边界回归。
RPN也是一种全卷积网络。同样可以进行端到端的训练。

RPN

在这里插入图片描述

图左是RPN,图右是使用RPN得到建议框的一些例子。
RPN以任意尺寸图像作为输入,输出一组建议框和对应的目标分数。这是通过一个全卷积网络实现的。
为了生成region proposal,我们在共享的最后一层卷积层(一般是某个模型的最后一个卷积层,比如ZF、VGG16)使用一个小网络(3x3的滑动窗,看视频解释是说是用的3x3卷积)进行滑动。该网络和输入的卷积特征图进行全连接。每个滑动窗口都映射到成低维向量(ZF为256d,VGG为512d)。这个向量被输入至两个同级全连接层,即一个是边界回归层(reg),另外一个是分类层(cls)。

anchors

在每个滑动窗口位置(也就是中心点,RPN里面3x3窗口内蓝色的小点),同时预测k个region proposal(可以理解成anchor,后面都当作是anchor),因此reg层编码k个anchor会得到4k个输出(也就是边界框回归输出的4个参数,x和y的偏移量,w和h的缩放因子)。cls层得到2k个输出来估计前景/背景的概率。
三种尺度(面积)

{

12

8

2

,

25

6

2

,

51

2

2

}

\{128^2,256^2,512^2\}

{1282,2562,5122},(视频里面说是由经验所得,论文好像也没提到?)
三种比例

{

1

:

1

,

1

:

2

,

2

:

1

}

\{ 1:1, 1:2, 2:1 \}

{1:1,1:2,2:1}
每个位置在原图上都对应有

3

×

3

=

9

3\times3=9

3×3=9个anchor
对于一张1000x600x3的图像,大约有60x40x9(20k)个anchor,忽略跨越边界的anchor以后,剩下约6k个anchor。对于RPN生成的候选框之间存在大量重叠,基于候选框的cls得分,采用非极大值抑制,IoU设为0.7,这样每张图片只剩2k个候选框。

region proposal的损失函数

为了训练RPN,为每个anchor分配一个二进制类别的标签(即是否为目标,也就是上面提到的前景/背景)。定义两种情况为正标签:

  1. 和ground truth box有着最大IOU的anchor
  2. 和任何ground truth box的IOU大于0.7的anchor

需要注意的是一个ground truth box可能会对应多个anchor。而负标签定义为:对于所有ground truth box,IOU小于0.3的anchor。
不满足正负标签条件的anchor均被舍弃,不参与训练。
RPN的损失函数:

L

(

{

p

i

}

,

{

t

i

}

)

=

1

N

c

l

s

i

L

c

l

s

(

p

i

,

p

i

)

+

λ

1

N

r

e

g

i

p

i

L

r

e

g

(

t

i

,

t

i

)

L(\{p_i\},\{t_i\})=\frac{1}{N_{cls}}\sum_iL_{cls}(p_i,p_i^*)+\lambda\frac{1}{N_{reg}}\sum_ip_i^*L_{reg}(t_i,t_i^*)

L({pi},{ti})=Ncls1iLcls(pi,pi)+λNreg1ipiLreg(ti,ti)

p

i

p_i

pi表示第i个anchor预测为真实标签的概率

p

i

p_i^*

pi当为正样本时为1,当为负样本时为0

t

i

t_i

ti表示第i个anchor的边界框回归参数

t

i

t_i^*

ti表示第i个anchor对应的ground truth bbox的边界框回归参数

N

c

l

s

N_{cls}

Ncls表示一个mini-batch中所有样本数量,论文为256

N

r

e

g

N_{reg}

Nreg表示中心点的个数,约2400

λ

\lambda

λ为超参数,论文为10

t

x

=

(

x

x

a

)

/

w

a

,

t

y

=

(

y

y

a

)

/

h

a

,

t

w

=

log

(

w

/

w

a

)

,

t

h

=

l

o

g

(

h

/

h

a

)

t_x=(x-x_a)/w_a,t_y=(y-y_a)/h_a,t_w=\log(w/w_a),t_h=log(h/h_a)

tx=(xxa)/wa,ty=(yya)/ha,tw=log(w/wa),th=log(h/ha)

t

x

=

(

x

x

a

)

/

w

a

,

t

y

=

(

y

y

a

)

/

h

a

,

t

w

=

log

(

w

/

w

a

)

,

t

h

=

l

o

g

(

h

/

h

a

)

t_x^*=(x^*-x_a)/w_a,t_y^*=(y^*-y_a)/h_a,t_w^*=\log(w^*/w_a),t_h^*=log(h^*/h_a)

tx=(xxa)/wa,ty=(yya)/ha,tw=log(w/wa),th=log(h/ha)
x,y,w,h表示box中心(不是左上角)的坐标、宽度和高度。x表示预测box,

x

a

x_a

xa表示anchor box,

x

x^*

x表示ground truth box。可以认为是anchor box回归到附近的ground truth box。个人理解相当于通过输入

x

a

x_a

xa输出x,然后得到误差

x

x

a

x-x_a

xxa,根据

x

x

a

x_*-x_a

xxa不断修正x。


参考:
Faster RCNN理论合集

版权声明:本文为CSDN博主「明天一定早睡早起」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/laonafahaodange/article/details/122674542

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

YOLOv3

YOLOv3 1. YOLOv3效果 1.1 COCO AP YOLOv3速度最快,但准确率不是很高 COCO数据集的一些指标含义 其中 AP指,IoU从0.5开始,以0.05为步距&#xff0c

FPN (特征金字塔) 的原理和代码

1. 为什么会使用金字塔式的representation以及它存在的问题。 论文中提到一些传统的使用深度学习来做物体检测的结构会倾向于避开使用金字塔性质的representation, 因为使用这样的representation会对算力和内存

Matlab实现Faster-RCNN目标检测

用Matlab自带的FastRcnnNetwork工具箱实现深度学习目标检测 一.搭建训练数据集和验证数据集 用的是Matlab2018a以上版本里的应用程序带的ImageLabeler来进行数据标记: 将标记好的数据以.gro