目标检测:R-CNN,Fast R-CNN,Faster R-CNN(详解)
1. R-CNN
R-CNN主要分为下面四个步骤:
- 候选区域生成: 一张图像生成1K~2K个候选区域 (采用Selective Search 方法),然后裁剪出每个候选区并说放到227x227大小
- 特征提取: 对每个候选区域,使用深度卷积网络提取特征 (CNN)
- 类别判断: 特征送入每一类的SVM 分类器,判别是否属于该类
- 位置精修: 使用回归器精细修正候选框位置
2. Fast R-CNN
Fast R-CNN主要是对R-CNN的后面三个步骤进行改进
Fast R-CNN的主要步骤:
-
输入图像:输入一张待检测的图像
-
候选区域生成: 使用Selective Search算法,在输入图像上生成1K~2K个候选区域
-
特征提取:将整张图像传入CNN提取特征
-
候选区域特征:利用RolPooling分别生成每个候选区域的特征
RolPooling:利用特征采样,将不同大小的特征,变成大小一致的特征
-
候选区域分类和回归:利用扣取的特征,对每个候选区域进行分类和回归
3. Faster R-CNN
Faster R-CNN主要是对Fast R-CNN的候选区域生成进行改进,使用Region Proposal Network(RPN)结构进行区域生成,所以,FasterR-CNN可以简单的看做是RPN+Fast R-CNN。
Faster R-CNN可以大致分为三部分,首先是backbone,用来提取特征图,可以使用VGG16,ZF网络等进行特征提取,然后就是RPN,进行候选框生成,最后就是ROlPooling与分类网络,对候选框进行分类和微调。下图是FasterR-CNN的大致流程图
RPN结构
经过backbone后得到的特征图传入RPN,其中backbone中的网络可以使用VGG16,ZF网络等,如果使用VGG16训练得到的特征图,则是特征图的深度是512,如果使用ZF网络,则是256。
然后将特征图padding=1,再对特征图使用3x3的卷积核以步长为1进行卷积,并计算以卷积核中心点对应原始图像上的中心点,并计算出K个anchor boxes,生成的anchor有三种面积,三种比例,也就是每个中心点都会生成3x3=9个anchor boxes
特征图经过一个共同的3x3卷积层,两个独立的1x1深度为2k和4k的卷积层,输出2k个scores,和4k个coordinates
2k个scores2个为一组,分别表示每个anchor为前景和后景的概率,4k个coordinates4个为一组,分别表示每个anchor的中心坐标和宽度高度,
用这些回归参数,将生成的anchor去调成成候选框,此时生成的候选框还存在大量的重叠,再使用cls得分,采用非极大值抑制,去除大量重叠和不是目标的候选框。
最后,从这些候选框中选出正负样本,对于每一个ground truth box ,选择和它重叠度(IoU)最高的一个anchor作为正样本,
对于剩下的anchor,从中选择和任意一个ground truth box重叠度超过0.7的anchor,作为正样本,正样本的数目不超过128个。随机选择和ground truth box重叠度小于0.3的anchor作为负样本。负样本和正样本的总数为256,其余的anchor丢弃。
损失函数
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_i{L_{cls}(p_i,p_i^*)+\lambda\frac{1}{N_{reg}}\sum_i{p_i^*L_{reg}(t_i,t_i^*)}}
L({pi},{ti})=Ncls1i∑Lcls(pi,pi∗)+λNreg1i∑pi∗Lreg(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 box的边界框回归参数
N
c
l
s
N_{cls}
Ncls表示一个mini-batch中的所有样本数量256
N
r
e
g
N_{reg}
Nreg表示anchor位 置的个数(不是anchor个数)约2400