YOLOV2-Better,Faster,Stronger

YOLOV2-Better,Faster,Stronger_第1张图片
参考:https://www.bilibili.com/video/BV1Q64y1s74K/?spm_id_from=333.337.search-card.all.click&vd_source=de203b26ba8599fca1d56a5ac83a051c

下图是目标检测网络的发展时间图,可以看到YOLO的每一个版本的推出都是在非常关键的时刻。

一、Better
为了提升YOLO的性能,YOLOV2主要采用了以下方法来提升性能。
Batch Normalization (批归一化)
High Resolution Classifier (高分辨率分类器)
Anchor (锚边界框)
Dimension Cluster (维度聚类)
Direct locaiton prediction (直接位置预测)
Multi-Scale Training (多尺度训练)

(1)Batch Normalization
批归一化从数学层面上来说,就是将数据尽可能的压缩在(0,1)之间,并服从正态分布。在深度学习中,BN层往往添加在全连接层激活层之间。
我们可以知道,对于激活层来说,输入激活层的数据是很重要的,对于常用的sigmoid的激活函数来说,数据集中在中间时,能够更好地利用非线性函数的性质,才能将数据更好地传递。具体的效果如下图所示。
YOLOV2-Better,Faster,Stronger_第2张图片
如果输入数据大致是二值分布,进行归一化后,也可以尽可能的将数据往中间靠拢。
YOLOV2-Better,Faster,Stronger_第3张图片
没有经过BN的数据,往往有一部分数据在通过激活函数后,直接达到了饱和阶段(饱和指输出结果不是1就是-1),经过BN层的数据,可以在通过激活函数后更具有价值。BN层具体的运算过程,见下图所见。
YOLOV2-Better,Faster,Stronger_第4张图片
(2)High Resolution Classifier
传统的图片网络训练,都是使用的低分辨率的图片,如在ImaeNet上采用224x224分辨率的图片进行训练。YOLOV1就是在这种情况下进行训练的,但是根据YOLOV1的实际情况,输入的图片的分辨率是448x448,那就和训练时的分辨率不一样,这样会导致训练时,我们要放大图片,这样必然会影响最后的精度。而YOLOV2采用的训练方法中,最后是要使用448x448的分辨率进行训练的,这样可以改善YOLOV1的缺点,提高最后的精准度。

(3)Anchor,Dimension Cluster,Direct locaiton prediction

①什么是Anchor?
在YOLOV1的网络中,一个GC会划分2个BBOX,这两个BBox的长宽比没有事先决定,且这两个BBOX是会野蛮生长的。而在YOLOV2中,我们会给BBox一个先验的概率框,比如一个是矮胖的,一个是长高的。这样矮胖的框天生就适合预测汽车等物体,长高的框天生就适合去预测行人,路灯等物体。本身由哪一个框去拟合训练框和YOLOV1是一样的,采用交并比去决定。这样会让模型更加稳定。

②YOLOV2中黑箱输出矩阵的意义是什么?
YOLOV2-Better,Faster,Stronger_第5张图片
在YOLOV2中,黑箱输出的矩阵大小是13x13x125,13指的是YOLOV2最终是将图片划分为13x13个GC,没一个GC对应125长度的向量。这125个数据代表的是:一个GC会划分5个Anchor,每个Anchor有4个位置参数,1个置信度参数,20个类别概率参数。所以长度是5*(5+20)=125。
这里值得注意的是,在YOLOV1网络中,一个GC=2个BBOX+20维概率。
而在YOLOV2网络中,一个GC=5个Anchor
也就是说,在YOLOV1中,一个GC对应了一个物体的类别,所以YOLOV1最大能识别出7x7=49个物体。
而在YOLOV2中,决定物体的类别的不再是GC,而是Anchor,所以YOLOV2最大能够识别出51313=845个物体,这样YOLOV2在小物体检测上的性能得到了提高。

③为什么Anchor的个数是5?
在其他的一些目标识别网络中,Anchor的个数和长宽比都是手动选择的。
在YOLOV2中,对VOC和COCO数据集进行了聚类(Dimension Cluster),最终取了折中,选择Anchor 个数为5。
YOLOV2-Better,Faster,Stronger_第6张图片
④Anchor中是怎么限制预测框的野蛮生长的?
在YOLOV2中,采用了Direct locaiton prediction
YOLOV1中,一开始中心点是位于GC中的,但随着训练的进行,BBOX可以野蛮的生长,这样会导致,中心点不再落在该GC中。
在YOLOV2中,对框进行了处理使得位置中心偏移始终不能让中心点超出原本的GC。使用的方法是对偏移量套一个sigmoid函数,这样不管你的偏移量是多少,都能约束在该GC中。
YOLOV2-Better,Faster,Stronger_第7张图片
做一个比喻,YOLOV1中的中心点诞生于新手村GC,最终会走出新手村。而在YOLOV2中的中心点,诞生于新手村GC,最终也会老死在驯兽村中。

(4)Multi-Scale Training
Multi-Scale Training是指在模型训练的过程中,会输入各种大小的图片,强迫YOLOV2模型去适应各种大小。这里模型的权重和结构都不会变。
原因是因为有全局平均池化层,这可以让各种大小的图片都能进入模型进行预测。这里还值得注意的是,速度和精度不可以兼得。输入小图片精度降低但是速度变快,输入大图片精度变高但是速度下降。
YOLOV2-Better,Faster,Stronger_第8张图片
通过对比,在同精度下,YOLOV2速度最快,同速度下YOLOV2精度最高。
YOLOV2-Better,Faster,Stronger_第9张图片

(5)Fine-Grained Features(细粒度特征)
实际上就是底层的细粒度特征+卷积后的高层特征,有利于小目标检测。
YOLOV2-Better,Faster,Stronger_第10张图片YOLOV2-Better,Faster,Stronger_第11张图片
(6)YOLOV2的损失函数
首先回顾一下YOLOV1的损失函数的构成:
因为一个GC会产生2个BBOX,所以YOLOV1的误差主要分为负责检测物体的BBOX的误差和不负责检测BBOX的误差。
具体来说分为:
负责检测物体的BBOX的中心点误差
负责检测物体的BBOX的长宽误差
负责检测物体的BBOX的置信度误差
负责检测物体的BBOX的分类误差
不负责检测物体的BBOX的置信度误差

下图是YOLOV2的损失函数总结图
YOLOV2-Better,Faster,Stronger_第12张图片
首先对于YOLOV2来说,需要遍历所有的预测框也就是13x13x5个。
主要分为5类误差。
非检测物体的Anchor的置信度误差
训练早期,拟合的Anchor和预测框的误差
检测物体的Anchor的定位误差
检测物体的Anchor的置信度误差
检测物体的Anchor的分类误差

(7)不同技巧对于YOLO的优化力度
YOLOV2-Better,Faster,Stronger_第13张图片

二、Faster
主要是更换了骨干网络使得模型的速度得到了提升。

三、Stronger
这里不是YOLOV2的重点,暂时就不做赘述了。

你可能感兴趣的:(深度学习)