深刻浅出Yolo系列之Yolov5核心基础知识完整讲解

转自:https://zhuanlan.zhihu.com/p/172121380git

大白在以前写过《深刻浅出Yolo系列之Yolov3&Yolov4核心基础知识完整讲解》github

Yolov4的相关基础知识作了比较系统的梳理,但Yolov4后不久,又出现了Yolov5,虽然做者没有放上和Yolov4的直接测试对比,但在COCO数据集的测试效果仍是很可观的。web

不少人考虑到Yolov5创新性不足,对算法是否可以进化,称得上Yolov5而议论纷纷。算法

但既然称之为Yolov5,也有不少很是不错的地方值得咱们学习。不过由于Yolov5的网络结构和Yolov3Yolov4相比,很差可视化,致使不少同窗看Yolov5看的云里雾里。网络

所以本文,大白主要对Yolov5四种网络结构的各个细节作一个深刻浅出的分析总结,和你们一些探讨学习。架构

版权申明:本文包含图片,都为大白使用PPT所绘制的,如需网络结构高清图模型权重,可点击查看下载函数

本文目录

1 Yolov5 四种网络模型
1.1 Yolov5网络结构图
1.2 网络结构可视化
1.2.1 Yolov5s网络结构
1.2.2 Yolov5m网络结构
1.2.3 Yolov5l网络结构
1.2.4 Yolov5x网络结构
2 核心基础内容
2.1 Yolov3&Yolov4网络结构图
2.2 Yolov5核心基础内容
2.2.1 输入端
2.2.2 Backbone
2.2.3 Neck
2.2.4 输出端
2.3 Yolov5四种网络结构的不一样点
2.3.1 四种结构的参数
2.3.2 Yolov5网络结构
2.3.3 Yolov5四种网络的深度
2.3.4 Yolov5四种网络的宽度
3 Yolov5相关论文及代码
4 小目标分割检测
5 后语




















1 Yolov5四种网络模型

Yolov5官方代码中,给出的目标检测网络中一共有4个版本,分别是Yolov5s、Yolov5m、Yolov5l、Yolov5x四个模型。工具

学习一个新的算法,最好在脑海中对算法网络的总体架构有一个清晰的理解。性能

但比较尴尬的是,Yolov5代码中给出的网络文件是yaml格式,和本来Yolov三、Yolov4中的cfg不一样。学习

所以没法用netron工具直接可视化的查看网络结构,形成有的同窗不知道如何去学习这样的网络。

好比下载了Yolov5的四个pt格式的权重模型:

大白在《深刻浅出Yolo系列之Yolov3&Yolov4核心基础完整讲解》中讲到,可使用netron工具打开网络模型。

但由于netron对pt格式的文件兼容性并很差,直接使用netron工具打开,会发现,根本没法显示所有网络。

所以能够采用pt->onnx->netron的折中方式,先使用Yolov5代码中models/export.py脚本将pt文件转换为onnx格式,再用netron工具打开,这样就能够看全网络的总体架构了。

若是有同窗对netron工具还不是很熟悉,这里仍是放上安装netron工具的详解,若是须要安装,能够移步大白的另外一篇文章:《网络可视化工具netron详细安装流程》

如需下载Yolov5总体的4个网络pt文件及onnx文件,也可点击连接查看下载,便于直观的学习。

1.1 Yolov5网络结构图

安装好netron工具,就能够可视化的打开Yolov5的网络结构。

这里大白也和以前讲解Yolov3&Yolov4一样的方式,绘制了Yolov5s总体的网络结构图,配合netron的可视化网络结构查看,脑海中的架构会更加清晰。

本文也会以Yolov5s的网络结构为主线,讲解与其余三个模型(Yolov5m、Yolov5l、Yolov5x)的不一样点,让你们对于Yolov5有一个深刻浅出的了解。

1.2 网络结构可视化

将四种模型pt文件的转换成对应的onnx文件后,便可使用netron工具查看。
可是,有些同窗可能不方便,使用脚本转换查看。
所以,大白也上传了每一个网络结构图的图片,也能够直接点击查看。
虽然没有netron工具更直观,可是也能够学习了解。


1.2.1 Yolov5s网络结构

Yolov5s网络是Yolov5系列中深度最小,特征图的宽度最小的网络。后面的3种都是在此基础上不断加深,不断加宽。

上图绘制出的网络结构图也是Yolov5s的结构,你们也可直接点击查看,Yolov5s的网络结构可视化的图片。

1.2.2 Yolov5m网络结构

此处也放上netron打开的Yolov5m网络结构可视图,点击便可查看,后面第二版块会详细说明不一样模型的不一样点。

1.2.3 Yolov5l网络结构

此处也放上netronx打开的Yolov5l网络结构可视图,点击便可查看

1.2.4 Yolov5x网络结构

此处也放上netronx打开的Yolov5x网络结构可视图,点击便可查看

2 核心基础内容

2.1 Yolov3&Yolov4网络结构图

2.1.1 Yolov3网络结构图

Yolov3的网络结构是比较经典的one-stage结构,分为输入端、Backbone、Neck和Prediction四个部分。

大白在以前的《深刻浅出Yolo系列之Yolov3&Yolov4核心基础知识完整讲解》中讲了不少,这里很少说,仍是放上绘制的Yolov3的网络结构图

2.1.2 Yolov4网络结构图

Yolov4在Yolov3的基础上进行了不少的创新。
好比输入端采用mosaic数据加强,
Backbone上采用了CSPDarknet5三、Mish激活函数、Dropblock等方式,
Neck中采用了SPP、FPN+PAN的结构,
输出端则采用CIOU_Loss、DIOU_nms操做。



所以Yolov4对Yolov3的各个部分都进行了不少的整合创新,关于Yolov4详细的讲解仍是能够参照大白以前写的《深刻浅出Yolo系列之Yolov3&Yolov4核心基础知识完整讲解》,写的比较详细。

2.2 Yolov5核心基础内容

Yolov5的结构和Yolov4很类似,但也有一些不一样,大白仍是按照从总体到细节的方式,对每一个板块进行讲解。

上图即Yolov5的网络结构图,能够看出,仍是分为输入端、Backbone、Neck、Prediction四个部分。

你们可能对Yolov3比较熟悉,所以大白列举它和Yolov3的一些主要的不一样点,并和Yolov4进行比较。

(1)输入端:Mosaic数据加强、自适应锚框计算、自适应图片缩放
(2)Backbone:Focus结构,CSP结构
(3)Neck:FPN+PAN结构
(4)Prediction:GIOU_Loss


下面丢上Yolov5做者的算法性能测试图:

Yolov5做者也是在COCO数据集上进行的测试,大白在以前的文章讲过,COCO数据集的小目标占比,所以最终的四种网络结构,性能上来讲各有千秋。

Yolov5s网络最小,速度最少,AP精度也最低。但若是检测的以大目标为主,追求速度,倒也是个不错的选择。

其余的三种网络,在此基础上,不断加深加宽网络,AP精度也不断提高,但速度的消耗也在不断增长。

2.2.1 输入端

(1)Mosaic数据加强

Yolov5的输入端采用了和Yolov4同样的Mosaic数据加强的方式。

Mosaic数据加强提出的做者也是来自Yolov5团队的成员,不过,随机缩放随机裁剪随机排布的方式进行拼接,对于小目标的检测效果仍是很不错的。

Mosaic数据加强的内容在以前《深刻浅出Yolo系列之Yolov3&Yolov4核心基础知识完整讲解》文章中写的很详细,详情能够查看以前的内容。

(2) 自适应锚框计算

在Yolo算法中,针对不一样的数据集,都会有初始设定长宽的锚框

在网络训练中,网络在初始锚框的基础上输出预测框,进而和真实框groundtruth进行比对,计算二者差距,再反向更新,迭代网络参数

所以初始锚框也是比较重要的一部分,好比Yolov5在Coco数据集上初始设定的锚框:

在Yolov三、Yolov4中,训练不一样的数据集时,计算初始锚框的值是经过单独的程序运行的。

但Yolov5中将此功能嵌入到代码中,每次训练时,自适应的计算不一样训练集中的最佳锚框值。

固然,若是以为计算的锚框效果不是很好,也能够在代码中将自动计算锚框功能关闭

控制的代码即train.py中上面一行代码,设置成False,每次训练时,不会自动计算。

(3)自适应图片缩放

在经常使用的目标检测算法中,不一样的图片长宽都不相同,所以经常使用的方式是将原始图片统一缩放到一个标准尺寸,再送入检测网络中。

好比Yolo算法中经常使用416*416,608*608等尺寸,好比对下面800*600的图像进行缩放。

Yolov5代码中对此进行了改进,也是Yolov5推理速度可以很快的一个不错的trick。

做者认为,在项目实际使用时,不少图片的长宽比不一样,所以缩放填充后,两端的黑边大小都不一样,而若是填充的比较多,则存在信息冗余,影响推理速度。

所以在Yolov5的代码中datasets.py的letterbox函数中进行了修改,对原始图像自适应的添加最少的黑边

图像高度上两端的黑边变少了,在推理时,计算量也会减小,即目标检测速度会获得提高。

这种方式在以前github上Yolov3中也进行了讨论:https://github.com/ultralytics/yolov3/issues/232

在讨论中,经过这种简单的改进,推理速度获得了37%的提高,能够说效果很明显。

可是有的同窗可能会有大大的问号??如何进行计算的呢?大白按照Yolov5中的思路详细的讲解一下,在datasets.py的letterbox函数中也有详细的代码。

第一步:计算缩放比例

原始缩放尺寸是416*416,都除以原始图像的尺寸后,能够获得0.52,和0.69两个缩放系数,选择小的缩放系数。

第二步:计算缩放后的尺寸

原始图片的长宽都乘以最小的缩放系数0.52,宽变成了416,而高变成了312。

第三步:计算黑边填充数值

将416-312=104,获得本来须要填充的高度。再采用numpy中np.mod取余数的方式,获得40个像素,再除以2,即获得图片高度两端须要填充的数值。

此外,须要注意的是:

a.这里大白填充的是黑色,即(0,0,0),而Yolov5中填充的是灰色,即(114,114,114),都是同样的效果。

b.训练时没有采用缩减黑边的方式,仍是采用传统填充的方式,即缩放到416*416大小。只是在测试,使用模型推理时,才采用缩减黑边的方式,提升目标检测,推理的速度。

2.2.2 Backbone

(1)Focus结构

Focus结构,在Yolov3&Yolov4中并无这个结构,其中比较关键是切片操做。

好比右图的切片示意图,4*4*3的图像切片后变成2*2*12的特征图。

以Yolov5s的结构为例,原始608*608*3的图像输入Focus结构,采用切片操做,先变成304*304*12的特征图,再通过一次32个卷积核的卷积操做,最终变成304*304*32的特征图。

须要注意的是:Yolov5s的Focus结构最后使用了32个卷积核,而其余三种结构,使用的数量有所增长,先注意下,后面会讲解到四种结构的不一样点。

(2)CSP结构

Yolov4网络结构中,借鉴了CSPNet的设计思路,在主干网络中设计了CSP结构。

Yolov5与Yolov4不一样点在于,Yolov4中只有主干网络使用了CSP结构。

而Yolov5中设计了两种CSP结构,以Yolov5s网络为例,CSP1_X结构应用于Backbone主干网络,另外一种CSP2_X结构则应用于Neck中。

这里关于CSPNet的内容,也能够查看大白以前的《深刻浅出Yolo系列之Yolov3&Yolov4核心基础完整讲解》

2.2.3 Neck

Yolov5如今的Neck和Yolov4中同样,都采用FPN+PAN的结构,但在Yolov5刚出来时,只使用了FPN结构,后面才增长了PAN结构,此外网络中其余部分也进行了调整。

所以,大白在Yolov5刚提出时,画的不少结构图,又都从新进行了调整。

这里关于FPN+PAN的结构,大白在《深刻浅出Yolo系列之Yolov3&Yolov4核心基础知识完整讲解》中,讲的不少,你们应该都有理解。

但如上面CSPNet结构中讲到,Yolov5和Yolov4的不一样点在于,

Yolov4的Neck结构中,采用的都是普通的卷积操做。而Yolov5的Neck结构中,采用借鉴CSPnet设计的CSP2结构,增强网络特征融合的能力。

2.2.4 输出端

(1)Bounding box损失函数

《深刻浅出Yolo系列之Yolov3&Yolov4核心基础知识完整讲解》中,大白详细的讲解了IOU_Loss,以及进化版的GIOU_Loss,DIOU_Loss,以及CIOU_Loss。

Yolov5中采用其中的GIOU_Loss作Bounding box的损失函数。

而Yolov4中采用CIOU_Loss做为目标Bounding box的损失。

(2)nms非极大值抑制

在目标检测的后处理过程当中,针对不少目标框的筛选,一般须要nms操做。

由于CIOU_Loss中包含影响因子v,涉及groudtruth的信息,而测试推理时,是没有groundtruth的。

因此Yolov4在DIOU_Loss的基础上采用DIOU_nms的方式,而Yolov5中采用加权nms的方式。

能够看出,采用DIOU_nms,下方中间箭头的黄色部分,本来被遮挡的摩托车也能够检出。

大白在项目中,也采用了DIOU_nms的方式,在一样的参数状况下,将nms中IOU修改为DIOU_nms。对于一些遮挡重叠的目标,确实会有一些改进。

好比下面黄色箭头部分,本来两我的重叠的部分,在参数和普通的IOU_nms一致的状况下,修改为DIOU_nms,能够将两个目标检出。

虽然大多数状态下效果差很少,但在不增长计算成本的状况下,有稍微的改进也是好的。

2.3 Yolov5四种网络结构的不一样点

Yolov5代码中的四种网络,和以前的Yolov3,Yolov4中的cfg文件不一样,都是以yaml的形式来呈现。

并且四个文件的内容基本上都是同样的,只有最上方的depth_multiplewidth_multiple两个参数不一样,不少同窗看的一脸懵逼,不知道只经过两个参数是如何控制四种结构的?

相关文章
相关标签/搜索