YOLOv2:YOLO9000:Better,Faster,Stronger解读,入门小白,若博文有不妥之处,望加以指点,笔者一定及时修正。
YOLOV1解读:(https://blog.csdn.net/qq_33948796/article/details/88538940)
文章目录
相关:YOLOV1解读:(https://blog.csdn.net/qq_33948796/article/details/88538940)
① 论文翻译
摘要
(emmmmmm…没啥重要的)
1. 引言
目标检测的一个难题是小目标的检测。
常见的用于检测的数据集比用于分类的数据集小得多了。因为检测的数据集成本比分类的高得多。
我们提出了一种新方法来利用我们已有的大量分类数据,并用它来扩展当前检测系统的范围。 我们的方法使用对象分类的分层视图,允许我们将不同的数据集组合在一起。
我们还提出了一种联合训练算法,它允许我们在检测和分类数据上训练检测器。 我们的方法利用标记的检测图像来学习精确定位对象,同时使用分类图像来增加其多样性和鲁棒性。
首先,我们改进了基础YOLO检测系统,产生YOLOv2。 然后使用数据集组合方法和联合训练算法来训练来自ImageNet的9000多个类的模型。
2. Better
YOLOV1与Fast RCNN相比,定位误差大;与基于region proposal方法相比,召回率较低。
计算机视觉应用的趋势是更大、更深的网络。一般训练更大的网络或者将多个模型融合起来可以获取更好的性能。对于YOLOV2,我们要保证速度和精度。我们不扩展我们的网络,我们简化我们的网络,使其更容易学习。我们将很多
t
r
i
c
k
trick
trick与YOLO结合起来,来提高性能。如
t
a
b
l
e
2
table \ 2
table 2:
①Batch Normalization
在每个卷积层后面添加一个 B N BN BN层,可以加快收敛速度,也有利于正则化。所以去除了 Y O L O V 1 YOLOV1 YOLOV1后面的 d r o p o u t dropout dropout层。
②高分辨率分类器
简单的说就是很多模型都是用在 I m a g e N e t ImageNet ImageNet 数据集上预训练的模型,一般都是去除后面几层,保留前面的用来提取特征。比如SSD里面使用VGG、ResNet、MobileNetV2等。YOLOV1是预训练的是 224X224,然后提升到 448X448。而YOLOV2直接是 448X448 进行预训练。
③Convolutional With Anchor Boxes
下面先介绍一下
R
P
N
RPN
RPN:在
f
e
a
t
u
r
e
m
a
p
feature \ map
feature map 上进行滑窗操作,每一个中心预测
9
9
9 种不同大小的建议框。
每个点预测 K (Faster RCNN里面
k
=
9
k=9
k=9 )种不同大小的建议框,3个尺度和3个纵横比。上面的256-d是指通道数,
r
e
g
为
4
K
reg 为 4K
reg为4K,因为一个
r
e
g
reg
reg表示
(
x
,
y
,
w
,
h
)
(x,y,w,h)
(x,y,w,h);而
c
l
s
cls
cls为
2
K
2K
2K,表达是或者不是目标。
之前的YOLOV1利用最后的全连接层完成
b
o
u
n
d
i
n
g
b
o
x
e
s
bounding \ boxes
bounding boxes 的预测,会丢失较多的空间信息,定位不准确。为了引入
A
n
c
h
o
r
b
o
x
e
s
Anchor \ boxes
Anchor boxes来预测
b
o
u
n
d
i
n
g
b
o
x
e
s
bounding \ boxes
bounding boxes,去掉网络的全连接层。
1)去掉最后一个池化层确保输出的卷积层特征图有更高的分辨率;
2)缩减输入图片的分辨率,从 448x448 变成 416x416,这样让后面产生的特征图大小都为奇数。这样最中间就会有一个中心格。作者的解释是: 大物体通常会占据图像的中间位置,可以只用一个中心的
c
e
l
l
cell
cell 来预测大物体的位置。如果特征图的宽和高是偶数,就需要用中间的
4
个
c
e
l
l
4个cell
4个cell来预测,效率会比1个低得多;
3)使用卷积层进行降采样,最后得到13x13的特征图(416/32);
4)有了
A
n
c
h
o
r
b
o
x
Anchor \ box
Anchor box,同时预测类别和位置。YOLOV1是每个
c
e
l
l
cell
cell 来预测类别,也就是每个网格来预测类别。而每个
c
e
l
l
cell
cell 画的两个
b
o
u
n
d
i
n
g
b
o
x
e
s
bounding \ boxes
bounding boxes 负责预测框的坐标,让类别的预测与每个cell预测的位置绑在一起。而在YOLOV2中,不再绑在一起,而是全部放到
A
n
c
h
o
r
b
o
x
Anchor \ box
Anchor box 中。
使用了 A n c h o r b o x e s Anchor \ boxes Anchor boxes 之后,预测框超过1000个,而YOLOV1只能在每张图片给出98个预测框( 7 ∗ 7 ∗ 2 = 98 7*7*2 = 98 7∗7∗2=98)。
④聚类
这边先介绍一下
K
−
m
e
a
n
s
K-means
K−means:
K
−
m
e
a
n
s
K-means
K−means是非监督学习中的聚类方法。它需要事先确定常数 K,K表示最终的聚类类别数。首先随机选定初始点为质心,并通过计算每一个样本与质心之间的相似度(欧式距离、曼哈顿距离、契比雪夫距离、余弦距离、Jaccard相似系数(IOU)),将样本点归到最相似的类中。接着重新计算每个类的类中心,重复上述过程,直到质心不再变化,最终确定了每个样本所属类别以及每个类的质心。
这里为什么使用聚类呢?我们知道 F a s t e r R C N N Faster \ RCNN Faster RCNN 和 S S D SSD SSD 中的 A n c h o r b o x Anchor \ box Anchor box 的大小和比例是按照经验设定的,然后网络会在训练过程中调整 A n c h o r b o x e s Anchor \ boxes Anchor boxes 的尺寸。但是如果一开始就找到合适尺寸的 A n c h o r b o x e s Anchor \ boxes Anchor boxes ,那么肯定可以帮助网络更好预测。作者使用了 K − m e a n s K-means K−means 的方式对训练集的 b o u n d i n g b o x e s bounding \ boxes bounding boxes 做聚类,试图找到合适的 A n c h o r b o x e s Anchor \ boxes Anchor boxes。
作者发现如果采用标准的
K
−
m
e
a
n
s
K-means
K−means (即采用欧氏距离来衡量差异),在 box 的尺寸比较大的时候其误差也更大。而作者希望的是误差和 box 的尺寸没有太大关系。所以距离函数重新定义,这里使用了 IOU 参与距离计算,使得通过这些
A
n
c
h
o
r
b
o
x
e
s
Anchor \ boxes
Anchor boxes 获得好的 IOU 分值。使用聚类进行选择的优势是达到相同的 IOU 结果时所需的 anchor box 数量更少, 使得模型的表示能力更强, 任务更容易学习。距离公式:
上面的
c
e
n
t
r
o
i
d
centroid
centroid 表示聚类是被选中作为质心的框,
b
o
x
box
box 表示其他边框,D 表示两者之间的距离,而 IOU 表示两个框之间的重叠度。IOU越大,距离越小,越接近。
作者实验表明,边框 K 越多,Avg IOU越大。K = 5的时候,就可与人工设置 9 个 A n c h o r b o x e s Anchor \ boxes Anchor boxes尺寸得到的效果。聚类得到的框和之前手动挑选的框大不一样。有稍微短宽的和高瘦一些的(框)。这表明了使用k-means聚类来生成b-box的初始框,这个模型能有更好的表型以及更容易学习。 (笔者就不懂了,是生成很多框,然后用这种方法选取 bounding box 的初始框,也就是一个cell 产生5个 bounding box?好像③④矛盾啊而且这作用类似于NMS作用?看下面的分析。读论文还是很难受的啊。。。。。而YOLOV1里面是认为设置每个 cell 有两个 bounding box)
⑤直接预测位置
这一小段需要仔细阅读,回味无穷:
当YOLOV2运用
A
n
c
h
o
r
b
o
x
e
s
Anchor \ boxes
Anchor boxes机制的时候,也就是上述的 ③,设定 9 个固定面积和尺寸的框。产生了一个问题,模型不稳定。论文中不稳定的因素:来自于 bounding box 的 (x,y) 的预测。在RPN中,网络预测了值
t
x
,
t
y
t_x,t_y
tx,ty 以及
(
x
,
y
)
(x,y)
(x,y)坐标,计算公式为:简单点说,这边也就是预测(x,y)的坐标
其中,
x
,
y
x,y
x,y 是预测框的中心点坐标,
x
a
,
y
a
x_a,y_a
xa,ya是先验框的中心点坐标,
w
a
,
h
a
w_a,h_a
wa,ha是先验框的宽和高。
t
x
,
t
y
t_x,t_y
tx,ty是要学习的参数,也就是偏移量。
公式没有限制条件,所以任何
A
n
c
h
o
r
b
o
x
Anchor \ box
Anchor box 都可以偏移到图像任意的位置上,所以随机初始化模型会需要很长一段时间才能稳定产生可靠的偏移量。但是YOLOV2没有预测偏移量,而是直接预测对于网格单元的相对位置。即相对单元格的左上角的位置坐标。当(x, y)被直接预测出来,那整个bounding box还差w和h需要确定。yolo_v2的做法是既有保守又有激进,x和y直接暴力预测,而w和h通过bounding box prior的调整来确定,YOLOV2为每个bounding box预测出5个坐标
(
t
x
,
t
y
,
t
w
,
t
h
,
t
o
)
(t_x,t_y,t_w,t_h,t_o)
(tx,ty,tw,th,to)。
YOLOV2的公式为:将预测边框的中心约束在特定gird网格内。
其中,
b
x
,
b
y
,
b
w
,
b
h
b_x,b_y,b_w,b_h
bx,by,bw,bh为预测框的中心和宽高。
P
r
(
O
b
j
e
c
t
)
∗
I
O
U
(
b
,
o
b
j
e
c
t
)
Pr(Object)*IOU(b,object)
Pr(Object)∗IOU(b,object)是预测框的置信度。注意的是:YOLOV1直接计算置信度的值,而YOLOV2是对预测的参数
t
0
t_0
t0 进行
σ
\sigma
σ 变换后作为置信度的值。
c
x
,
c
y
c_x,c_y
cx,cy是当前网格左上角到图像左上角的距离,需要先将网格大小归一化,即令一个网格宽和高均为1。
P
w
,
P
h
P_w,P_h
Pw,Ph均为先验框的宽和高。
σ
\sigma
σ是
S
i
g
m
o
i
d
Sigmoid
Sigmoid函数。
t
x
,
t
y
,
t
w
,
t
h
,
t
o
t_x,t_y,t_w,t_h,t_o
tx,ty,tw,th,to是要学到的函数,分别用于预测框的中心点坐标和宽高,以及置信度。
看上面的公式也可以看出,b-box的宽和高也是同时确定出来,并不会像RPN那样通过regression来确定。 p w p_w pw和 p h p_h ph都是 k − m e a n s k-means k−means聚类之后的先验框的宽和高,YOLOV2直接预测出偏移量 t w t_w tw和 t h t_h th,相当于直接预测了 b o u n d i n g b o x bounding \ box bounding box的宽和高。使用聚类搭配直接位置预测法的操作,使得模型上升了5个百分点。
由于σ函数将 t x , t y t_x,t_y tx,ty约束在(0,1)范围内,所以根据上面的计算公式,预测边框的蓝色中心点被约束在蓝色背景的网格内。约束边框位置使得模型更容易学习,且预测更为稳定。
这边注意的是: A n c h o r Anchor Anchor只是试验性在YOLOV2上铺设,一旦有了 d i m e n s i o n p r i o r s dimension priors dimensionpriors就把 A n c h o r Anchor Anchor抛弃了
⑥小目标检测的处理
为了加强对小目标检测的精确度。YOLOV2使用了一个passthrough层的方法。具体来说,就是在最后一个pooling之前,特征图的大小是2626512,将其1拆4,直接传递到pooling后(并且又经过一组卷积)的特征图,两者叠加到一起作为输出的特征图。
上面的图只是一个示意图,而不是代码中的做法。
⑦多尺度训练
因为去掉了全连接层,YOLO2可以输入任何尺寸的图像。因为整个网络下采样倍数是32,作者采用了{320,352,…,608}等10种输入图像的尺寸,这些尺寸的输入图像对应输出的特征图宽和高是{10,11,…19}。训练时每10个batch就随机更换一种尺寸,使网络能够适应各种大小的对象检测。
3. Faster
追求速度和精确度之间的平衡。
提出了一个网络结构
D
a
r
k
n
e
t
−
19
Darknet-19
Darknet−19,比
V
G
G
VGG
VGG小但是精度不弱于
V
G
G
VGG
VGG。但浮点运算量减少到约1/5,以保证更快的运算速度。
用
d
a
r
k
n
e
t
−
19
darknet-19
darknet−19 作为
Y
O
L
O
V
2
YOLOV2
YOLOV2的
b
a
c
k
b
o
n
e
backbone
backbone 网络。一般的检测任务模型都会有一个分类网络作为
b
a
c
k
b
o
n
e
backbone
backbone网络,比如
S
S
D
SSD
SSD拿
V
G
G
VGG
VGG 作为
b
a
c
k
b
o
n
e
backbone
backbone。YOLOV2用的自家的分类网络
d
a
r
j
n
e
t
−
19
darjnet-19
darjnet−19作为base。同时在
d
a
r
k
n
e
t
−
19
darknet-19
darknet−19 中使用
B
a
t
c
h
N
o
r
m
a
l
i
z
a
t
i
o
n
Batch Normalization
BatchNormalization 来加速收敛。最后输出为(batch_size,13,13,num_anchors*(5+num_classes))。。。。。。网络结构不细究了咯!其中 num_anchors = 5,先验框个数,这个先验框是聚类来做的。
4. Stronger
提出了一种联合训练方法,能够容许同时使用目标检测数据集和分类数据集。使用有标记的检测数据集精确定位,使用分类数据增加类别和鲁棒性。
(个人觉得不必在意。。。。。)
5. YOLOV2的损失函数
误差依然包括边框位置误差、置信度误差、对象分类误差。
1)
I
M
a
x
I
O
U
<
T
h
r
e
s
h
I_{Max IOU<Thresh}
IMaxIOU<Thresh 意思是预测边框中,与真实对象边框IOU最大的那个,其IOU<阈值Thresh,此系数为1,即计入误差,否则为0,不计入误差。YOLO2使用Thresh=0.6。
2)
1
t
<
128000
1_{t<128000}
1t<128000 意思是前128000次迭代计入误差。这里是与先验框的误差,而不是与真实对象边框的误差。可能是为了在训练早期使模型更快学会先预测先验框的位置。
3)
1
k
t
r
u
t
h
1_{k}^{truth}
1ktruth 意思是该边框负责预测一个真实对象(边框内有对象)。
各种
λ
\lambda
λ 是不同类型误差的调节系数,类似于YOLOV1中的。
(历来损失函数都是调试代码才会透彻理解。。。。笔者小白也不例外啊!)
② 阅读笔记及V1与V2的比较
1、对比YOLO1的输出张量,YOLO2的主要变化就是会输出5个先验框,且每个先验框都会尝试预测一个对象。输出的
13
∗
13
∗
5
∗
25
13*13*5*25
13∗13∗5∗25 张量中,25维向量包含 20个对象的分类概率+4个边框坐标+1个边框置信度。
2、
L
o
s
s
:
S
o
f
t
m
a
x
l
o
s
s
Loss:Softmax \ loss
Loss:Softmax loss;
3、5个
A
n
c
h
o
r
b
o
x
e
s
Anchor \ boxes
Anchor boxes,是聚类
K
−
m
e
a
n
s
K-means
K−means产生的,计算距离的依据是
I
O
U
IOU
IOU;
4、
B
a
c
k
b
o
n
e
:
D
a
r
k
n
e
t
−
19
Backbone:Darknet-19
Backbone:Darknet−19;
5、YOLO V2是一个纵向自上而下的网络架构,随着通道数目的不断增加,FLOPS是不断增加的。
嘿!。。。。。。。后期代码解读会上传到github上哈,敬请期待!
③ 参考
这几位的博客十分好,隆重推荐!
1、https://zhuanlan.zhihu.com/p/25167153
2、https://blog.csdn.net/zxyhhjs2017/article/details/83013297
3、https://zhuanlan.zhihu.com/p/47575929
4、https://blog.csdn.net/leviopku/article/details/82588959