一、RCNN
RCNN(Region with CNN feature)
R-CNN是利用深度学习进行目标检测的开山之作。将目标检测识别率由30%提升到了60%
RCNN算法流程可以分为4个步骤
- 对一张图片生成1k~2k个候选区域(使用ss算法)
- 对每一个候选区域,使用深度网络提取特征
- 特征送入每一类SVM分类器,并判断是否属于此类
- 使用回归器精细修正候选框位置
详细步骤
1、候选区域生成
利用ss算法(Selective Search)通过图像分割的方法得到一些原始区域,然后使用一些方法将这些区域合并,得到一个层次化的区域结构,这些结构中包含着需要的物体。
2、使用深度网络提取特征
将2000候选区域缩放到227×227像素,接着讲候选区域输入事先训练好的AlexNet CNN网络,获得4096维的特征,最后得到2000×4096维矩阵
3、SVM分类器进行判别
将2000×4096维特征与20个SVM组成的权值矩阵4096×20相乘,最后获得的2000×20维矩阵表示每个建议框是某个目标类别的的分,对上述矩阵的每一列即每一类进行
非极大值抑制剔除重叠建议框
,得到得分最高的一些建议框。
注:非极大值抑制如何实现的?
IoU(Intersection over Union)
表示的是(A∩B)/(A∪B)
4、使用回归器精修候选框位置
对NMS处理后剩余的建议框进行进一步筛选,接着分别用20个回归器对上述20个类别中剩余的建议框进行回归操作,最终得到每个类别的修正后得分最高的bounding box。
如上图所示,黄色框P表示建议框,绿色框G表示实际框(Ground Truth),红色框G表示Region Proposal进行回归后的预测窗口,可以用最小二乘法解决的线性回归问题。
总结RCNN框架如下所示
RCNN存在的问题:
- 测试速度慢
- 训练速度慢
- 训练所需空间大
为此,后面介绍的Fast RCNN解决了这些问题。
一、Fast R-CNN
Fast R-CNN是作者Ross Girshick在提出R-CNN后的又一力作,同样适用VGG16作为网络的backbone,比R-CNN的训练时间快9倍,测试推理时间快213倍,准确率提升到了%66(在Pascal VOC数据集上)
Fast R-CNN算法可以分为三个步骤
- 对一张图生成1k~2k个候选区域(使用ss算法)。
- 将图像输入网络中得到相应的特征图,将SS算法生成的候选框投影到特征图上获得相应的特征矩阵。
- 将每一个特征矩阵通过ROI Pooling层缩放到7×7大小的特征图,接着将特征图展平,通过一系列全连接层得到预测结果。
与R-CNN相比,Fast R-CNN在第二步就已经全然不同,R-CNN是依次将候选框区域输入神经网络中得到特征,而Fast R-CNN是将一整幅图像送入网络,从特征图像上提取候选区域,这些候选区域的特征是不需要重复计算的。
在训练过程中,并不会去使用SS算法所提供的所有候选区域,训练时的数据采样我们会分为正样本与负样本(背景)。
对于ROI Pooling层如何实现的,如下图所示
对7×7的每一个区域执行Max Pooling下采样,得到一个特征矩阵,这样可以不用限制输入图像的尺寸(R-CNN要求输入必须是227×227的大小)。
Fast R-CNN分类器与边界回归器
将特征矩阵进行展平处理后,通过两个全连接层得到ROI feature vector,在此基础上并联两个全连接层,其中一个用于目标概率的预测,另外一个用来边界框回归参数的预测。
- 分类器输出N+1个类别的概率(N为检测目标种类,1为背景)共N+1个节点。
-
边界框回归器输出对应N+1个类别的候选边界框回归参数(
dx
d_x
d
x
,
dy
d_y
d
y
,
dw
d_w
d
w
,
dh
d_h
d
h
),共(N+1)×4个节点。
边界框回归参数的计算
P
x
P_x
P
x
,
P
y
P_y
P
y
,
P
w
P_w
P
w
,
P
h
P_h
P
h
分别为候选框的中心x,y坐标,以及宽高。
G
x
^
\hat{G_x}
G
x
^
,
G
y
^
\hat{G_y}
G
y
^
,
G
w
^
\hat{G_w}
G
w
^
,
G
h
^
\hat{G_h}
G
h
^
分别为最终预测的边界框中心x,y坐标,以及宽高。
Fast R-CNN损失的计算
p
p
p
是分类器预测的softmax概率分布
p
=
(
p
0
.
.
.
.
.
.
.
p
k
)
p=(p_0…….p_k)
p
=
(
p
0
.
.
.
.
.
.
.
p
k
)
u
u
u
对应目标真实类别标签
t
u
t^u
t
u
对应边界框回归器预测的对应类别
u
u
u
的回归参数
v
v
v
对应真实的目标边界框回归参数(计算时只需将回归参数计算公式要么移项再除以
P
w
P_w
P
w
或
P
h
P_h
P
h
,要么取对数)
注:
-
分类损失(多分类问题):
Lc
l
s
(
p
,
u
)
=
−
log
(
p
u
)
L_{cls}(p,u)=-\log(p_u)
L
c
l
s
(
p
,
u
)
=
−
lo
g
(
p
u
)
假设真实标签的one-hot编码是[0,0,…,1,…,0]
预测的softmax概率为[0.1,0.3,…,0.4,…,0.1]
那么Loss=-
log
(
0.4
)
\log(0.4)
lo
g
(
0
.
4
)
-
边界框回归损失
[u≥1]是艾弗森括号(大于等于1为1,否则为0)
边界框回归损失可以参考
回归损失函数
Fast R-CNN框架
三、Faster R-CNN
Faster R-CNN同样使用VGG16作为backbone,推理速度在GPU上达到5fps,准确率也有进一步的提升。
Faster R-CNN算法流程也可分为三个步骤
- 将图像输入网络得到相应的特征图。
- 使用RPN结构生成候选框,将RPN生成的候选框投影到特征图上获得相应的特征矩阵。
- 将每个特征矩阵通过ROI pooling层缩放到7×7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果。
Faster R-CNN可以认为是RPN+Fast R-CNN的组合。
RPN结构
上图右半部分,feature map通过一个滑动窗口进行滑动,每滑动到一个位置生成一个1维的向量,此向量通过两个全连接层,生成目标概率与边界框回归参数。
对于特征图上每个3×3的滑动窗口,计算出滑动窗口中心点对应原始图像上的中心点,并计算出k个anchor boxes(和proposal不同)。
生成的2k个scores,每两个参数对应一个anchor,两个参数分别是判断该物体是
背景的概率
和该物体是
我们所需要辨别物体的概率
。4k个回归参数用于将所选边框进行修正。
在Faster R-CNN论文中,给定了三种尺度和三种比例,这些都是根据经验所得,三种尺度是{
12
8
2
128^2
1
2
8
2
,
25
6
2
256^2
2
5
6
2
,
51
2
2
512^2
5
1
2
2
};三种比例是{1:1,1:2,2:1}。每个位置在原图上都对应有3×3=9个anchor。
注:对于ZF感受野为171,对于VGG感受野为228
为什么VGG感受野是228,还能预测比228还大的目标边界框?
原论文中说,通过一个小的感受野来预测一个大的目标是有可能的,比如我们看到一个物体的一部分,就能判断出物体是什么。
训练RPN时,需要考虑采样正负样本的问题,中我们从样本中选出256个样本,正样本和负样本比例大概在1:1左右,如果正样本的个数不足128个,我们就用负样本进行填充。
如何定义正样本与负样本,论文规定两个条件,一是只要我们确定的anchor与ground truth的IOU大于0.7,那么该anchor就为一个正样本。二是anchors与某一个gtound truth有最大的IOU值,那么也将其定义为正样本。(第二个条件在极少数情况下有用)。负样本是IOU小于0.3的。对于这两种样本情况之外的,全部丢弃。
RPN损失计算
p
i
p_i
p
i
表示第i个anchor预测为真实标签的概率
p
i
∗
p_i^*
p
i
∗
当为正样本时为1,为负样本时为0
t
i
t_i
t
i
表示预测第i个anchor的边界框回归参数
t
i
∗
t_i^*
t
i
∗
表示第i个anchor对应的GT Box
N
c
l
s
N_{cls}
N
c
l
s
表示一个mini-banch中的所有样本数256
N
r
e
g
N_{reg}
N
r
e
g
表示anchor位置的个数(不是anchor个数)约为2400
分类损失为多分类损失
L
c
l
s
=
−
log
(
p
i
)
L_{cls}=-\log(p_i)
L
c
l
s
=
−
lo
g
(
p
i
)
Faster R-CNN训练
直接采用RPN Loss+Fast R-CNN Loss的联合训练方法
Faster R-CNN框架