yolov3论文地址:https://arxiv.org/abs/1804.02767
yolov3代码地址pytorch:https://github.com/ultralytics/yolov3
一、模型简介
yolov3模型相对于yolov2做了一些改进,主要包括以下几个方面:
- 特征提取的backbone使用了效果更好的Darknet-53。与Darknet-19相比,该网络增加了更多连续的3x3和1 x1卷积层,同时引入了残差连接Residual,使得网络更有效。
- 网络输出三个不同尺寸大小的结果,使得网络预测结果能够融合更细粒度的特征,提升效果。
二、模型结构
yolov3的模型结构如上图所示,使用Darknet-53网络进行特征提取,该网络进行了一系列的3x3和1x1卷积,同时也使用了残差连接。在接下来的网络结构中,做了更多的层间融合,深层网络进行上采样与浅层特征网络相互融合,使得预测结果能充分融合细粒度的特征,最终输出三个不同尺寸的预测结果。
三、模型损失函数
yolo系列模型的损失函数原理上都是一样的,yolov3的损失函数同样划分为三个部分
- 定位误差 l b o x lbox lbox 计算预测框与真实框xywh均方误差
- 分类误差 l c l s lcls lcls
- 置信度误差 l c o n f lconf lconf
- l o s s = l b o x + l c l s + l c o n f loss = lbox+ lcls + lconf loss=lbox+lcls+lconf
1. 定位误差
在计算定位误差时,模型预测值(
t
x
,
t
y
,
t
w
,
t
h
t_x, t_y, t_w, t_h
tx,ty,tw,th)并不直接代表物体位置参数,需要转换到为(
b
x
,
b
y
,
b
w
,
b
h
b_x, b_y, b_w, b_h
bx,by,bw,bh),即下图中蓝色框,黑色虚线框表示对应的锚框。该处是沿用了yolov2的处理方式,对真实预测值(
t
x
,
t
y
t_x, t_y
tx,ty)取sigmoid是为了将预测位置点限制在所属网格内。
l
b
o
x
=
λ
c
o
o
r
d
∑
i
=
0
S
2
∑
j
=
0
B
I
i
j
o
b
j
(
2
−
w
i
×
h
i
)
[
(
x
i
−
x
^
i
j
)
2
+
(
y
i
−
y
^
i
j
)
2
+
(
w
i
−
w
^
i
j
)
2
+
(
h
i
−
h
^
i
j
)
2
]
lbox = \lambda_{coord}\displaystyle\sum_{i=0}^{S^2}\displaystyle\sum_{j=0}^{B}\Iota_{ij}^{obj}(2 - w_i \times h_i)[(x_i - \hat{x}_i^j )^2 + (y_i - \hat{y}_i^j)^2+(w_i - \hat{w}_i^j )^2 + (h_i - \hat{h}_i^j)^2]
lbox=λcoordi=0∑S2j=0∑BIijobj(2−wi×hi)[(xi−x^ij)2+(yi−y^ij)2+(wi−w^ij)2+(hi−h^ij)2]
定位误差公式如上,
(
2
−
w
i
×
h
i
)
(2 - w_i \times h_i)
(2−wi×hi)是为了平衡大小物体的误差,其余则是计算预测框与真实框的均方误差。
2. 分类误差
在yolov3中,作者使用bceloss计算分类误差,而没有沿用均方误差。原因主要是训练数据集是多标签的,在激活函数使用了logistic函数,没有使用softmax(适用于类别间互斥),从而计算损失函数使用bceloss更适合。bceloss虽然是二分类损失函数,但是针对每个单独的物体类,都可以用一个二分类损失函数来计算。
l
c
l
s
=
−
λ
c
l
a
s
s
∑
i
=
0
S
2
∑
j
=
0
B
I
i
j
o
b
j
∑
c
ϵ
c
l
a
s
s
e
s
[
(
P
^
i
j
l
o
g
(
P
i
j
)
+
(
1
−
P
^
i
j
)
l
o
g
(
1
−
P
i
j
)
)
]
lcls=-\lambda_{class}\displaystyle\sum_{i=0}^{S^2}\displaystyle\sum_{j=0}^{B}\Iota_{ij}^{obj}\displaystyle\sum_{c\epsilon{classes}}[(\hat{P}_i^jlog(P_i^j) + (1-\hat{P}_i^j)log(1-P_i^j))]
lcls=−λclassi=0∑S2j=0∑BIijobjcϵclasses∑[(P^ijlog(Pij)+(1−P^ij)log(1−Pij))]
3. 置信度误差
置信度误差同样采用了bceloss来计算,置信度部分的误差要计算两部分,包含物体的预测框置信度要与真实置信度接近,不包含物体的预测框置信度要接近0。
l
c
o
n
f
=
−
∑
i
=
0
S
2
∑
j
=
0
B
(
λ
o
b
j
I
i
j
o
b
j
+
λ
n
o
o
b
j
I
i
j
n
o
o
b
j
)
[
(
C
^
i
j
l
o
g
(
C
i
j
)
+
(
1
−
C
^
i
j
)
l
o
g
(
1
−
C
i
j
)
)
]
lconf=-\displaystyle\sum_{i=0}^{S^2}\displaystyle\sum_{j=0}^{B}(\lambda_{obj}\Iota_{ij}^{obj}+\lambda_{noobj}\Iota_{ij}^{noobj})[(\hat{C}_i^jlog(C_i^j) + (1-\hat{C}_i^j)log(1-C_i^j) )]
lconf=−i=0∑S2j=0∑B(λobjIijobj+λnoobjIijnoobj)[(C^ijlog(Cij)+(1−C^ij)log(1−Cij))]