参考代码:Gaussian_YOLOv3
关键代码解释:Gaussian YOLOv3:一个更强的YOLOv3,现已开源!
1. 概述
导读:这篇文章着力于解决自动驾驶检测任务最后结果中的假阳性检测结果问题,文章在YOLOv3网络的坐标回归上引入一组高斯参用于表示坐标的不确定性(目标置信度与分类置信度并不能很好表征检测框的置信度),并且根据这个需求重新设计网络损失函数,从而网络在假阳性检测结果上有所好转,即是这个重新设计的网络可以输出检测结果的定位不确定性,从而在检测的过程中使用这个属性就可以减少错误的检测结果,这个改进的网络在文章中被称为Gaussian YOLOv3。在性能表现上相比原始版本的YOLOv3在KITTI与berkeley deep dirve(BDD)数据集上分别提升了3.09和3.5的mAP,对于TP与FP性能也分别有所提升,同时保持了42FPS(输入分辨率为512*512)的检测速率。
在这篇文章中通过对坐标回归引入高斯回归量(高斯分布的均值与方差),代表的是坐标回归的不确定性,并且对损失函数进行了重新设计,这些回归量可以通过网络进行回归估计得到的,在后面的结果中使用这些估计出来的参数辅助提升检测的精度。
回顾YOLOv1版本的检测模型,它是在最后特征图划分的区域上寻找落在区域中的目标的中心,实现对应寻找并进行回归目标,这样使其处理简单,运算速度也够快。v2的版本在v1的基础上对于卷积层添加BN操作,引入anchor box,变尺度图像输入,更好的backboe网络上进行改进。而v3是主要引入了类似FPN的多尺度特征融合与检测模块,从而适应不同大小的目标,并且其backbone引入了残差连接的结构优化backbone,其结构见下图1所示:
2. 网络设计
2.1 在YOLOv3中引入定位不确定性预测
在YOLOv3模型中输出包含三部分的内容:
(
t
x
,
t
y
,
t
w
,
t
h
)
(t_x,t_y,t_w,t_h)
(tx,ty,tw,th)它表示一个检测框结果,当前框是否为目标的置信度,当前框的分类置信度。但是对检测框的坐标确定性却没有显式的表达,这篇文章也是从这个角度进行优化从而排除一些错误的检测结果。对于一组数据
x
x
x其对应的高斯分布拟合为:
p
(
y
∣
x
)
=
N
(
y
;
u
(
x
)
,
∑
(
x
)
)
p(y|x)=N(y;u(x),\sum(x))
p(y∣x)=N(y;u(x),∑(x))
而对于每一个检测框的回归值使用高斯进行不确定性描述,则对于每个检测框的坐标使用特征图上去预估其分布的均值与方差,则改进之后的网络检测头输出可以描述为图2中所示的情况(替换了原有的检测框输出,换成高斯估计量):
因而按照上面的思路就会对边界框回归的4个变量进行不确定估计,也就是上面说到的高斯参数(表达检测框的4个分量均值与方差),即是:
u
^
t
x
,
∑
^
t
x
,
u
^
t
y
,
∑
^
t
y
,
u
^
t
w
,
∑
^
t
w
,
u
^
t
h
,
∑
^
t
h
\hat{u}_{tx},\hat{\sum}_{tx},\hat{u}_{ty},\hat{\sum}_{ty},\hat{u}_{tw},\hat{\sum}_{tw},\hat{u}_{th},\hat{\sum}_{th}
u^tx,∑^tx,u^ty,∑^ty,u^tw,∑^tw,u^th,∑^th
之后这些从特征图上估计出来的参数通过Sigmoid进行输出:
由于
u
t
x
,
u
t
y
u_{tx},u_{ty}
utx,uty等参数代表的是检测框的中心点坐标且这些参数具有非负的属性,因而参数会经过Sigmoid函数,而像宽高这类就可以为正负,因而这里没有加Sigmoid激活。这部分将边界框回归替换为预估高斯系数,其计算给整体YOLOv3带来的计算量其实很小,占的比例只有0.04%。
2.2 网络损失函数的重定义
在原YOLOv3的模型中检测框的损失函数是平方损失,分类和目标置信度是使用的交叉墒损失。由于在这篇文章中将边界框回归替换为了高斯参数估计,因而将边界框的损失函数替换为了负对数损失函数(NLL loss),则对于会回归量
x
x
x其对应的损失描述为(其它的分量也是类似的计算过程):
L
x
=
−
∑
i
=
1
W
∑
j
=
1
H
∑
k
=
1
K
γ
i
j
k
l
o
g
(
N
(
x
i
j
k
G
∣
u
t
x
(
x
i
j
k
)
,
∑
t
x
(
x
i
j
k
)
)
+
ϵ
)
L_x=-\sum_{i=1}^W\sum_{j=1}^H\sum_{k=1}^K\gamma_{ijk}log(N(x_{ijk}^G|u_{tx}(x_{ijk}),\sum_{tx}(x_{ijk}))+\epsilon)
Lx=−i=1∑Wj=1∑Hk=1∑Kγijklog(N(xijkG∣utx(xijk),tx∑(xijk))+ϵ)
X
=
N
(
u
,
σ
2
)
=
1
2
π
σ
e
x
p
(
−
(
x
−
u
)
2
2
σ
2
)
X=N(u,\sigma^2)=\frac{1}{\sqrt{2\pi}\sigma}exp(-\frac{(x-u)^2}{2\sigma^2})
X=N(u,σ2)=2πσ1exp(−2σ2(x−u)2)
其中,
W
,
H
W,H
W,H是宽和高上的grid数量,
K
K
K是anchor的数量,
u
t
x
(
x
i
j
k
)
u_{tx}(x_{ijk})
utx(xijk)是检测层的输出,
∑
t
x
(
x
i
j
k
)
\sum_{tx}(x_{ijk})
∑tx(xijk)是网络预测得到的坐标定位不确定性。
对应的训练标注target则表示为:
其中
x
G
,
y
G
,
w
G
,
h
G
x^G, y^G, w^G, h^G
xG,yG,wG,hG代表的是真实标注相对图像宽高的比值,
I
W
,
I
H
IW,IH
IW,IH是resize之后的图像宽高,
A
k
w
A_k^w
Akw是anchor的宽度信息。
在损失计算代码中,是将真实坐标作为高斯分布的均值回归目标,再而根据这个均值确定文章提到的不确定性估计回归值,这样就将GT,高斯均值与不确定性相关联起来了,完成损失函数的计算。
在上面的公式5中出现了
γ
i
,
j
,
k
\gamma_{i,j,k}
γi,j,k,它的定义是与标注宽高相关
w
s
c
a
l
e
w_{scale}
wscale和
δ
i
j
k
o
b
j
\delta_{ijk}^{obj}
δijkobj相关的计算:
γ
i
j
k
=
w
s
c
a
l
e
∗
δ
i
j
k
o
b
j
2
\gamma_{ijk}=\frac{w_{scale}*\delta_{ijk}^{obj}}{2}
γijk=2wscale∗δijkobj
其中,
w
s
c
a
l
e
=
2
−
w
G
∗
h
G
w_{scale}=2-w^G*h^G
wscale=2−wG∗hG看作是对损失的加权,在小目标的时候会有损失函数上的帮助。而
δ
i
j
k
o
b
j
∈
{
0
,
1
}
\delta_{ijk}^{obj}\in \{0,1\}
δijkobj∈{0,1}代表的是与第
k
k
k个anchor在grid
(
i
,
j
)
(i,j)
(i,j)相比配,匹配上了那就是1,否则就是0。
2.3 定位不确定性的使用
在原版的YOLOv3中的检测结果只会考虑目标的置信度与分类置信度,而在这篇文章的Gaussian YOLOv3中还引入了检测框不确定性(会与目标置信度/分类概率一起),在检测框的后处理中就会根据这些不确定性的高低过滤掉一些检测结果。在这篇文章中将检测结果的不确定性描述为:
C
r
.
=
σ
(
o
b
j
e
c
t
)
∗
σ
(
C
l
a
s
s
i
)
∗
(
1
−
U
n
c
e
r
t
r
a
i
n
t
y
a
v
e
r
)
Cr.=\sigma(object)*\sigma(Class_i)*(1-Uncertrainty_{aver})
Cr.=σ(object)∗σ(Classi)∗(1−Uncertraintyaver)
3. 实验结果
KITTI数据集上的性能表现:
BDD数据集上的性能表现:
TP与FP: