paper:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
Tensorflow-faster r-cnn github:Tensorflow Faster RCNN for Object Detection
代码解析:https://blog.csdn.net/qq_41576083/article/details/82966489
论文的整个网络 { 公 共 的 特 征 提 取 网 络 , 目 前 在 看 的 源 码 中 可 以 选 择 V G G 16 等 网 络 来 作 为 特 征 提 取 网 络 , 继 而 在 特 征 提 取 网 络 的 最 后 输 出 的 基 础 上 R P N 网 络 , R P N 网 络 主 要 用 于 输 出 候 选 框 ( r o i ) 的 坐 标 修 正 量 以 及 针 对 每 一 个 候 选 框 的 可 靠 打 分 f a s t − r c n n 网 络 , 用 于 生 成 最 终 的 目 标 框 坐 标 以 及 目 标 框 内 的 类 别 信 息 。 \begin{cases} 公共的特征提取网络,目前在看的源码中可以选择VGG16等网络来作为特征提取网络,继而在特征提取网络的最后输出的基础上\\ RPN网络,RPN网络主要用于输出候选框(roi)的坐标修正量以及针对每一个候选框的可靠打分\\ fast-rcnn网络,用于生成最终的目标框坐标以及目标框内的类别信息。 \end{cases} ⎩⎪⎨⎪⎧公共的特征提取网络,目前在看的源码中可以选择VGG16等网络来作为特征提取网络,继而在特征提取网络的最后输出的基础上RPN网络,RPN网络主要用于输出候选框(roi)的坐标修正量以及针对每一个候选框的可靠打分fast−rcnn网络,用于生成最终的目标框坐标以及目标框内的类别信息。
Faster R-CNN
1 发展历程
1.1 目前的卷积神经网络
{ 图 像 分 类 的 C N N : L e N e t 、 A l e x N e t 、 V G G 、 G o o g L e N e t 目 标 检 测 的 C N N : R C N N 、 F a s t R C N N 、 F a s t e r R C N N 、 Y O L O 、 Y O L O v 2 、 S S D \begin{cases} 图像分类的CNN:LeNet、AlexNet、VGG、GoogLeNet \\ 目标检测的CNN:RCNN 、Fast RCNN、Faster RCNN、YOLO、YOLOv2、SSD \end{cases} {图像分类的CNN:LeNet、AlexNet、VGG、GoogLeNet目标检测的CNN:RCNN、FastRCNN、FasterRCNN、YOLO、YOLOv2、SSD
1.2 Faster R-CNN发展由来
CNN → \to →RCNN → \to →Fast RCNN → \to →Faster RCNN
1.2.1 CNN
算法步骤:
1.首先,我们把下面的图片用作输入;
2.之后,我们将图片分成多个区域;
3.将每个区域看作单独的图片;
4.把这些区域照片传递给CNN,将它们分到不同类别中;
5.当我们把每个区域都分到对应的类别后,再把它们结合在一起,完成对原始图像的目标检测。
1.2.2 RCNN(基于区域的卷积神经网络)
算法步骤:
1.首先取一个预训练卷积神经网络;
- 根据需要检测的目标类别数量,训练网络的最后一层;
- 得到每张图片的感兴趣区域(Region of Interest),对这些区域重新改造,以让其符合CNN的输入尺寸要求;
4.得到这些区域后,我们训练支持向量机(SVM)来辨别目标物体和背景。对每个类别,我们都要训练一个二元SVM;
5.最后,我们训练一个线性回归模型,为每个辨识到的物体生成更精确的边界框。
注意: - 根据选择性搜索,要对每张图片提取2000个单独区域;
- 用CNN提取每个区域的特征。假设我们有N张图片,那么CNN特征就是N*2000;
- 用RCNN进行目标检测的整个过程有三个模型:
1- 用于特征提取的CNN
2- 用于目标物体辨别的线性SVM分类器
3-调整边界框的回归模型。
1.2.3 Fast RCNN
在每张照片上只运行一次CNN,然后找到一种方法在2000个区域中进行计算。在Fast RCNN中,我们将图片输入到CNN中,会相应地生成传统特征映射。利用这些映射,就能提取出感兴趣区域。之后,我们使用一个Rol池化层将所有提出的区域重新修正到合适的尺寸,以输入到完全连接的网络中。
步骤:
1.输入图片;
2.输入到卷积网络中,它生成感兴趣区域;
3. 利用Rol池化层对这些区域重新调整,将其输入到完全连接网络中;
4.在网络的顶层用softmax层输出类别。同样使用一个线性回归层,输出相对应的边界框。
所 以 , 和 R C N N 所 需 要 的 三 个 模 型 不 同 , F a s t R C N N 只 用 了 一 个 模 型 就 同 时 实 现 了 区 域 的 特 征 提 取 、 分 类 、 边 界 框 生 成 。 \green{所以,和RCNN所需要的三个模型不同,Fast RCNN只用了一个模型就同时实现了区域的特征提取、分类、边界框生成。} 所以,和RCNN所需要的三个模型不同,FastRCNN只用了一个模型就同时实现了区域的特征提取、分类、边界框生成。
1.2.4 RCNN家族对比
2 Faster R-CNN算法
Faster RCNN是Fast RCNN的优化版本,二者主要的不同在于感兴趣区域的生成方法,Fast RCNN使用的是选择性搜索,而Faster RCNN用的是Region Proposal网络(RPN)。RPN将图像特征映射作为输入,生成一系列object proposals,每个都带有相应的分数。
步骤:
1.输入图像到卷积网络中,生成该图像的特征映射。
2. 在特征映射上应用Region Proposal Network,返回object proposals和相应分数。
3.应用Rol池化层,将所有proposals修正到同样尺寸。
4.最后,将proposals传递到完全连接层,生成目标物体的边界框。
2.1 算法过程
2.2 激活函数
激活函数的目的:引入非线性可以让模型解决线性不可分问题。
详情请见博客《小嘿嘿之常见分类算法之SVM/k-近邻/BP神经网络/朴素贝叶斯》BP神经网络节。
2.3 卷积层
Conv layers=conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
重
要
的
事
需
要
说
三
遍
!
!
!
\red{重要的事需要说三遍!!!}
重要的事需要说三遍!!!
1
、
所
有
的
c
o
n
v
层
都
是
:
k
e
r
n
e
l
s
i
z
e
=
3
,
p
a
d
=
1
,
s
t
r
i
d
e
=
1
;
\red{1、所有的conv层都是:kernel_size=3,pad=1,stride=1;}
1、所有的conv层都是:kernelsize=3,pad=1,stride=1;
2
、
所
有
的
p
o
o
l
i
n
g
层
都
是
:
k
e
r
n
e
l
s
i
z
e
=
2
,
p
a
d
=
0
,
s
t
r
i
d
e
=
2
\red{2、所有的pooling层都是:kernel_size=2,pad=0,stride=2}
2、所有的pooling层都是:kernelsize=2,pad=0,stride=2
因为在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)!这样Conv layers生成的feature map中都可以和原图对应起来。
2.4 softmax
softmax函数,又称归一化指数函数。它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。下图展示了softmax的计算方法:
首先,我们知道概率有两个性质:1)预测的概率为非负数;2)各种预测结果概率之和等于1。softmax就是将在负无穷到正无穷上的预测结果按照这两步转换为概率的。
1)将预测结果转化为非负数
softmax第一步就是将模型的预测结果转化到指数函数上,这样保证了概率的非负性。
2)各种预测结果概率之和等于1
为了确保各个预测结果的概率之和等于1。我们只需要将转换后的结果进行归一化处理。方法就是将转化后的结果除以所有转化后结果之和,可以理解为转化后结果占总数的百分比。这样就得到近似的概率。
2.5 Region Proposal Networks
经典的检测方法生成检测框都非常耗时,如OpenCV adaboost使用滑动窗口+图像金字塔生成检测框;或如R-CNN使用SS(Selective Search)方法生成检测框。而Faster RCNN则抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。
可以看到RPN网络实际分为2条线,上面一条通过softmax分类anchors获得positive和negative分类,下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
生成anchors -> softmax分类器提取positvie anchors -> bbox reg回归positive anchors -> Proposal Layer生成proposals
2.5.1 1 × \times × 1卷积
对于多通道图像+多卷积核做卷积,计算方式如下:
输入有3个通道,同时有2个卷积核。对于每个卷积核,先在输入3个通道分别作卷积,再将3个通道结果加起来得到卷积输出。所以对于某个卷积层,无论输入图像有多少个通道,输出图像通道数总是等于卷积核数量!
对
多
通
道
图
像
做
1
×
1
卷
积
,
其
实
就
是
将
输
入
图
像
于
每
个
通
道
乘
以
卷
积
系
数
后
加
在
一
起
,
即
相
当
于
把
原
图
像
中
本
来
各
个
独
立
的
通
道
“
联
通
”
在
了
一
起
。
\red{对多通道图像做1\times1卷积,其实就是将输入图像于每个通道乘以卷积系数后加在一起,即相当于把原图像中本来各个独立的通道“联通”在了一起。}
对多通道图像做1×1卷积,其实就是将输入图像于每个通道乘以卷积系数后加在一起,即相当于把原图像中本来各个独立的通道“联通”在了一起。
2.5.2 anchor
anchor机制:
对于公共特征提取网络输出结果,stride和大概为16,即输入图片尺寸与输出特征图(也可以理解为是一个图片,反正都是一个矩阵)尺寸的比,假设最后输出特征图尺寸为60X60,那么可以理解为60X60个点,每一个点都可以作为一个窗口中心点,那么窗口的尺寸呢?这就是anchor的用处,每一个anchor即对应9个(一般是9个)窗口尺寸,再将每一个窗口应用在每一个中心点上,用来截取原图像,那么一共可以截取60X60X9约3W幅图片,即60X60X(9X4)个坐标。然后针对这些窗口,网络又需要预测窗口中是否存在目标,即对于每一个窗口还要有两个概率输出,也就是一共要有60X60X(9X2)概率得分,用于甄别对应的候选框里是否存在目标,达到候选窗筛选的功能。
所谓anchors,实际上就是一组由rpn/generate_anchors.py生成的矩形。
[[ -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.]]
其中每行的4个值
(
x
1
,
y
1
,
x
2
,
y
2
)
(x_1,y_1,x_2,y_2)
(x1,y1,x2,y2)表矩形左上和右下角点坐标。9个矩形共有3种形状,长宽比为大约为{1:1,1:2,2:1}三种,实际上通过anchors就引入了检测中常用到的多尺度方法.
注
:
关
于
上
面
的
a
n
c
h
o
r
s
s
i
z
e
,
其
实
是
根
据
检
测
图
像
设
置
的
。
在
p
y
t
h
o
n
d
e
m
o
中
,
会
把
任
意
大
小
的
输
入
图
像
r
e
s
h
a
p
e
成
800
x
600
(
即
2.1
节
中
的
M
=
800
,
N
=
600
)
。
再
回
头
来
看
a
n
c
h
o
r
s
的
大
小
,
a
n
c
h
o
r
s
中
长
宽
1
:
2
中
最
大
为
352
x
704
,
长
宽
2
:
1
中
最
大
736
x
384
,
基
本
是
c
o
v
e
r
了
800
x
600
的
各
个
尺
度
和
形
状
。
\green{注:关于上面的anchors size,其实是根据检测图像设置的。在python demo中,会把任意大小的输入图像reshape成800x600(即2.1节中的M=800,N=600)。再回头来看anchors的大小,anchors中长宽1:2中最大为352x704,长宽2:1中最大736x384,基本是cover了800x600的各个尺度和形状。}
注:关于上面的anchorssize,其实是根据检测图像设置的。在pythondemo中,会把任意大小的输入图像reshape成800x600(即2.1节中的M=800,N=600)。再回头来看anchors的大小,anchors中长宽1:2中最大为352x704,长宽2:1中最大736x384,基本是cover了800x600的各个尺度和形状。
那么这9个anchors是做什么的呢?借用Faster RCNN论文中的原图,遍历Conv layers计算获得的feature maps,为每一个点都配备这9种anchors作为初始的检测框。这样做获得检测框很不准确,不用担心,后面还有2次bounding box regression可以修正检测框位置。
解释:
- 在原文中使用的是ZF model中,其Conv Layers中最后的conv5层num_output=256,对应生成256张特征图,所以相当于feature map每个点都是256-dimensions在conv5之后,做了rpn_conv/3x3卷积且num_output=256,相当于每个点又融合了周围3x3的空间信息,同时256-d不变
- 假设在conv5 feature map中每个点上有k个anchor(默认k=9),而每个anhcor要分positive和negative,所以每个点由256d feature转化为cls=2k scores;而每个anchor都有(x, y, w, h)对应4个偏移量,所以reg=4k coordinates
- 补充一点,全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练
其
实
R
P
N
最
终
就
是
在
原
图
尺
度
上
,
设
置
了
密
密
麻
麻
的
候
选
A
n
c
h
o
r
。
然
后
用
c
n
n
去
判
断
哪
些
A
n
c
h
o
r
是
里
面
有
目
标
的
p
o
s
i
t
i
v
e
a
n
c
h
o
r
,
哪
些
是
没
目
标
的
n
e
g
a
t
i
v
e
a
n
c
h
o
r
。
所
以
,
仅
仅
是
个
二
分
类
而
已
!
\red{其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的positive anchor,哪些是没目标的negative anchor。所以,仅仅是个二分类而已!}
其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的positiveanchor,哪些是没目标的negativeanchor。所以,仅仅是个二分类而已!
eg.那么Anchor一共有多少个?原图800x600,VGG下采样16倍,feature map每个点设置9个Anchor
所以:ceil(800/16)
×
\times
×ceil(600/16)
×
\times
×=50
×
\times
× 38
×
\times
× 9=17100
其中ceil()表示向上取整,是因为VGG输出的feature map size= 50
×
\times
× 38
2.5.3 bounding box regression原理
在了解bounding box regression后,再回头来看RPN网络第二条线路
2.6 Roi Pooling
而RoI Pooling层则负责收集proposal,并计算出proposal feature maps,送入后续网络。从图2中可以看到Rol pooling层有2个输入:
1、原始的feature maps
2、RPN输出的proposal boxes(大小各不相同)