Week1
学习时间:2020/06/23 - 2020/06/28
主要学习内容
所有相关资料和我写的代码可以在此处下载:Download
- DeepLearning中视频学习和YOLO代码实现
- VGG Paper阅读
DeepLearning中的YOLO代码实现重点知识
1. Anchor Boxes
Anchor Boxes出现的目的就是解决以前目标检测中一个格子只能检测出一个物体的问题。
举个栗子
为了能够明白Anchor Boxes的原理,我们来看一下这样一幅图片:
在这个图像之中,人与车的中心点都分布在了第8个格子之中。如果这个时候按照以前
y
=
[
p
c
b
x
b
y
b
h
b
w
c
1
c
2
c
3
]
y = left[ egin{matrix} p_c\ b_x\ b_y\ b_h\ b_w\ c_1 \ c_2 \ c_3 end{matrix}
ight]
y=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡pcbxbybhbwc1c2c3⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
这样的方式打标签,不论是网络的训练还是输出都只能得到一个结果。所以,为了解决这个问题Anchor Boxes就出现了。
原理分析
还是接着前面的那个栗子来讲原理。为了同时能够在一个格子里面检测出人和车两个物体,我们引入了上图中的两个Anchor Box。从这两个Anchor Box的形状我们就能看出来,第一个Anchor Box代表人而第二个Anchor Box就代表汽车。
有了这两个Anchor Box,我们就可以得到以下的打标签方式:
y
=
[
p
c
,
b
x
,
b
y
,
b
h
,
b
w
,
c
1
,
c
2
,
c
3
⏞
A
n
c
h
o
r
B
o
x
1
,
p
c
,
b
x
,
b
y
,
b
h
,
b
w
,
c
1
,
c
2
,
c
3
⏞
A
n
c
h
o
r
B
o
x
2
]
T
y = left[ overbrace{p_c, b_x, b_y, b_h, b_w, c_1, c_2, c_3}^{Anchor Box1}, overbrace{p_c, b_x, b_y, b_h, b_w, c_1, c_2, c_3}^{Anchor Box2}
ight]^T
y=⎣⎡pc,bx,by,bh,bw,c1,c2,c3
AnchorBox1,pc,bx,by,bh,bw,c1,c2,c3
AnchorBox2⎦⎤T
针对人类,其形状更像是Anchor Box1,所以我们在打标签的时候,如果有人类则可以直接令Anchor Box1中
p
c
=
1
,
c
1
=
1
p_c = 1, c_1 = 1
pc=1,c1=1,而其
b
h
,
b
w
b_h, b_w
bh,bw仍然按照图片中人类的大小来框定;如果没有人类,则令Anchor Box1的
p
c
=
0
p_c = 0
pc=0,其他变量就don’t care了。同理,车辆的Anchor Box中的变量设定也是一样的。
2. Encoding方式
有了前面Anchor Boxes的基础,我们就可以来康康YOLO中的Encoding方式。在YOLO之中使用了Deep CNN(也就是Fully Convlution的策略实现的)进行编码,而最后的编码结果是一个shape为(19, 19, 5, 85)的矩阵。
Shape解释: 19 × 19 19 imes 19 19×19 是指YOLO最后会将图像分割为 19 × 19 19 imes 19 19×19个格子,5代表这里用了5个Anchor Boxes,85则是80个类 + p c , b x , b y , b h , b w p_c, b_x, b_y, b_h, b_w pc,bx,by,bh,bw。最后输出的时候为了方便处理一般会把最后两维flatten得到一个(19, 19, 425)的矩阵。
3. Class score
这个Class score就是为了后面的Non-max suppression作准备的。
对于每一个box来说,要想得到Class score,就是用
p
c
p_c
pc乘上每一个种类的soft_max输出即可。
4.Non-Max Suppression
继续看一个栗子
如上图所示,YOLO网络的输出通过
p
c
<
t
h
r
e
s
h
o
l
d
p_c < threshold
pc<threshold 这个筛选之后还是会在一个物体的附近输出几个框图。为了解决这个问题Non-Max Supression也就应运而生了。
实现原理
NMS的实现步骤如下:
- 首先找出拥有最高score的box(注意:这里的score是每个box中挑选出来的最高的)
- 计算这个box和其他所有box的iou,如果 i o u > t h r e s h o l d iou > threshold iou>threshold,那么就把其他的box舍弃掉。
- 重复第1步直到没有盒子可以继续删了。
虽然整个步骤看起来比较简单,但是有一个细节需要注意的是如果要使用
TensorFlow
所提供的tf.image.non_max_suppression()
,就需要将box的score进行flatten操作即变为(4, )的输出,因为tf操作是需要在全局进行的,而不是针对每个Cell重复上面的三个步骤。具体如何实现可以看上面的Download下载代码查看。
VGG Paper阅读
文章思维导图
这个图比较模糊,如果想看清楚一点的图片请在Download中自行下载。
重点
有关VGG的Configuration网上资料有很多都在讨论,并且原文的2.2所列出的table也十分通俗易懂。这里我主要讨论两个网上资料相对较少的重点。
smallest image side
notation:paper中训练时的
smallest image side
记为S,测试时记为Q。本文与原paper保持一致。
解释:这个参数就是指最小图片边长,也就是只接受大于S的输入(paper默认长宽相等,输入大小就是指长或宽)。如果输入刚刚等于S则接受全部输入,如果远远大于S的话则会裁剪出含有较小物体或者物体一部分的图片部分作为输入。
上面两个表格分别是作者做了单尺度和多尺度测试集的性能结果表。作者在这之中引入了两种方式处理S:
- 固定S
- 让 S ∈ [ S m i n , S m a x ] S in [{S_{min}, S_{max}}] S∈[Smin,Smax] 随机取值。
其中第二个方式可以看做是训练集的scale jittering(注意这里是可以看做,后面可以使用crop的scale jittering控制在224大小的)。
从表格中就可以看出来训练集的scale jittering对于性能的提升有较好的帮助作用。而作者给出的解释就是:物体在不同图片中的大小可能有所不同,需要把这部分因素纳入考虑的范围。
Dense Evaluation & Multi-Crop Evaluation
paper在测试的时候介绍了这两种评估的策略,而这两种策略在网上讨论较少。究其原因,我认为是这两种策略融合后其实对结果精度的提升并不明显,因此后续有关这两者评估方法的讨论比较少。
下面我根据自己的理解分别介绍一下这两种评估方式:
- Dense Evaluation就是通过fully-convlutional network去实现YOLO网络,这样有个好处就是不需要在测试的时候进行multiple crops(因为没有全连接层的话就不需要严格限制输入大小,后面输出时直接做sum pooling再求均值即可,只需要保证通道数量和标签规定的维度相同即可)。
- Multi-Crop Evaluation就是通过全连接层的方式进行输出。对图像进行多样本的随机裁剪,然后通过网络预测每一个样本的结构,最终对所有结果平均。
paper认为Multi-Crop Evaluation是Dense Evaluation的补充。也就是说,Multi-Crop Evaluation中卷积输出的feature map通过padding 0的方式补全大小,而Dense Evaluation相当于padding补充了来自原来图像临域的值。