赞
踩
以前写过一篇博客,都是转载其余博主的内容,对yolov3有了基本认识,但是当时只浮于表面,并没有真正的理解yolov3,现在对于yolov3的anchor计算,损失函数的计算有了一些新的理解,记录一下。
在网络最后的输出中,对于每个grid cell产生3个bounding box,每个bounding box的输出有三类参数:一个是对象的box参数,一共是四个值,即box的中心点坐标(x,y)和box的宽和高(w,h);一个是置信度,这是个区间在[0,1]之间的值;最后一个是一组条件类别概率,都是区间在[0,1]之间的值,代表概率。
假如一个图片被分割成
S
∗
S
S*S
S∗S个grid cell,我们有B个anchor box,也就是说每个grid cell有B个bounding box, 每个bounding box内有4个位置参数,1个置信度,classes个类别概率,那么最终的输出维数是:
S
∗
S
∗
[
B
∗
(
4
+
1
+
c
l
a
s
s
e
s
)
]
S*S*[B*(4 + 1 + classes)]
S∗S∗[B∗(4+1+classes)]。
下面分别具体介绍这三个参数的意义。
anchor box其实就是从训练集的所有ground truth box中统计(使用k-means)出来的在训练集中最经常出现的几个box形状和尺寸。比如,在某个训练集中最常出现的box形状有扁长的、瘦高的和宽高比例差不多的正方形这三种形状。我们可以预先将这些统计上的先验(或来自人类的)经验加入到模型中,这样模型在学习的时候,瞎找的可能性就更小了些,当然就有助于模型快速收敛了。以前面提到的训练数据集中的ground truth box最常出现的三个形状为例,当模型在训练的时候我们可以告诉它,你要在grid cell 1附件找出的对象的形状要么是扁长的、要么是瘦高的、要么是长高比例差不多的正方形,你就不要再瞎试其他的形状了。anchor box其实就是对预测的对象范围进行约束,并加入了尺寸先验经验,从而实现多尺度学习的目的。
前提需要知道,
c x c_{x} cx和 c y c_{y} cy的坐标是(0,0) (0,1),(0,2),(0,3)…(0,13)
(1,0),(1,1),(1,2),(1,3)…(1,13)等等
bouding box的输出应当为: t x t_{x} tx和 t y t_{y} ty以及 t w t_{w} tw和 t h t_{h} th
而真实的预测box应当是: b x b_{x} bx和 b y b_{y} by(中心坐标)以及 b w b_{w} bw和 b h b_{h} bh(宽高)
还有就是 c x c_{x} cx和 c y c_{y} cy的每一个都是1,也就是说,每个格子grid cell是以1为一个范围,每个grid cell的大小实际是 1 ∗ 1 1*1 1∗1
刚才说的绑定的关系是什么?就是下面这个公式:
b
w
=
a
w
e
t
w
b_w=a_we^{t_w}
bw=awetw
b
h
=
a
h
e
t
h
b_h=a_he^{t_h}
bh=aheth
其中, a w a_{w} aw和 a h a_{h} ah为anchor box的宽和高,
t w t_{w} tw和 t h t_{h} th为bounding box直接预测出的宽和高,
b w b_{w} bw和 b h b_{h} bh为转换后预测的实际宽和高,
这也就是最终预测中输出的宽和高。你可能会想,这个公式这么麻烦,为什么不能用 b w = a w ∗ t w b_{w}=a_{w}*t_{w} bw=aw∗tw, b h = a h ∗ t h b_{h}=a_{h}*t_{h} bh=ah∗th这样的公式,我的理解是上面的公式虽然计算起来比较麻烦,但是在误差函数求导后还带有 t w t_{w} tw和 t h t_{h} th参数,而且也好求导(此观点只是个人推测,需要进一步查证)。
既然提到了最终预测的宽和高公式,那我们也就直接带出最终预测输出的box中心坐标
(
b
x
,
b
y
)
(b_{x},b_{y})
(bx,by)的计算公式:
前面提到过box中心坐标总是落在相应的grid cell中的,所以bounding box直接预测出的
t
x
t_{x}
tx和
t
y
t_{y}
ty也是相对grid cell来说的,要想转换成最终输出的绝对坐标,需要下面的转换公式:
b
x
=
σ
(
t
x
)
+
c
x
b_{x} = \sigma(t_{x}) + c_{x}
bx=σ(tx)+cx
b
y
=
σ
(
t
y
)
+
c
y
b_{y} = \sigma(t_{y}) + c_{y}
by=σ(ty)+cy
其中, σ ( t x ) \sigma(t_{x}) σ(tx)为sigmoid函数,
c x c_{x} cx和 c y c_{y} cy分别为grid cell方格左上角点相对整张图片的坐标。
最终可以得出实际输出的box参数公式如下,这个也是在推理时将输出转换为最终推理结果的公式:
b x = σ ( t x ) + c x b_{x}=\sigma(t_{x}) + c_{x} bx=σ(tx)+cx b y = σ ( t y ) + c y b_{y}=\sigma(t_{y}) + c_{y} by=σ(ty)+cy b w = a w e t w b_{w}= a_{w}e^{t_{w}} bw=awetw b h = a h e t h b_{h}= a_{h}e^{t_{h}} bh=aheth
其中,
c x c_{x} cx和 c y c_{y} cy是网格grid cell的左上角坐标是:(0,0) (0,1),(0,2),(0,3)…(0,13)
(1,0),(1,1),(1,2),(1,3)…(1,13)等等
bouding box的输出应当为: t x t_{x} tx和 t y t_{y} ty以及 t w t_{w} tw和 t h t_{h} th
而真实的预测box应当是: b x b_{x} bx和 b y b_{y} by以及 b w b_{w} bw和 b h b_{h} bh
b x b_{x} bx和 b y b_{y} by以及 b w b_{w} bw和 b h b_{h} bh:预测出来的box的中心坐标和宽高
下图中的
p
w
p_w
pw实际上就是上面的
a
w
a_w
aw,
p
h
p_h
ph实际上就是上面的
a
h
a_h
ah
也就是说,我们训练的输出是: t x 、 t y 、 t w t_{x}、t_{y}、t_{w} tx、ty、tw和 t h t_{h} th,那么在计算误差时,也是利用真实框的 t ^ x 、 t ^ y 、 t ^ w \hat t_{x}、\hat t_{y}、\hat t_{w} t^x、t^y、t^w和 t ^ h \hat t_{h} t^h这几个值计算误差。
所以需要求解
t
^
x
、
t
^
y
、
t
^
w
\hat t_{x}、\hat t_{y}、\hat t_{w}
t^x、t^y、t^w和
t
^
h
\hat t_{h}
t^h:
对于上面的公式:
b
x
=
σ
(
t
x
)
+
c
x
b_{x}=\sigma(t_{x}) + c_{x}
bx=σ(tx)+cx
b
y
=
σ
(
t
y
)
+
c
y
b_{y}=\sigma(t_{y}) + c_{y}
by=σ(ty)+cy
b
w
=
a
w
e
t
w
b_{w}= a_{w}e^{t_{w}}
bw=awetw
b
h
=
a
h
e
t
h
b_{h}= a_{h}e^{t_{h}}
bh=aheth
我们可以知道其中,
b
x
、
b
y
、
b
w
b_{x}、b_{y}、b_{w}
bx、by、bw和
b
h
b_{h}
bh实际上就是预测出来的框box的中心坐标和宽高,那么如果预测的非常准确,需要真实框的
g
x
、
g
y
、
g
w
g_{x}、g_{y}、g_{w}
gx、gy、gw和
g
h
g_{h}
gh坐标应当为:(
g
x
、
g
y
、
g
w
g_{x}、g_{y}、g_{w}
gx、gy、gw和
g
h
g_{h}
gh实际上是实际框的中心坐标和宽高)
g
x
=
σ
(
t
x
)
+
c
x
g_{x}=\sigma(t_{x}) + c_{x}
gx=σ(tx)+cx
g
y
=
σ
(
t
y
)
+
c
y
g_{y}=\sigma(t_{y}) + c_{y}
gy=σ(ty)+cy
g
w
=
a
w
e
t
w
g_{w}= a_{w}e^{t_{w}}
gw=awetw
g
h
=
a
h
e
t
h
g_{h}= a_{h}e^{t_{h}}
gh=aheth
由此可以得到,真实框的
t
^
x
、
t
^
y
、
t
^
w
\hat t_{x}、\hat t_{y}、\hat t_{w}
t^x、t^y、t^w和
t
^
h
\hat t_{h}
t^h
计算中由于sigmoid函数的反函数那计算,所以并没有计算sigmoid的反函数,而是计算输出对应的sigmoid函数值。
σ
(
t
^
x
)
=
g
x
−
c
x
\sigma(\hat t_{x}) = g_x - c_{x}
σ(t^x)=gx−cx
σ
(
t
^
y
)
=
g
y
−
c
y
\sigma(\hat t_{y}) = g_y - c_{y}
σ(t^y)=gy−cy
t
^
w
=
log
(
g
w
/
a
w
)
\hat t_{w} = \log(g_{w} / a_{w})
t^w=log(gw/aw)
t
^
h
=
log
(
g
h
/
a
h
)
\hat t_{h} = \log(g_{h} / a_{h})
t^h=log(gh/ah)
这样,我们就可以根据训练的输出
σ
(
t
x
)
、
σ
(
t
y
)
、
t
w
\sigma(t_{x})、\sigma(t_{y})、t_{w}
σ(tx)、σ(ty)、tw和
t
h
t_{h}
th以及真实框的值
σ
(
t
^
x
)
、
σ
(
t
^
y
)
、
t
^
w
\sigma(\hat t_{x})、\sigma(\hat t_{y})、\hat t_{w}
σ(t^x)、σ(t^y)、t^w和
t
^
h
\hat t_{h}
t^h求出误差了。
还存在一个很关键的问题:在训练中我们挑选哪个bounding box的准则是选择预测的box与ground truth box的IOU最大的bounding box做为最优的box,但是在预测中并没有ground truth box,怎么才能挑选最优的bounding box呢?这就需要另外的参数了,那就是下面要说到的置信度。
置信度是每个bounding box输出的其中一个重要参数,作者对他的作用定义有两重:
一重是:代表当前box是否有对象的概率
P
r
(
O
b
j
e
c
t
)
P_{r}(Object)
Pr(Object),注意,是对象,不是某个类别的对象,也就是说它用来说明当前box内只是个背景(backgroud)还是有某个物体(对象);
另一重:表示当前的box有对象时,它自己预测的box与物体真实的box可能的
I
O
U
p
r
e
d
t
r
u
t
h
IOU_{pred}^{truth}
IOUpredtruth的值,注意,这里所说的物体真实的box实际是不存在的,这只是模型表达自己框出了物体的自信程度。
以上所述,也就不难理解作者为什么将其称之为置信度了,因为不管哪重含义,都表示一种自信程度:框出的box内确实有物体的自信程度和框出的box将整个物体的所有特征都包括进来的自信程度。经过以上的解释,其实我们也就可以用数学形式表示置信度的定义了:
C i j = P r ( O b j e c t ) ∗ I O U p r e d t r u t h C_{i}^{j} = P_{r}(Object) * IOU_{pred}^{truth} Cij=Pr(Object)∗IOUpredtruth
其中,
C
i
j
C_{i}^{j}
Cij表示第i个grid cell的第j个bounding box的置信度。
那么如何训练
C
i
j
C_{i}^{j}
Cij?
训练中, C ^ i j \hat C_{i}^{j} C^ij表示真实值, C ^ i j \hat C_{i}^{j} C^ij的取值是由grid cell的bounding box有没有负责预测某个对象决定的。如果负责,那么 C ^ i j = 1 \hat C_{i}^{j}=1 C^ij=1,否则, C ^ i j = 0 \hat C_{i}^{j}=0 C^ij=0。
下面我们来说明如何确定某个grid cell的bounding box是否负责预测该grid cell中的对象:前面在说明anchor box的时候提到每个bounding box负责预测的形状是依据与其对应的anchor box(bounding box prior)相关的,那这个anchor box与该对象的ground truth box的IOU在所有的anchor box(与一个grid cell中所有bounding box对应,COCO数据集中是9个)与ground truth box的IOU中最大,那它就负责预测这个对象,因为这个形状、尺寸最符合当前这个对象,这时 C ^ i j = 1 \hat C_{i}^{j}=1 C^ij=1,其他情况下 C ^ i j = 0 \hat C_{i}^{j}=0 C^ij=0。注意,你没有看错,就是所有anchor box与某个ground truth box的IOU最大的那个anchor box对应的bounding box负责预测该对象,与该bounding box预测的box没有关系。
对象条件类别概率是一组概率的数组,数组的长度为当前模型检测的类别种类数量,它的意义是当bounding box认为当前box中有对象时,要检测的所有类别中每种类别的概率.
其实这个和分类模型最后使用softmax函数输出的一组类别概率是类似的,只是二者存在两点不同:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。