参考:https://blog.youkuaiyun.com/u014380165/article/details/77961414、
转载:https://blog.youkuaiyun.com/qiu931110/article/details/81449617?utm_source=blogxgwz4
请看原文
Faster R-CNN中RPN的Loss:
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(\left \{ p_{i} \right \},\left \{ t_{i} \right \})=\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∗)
以特征图上每个位置生成9个候选框为例,其中,
i
i
i逐个代表9个候选框;
p
i
p_{i}
pi代表第i个预测框属于正样本的概率;
p
i
∗
p_{i}^{*}
pi∗当第i个标准anchor为正样本时,其值为1,为负样本时,其值为0;
t
i
t_{i}
ti表示预测的框坐标,形式为带有四个参数的向量,具体运算规则见下方;
t
i
∗
t_{i}^{*}
ti∗表示正样本的anchor和相应的GT的偏移标准量;
L
c
l
s
L_{cls}
Lcls表示一个二分类的log损失函数;
L
r
e
g
L_{reg}
Lreg表示smooth L1损失函数;
p
i
∗
L
r
e
g
p_{i}^{*}L_{reg}
pi∗Lreg表示回归损失只对正anchor对应的预测结果起作用。
基本思路是:分别计算出预测结果与anchors的差值和GT与anchors的差值,用损失函数对两者进行逼近。 网络的直接预测结果是:tx,ty,然后有tx,ty根据以下公式计算出对应坐标。
t
x
=
(
x
−
x
a
)
/
w
a
t_{x} = (x-x_{a})/w_{a}
tx=(x−xa)/wa
t
y
=
(
y
−
y
a
)
/
h
a
t_{y} = (y-y_{a})/h_{a}
ty=(y−ya)/ha
t
w
=
l
o
g
(
w
/
w
a
)
t_{w} = log(w/w_{a})
tw=log(w/wa)
t
h
=
l
o
g
(
h
/
h
a
)
t_{h} = log(h/h_{a})
th=log(h/ha)
这里
t
x
,
t
y
t_{x},t_{y}
tx,ty的取值范围太大,并没有将其限制在一个范围内,
t
w
,
t
h
t_{w},t_{h}
tw,th相对有一个经验性的范围,但理论上仍然可以是任意数,取值范围的过大会造成模型的震荡,不易收敛。
t
x
∗
=
(
x
∗
−
x
a
)
/
w
a
t_{x}^{*} = (x^{*}-x_{a})/w_{a}
tx∗=(x∗−xa)/wa
t
y
∗
=
(
y
∗
−
y
a
)
/
h
a
t_{y}^{*} = (y^{*}-y_{a})/h_{a}
ty∗=(y∗−ya)/ha
t
w
∗
=
l
o
g
(
w
∗
/
w
a
)
t_{w}^{*} = log(w^{*}/w_{a})
tw∗=log(w∗/wa)
t
h
∗
=
l
o
g
(
h
∗
/
h
a
)
t_{h}^{*} = log(h^{*}/h_{a})
th∗=log(h∗/ha)
x
,
y
,
w
,
h
x,y,w,h
x,y,w,h分别为中心点坐标和宽高。
x
,
x
a
,
x
∗
x,x_{a},x^{*}
x,xa,x∗分别代表预测框,anchor框和ground-truth。
的
Better:
- BN。对每一层的都用BN,BN作用在非线性激活函数之前,在第零维,即batch-size维度上做归一化。
- High Resolution Classifier。即在网络初始化时,先用224224,再用448448进行微调,使网络适应检测时分辨率的变化。
- Convolutional With Anchor Boxes。原来的YOLO是利用全连接层直接预测bounding box的坐标,而YOLOv2借鉴了Faster R-CNN的思想,引入anchor。首先将原网络的全连接层和最后一个pooling层去掉,使得最后的卷积层可以有更高分辨率的特征。
- Dimension Clusters,我们知道在Faster R-CNN中anchor box的大小和比例是按经验设定的,然后网络会在训练过程中调整anchor box的尺寸。但是如果一开始就能选择到合适尺寸的anchor box,那肯定可以帮助网络越好地预测detection。所以作者采用k-means的方式对训练集的bounding boxes做聚类,试图找到合适的anchor box。
- Direct Location prediction改进Faster R-CNN模型中RPN部分损失函数不稳定问题。
- Fine-Grained Features。这里主要是添加了一个层:passthrough layer。这个层的作用就是将前面一层的2626的feature map和本层的1313的feature map进行连接,有点像ResNet。这样做的原因在于虽然13*13的feature map对于预测大的object以及足够了,但是对于预测小的object就不一定有效。也容易理解,越小的object,经过层层卷积和pooling,可能到最后都不见了,所以通过合并前一层的size大一点的feature map,可以有效检测小的object。
- Multi-Scale Training。这里是在检测模型训练时采用的,具体为每训练10个batch,网络就会随机选择另一种size的输入。那么输入图像的size的变化范围要怎么定呢?前面我们知道本文网络本来的输入是416416,最后会输出1313的feature map,也就是说downsample的factor是32,因此作者采用32的倍数作为输入的size,具体来讲文中作者采用从{320,352,…,608}的输入尺寸。
这种网络训练方式使得相同网络可以对不同分辨率的图像做detection。
YOLOv2配置文件
[net]
batch=64 每batch个样本更新一次参数。
subdivisions=8 如果内存不够大,将batch分割为subdivisions个子batch,\
每个子batch的大小为batch/subdivisions。在darknet代码中,\
会将batch/subdivisions命名为batch。
height=416 input图像的高
width=416 Input图像的宽
channels=3 Input图像的通道数
momentum=0.9 动量
decay=0.0005 权重衰减正则项,防止过拟合
angle=0 通过旋转角度来生成更多训练样本
saturation = 1.5 通过调整饱和度来生成更多训练样本
exposure = 1.5 通过调整曝光量来生成更多训练样本
hue=.1 通过调整色调来生成更多训练样本
learning_rate=0.0001 初始学习率
max_batches = 45000 训练达到max_batches后停止学习
policy=steps 调整学习率的policy,有如下policy:
CONSTANT, STEP, EXP, POLY, STEPS, SIG, RANDOM
steps=100,25000,35000 根据batch_num调整学习率
scales=10,.1,.1 学习率变化的比例,累计相乘
[convolutional]
batch_normalize=1 是否做BN
filters=32 输出多少个特征图
size=3 卷积核的尺寸
stride=1 做卷积运算的步长
pad=1 如果pad为0,padding由 padding参数指定。\
如果pad为1,padding大小为size/2
activation=leaky 激活函数:
logistic,loggy,relu,elu,relie,plse,hardtan,lhtan,linear,ramp,leaky,tanh,stair
[maxpool]
size=2 池化层尺寸
stride=2 池化步进
[convolutional]
batch_normalize=1
filters=64
size=3
stride=1
pad=1
activation=leaky
[maxpool]
size=2
stride=2
......
......
#######
[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=1024
activation=leaky
[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=1024
activation=leaky
[route] 这是指用当前层减去9得到的那一层来进行特征组合
layers=-9
[reorg] 这里是把上面得到大分辨率的特征图以什么方式组合到当前层,\
成为当前层的特征。其中stride的值要根据大分辨率特征图跟当前层来确定的
stride=2
[route]
layers=-1,-3
[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=1024
activation=leaky
[convolutional]
size=1
stride=1
pad=1
filters=125 region前最后一个卷积层的filters数是特定的,
计算公式为filter=num*(classes+5)
5的意义是5个坐标,论文中的tx,ty,tw,th,to
activation=linear
[region]
anchors = 1.08,1.19, 3.42,4.41, 6.63,11.38, 9.42,5.11, 16.62,10.52 预选框,可以手工挑选,也可以通过k means 从训练样本中学出
bias_match=1
classes=20 网络需要识别的物体种类数
coords=4 每个box的4个坐标tx,ty,tw,th
num=5 每个grid cell预测几个box,和anchors的数量一致。当想要使用更
多anchors时需要调大num,且如果调大num后训练时Obj趋近0的话可以尝
试调大object_scale
softmax=1 使用softmax做激活函数
jitter=.2 通过抖动增加噪声来抑制过拟合
rescore=1 暂理解为一个开关,非0时通过重打分来调整l.delta
(预测值与真实值的差)
object_scale=5 栅格中有物体时,bbox的confidence loss对总loss计算贡献的权重
noobject_scale=1 栅格中没有物体时,bbox的confidence loss对总loss计算贡献的权重
class_scale=1 类别loss对总loss计算贡献的权重
coord_scale=1 bbox坐标预测loss对总loss计算贡献的权重
absolute=1
thresh = .6
random=0 random为1时会启用Multi-Scale Training,随机使用不同
尺寸的图片进
reorg层的理解:
输出的网络结构
layer filters size input output
0 conv 32 3 x 3 / 1 416 x 416 x 3 -> 416 x 416 x 32
1 max 2 x 2 / 2 416 x 416 x 32 -> 208 x 208 x 32
2 conv 64 3 x 3 / 1 208 x 208 x 32 -> 208 x 208 x 64
3 max 2 x 2 / 2 208 x 208 x 64 -> 104 x 104 x 64
4 conv 128 3 x 3 / 1 104 x 104 x 64 -> 104 x 104 x 128
5 conv 64 1 x 1 / 1 104 x 104 x 128 -> 104 x 104 x 64
6 conv 128 3 x 3 / 1 104 x 104 x 64 -> 104 x 104 x 128
7 max 2 x 2 / 2 104 x 104 x 128 -> 52 x 52 x 128
8 conv 256 3 x 3 / 1 52 x 52 x 128 -> 52 x 52 x 256
9 conv 128 1 x 1 / 1 52 x 52 x 256 -> 52 x 52 x 128
10 conv 256 3 x 3 / 1 52 x 52 x 128 -> 52 x 52 x 256
11 max 2 x 2 / 2 52 x 52 x 256 -> 26 x 26 x 256
12 conv 512 3 x 3 / 1 26 x 26 x 256 -> 26 x 26 x 512
13 conv 256 1 x 1 / 1 26 x 26 x 512 -> 26 x 26 x 256
14 conv 512 3 x 3 / 1 26 x 26 x 256 -> 26 x 26 x 512
15 conv 256 1 x 1 / 1 26 x 26 x 512 -> 26 x 26 x 256
16 conv 512 3 x 3 / 1 26 x 26 x 256 -> 26 x 26 x 512
17 max 2 x 2 / 2 26 x 26 x 512 -> 13 x 13 x 512
18 conv 1024 3 x 3 / 1 13 x 13 x 512 -> 13 x 13 x1024
19 conv 512 1 x 1 / 1 13 x 13 x1024 -> 13 x 13 x 512
20 conv 1024 3 x 3 / 1 13 x 13 x 512 -> 13 x 13 x1024
21 conv 512 1 x 1 / 1 13 x 13 x1024 -> 13 x 13 x 512
22 conv 1024 3 x 3 / 1 13 x 13 x 512 -> 13 x 13 x1024
23 conv 1024 3 x 3 / 1 13 x 13 x1024 -> 13 x 13 x1024
24 conv 1024 3 x 3 / 1 13 x 13 x1024 -> 13 x 13 x1024
25 route 16 //指的是第16层
26 reorg / 2 26 x 26 x 512 -> 13 x 13 x2048 //把16层网络进行重整
27 route 26 24 //指的是进行融合的网络
28 conv 1024 3 x 3 / 1 13 x 13 x3072 -> 13 x 13 x1024
29 conv 125 1 x 1 / 1 13 x 13 x1024 -> 13 x 13 x 125
30 detection