• 【无标题】


    Yolov5

    一. Yolov5 现状

    Yolov5 gitlab代码已经更新到V6.0,不同版本的模型结构都有所差异。比如Conv 模块各版本差异示例如下

    yolov5版本Conv模块激活函数
    1.0LeakyRelu
    2.0LeakyRelu
    3.0LeakyRelu
    3.1hswish
    4.0SiLU
    5.0SiLU
    6.0SiLU

    Yolov5每个版本具有4个开源模型,具体包括:YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x四种,YOLOv5s模型最小,其它的模型都在此基础上对网络进行加深与加宽。

    二. Yolov5 模型结构

    (一)Yolov5 2.0

    输出:255=(nc+5)*3

    在这里插入图片描述

    在这里插入图片描述

    (二)Yolov5 6.0

    在这里插入图片描述

    在这里插入图片描述

    输入端

    在模型训练阶段,做了一些改进操作,主要包括Mosaic数据增强、自适应锚框计算、自适应图片缩放

    BackBone基准网络

    融合其它检测算法中的一些新思路,主要包括:Focus结构,CSP结构;

    Head网络

    目标检测网络在BackBone与最后的Head输出层之间往往会插入一些层,Yolov5中添加了FPN+PAN结构

    输出层的锚框机制与YOLOv3相同,主要改进的是训练时的损失函数GIOU_Loss

    三. Yolov5 模型推理流程

    在这里插入图片描述

    四. Yolov5 输入端

    (一)Mosaic数据增强

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

    (二)自适应锚框计算

    在Yolov3、Yolov4中,训练不同的数据集时,计算初始锚框的值是通过单独的程序运行的。

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

    当然,如果觉得计算的锚框效果不是很好,也可以在代码中将自动计算锚框功能关闭

    (三)自适应图片缩放

    在项目实际使用时,很多图片的长宽比不同,因此缩放填充后,两端的黑边大小都不同,而如果填充的比较多,则存在信息冗余,影响推理速度。

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

    五. Yolov5 BackBone

    (一)Focus结构

    2.0版本

    比如右图的切片示意图。

    以Yolov5s的结构为例,原始608×608×3的图像输入Focus结构,采用切片操作,先变成304×304×12的特征图,再经过一次32个卷积核的卷积操作,最终变成304×304×32的特征图。
    在这里插入图片描述
    在这里插入图片描述

    (二)CSP结构

    (三)SPP结构 /SPPF结构

    2.0版本SPP,输出尺寸和输出尺寸保持一致

    6.0版本SPPF

    六. Yolov5 Head

    (一) FPN+PAN的结构

    (二)损失函数

    GIOU

    (三)nms非极大值抑制改进

    加权nms的方式

    NMS算法是略显粗暴,因为NMS直接将删除所有IoU大于阈值的框。soft-NMS吸取了NMS的教训,在算法执行过程中不是简单的对IoU大于阈值的检测框删除,而是降低得分。算法流程同NMS相同,但是对原置信度得分使用函数运算,目标是降低置信度得分。

    (四) 激活函数

    silu(x)= x * sigmoid(x)

    在这里插入图片描述

    七 . Yolov5 V2.0模型结构代码

    #yolo5s.yaml V2.0
    # parameters
    nc: 80  # number of classes 从1开始算起
    depth_multiple: 0.33  # model depth multiple 模型深度
    width_multiple: 0.50  # layer channel multiple  卷积核的个数,Bottleneck层使用
    
    # anchors
    anchors:
      - [10,13, 16,30, 33,23]  # P3/8 
      - [30,61, 62,45, 59,119]  # P4/16
      - [116,90, 156,198, 373,326]  # P5/32
    
    # YOLOv5 backbone
    backbone:
      # [from, number, module, args]
      [[-1, 1, Focus, [64, 3]],  # 0-P1/2
       [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4,128个卷积核个数。根据 [128, 3, 2] 解析得到[32, 64, 3, 2] ,32是输入,64是输出(128*0.5=64),3表示3×3的卷积核,2表示步长为2。
       [-1, 3, BottleneckCSP, [128]],
       [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8[128, 3, 2] 这是固定的,
       [-1, 9, BottleneckCSP, [256]],
       [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
       [-1, 9, BottleneckCSP, [512]],
       [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
       [-1, 1, SPP, [1024, [5, 9, 13]]],
       [-1, 3, BottleneckCSP, [1024, False]],  # 9
      ]
    
    # YOLOv5 head
    head:
      [[-1, 1, Conv, [512, 1, 1]],
       [-1, 1, nn.Upsample, [None, 2, 'nearest']],
       [[-1, 6], 1, Concat, [1]],  # cat backbone P4
       [-1, 3, BottleneckCSP, [512, False]],  # 13
    
       [-1, 1, Conv, [256, 1, 1]],
       [-1, 1, nn.Upsample, [None, 2, 'nearest']],
       [[-1, 4], 1, Concat, [1]],  # cat backbone P3 
       [-1, 3, BottleneckCSP, [256, False]],  # 17 false表示无残差结构
    
       [-1, 1, Conv, [256, 3, 2]],
       [[-1, 14], 1, Concat, [1]],  # cat head P4
       [-1, 3, BottleneckCSP, [512, False]],  # 20
    
       [-1, 1, Conv, [512, 3, 2]],
       [[-1, 10], 1, Concat, [1]],  # cat head P5
       [-1, 3, BottleneckCSP, [1024, False]],  # 23
    
       [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
      ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
  • 相关阅读:
    【数据结构与算法】之深入解析“对角线遍历II”的求解思路与算法示例
    python 3.11中安装sympy(符号工具包)
    密码输入检测(100%用例)D卷(Java&&Python&&C++&&Node.js&&C语言)
    设计模式-14-迭代器模式
    StarRocks 面试题及参考答案详解(万字详解)
    水管安装过滤器笔记
    JavaScript 17 JavaScript 事件
    网络——IPV4地址(一)
    Android调用相机与相册的方法
    如何将Python程序打包并保护源代码
  • 原文地址:https://blog.csdn.net/weixin_41021342/article/details/126163380