网站建设需要考啥证,做网站的图片一般放哪,wordpress trash,如何制作网站平台YOLOv5理论模型详解
1.Yolov5四种网络模型
Yolov5官方代码中#xff0c;给出的目标检测网络中一共有4个版本#xff0c;分别是Yolov5s、Yolov5m、Yolov5l、Yolov5x四个模型。
YOLOv5系列的四个模型#xff08;YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x#xff09;在参数量和性…YOLOv5理论模型详解
1.Yolov5四种网络模型
Yolov5官方代码中给出的目标检测网络中一共有4个版本分别是Yolov5s、Yolov5m、Yolov5l、Yolov5x四个模型。
YOLOv5系列的四个模型YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x在参数量和性能上有所不同。参数量指的是模型中需要学习的参数的数量通常表示模型的复杂度和容量。四个模型的网络结构是相同的它们都是基于YOLOv5的骨干网络但是随着模型的增大从s到x参数量也会增加从而提供更高的性能和更准确的检测结果。
学习一个新的算法最好在脑海中对算法网络的整体架构有一个清晰的理解。但Yolov5代码中给出的网络文件是yaml格式和原本Yolov3、Yolov4中的cfg不同无法用netron工具直接可视化的查看网络结构。
因此可以采用pt-onnx-netron的折中方式先使用Yolov5代码中models/export.py脚本将pt文件转换为onnx格式再用netron工具打开查看全网络的整体架构。
1.1Yolov5网络结构图
利用netron工具可以可视化的打开Yolov5的网络结构 1.2网络结构可视化
将四种模型的pt文件转换成对应的onnx文件后使用netron工具查看。
先安装ONNX模块转换pt文件 # for ONNX export pip install onnx1.7.0 -i https://pypi.tuna.tsinghua.edu.cn/simple # for CoreML export pip install coremltools4.0 -i https://pypi.tuna.tsinghua.edu.cn/simple # export at 640x640 with batch size 1 python models/export.py --weights weights/yolov5s.pt --img 640 --batch 1 然后浏览器在线使用NETRON工具打开yolov5s.onnx模型文件 Yolov5s网络是Yolov5四种模型中深度最小特征图的宽度最小的网络。后面3种都是在此基础上不断加深不断加宽。
2.Yolov5网络模型详解
2.1概述 YOLOv5在YOLOv4算法的基础上做了进一步的改进检测性能得到进一步的提升。虽然YOLOv5算法并没有与YOLOv4算法进行性能比较与分析但是YOLOv5在COCO数据集上面测试的效果还是挺不错的。虽然YOLOv5的这些改进思路看来比较简单或者创新点不足但是它们确实可以提升检测算法的性能。其实工业界往往更喜欢使用这些方法而不是利用一个超级复杂的算法来获得较高的检测精度。 下面将对YOLOv5检测算法中提出的改进思路进行详细的解说可以尝试将这些改进思路应用到其它的目标检测算法中。
主要的改进思路如下所示
输入端在模型训练阶段提出了一些改进思路主要包括Mosaic数据增强、自适应锚框计算、自适应图片缩放基准网络融合其它检测算法中的一些新思路主要包括Focus结构与CSP结构Neck网络目标检测网络在BackBone与最后的Head输出层之间往往会插入一些层Yolov5中添加了FPNPAN结构Head输出层输出层的锚框机制与YOLOv4相同主要改进的是训练时的损失函数GIOU_Loss以及预测框筛选的DIOU_nms。 Yolov5采用的基础组件
CBL-CBL模块由ConvBNLeaky_relu激活函数组成如上图中的模块1所示。Res unit-借鉴ResNet网络中的残差结构用来构建深层网络CBM是残差模块中的子模块如上图中的模块2所示。CSP1_X-借鉴CSPNet网络结构该模块由CBL模块、Res unint模块以及卷积层、Concat组成而成如上图中的模块3所示。CSP2_X-借鉴CSPNet网络结构该模块由卷积层和X个Res unint模块Concat组成而成如上图中的模块4所示。Focus-如上图中的模块5所示Focus结构首先将多个slice结果Concat起来然后将其送入CBL模块中。SPP-采用1×1、5×5、9×9和13×13的最大池化方式进行多尺度特征融合如上图中的模块6所示。
2.2网络结构演进
Yolov3网络结构是比较经典的one-stage结构分为输入端、Backbone、Neck和Prediction四个部分。 Yolov4的网络结构在Yolov3的基础上进行了很多创新比如
输入端采用mosaic数据增强Backbone上采用了CSP、Darknet53、Mish激活函数、Dropblock等方式Neck中采用了SPP、FPNPAN的结构输出端则采用CIOU_Loss、DIOU_nms操作 Yolov5的网络结构整体上还是分为输入端、Backbone、Neck、Prediction四个部分。
与Yolov3比较主要的不同点如下
输入端Mosaic数据增强、自适应锚框计算BackboneFocus结构、CSP结构NeckFPNPAN结构PredictionGIOU_Loss Yolov5作者在COCO数据集上进行了算法性能测试Yolov5s网络模型最小速度最块AP精度也最低。其他的三种规模的网络模型是在它的基础上加深和加宽网络得到的AP精度在不断提升但GPU速度的消耗也在不断增加。 2.3Yolov5输入端
输入端表示输入的图片。该网络的输入图像大小为608*608该阶段通常包含一个图像预处理阶段即将输入图像缩放到网络的输入大小并进行归一化等操作。在网络训练阶段YOLOv5使用Mosaic数据增强操作提升模型的训练速度和网络的精度并提出了一种自适应锚框计算与自适应图片缩放方法。
1Mosaic数据增强
Mosaic数据增强是采用4张图片通过随机缩放、随机裁剪、随机排布的方式进行拼接在丰富数据集的同时极大的提升网络的训练速度而且可以降低模型的内存需求这对于小目标的训练检测效果还是很不错的。 为什么要进行Mosaic数据增强
在平时项目训练时小目标的AP一般比中目标和大目标低很多。而Coco数据集中也包含大量的小目标但比较麻烦的是小目标的分布并不均匀。
大、中、小目标的定义小目标是目标框的长宽0*0-32*32之间的物体。 如上表所示COCO数据集的统计三种尺度的目标占比并不均衡。在所有的训练集图片中只有52.3% 的图片有小目标而中目标和大目标的分布相对来说更加均匀一些。
因此采用Mosaic数据增强的主要优点;
a.丰富数据集随机选用四张图片随机缩放在随机分布进行拼接大大丰富了检测数据集特别是随机缩放增加了很多小目标让网络的鲁棒性更好。
b.减少GPU这样可以直接计算4张图片的数据使得Min-batch大小并不需要很大一个GPU就可以达到比较好的效果。
2自适应锚框计算
在Yolo系列算法中针对不同的数据集都会有初始设定长宽的锚框。在网络训练中网络在初始锚框的基础上输出预测框进而与真实框groundtruth进行对比计算两者差距再反向更新迭代网络参数。因此初始锚框也是比较重要的一部分比如Yolov5在Coco数据集上初始设定的锚框 在Yolov3、Yolov4中训练不同的数据集时计算初始锚框的值是通过单独的程序运行的。
但Yolov5中将此功能嵌入到代码中每次训练时自适应的计算不同训练集中的最佳锚框值。当然如果觉得计算的锚框效果不是很好也可以在代码中将自动计算锚框功能关闭。控制的代码即train.py中的一行代码设置成False每次训练时不会自动计算。 3自适应图片缩放
在常用的目标检测算法中不同的图片长宽都不相同因此常用的方式是将原始图片统一缩放到一个标准尺寸再送入检测网络中。比如Yolo算法中常用416×416608×608等尺寸比如对下面800*600的图像进行变换。 Yolov5代码中对此进行了改进也是Yolov5推理速度能够很快的一个不错的trick(技巧)。
因为在项目实际使用时很多图片的长宽比不同所以缩放填充后两端的黑边宽度不同。如果填充的比较多则存在信息冗余影响推理速度。
Yolov5代码中datasets.py的letterbox函数进行了修改对原始图像自适应的添加最少的黑边。图像高度上两端的黑边变少了在推理时计算量也会减少及目标检测速度会得到提升。 Yolov5中datasets.py的letterbox函数采用的具体计算方法是
第一步计算缩放比例
原始缩放尺寸是416×416都除以原始图像的尺寸后可以得到0.52和0.69两个缩放系数选择小的缩放系数0.52。 第二步计算缩放后的尺寸
原始图片的长宽都乘以最小的缩放系数0.52宽变成了416而高变成了312。 第三步计算黑边填充数值 将416-312104得到原本需要填充的高度。再采用numpy中np.mod取余数的方式得到8个像素再除以2即得到图片高度两端需要填充的数值。
a.这里填充的是黑色即000而Yolov5中填充的是灰色即114,114,114都是一样的效果。b.训练时没有采用缩减黑边的方式还是采用传统填充的方式即缩放到416×416大小。只是在测试使用模型推理时才采用缩减黑边的方式提高目标检测推理的速度。 c.为什么np.mod函数的后面用32因为Yolov5的网络经过5次下采样而2的5次方等于32。所以至少要去掉32的倍数再进行取余。
2.4 Backbone
骨干网络通常是一些性能优异的分类器中的网络该模块用来提取一些通用的特征表示。YOLOv5中不仅使用了CSPDarknet53结构而且使用了Focus结构作为骨干网络。
(1) Focus结构 Focus结构在Yolov3Yolov4中并没有这个结构其中比较关键的是切片操作。右图的切片示意图4*4*3的图像切片后变成2*2*12的特征图。作用是减少浮点计算量增加计算速度。
以Yolov5s的结构为例原始608*608*3的图像输入Focus结构采用切片操作先变成304*304*12的特征图再经过一次32个卷积核的卷积操作最终变成304*304*32的特征图。
Yolov5s的Focus结构最后使用了32个卷积核而其他三种结构使用的数量有所增加。
(2) CSP结构
Cross Stage Partial Network 跨阶段局部网络
YOLOv4网络结构中借鉴了CSPNet的设计思路在主干网络中设计了CSP结构。 Yolov5与Yolov4不同点在于Yolov4中只有主干网络使用了CSP结构而Yolov5中设计了两种CSP结构以Yolov5s网络为例以CSP1_X结构应用于Backbone骨干网络另一种CSP2_X结构则应用在Neck中。 YOLOv5s的CSP结构是将原输入分成两个分支分别进行卷积操作使得通道数减半然后一个分支进行Bottleneck * N操作然后concat两个分支使得BottlenneckCSP的输入与输出是一样的大小这样是为了让模型学习到更多的特征。
CSP1_X结构
BottleneckCSP的网络结构图如下图所示
其中CBS为ConvBNSiLu后期的图中CBL(convBNLeaky relu)需要改成CBS(convBNSiLU)。其中Resunit是x个残差组件。
将输入分为两个分支一个分支先通过CBS再经过多个残差结构Bottleneck * N再进行一次卷积另一个分支直接进行卷积然后两个分支进行concat再经过BN正态分布再来一次激活之前的版本是Leaky后面是SiLU最后进行一个CBS。 C3的网络结构图如下图所示 CSP1_X应用于backbone主干网络部分backbone是较深的网络增加残差结构可以增加层与层之间反向传播的梯度值避免因为加深而带来的梯度消失从而可以提取到更细粒度的特征并且不用担心网络退化。
CSP2_X结构
BottleneckCSP的网络结构图如图所示 C3的网络结构图如图所示 CSP2_X相对于CSP1_X来说不一样的地方只有CSP2_X将Resunit换成了2 * X个CBS主要应用在Neck网络 网络没那么深。同样的之前的版本是Leaky后期是SiLU (3) SPP组件
空间金字塔池化能将任意大小的特征图转换成固定大小的特征向量。
在卷积神经网络中不固定输入尺寸的方法有下面三种:
对输入进行resize操作让他们统统变成你设计的层的输入规格那样。但是这样过于暴力直接可能会丢失很多信息或者多出很多不该有的信息图片变形等影响最终的结果。替换网络中的全连接层对最后的卷积层使用global average pooling全局平均池化只和通道数有关而与特征图大小没有关系最后一个就是SPP结构 在yolov5中SPP作用是实现局部特征和全局特征的featherMap级别的融合。 在YOLOv5中SPP的结构图如下图所示 分别对1 * 1分块5*5分块9*9分块和13 *13分块的子图里分别取每一个框内的max值这一步就是作最大池化这样最后提取出来的特征值一共有1 * 1 5 * 5 9 * 9 107个。得出的特征再concat在一起。 2.5 Neck
Neck网络通常位于基准网络和头部网络的中间位置利用它可以进一步提升特征的多样性及鲁棒性。虽然YOLOv5同样用到了SPP模块、FPNPAN模块但是实现的细节有些不同。
Yolov5的Neck和Yolov4中一样都采用FPNPAN的结构但在Yolov5刚出来时只使用了FPN结构后面才增加了PAN结构此外网络中其他部分也进行了调整。 2.6 Head输出端
Head用来完成目标检测结果的输出。针对不同的检测算法输出端的分支个数不尽相同通常包含一个分类分支和一个回归分支。YOLOv4利用GIOU_Loss来代替Smooth L1 Loss函数从而进一步提升算法的检测精度。
1Bounding box损失函数
目标检测任务的损失函数一般由Classificition Loss分类损失函数和Bounding Box Regeression Loss回归损失函数两部分构成。 Bounding Box Regeression的Loss近些年的发展过程是Smooth L1 Loss- IoU Loss2016- GIoU Loss2019- DIoU Loss2020-CIoU Loss2020
a. IOU_Loss 根据IOU计算的loss很简单主要是交集/并集但也存在两个问题。
问题1即状态1的情况当预测框和目标框不相交时IOU0无法反应两个框距离的远近此时损失函数不可导IOU_Loss无法优化两个框不相交的情况。问题2即状态2和状态3的情况当两个预测框大小相同两个IOU也相同IOU_Loss无法区分两者相交情况的不同。 因此2019年出现了GIOU_Loss来进行改进。
b. GIOU_loss 上图GIOU_Loss中增加了相交尺度的衡量方式缓解了单纯IOU_Loss时的尴尬。
但还存在一种不足 问题状态1、2、3都是预测框在目标框内部且预测框大小一致的情况这时预测框和目标框的差集都是相同的因此这三种状态的GIOU值也都是相同的这时GIOU退化成了IOU无法区分相对位置关系。基于这个问题2020年的AAAI又提出了DIOU_Loss。
c. DIOU _loss
好的目标框回归函数应该考虑三个重要几何因素重叠面积、中心点距离长宽比。 针对IOU和GIOU存在的问题作者从两个方面进行考虑
一如何最小化预测框和目标框之间的归一化距离二如何在预测框和目标框重叠时回归的更准确 针对第一个问题提出了DIOU_LossDistance_IOU_Loss DIOU_Loss考虑了重叠面积和中心点距离当目标框包裹预测框的时候直接度量2个框的距离因此DIOU_Loss收敛的更快。但就像前面好的目标框回归函数所说的这时并没有考虑到长宽比。 问题比如上面三种状态目标框包裹预测框但预测框的中心点的位置都是一样的因此按照DIOU_Loss的计算公式三者的值都是相同的。
d. CIOU_loss
CIOU_Loss是在DIOU_Loss基础上还增加了一个影响因子将预测框和目标框的长宽比都考虑了进去。 综合来看各个Loss函数的不同点
IOU_Loss主要考虑检测框和目标框重叠面积。GIOU_Loss在IOU的基础上解决边界框不重合时的问题。DIOU_Loss在IOU和GIOU的基础上考虑边界框中心点距离的信息。CIOU_Loss在DIOU的基础上考虑边界框宽高比的尺度信息。
Yolov5中采用其中的CIOU_Loss做Bounding box的损失函数使预测框回归的速度和精度更高一些。
2NMS非极大值抑制
在目标检测的后处理过程中针对很多目标框的筛选通常需要NMS操作。
Yolov4在DIOU_loss的基础上采用DIOU_nms的方式而Yolov5中仍然采用加权nms的方式。可以看出采用DIOU_nms下方中间箭头的黄色部分原本被遮挡的摩托车也可以检出。 采用了DIOU_nms的方式在同样的参数情况下将nms中IOU修改成DIOU_nms。对于一些遮挡重叠的目标确实会有一些改进。在参数和普通的IOU_nms一致的情况下修改成DIOU_nms可以将两个目标检出。虽然大多数状态下效果差不多但在不增加计算成本的情况下有稍微的改进也是好的。
3. Yolov5四种网络结构的不同点
Yolov5的四种网络结构都是以yaml文件的形式来呈现的。四个文件的内容基本上都是一样的只有最上方的depth_mutiple和width_mutiple两个参数不同。
如何通过两个参数控制四种网络结构
3.1四种网络结构的参数
Yolov5的四种网络结构有区别的两个参数 通过上面的两个参数来进行控制网络的深度和宽度。其中depth_multiple控制网络的深度width_multiple控制网络的宽度。 3.2 Yolov5网络结构
四种结构的yaml文件中下方的网络架构代码都是一样的。将其中的Backbone部分提取出来讲解如何控制网络的宽度和深度Head部分也是同样的原理。 在对网络结构进行解析时yolo.py中下方的这一行代码将四种结构的depth_multiplewidth_multiple提取出赋值给gdgw。后面主要对这gdgw这两个参数进行讲解。 3.3 Yolov5四种网络的深度 1不同网络的深度
上图中是Yolov5的两种CSP结构CSP1结构主要应用于Backbone中CSP2结构主要应用于Neck中。四种网络结构的CSP结构的深度都是不同的。
a. Yolov5s的CSP1结构中使用了1个残差组件因此是CSP1_1。Yolov5m增加了网络的深度增加了CSP结构中使用的残差组件。
b. CSP2结构中的残差组件个数在四种网络结构中不断加深在不断增加网络特征提取和特征融合的能力。
2控制深度的代码
控制四种网络结构的核心代码是yolo.py中下面的代码存在两个变量n和gd。将n和gd带入计算看每种网络的变化结果。 3验证控制深度的有效性
选择最小的yolov5s.yaml和中间的yolov5l.yaml两个网络结构将gd(height_multiple)系数带入看是否正确。 a. yolov5s.yaml
其中depth_multiple0.33即gd0.33而n则由上面红色框中的信息获得。 以上面网络框图中的第一个CSP1为例即上面的第一个红色框。n等于第二个数值3。 而gd0.33带入2中的计算代码结果n1。因此第一个CSP1结构内只有1个残差组件即CSP1_1。 第二个CSP1结构中n等于第二个数值9而gd0.33带入2中计算结果n3因此第二个CSP1结构中有3个残差组件即CSP1_3。 第三个CSP1结构也是同理。
b. yolov5l.xml 其中depth_multiple1即gd1 和上面的计算方式相同第一个CSP1结构中n3带入代码中结果n3因此为CSP1_3。 下面第二个CSP1结构和第三个CSP1结构都是同样的原理。
3.4 Yolov5四种网络的宽度 1不同网络的宽度
如上图所示四种Yolov5结构在不同阶段的卷积核的数量都是不一样的。因此也直接影响卷积后特征图的第三维度即厚度这里表示为网络的宽度。
a. 以Yolov5s结构为例第一个Focus结构中最后卷积操作时卷积核的数量是32个因此经过Focus结构特征图的大小变成34*304*32。Yolov5m的Focus结构中的卷积操作使用了48个卷积核因此Focus结构后的特征图变成304×304×48。Yolov5lYolov5x也是同样的原理。
b. 第二个卷积操作时Yolov5s使用了64个卷积核因此得到的特征图是152×152×64。而Yolov5m使用96个特征图因此得到的特征图是152×152×96。Yolov5lYolov5x也是同理。
四种不同结构的卷积核的数量不同这也直接影响网络中比如CSP1结构CSP2等结构以及各个普通卷积卷积操作时的卷积核数量也同步在调整影响整体网络的计算量。
当然卷积核的数量越多特征图的厚度即宽度越宽网络提取特征的学习能力也越强。
2控制宽度的代码
在Yolov5的代码中控制宽度的核心代码是yolo.py文件里面的这一行 这里调用的函数make_divisible的功能是 3验证控制宽度的有效性
选择Yolov5s和Yolov5l两个网络结构将width_multiple系数带入看是否正确。 a. yolov5s.yaml
其中width_multiple0.5即gw0.5 以第一个卷积下采样为例即Focus结构中下面的卷积操作。按照上面Backbone的信息在Focus中标准的c264而gw0.5代入2中的计算公式最后的结果32。即Yolov5s的Focus结构中卷积下采样操作的卷积核数量为32个。 计算后面的第二个卷积下采样操作标准c2的值128gw0.5代入2中公式最后的结果64也是正确的。
b. yolov5l.yaml
其中width_multiple1即gw1而标准的c264代入上面2的计算公式中可以得到Yolov5l的Focus结构中卷积下采样操作的卷积核的数量为64个而第二个卷积下采样的卷积核数量是128个。 另外的三个卷积下采样操作以及Yolov5mYolov5x结构也是同样的计算方式。
4. 在小目标分割检测上的研究
目标检测发展很快但对于小目标的检测还是有一定的瓶颈特别是大分辨率图像的小目标检测。比如7920*2160甚至是16000*16000像素的图像。 图像的分辨率很大但又有很多小的目标需要检测。如果直接输入检测网络比如Yolov3检出效果并不好。
4.1Yolo检测效果不好的主要原因
1小目标尺寸
以网络的输入608×608为例Yolov3、Yolov4Yolov5中下采样都使用了5次因此最后的特征图大小是19×1938×3876×76。三个特征图中最大的76×76负责检测小目标而对应到608×608上每格特征图的感受野是608/768×8大小。 将608×608对应到7680×2160上以最长边7680为例7680/608×8101。即如果原始图像中目标的宽或高小于101像素网络很难学习到目标的特征信息。这里忽略多尺度训练的因素及增加网络检测分支的情况
2高分辨率
在很多遥感图像中长宽比的分辨率比7680*2160更大。如果直接输入原图检测很多小目标都无法检测出。
3显卡爆炸
很多图像分辨率很大如果简单的进行下采样下采样的倍数太大容易丢失数据信息。但是倍数太小网络前向传播需要在内存中保存大量的特征图极大耗尽GPU资源很容易发生显卡爆炸显存爆炸无法正常的训练及推理。
可以借鉴2018年YOLT算法的方式改变一下思维对大分辨率图片先进行分割变成一张张小图再进行检测。需要注意的是
为了避免两张小图之间一些目标正好被分割截断所以两个小图之间需要设置overlap重叠区域比如分割的小图是960×960像素大小则overlap可以设置为960×20%192像素。 每个小图检测完成后再将所有的框放到大图上对大图整体做一次nms操作将重叠区域的很多重复框去除。这样操作可以将很多小目标检出比如16000×16000像素的遥感图像。
说明这里关于小图检测后放到大图上的方法采用的方式其实按照在大图上裁剪的位置直接回归到大图即可。
国内还有一个10亿像素图像目标检测的比赛也是用的这样的方式有相应的讲解视频。 无人机视角下也有很多小的目标。这里也进行了测试效果还是不错的。比如下图是将原始大图-416×416大小直接使用目标检测网络输出的效果 可以看到中间黄色框区域很多汽车检测漏掉。再使用分割的方式将大图先分割成小图再对每个小图检测可以看出中间区域很多的汽车都被检测出来 这样处理的方式既有优点也有缺点
优点
1准确性
分割后的小图再输入目标检测网络中对于最小目标像素的下限会大大降低。比如分割成608×608大小送入输入图像大小608×608的网络中按照上面的计算方式原始图片上长宽大于8个像素的小目标都可以学习到特征。
2检测方式
在大分辨率图像比如遥感图像或者无人机图像如果无需考虑实时性的检测且对小目标检测也有需求的项目可以尝试此种方式。
缺点
1 增加计算量
比如原本7680×2160的图像如果使用直接大图检测的方式一次即可检测完。但采用分割的方式切分成N张608×608大小的图像再进行N次检测会大大增加检测时间。 借鉴Yolov5的四种网络方式我们可以采用尽量轻的网络比如Yolov5s网络结构或者更轻的网络。当然Yolov4和Yolov5的网络各有优势我们也可以借鉴Yolov5的设计方式对Yolov4进行轻量化改造或者进行剪枝。在实际测试中Yolov4的准确性有不错的优势但Yolov5的多种网络结构使用起来更加灵活我们可以根据不同的项目需求取长补短发挥不同检测网络的优势。