候选区域
将图像划分成 7 ∗ 7 = 49 7*7=49 7∗7=49个网格,每个网格允许有2个预测bounding box,也就是全图像有 7 ∗ 7 ∗ 2 = 98 7*7*2=98 7∗7∗2=98个候选区域。
网络输入
yolo的输入可以是任意大小的原始图像,但是在放进网络前必须缩放成448*448的大小。
是由于网络中有两个全连接层,而全连接层需要固定输入的大小。
为什么全连接层需要固定输入的大小?
全连接层的前向传播计算公式为
a
l
=
σ
(
z
l
)
=
σ
(
W
l
a
l
−
1
+
b
l
)
a^l=\sigma(z^l)=\sigma(W^la^{l-1}+b^l)
al=σ(zl)=σ(Wlal−1+bl)
当前层权重
W
l
W^{l}
Wl,上一层的输出
a
l
−
1
a^l-1
al−1,其中
W
l
W^{l}
Wl的形状是固定的。
例如:
W
l
W^{l}
Wl是(50,784),如果输入图像大小
a
l
−
1
a^l-1
al−1为(36,36)那么压成一维后为(1296,1)则
(
50
∗
784
)
∗
(
1296
,
1
)
(50*784)*(1296,1)
(50∗784)∗(1296,1)会出现错误无法计算。
只有固定输入
a
l
−
1
a^l-1
al−1为(28,28)压成一维后计算
(
50
,
784
)
∗
(
784
,
1
)
=
>
(
50
,
1
)
(50,784)*(784,1)=>(50,1)
(50,784)∗(784,1)=>(50,1)才可以正确计算。
网络输出
7
∗
7
∗
30
7*7*30
7∗7∗30的tensor
30个维度=20个对象分类概率+2个预测bounding box的位置+2个bounding box的置信度
1. 20个对象分类概率
voc数据集有20个类别,每个类别的概率 P ( C 1 ∣ o b j e c t ) 、 P ( C 1 ∣ o b j e c t ) . . . P ( C i ∣ o b j e c t ) P(C_1|object)、P(C_1|object)...P(C_i|object) P(C1∣object)、P(C1∣object)...P(Ci∣object)
2. 2个预测bounding box的位置
1个bounding box有4个数值表示位置信息
(
c
e
n
t
e
r
x
,
c
e
n
t
e
r
y
,
w
i
d
t
h
,
h
e
i
g
h
t
)
(center_x,center_y,width,height)
(centerx,centery,width,height)
分别表示bounding box的中心坐标、宽和高,而2个bounding box有8个数值。
3. 2个bounding box的置信度
bounding box的置信度=
该bounding box存在对象的概率*该bounding box与实际bounding box的IOU
公式:
C
o
n
f
i
d
e
n
c
e
=
P
r
(
O
b
j
e
c
t
)
∗
I
O
U
p
r
e
d
t
r
u
t
h
Confidence=Pr(Object)*IOU^{truth}_{pred}
Confidence=Pr(Object)∗IOUpredtruth
其中
P
r
(
O
b
j
e
c
t
)
Pr(Object)
Pr(Object)区别于1中的
P
(
C
i
∣
o
b
j
e
c
t
)
P(C_i|object)
P(Ci∣object),
P
r
(
O
b
j
e
c
t
)
Pr(Object)
Pr(Object)存在对象概率指的是,无论对象是哪个类别,只有存在对象即可;
P
(
C
i
∣
o
b
j
e
c
t
)
P(C_i|object)
P(Ci∣object)指的是存在对象,并且该对象是哪一个类别的概率。
I
O
U
p
r
e
d
t
r
u
t
h
IOU^{truth}_{pred}
IOUpredtruth的计算:深度学习中的IoU概念理解
特别的
- 一张图片中检测对象数量有限制:因为图像划分为7*7=49的网格,也就是一张图片最多只可以检测49个对象。
- YOLO没有预先设置好每个网格中2个bounding box的大小和形状,是对同一个对象输出2种bounding box选择IOU最大的那个作为预测该对象的bounding box。
- 一个对象只能由一个网格进行预测,即使这个对象跨多个网格,也只能由该对象的bounding box中心位置所落在的那个网格进行预测。该网格存在对象概率为1,其余网格存在对象概率为0。
- 网格数量及bounding box数量的计算,网格数量和bounding box的数量是可以改变的。
网格数量S*S,每个网格产生B个bounding box,识别C个不同类别的对象,
输出的tensor为:
S ∗ S ∗ ( C + B ∗ ( 4 + 1 ) ) ∣ 其 中 ( 4 + 1 ) 是 4 个 位 置 信 息 和 1 个 置 信 度 S*S*(C+B*(4+1)){|其中(4+1)是4个位置信息和1个置信度} S∗S∗(C+B∗(4+1))∣其中(4+1)是4个位置信息和1个置信度
损失函数
S S S是网格数量, B B B是bounding box数量, C C C是类别数。
- bounding box边框中心点误差:
λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B I i j o b j [ ( x i − x i ^ ) 2 + ( y i − y i ^ ) 2 ] \lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}^{obj}_{ij}[(x_i-\hat{x_i})^2+(y_i-\hat{y_i})^2] λcoordi=0∑S2j=0∑BIijobj[(xi−xi^)2+(yi−yi^)2]
其中 I i j o b j \mathbb{I}_{ij}^{obj} Iijobj表示第i个网格第j个bounding box存在对象; x i ^ , y i ^ \hat{x_i},\hat{y_i} xi^,yi^实际bounding box 中心点位置, λ c o o r d \lambda_{coord} λcoord用于调节bounding box位置误差的权重,YOLO默认为5。 - bounding box宽高误差:
λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B I i j o b j [ ( w i − w i ^ ) 2 + ( h i − h i ^ ) 2 ] \lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}^{obj}_{ij}[(\sqrt{w_i}-\sqrt{\hat{w_i}})^2+(\sqrt{h_i}-\sqrt{\hat{h_i}})^2] λcoordi=0∑S2j=0∑BIijobj[(wi−wi^)2+(hi−hi^)2]
这里宽高取了平方是因为如果数值大对误差并不敏感,但是如果数值小则对误差很敏感,为了消除误差选择这种平方的方式。 - 置信度误差(有对象):
∑ i = 0 S 2 ∑ j = 0 B I i j o b j ( C i − C i ^ ) 2 \sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}^{obj}_{ij}(C_i-\hat{C_i})^2 i=0∑S2j=0∑BIijobj(Ci−Ci^)2 - 置信度误差(无对象):
λ n o o b j ∑ i = 0 S 2 ∑ j = 0 B I i j n o o b j ( C i − C i ^ ) 2 \lambda_{noobj}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}^{noobj}_{ij}(C_i-\hat{C_i})^2 λnoobji=0∑S2j=0∑BIijnoobj(Ci−Ci^)2
其中 I i j n o o b j \mathbb{I}_{ij}^{noobj} Iijnoobj表示第i个网格第j个bounding box不存在对象, λ n o o b j \lambda_{noobj} λnoobj在YOLO中默认为0.5。 - 有对象分类误差:
∑ i = 0 S 2 l i o b j ∑ c ε c l a s s e s ( P i ( c ) − P i ( c ) ^ ) 2 \sum_{i=0}^{S^2}l^{obj}_{i}\sum_{c\,\varepsilon\,{classes}}(P_i(c)-\hat{P_i(c)})^2 i=0∑S2liobjcεclasses∑(Pi(c)−Pi(c)^)2
其中 I i o b j \mathbb{I}_{i}^{obj} Iiobj表示第i个网格存在对象
总损失函数:
λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B I i j o b j [ ( x i − x i ^ ) 2 + ( y i − y i ^ ) 2 ] + λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B I i j o b j [ ( w i − w i ^ ) 2 + ( h i − h i ^ ) 2 ] + ∑ i = 0 S 2 ∑ j = 0 B I i j o b j ( C i − C i ^ ) 2 + λ n o o b j ∑ i = 0 S 2 ∑ j = 0 B I i j n o o b j ( C i − C i ^ ) 2 + ∑ i = 0 S 2 I i o b j ∑ c ε c l a s s e s ( P i ( c ) − P i ( c ) ^ ) 2 \lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}^{obj}_{ij}[(x_i-\hat{x_i})^2+(y_i-\hat{y_i})^2]+\lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}^{obj}_{ij}[(\sqrt{w_i}-\sqrt{\hat{w_i}})^2+(\sqrt{h_i}-\sqrt{\hat{h_i}})^2]+\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}^{obj}_{ij}(C_i-\hat{C_i})^2+\lambda_{noobj}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}^{noobj}_{ij}(C_i-\hat{C_i})^2+\sum_{i=0}^{S^2}\mathbb{I}^{obj}_{i}\sum_{c\,\varepsilon\,{classes}}(P_i(c)-\hat{P_i(c)})^2 λcoordi=0∑S2j=0∑BIijobj[(xi−xi^)2+(yi−yi^)2]+λcoordi=0∑S2j=0∑BIijobj[(wi−wi^)2+(hi−hi^)2]+i=0∑S2j=0∑BIijobj(Ci−Ci^)2+λnoobji=0∑S2j=0∑BIijnoobj(Ci−Ci^)2+i=0∑S2Iiobjcεclasses∑(Pi(c)−Pi(c)^)2
训练
总共有24个卷积层和2个全连接层。前20层利用ImageNet进行预训练,后4层卷积层用随机数值初始化。
除了最后一层采用线性激活函数,其他层均用Leaky-RELU进行激活。(各种激活函数:一文搞懂激活函数)
并且采用了dropout和数据增强防止过拟合。
预测
预测中最主要用了NMS(非极大值抑制算法)
NMS
根据上面说的,网络的输出是
7
∗
7
∗
30
7*7*30
7∗7∗30的tensor,1个网格有20个类别对象的概率*2个bounding box的置信度=40个候选对象,49个网格就有
49
∗
40
=
1960
49*40=1960
49∗40=1960个候选对象,对每种对象进行NMS则
1960
/
20
=
98
1960/20=98
1960/20=98,每个类别有98个候选对象。
设
置
阈
值
,
把
s
c
o
r
e
低
于
阈
值
的
对
象
去
除
设置阈值,把score低于阈值的对象去除
设置阈值,把score低于阈值的对象去除
⇓
\Downarrow
⇓
遍
历
每
个
类
别
遍历每个类别
遍历每个类别
⇓
\Downarrow
⇓
找
到
98
个
候
选
对
象
中
选
择
s
c
o
r
e
最
大
找到98个候选对象中选择score最大
找到98个候选对象中选择score最大
⇓
\Downarrow
⇓
上
面
找
到
的
候
选
对
象
与
其
余
s
c
o
r
e
不
为
0
的
候
选
对
象
之
间
计
算
I
O
U
上面找到的候选对象与其余score不为0的候选对象之间计算IOU
上面找到的候选对象与其余score不为0的候选对象之间计算IOU
⇓
\Downarrow
⇓
去
除
I
O
U
大
于
阈
值
的
候
选
对
象
(
就
是
重
叠
度
很
高
)
,
并
设
置
s
c
o
r
e
=
0
去除IOU大于阈值的候选对象(就是重叠度很高),并设置score=0
去除IOU大于阈值的候选对象(就是重叠度很高),并设置score=0
⇓
\Downarrow
⇓
最
后
记
下
剩
余
的
候
选
对
象
,
返
回
第
二
个
步
骤
,
继
续
下
一
个
对
象
最后记下剩余的候选对象,返回第二个步骤,继续下一个对象
最后记下剩余的候选对象,返回第二个步骤,继续下一个对象
缺陷
虽然速度很快,但是精度不如RCNN,定位不准确,召回率低。
- 一个网格只能预测一个类别两种bbox,当一个网格中存在两种类别时(如这两个物体重叠,中心点都在同一个网格中),这个网格只能预测其中一个
- 依赖训练数据的bbox,如果预测的时候出现与训练时不同长宽比例的bbox时,泛化性低。