YOLOV3学习笔记
最近项目需要认真学习yolo神经网络,因此将学习过程记录下来。
参考博客1:https://blog.csdn.net/leonardohaig/article/details/90346325
参考博客2:https://blog.csdn.net/leviopku/article/details/82660381
参考博客3:https://blog.csdn.net/qq_42109740/article/details/106027427
前言
YOLOV1-V4的论文链接
1.YOLOV1:https://arxiv.org/abs/1506.02640
2.YOLOV2:https://arxiv.org/abs/1612.08242
3.YOLOV3:https://arxiv.org/abs/1804.02767
4.YOLOV4:https://arxiv.org/abs/2004.10934
5.YOLO官方Github地址:https://github.com/AlexeyAB/darknet
6.YOLO官网:https://pjreddie.com/
YOLOV3
摘要
由于原理上的限制,YOLO仅检测最后一层卷积输出层,小物体像素少,经过层层卷积,在这一层上的信息几乎体现不出来,导致难以识别,YOLOv3在这部分提升明显。
- YOLOV2和YOLOV3的对比:
- YOLOV3的性能对比:
一、论文中的Darknet-53网络结构
整个网络主要是由一系列的1x1和3x3的卷积层组成,作者说因为网络中有53个convolutional layers,所以叫做Darknet-53。
- 每个卷积层后都会跟一个BN层和一个LeakyReLU层
- 在YOLOV3网络中没有池化的过程,利用步长为2的下采样卷积过程来代替池化,Darknet-53网络中共有5次下采样的卷积过程(卷积核为3×3,步长为2),因此416x416输入得到了13x13输出。
- 使用残差的结构的好处:(1)深度模型一个关键的点就是能否正常收敛,残差这种结构能保证网络结构在很深的情况下,仍能收敛,模型能训练下去(解决了王网络退化的问题)。(2)网络越深,表达的特征越好,分类+检测的效果都会提升。(3)残差中的1*1卷积,使用network in network的想法,大量的减少了每次卷积的channel,一方面减少了参数量(参数量越大,保存的模型越大),另一方面在一定程度上减少了计算量
- YOLOV3的darknet-53相较于YOLOV2的实时性有所下降,但是Performance有了一定的提升
- 用 tiny-darknet作为backbone可以替代darknet-53,可以实现轻量和高速的性能。
二、YOLOV3的整体网络结构
-
Convolutional是指Conv2d+BN+LeakyReLU。
-
Darknet-53网络输入尺寸为416x416,经过5次降采样之后变为13x13。
-
网络中作者进行了三次检测,分别是在32倍降采样(25)16倍降采样(24),8倍降采样(23)时进行多尺度检测。
-
Convolutional Set是是一个五次卷积过程,目的是提取特征以生成更高层次的特征。
-
生成预测结果的最后三层都只是Conv2d(只有卷积层)。
-
在网络中使用up-sample(上采样)的原因:(1)网络越深的特征表达效果越好,比如在进行16倍降采样检测,如果直接使用第四次下采样的特征来检测,这样就使用了浅层特征,这样效果一般并不好;(2)如果想使用32倍降采样后的特征,但深层特征的大小太小,因此yolo_v3使用了步长为2的up-sample(上采样),把32倍降采样得到的feature map的大小提升一倍,也就成了16倍降采样(和YOLOV2的降采样恰好相反);(3)同理8倍采样也是对16倍降采样的特征进行步长为2的上采样,这样就可以使用深层特征进行detection。
-
Anchor box的确定:在yolo v2和yolo v3中,都采用了对图像中的object采用k-means聚类,查看作者提供的yolo_v3网络配置文件,这个聚类结果应该是在416*416大小的图像下聚类得到的结果。
-
上述网络结构的输出为:
-
feature map中的每一个cell都会预测3个边界框(bounding box) ,每个bounding box每个box需要有(x, y, w, h, confidence)五个基本参数,然后还要有N个类别的概率。
-
coco数据集有80类目标,因此对于coco数据集,在网络输入为416×416时,网络的输出Y1大小为13×13×(3×(5+80)) = 13 × 13 ×255(还记得yolo v1的输出张量吗? 7x7x30,只能识别20类物体,而且每个cell只能预测2个box)
-
具体动态演示:
三、YOLOV3的loss function
在v3的论文里没有明确提所用的损失函数,确切地说,yolo系列论文里面只有yolo v1明确提了损失函数的公式,在YOLOV3里面,需要确定的是(x, y), (w, h), confidence五个基本参数以及class类别参数,根据关键信息的特点可以分为上述四类,损失函数应该由各自特点确定。最后加到一起就可以组成最终的loss_function了,也就是一个loss_function搞定端到端的训练。
具体损失函数如下:
具体函数在代码编写时再深入研究。
四、Tiny-YOLOV3网络
在Tiny-YOLOV3网络运行的过程中,我们可以根据输出结果得到相应的网络层结构,具体的输出结果如下:
由此我们可以得到Tiny-YOLOV3网络的具体结构图如下:
- Tiny-YOLOV3网络的输出向量变为了两个尺度,分别为13 × 13 ×255以及26 × 26 ×255。
- 在Tiny-YOLOV3网络中加入了池化层,通过5次的2个步长的池化来进行降采样。
- 将第五次降采样的特征进行了上采样和第四次降采样的特征进行了相加,从而实现了两个尺度的深度特征检测。
- Tiny-YOLOV3网络最快可以达到220FPS的速度。