当前位置: 首页 > article >正文

【YOLO学习】YOLOv5详解

文章目录

  • 1. 网络结构
  • 2. 结构整体描述
    • 2.1 输入端
    • 2.2 Backbone
    • 2.3 Neck
    • 2.4 Head
  • 3. 模块细节
    • 3.1 Focus模块
    • 3.2 SPPF
    • 3.3 Bounding Box损失函数
  • 4. 训练策略


1. 网络结构

 1. 目标检测的模型框架大体都是以下图示这样的结构:

在这里插入图片描述

 2. 关于 YOLOv5 的网络结构其实网上相关的讲解已经有很多了。网络结构主要由以下几部分组成:Backbone,Neck,Head。

 3. 下面是根据 yolov5l.yaml 绘制的网络整体结构,YOLOv5 针对不同大小(n, s, m, l, x)的网络整体架构都是一样的,只不过会在每个子模块中采用不同的深度和宽度,分别应对 yaml 文件中的 depth_multiplewidth_multiple 参数。

在这里插入图片描述

2. 结构整体描述

2.1 输入端

 1. 输入端主要由 Mosaic 图像增强、自适应锚框计算、自适应图片缩放组成。

 2. Mosaic 图像增强是一种目标检测中常用的数据增强方法,它可以通过组合多个不同的图像来生成新的训练图像。

 3. 在目标检测算法中,锚框是指在输入图像上定义的一些预先设定好的矩形框,用于检测不同尺度和宽高比的目标。
 传统的目标检测算法中,通常需要手动设置锚框的大小和宽高比等参数。然而,这些参数的选择往往需要经验和调试,容易出现不稳定和不准确的情况。
 为了解决这个问题,自适应锚框的方法应运而生。自适应锚框的思想是通过学习的方式自动计算出最适合输入图像的锚框参数,而不需要手动设置。这种方法可以提高目标检测的精度和鲁棒性。

 4. 在 YOLOv5 中,自适应图片缩放(Adaptive Image Scaling)是一种基于目标尺度的图像缩放方式,它可以自适应地缩放输入图像的尺寸,以适应不同尺度目标的检测。

2.2 Backbone

 1. Backbone 负责提取输入图像的特征。在 YOLOv5 中,常见的 Backbone 网络包括 CSPDarknet53 或 ResNet。这些网络都是相对轻量级的,能够在保证较高检测精度的同时,尽可能地减少计算量和内存占用。

 2. 其结构主要有 Conv 模块、C3 模块、SPPF 模块。

  • Conv 模块主要由卷积层、BN 层和激活函数组成。
  • C3 模块则将前面的特征图进行自适应聚合。
  • SPPF 模块通过全局特征与局部特征的加权融合,获取更全面的空间信息。

2.3 Neck

 Neck 部分负责对 Backbone 提取的特征进行多尺度特征融合,并把这些特征传递给预测层。主要用于增强模型的特征表达能力和感受野,进一步提升模型的检测性能。

2.4 Head

 Head 主要负责进行最终的回归预测,即利用 Backbone 骨干网络提取的特征图来检测目标的位置和类别。最后,输出端是模型预测的结果,包括每个目标的类别和其对应的边界框坐标等信息。

3. 模块细节

3.1 Focus模块

 1. Focus 结构类似于 YOLOv2中的 passthrough,是一种用于特征提取的卷积神经网络层,用于将输入特征图中的信息进行压缩和组合,从而提取出更高层次的特征表示。

在这里插入图片描述

 2. YOLOv5 的代码中有时会将 Focus 结构替换为卷积层。这是因为 Focus 结构在实现上比较复杂,需要进行通道分离、卷积、通道拼接等操作,导致计算量较大,不利于模型的训练和推理。但由于卷积层只能进行简单的特征压缩和下采样操作,可能会损失一些输入特征图中的细节信息。因此,在某些需要较高特征提取能力的任务中,采用 Focus 结构可能会更加合适。

在这里插入图片描述

3.2 SPPF

 1. SPP 结构如下图所示,是将输入并行通过多个不同大小的 MaxPool,然后做进一步融合,能在一定程度上解决目标多尺度问题。

在这里插入图片描述

 2. SPPF 结构是将输入串行通过多个 5x5 大小的 MaxPool 层,这里需要注意的是串行两个 5x5 大小的 MaxPool 层是和一个 9x9 大小的 MaxPool 层计算结果是一样的,串行三个 5x5 大小的 MaxPool 层是和一个 13x13 大小的 MaxPool 层计算结果是一样的。

在这里插入图片描述

 3. 做个简单的小实验,对比下 SPP 和 SPPF 的计算结果以及速度,代码如下(注意这里将 SPPF 中最开始和结尾处的 1x1 卷积层给去掉了,只对比含有MaxPool的部分)。运行后实验结果可以看出 SPPF 的速度更快。

import time
import torch
import torch.nn as nn


class SPP(nn.Module):
    def __init__(self):
        super().__init__()
        self.maxpool1 = nn.MaxPool2d(5, 1, padding=2)
        self.maxpool2 = nn.MaxPool2d(9, 1, padding=4)
        self.maxpool3 = nn.MaxPool2d(13, 1, padding=6)

    def forward(self, x):
        o1 = self.maxpool1(x)
        o2 = self.maxpool2(x)
        o3 = self.maxpool3(x)
        return torch.cat([x, o1, o2, o3], dim=1)


class SPPF(nn.Module):
    def __init__(self):
        super().__init__()
        self.maxpool = nn.MaxPool2d(5, 1, padding=2)

    def forward(self, x):
        o1 = self.maxpool(x)
        o2 = self.maxpool(o1)
        o3 = self.maxpool(o2)
        return torch.cat([x, o1, o2, o3], dim=1)


def main():
    input_tensor = torch.rand(8, 32, 16, 16)
    spp = SPP()
    sppf = SPPF()
    output1 = spp(input_tensor)
    output2 = sppf(input_tensor)

    print(torch.equal(output1, output2))

    t_start = time.time()
    for _ in range(100):
        spp(input_tensor)
    print(f"spp time: {time.time() - t_start}")

    t_start = time.time()
    for _ in range(100):
        sppf(input_tensor)
    print(f"sppf time: {time.time() - t_start}")


if __name__ == '__main__':
    main()

3.3 Bounding Box损失函数

 YOLOv5 采用的是 CIOU_Loss 作为 bounding box 的损失函数。

关于损失函数的详解可以参考博主前面写的 YOLOv4 部分:https://blog.csdn.net/m0_62881487/article/details/142748923

4. 训练策略

 在 YOLOv5 源码中使用到了很多训练的策略,这里简单总结几个我注意到的点:

  • Multi-scale training(0.5~1.5x):多尺度训练,假设设置输入图片的大小为 640 × 640,训练时采用尺寸是在 0.5 × 640 ∼ 1.5 × 640 之间随机取值,注意取值时取得都是 32 的整数倍(因为网络会最大下采样 32 倍)。
  • AutoAnchor(For training custom data):训练自己数据集时可以根据自己数据集里的目标进行重新聚类生成 Anchors 模板。
  • Warmup and Cosine LR scheduler:训练前先进行 Warmup 热身,然后在采用 Cosine 学习率下降策略。
  • EMA(Exponential Moving Average):可以理解为给训练的参数加了一个动量,让它更新过程更加平滑。
  • Mixed precision:混合精度训练,能够减少显存的占用并且加快训练速度,前提是 GPU 硬件支持。
  • Evolve hyper-parameters:超参数优化,建议保持默认。

http://www.kler.cn/news/361131.html

相关文章:

  • Turn-it:优化线材重构雕塑制造
  • Java全栈经典面试题剖析6】JavaSE高级 -- 文件、IO流、序列化
  • 【计算机网络】详解数据链路层数据帧Mac地址ARP协议
  • Jetpack架构组件_LiveData组件
  • 【贪心算法】(第八篇)
  • kali——strings的使用
  • 安利一款基于canvas/svg的富文本编辑器-支持在导出PDF、DOCX
  • 华为三层交换来实现不同vlan通信问题
  • Redis-04 Redis管道
  • Flink任务报错akka size oversized
  • 基于 Hugo 的静态响应式网址导航主题
  • sh与bash的区别
  • Linux 防火墙的开启、关闭、禁用命令
  • SpringMVC 中的常用注解和用法
  • 探索Web3生态系统:社区、协议与参与者的角色
  • 详解ip route
  • SpringBoot民宿预订系统:打造在线住宿新体验
  • 软件设计模式------简单工厂模式
  • vue 页面导出gif图片 img 导出gif 超简单~
  • Linux 进程终止和进程等待