一、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个类别的候选边界框回归参数( d x d_x dx, d y d_y dy, d w d_w dw, d h d_h dh),共(N+1)×4个节点。
边界框回归参数的计算
P
x
P_x
Px,
P
y
P_y
Py,
P
w
P_w
Pw,
P
h
P_h
Ph分别为候选框的中心x,y坐标,以及宽高。
G
x
^
\hat{G_x}
Gx^,
G
y
^
\hat{G_y}
Gy^,
G
w
^
\hat{G_w}
Gw^,
G
h
^
\hat{G_h}
Gh^分别为最终预测的边界框中心x,y坐标,以及宽高。
Fast R-CNN损失的计算
p
p
p是分类器预测的softmax概率分布
p
=
(
p
0
.
.
.
.
.
.
.
p
k
)
p=(p_0.......p_k)
p=(p0.......pk)
u
u
u对应目标真实类别标签
t
u
t^u
tu对应边界框回归器预测的对应类别
u
u
u的回归参数
v
v
v对应真实的目标边界框回归参数(计算时只需将回归参数计算公式要么移项再除以
P
w
P_w
Pw或
P
h
P_h
Ph,要么取对数)
注:
- 分类损失(多分类问题):
L
c
l
s
(
p
,
u
)
=
−
log
(
p
u
)
L_{cls}(p,u)=-\log(p_u)
Lcls(p,u)=−log(pu)
假设真实标签的one-hot编码是[0,0,…,1,…,0]
预测的softmax概率为[0.1,0.3,…,0.4,…,0.1]
那么Loss=- log ( 0.4 ) \log(0.4) log(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
1282,
25
6
2
256^2
2562,
51
2
2
512^2
5122};三种比例是{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
pi表示第i个anchor预测为真实标签的概率
p
i
∗
p_i^*
pi∗当为正样本时为1,为负样本时为0
t
i
t_i
ti表示预测第i个anchor的边界框回归参数
t
i
∗
t_i^*
ti∗表示第i个anchor对应的GT Box
N
c
l
s
N_{cls}
Ncls表示一个mini-banch中的所有样本数256
N
r
e
g
N_{reg}
Nreg表示anchor位置的个数(不是anchor个数)约为2400
分类损失为多分类损失
L
c
l
s
=
−
log
(
p
i
)
L_{cls}=-\log(p_i)
Lcls=−log(pi)
Faster R-CNN训练
直接采用RPN Loss+Fast R-CNN Loss的联合训练方法
Faster R-CNN框架