RCNN
来源
:B站霹雳吧啦Wz
算法流程可分为4个步骤
一张图像生成1K~2K个候选区域(使用Selective Search方法)
对每个候选区域(图片),使用深度网络(图片分类网络)提取特征
特征送入每一类的SVM分类器,判别是否属于该类
使用回归器精细修正候选框位置
1.候选区域的生成
利用Selective Search算法通过图像分割的方法得到一些原始区域,然后使用一些合并策略将这些区域合并,得到一个层次化的区域结构,而这些结构就包含着可能需要的物体。
2.对每个候选区域,使用深度网络提取特征
将2000候选区域缩放到227x227pixel,接着将候选区域输入事先训练好的AlexNet CNN网络获取4096维的特征得到2000 X 4096维矩阵。
3.特征送入每一类的SVM分类器,判定类别
将2000X4096维特征与20个SVM组成的权值矩阵4096X20相乘,获得2000 X 20维矩阵表示每个建议框是某个目标类别的得分。分别对上述2000X20维矩阵中每一列即每一类进行非极大值抑制剔除重叠建议框,得到该列即该类中得分最高的一些建议框。
非极大值抑制
为每个类别寻找得分最高的建议框,计算其他的建议框与该框的Iou值,删除所有Iou大于给定阈值的框
目的:只留下该类别对应的最好的框
4.使用回归器精细修正候选框位置
对NMS处理后剩余的建议框进一步筛选。接着分别用20个回归器对上述20个类别中剩余的建议框进行回
归操作,最终得到每个类别的修正后的得分最高的bounding box。
如图,黄色框口P表示建议框Region Proposal,绿色窗口G表示实际框Ground Truth, 红色窗口
G
^
\hat{G}
G^表示Region Proposal 进行回归后的预测窗口,可以用最小二乘法解决的线性回归问题。
整体框架
R-CNN存在的问题
- 测试速度慢:
测试一张图片约53s(CPU)。用Selective Search算法提取候选框用时约2秒,一张图像内候选框之间存在大量重叠,提取特征操作冗余。
- 训练速度慢:
过程及其繁琐
- 训练所需空间大:
对于SVM和bbox回归训练,需要从每个图像中的每个目标候选框提取特征,并写入磁盘。对于非常深的网络,如VGG16,从VOCO训练集上的5k图像上提取的特征需要数百GB的存储空间。
Fast R-CNN
算法流程可分为3个步骤
- 一张图像生成1K~2K个候选区域(使用Selective Search方法)
- 将图像输入网络得到相应的特征图,将SS算法生成的候选框投影到特征图上获得相应的特征矩阵
- 将每个特征矩阵通过ROI pooling层缩放到7x7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果
一次性计算整张图像特征
R-CNN依次将候选框区域输入卷积神经网络得到特征。
Fast-RCNN将整张图像送入网络,紧接着从特征图像上提取相应的候选区域。这些候选区域的特征不需要再重复计算。
训练数据的采样(正样本,负样本)
分类损失:
L
c
l
s
(
p
,
u
)
=
−
log
p
u
L_{c l s}(p, u)=-\log p_{u}
Lcls(p,u)=−logpu
Cross Entropy LOSS 交叉熵损失
1.针对多分类问题(softmax输出,所有输出概率和为1)
H
=
−
∑
i
o
i
∗
log
(
o
i
)
H=-\sum_{i} o_{i}^{*} \log \left(o_{i}\right)
H=−∑ioi∗log(oi)
2.针对二分类问题(sigmoid输出, 每个输出节点之间互不相干)
H
=
−
1
N
∑
i
=
1
N
[
o
i
∗
log
o
i
+
(
1
−
o
i
∗
)
log
(
1
−
o
i
)
]
H=-\frac{1}{N} \sum_{i=1}^{N}\left[o_{i}^{*} \log o_{i}+\left(1-o_{i}^{*}\right) \log \left(1-o_{i}\right)\right]
H=−N1∑i=1N[oi∗logoi+(1−oi∗)log(1−oi)]
其中
O
i
∗
O_{i}^{*}
Oi∗其中o*为真实标签值,
O
i
O_{i}
Oi为预测值,默认log以e为底等于ln
边界框回归损失:
[
u
≥
1
]
[u \geq 1]
[u≥1]是艾弗森括号,满足条件时等于1,不满足时等于0
t
u
t^{u}
tu对应边界框回归器预测的对应类别u的回归参数
(
t
x
u
,
t
y
u
,
t
w
u
,
t
h
u
)
\left(t_{x}^{u}, t_{y}^{u}, t_{w}^{u}, t_{h}^{u}\right)
(txu,tyu,twu,thu)
smooth
L
1
(
x
)
=
{
0.5
x
2
if
∣
x
∣
<
1
∣
x
∣
−
0.5
otherwise
\operatorname{smooth}_{L_{1}}(x)=\left\{\begin{array}{ll}0.5 x^{2} & \text { if }|x|<1 \\ |x|-0.5 & \text { otherwise }\end{array}\right.
smoothL1(x)={0.5x2∣x∣−0.5 if ∣x∣<1 otherwise
整体框架
Faster RCNN(RPN + Fast R-CNN)
算法流程可分为3个步骤.
- 将图像输入网络得到相应的特征图
- 使用RPN结构生成候选框,将RPN生成的候选框投影到特征图.上获得相应的特征矩阵
- 将每个特征矩阵通过ROI pooling层缩放到7x7大小的特征图, 接着将特征图展平通过一系列全连接层得到预测结果
RPN
生成anchors
使用ZF网络作为backbone所以是256d,也就是输出特征矩阵的深度
对于特征图上的每个3x3的滑动窗口,计算出滑动窗口中心点对应原始图像上的中心点,并计算出k个anchor boxes(注意和proposal的差异)。
cls判断为前景还是背景
三种尺度(面积)
{
12
8
2
,
25
6
2
,
51
2
2
}
\left\{128^{2}, 256^{2}, 512^{2}\right\}
{1282,2562,5122}
三种比例
{
1
:
1
,
1
:
2
,
2
:
1
}
\{1:1, 1:2, 2:1\}
{1:1,1:2,2:1}
每个位置(每个滑动窗口)在原图上都对应有3x3=9anchor
对于ZF感受野:171
对于VGG感受野: 228
为什么可以预测比他大的目标边界框?
看到一部分,也是能够猜出物体的大概区域
感受野的计算:
对于一张1000x600x3的图像,大约有60x40x9(20k)(特征图大小x9)个anchor,忽略跨越边界的anchor以后,剩下约6k个anchor。对于RPN生成的候选框之间存在大量重叠,基于候选框的cls得分,采用非极大值抑制,IoU设为0.7,这样每张图片只剩2k个候选框。
训练数据采样:正样本和负样本
采样256个anchors,比例为1:1,正样本不足时使用负样本填充
正样本:与ground-truth box的IoU大于0.7;与ground-truth box的IoU最大
负样本:与ground-truth box的IoU小于0.3
p
i
p_{i}
pi: 表示第
i
\mathrm{i}
i个anchor 预测为物体的概率
p
i
∗
p_{i}^{*}
pi∗: 当为正样本时为 1 , 当为负样本时为 0
t
i
t_{i}
ti: 表示预测第
i
\mathrm{i}
i个anchor的边界框回归参数
t
i
∗
t_{i}^{*}
ti∗: 表示第
i
\mathrm{i}
i个anchor对应的GT Box
N
c
l
s
N_{cls}
Ncls: 表示一个mini-batch中的所有样本数量 256
N
r
e
g
N_{reg}
Nreg: 表示anchor位置的个数(不是anchor个数)约2400(anchor个数是anchor位置的个数 x
k
k
k)
λ
\lambda
λ: 平衡超参数,10
分类损失
多分类交叉熵损失
二值交叉熵损失
这里生成k个scores
p
i
p_{i}
pi: 表示第
i
\mathrm{i}
i个anchor 预测为物体的概率
p
i
∗
p_{i}^{*}
pi∗: 当为正样本时为 1 , 当为负样本时为 0
边界框回归损失
L reg ( t i , t i ∗ ) = ∑ smooth L 1 ( t i − t i ∗ ) L_{\text {reg }}\left(t_{i}, t_{i}^{*}\right)=\sum \operatorname{smooth}_{L_{1}}\left(t_{i}-t_{i}^{*}\right) Lreg (ti,ti∗)=∑smoothL1(ti−ti∗)
t i = [ t x , t y , t w , t h ] t i ∗ = [ t x ∗ , t y ∗ , t w ∗ , t h ∗ ] t_{i}=\left[t_{x}, t_{y}, t_{w}, t_{h}\right] \quad t_{i}^{*}=\left[t_{x}^{*}, t_{y}^{*}, t_{w}^{*}, t_{h}^{*}\right] ti=[tx,ty,tw,th]ti∗=[tx∗,ty∗,tw∗,th∗]
smooth L 1 ( x ) = { 0.5 x 2 if ∣ x ∣ < 1 ∣ x ∣ − 0.5 otherwise \operatorname{smooth}_{L_{1}}(x)=\left\{\begin{array}{ll}0.5 x^{2} & \text { if }|x|<1 \\ |x|-0.5 & \text { otherwise }\end{array}\right. smoothL1(x)={0.5x2∣x∣−0.5 if ∣x∣<1 otherwise
t x = ( x − x a ) / w a , t y = ( y − y a ) / h a , t w = log ( w / w a ) , t w = log ( 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 ) \begin{array}{l}t_{x}=\left(x-x_{a}\right) / w_{a}, t_{y}=\left(y-y_{a}\right) / h_{a}, \\ t_{w}=\log \left(w / w_{a}\right), t_{w}=\log \left(h / h_{a}\right), \\ t_{x}^{*}=\left(x^{*}-x_{a}\right) / w_{a}, t_{y}^{*}=\left(y^{*}-y_{a}\right) / h_{a}, \\ t_{w}^{*}=\log \left(w^{*} / w_{a}\right), t_{h}^{*}=\log \left(h^{*} / h_{a}\right)\end{array} tx=(x−xa)/wa,ty=(y−ya)/ha,tw=log(w/wa),tw=log(h/ha),tx∗=(x∗−xa)/wa,ty∗=(y∗−ya)/ha,tw∗=log(w∗/wa),th∗=log(h∗/ha)
p
i
∗
p_{i}^{*}
pi∗: 当为正样本时为 1 , 当为负样本时为 0
t
i
t_{i}
ti: 表示预测第
i
\mathrm{i}
i个anchor的边界框回归参数
t
i
∗
t_{i}^{*}
ti∗: 表示第
i
\mathrm{i}
i个anchor对应的GT Box
训练
论文中的方法(训练训练微调微调)
(1)利用ImageNet预训练分类模型初始化前置卷积网络层参数,并开始单独训练RPN网络参数;
(2)固定RPN网络独有的卷积层以及全连接层参数,再利用ImageNet预训练分类模型初始化前置卷积网络参数,并利用RPN网络生成的目标建议框去训练FastRCNN网络参数。
(3)固定利用FastRCNN训练好的前置卷积网络层参数,去微调RPN网络独有的卷积层以及全连接层参数。
(4)同样保持固定前置卷积网络层参数,去微调FastRCNN网络的全连接层参数。最后RPN网络与FastRCNN网络共享前置卷积网络层参数,构成一个统一网络。
现在使用的方法
直接采用RPN Loss±Fast R-CNN Loss的联合训练方法