YOLO --- YOLOv5模型以及项目详解

YOLO — YOLOv5模型以及项目详解


文章目录

  • YOLO --- YOLOv5模型以及项目详解
  • 一,开源地址
  • 二,改进点
    • Focus 模块
  • 三,网络结构
    • 3.1 CSP1_X 与 CSP2_X
    • 3.2 自适应Anchor的计算
    • 3.3 激活函数
      • 3.3.1 SiLU
      • 3.3.2 Swish
    • 3.4 Bottleneck
    • 3.5 C3
      • 3.5.1 BottleneckCSP
      • 3.5.2 C3
    • 3.6 SPPF
  • 四,开源项目
    • 4.1 项目构建
    • 4.2 项目流程
      • 4.2.1 下载源码
      • 4.2.2 新建环境
      • 4.2.3 安装包
      • 4.2.4 下载推理文件
      • 4.2.5 常用命令
      • 4.2.6 数据集
      • 4.2.7 模型训练
      • 4.2.8 恢复训练
      • 4.2.9 导出onnx
      • 4.2.10 推理
      • 4.2.11 onnx推理
    • 4.3 模型应用
      • 4.3.1 实例分割
      • 4.3.2 图像分类
  • 五,优缺点


一,开源地址

  • YOLOV5并没有学术论文,是一个开源项目,是 Ultralytics 公司于 2020 年6月9 日发布的

  • 项目可以在 github 搜到:https://github.com/ultralytics/yolov5

二,改进点

  • 主干网络是修改后的 CSPDarknet53,后面跟了 SPPF 模块
  • 网络最开始增加 Focus 结构
  • 颈部网络采用 PANet、FPN
  • 激活函数换成了 SiLU、Swish
  • 采用 CloU 损失

Focus 模块

  • YOLOv5 刚推出时,为了提升模型效率,采用了 Focus 模块 作为网络的初始特征提取层,传统卷积下采样会丢失部分空间信息,Focus 模块旨在在不丢失信息的前提下进行高效下采样

  • **核心目标:**将高分辨率图像的空间信息通过切片操作转换为通道信息,从而实现高效、无信息损失的下采样

  • Focus 模块是一种用于特征提取的卷积神经网络层,用于将输入特征图中的信息进行压缩和组合,从而提取出更高层次的特征表示,它被用作网络中的第一个卷积层,用于对输入特征图进行下采样,以减少计算量和参数量

  • Focus 层在 YOLOv5 中是图片进入主干网络前,对图片进行切片操作,原理与 Yolov2 的 passthrough 层类似,采用切片操作把高分辨率的图片(特征图)拆分成多个低分辨率的图片(特征图),即隔列采样+拼接

  • 具体操作是在一张图片中每隔一个像素拿到一个值,类似于邻近下采样,这样就拿到了 4 张图片,4 张图片互补,但是没有信息丢失,这样一来,将空间信息就集中到了通道空间,输入通道扩充了 4 倍,即拼接起来的图片相对于原先的 RGB 3 通道模式变成了 12 个通道,最后将得到的新图片再经过卷积操作,最终得到了没有信息丢失情况下的二倍下采样特征图

  • 案例:假设输入一张图像大小为 640x640x3

    • 第一步:640 x 640 x 3的图像输入Focus结构,采用切片操作

    • 第二步:然后进行一个连接(concat),变成 320 x 320 x 12 的特征图

    • 第三步:经过一次 32 个卷积核的卷积操作,最终输出 320 x 320 x 32 的特征图

  • 在 YOLOv5 刚提出来的时候,有 Focus 结构,从 YOLOv5 第六版开始, 就舍弃了这个结构,改用 k=6×6,stride=2 的常规卷积

三,网络结构

请添加图片描述

3.1 CSP1_X 与 CSP2_X

模块名称CSP1_XCSP2_X
定义带 shortcut(残差连接)的 CSP 模块不带 shortcut 的 CSP 模块
结构特点内部包含带有 shortcut 的 Bottleneck 结构内部没有 shortcut 连接,仅通过卷积操作进行特征提取
应用场景主要用于 backbone 部分,如 CSPDarknet53,增强特征提取能力主要用于 neck 部分,如 PANet(Path Aggregation Network),进行特征聚合
X 的含义表示 bottleneck 的数量表示 bottleneck 或其他卷积模块的数量

3.2 自适应Anchor的计算

  • 在 YOLOv3、YOLOv4 中,训练不同的数据集时,计算初始 Anchor 的值是通过单独的程序运行的。但 YOLOv5 中将此功能嵌入到代码中,每次训练时会自适应的计算不同训练集中的最佳 Anchor 值
  • 实现方式:
    • 在训练开始前,YOLOv5 会自动加载训练集中的标注框
    • 使用 K-Means 聚类算法计算 Anchor
    • 将结果作为初始 Anchor 值用于模型初始化

3.3 激活函数

激活函数:使用了 SiLU 激活函数、Swish 激活函数两种激活函数

3.3.1 SiLU

  • YOLOv5 的 Backbone 和 Neck 模块和 YOLOv4 中大致一样,都采用 CSPDarkNet 和 FPN+PAN 的结构,但是网络中其他部分进行了调整,其中 YOLOv5 使用的激活函数是 SiLU
  • SiLU(x)=x⋅σ(x)SiLU(x) = x·\sigma(x)SiLU(x)=xσ(x),具备无上界有下届、平滑、非单调的特性
    请添加图片描述

3.3.2 Swish

Swish 激活函数是一个近似于 SiLU 函数的非线性激活函数
请添加图片描述

3.4 Bottleneck

Bottleneck 是用于减少参数和计算量的结构,其设计灵感来自于ResNet,结构如下:

  • 1x1卷积:用于减少特征图的通道数
  • 3x3卷积:用于提取特征,后接一个 Batch Normalization 层和 ReLU 激活函数
  • 1x1卷积:用于恢复特征图的通道数,后接一个BN层
  • 跳跃连接(Shortcut):将输入直接加到输出上,以形成残差连接请添加图片描述

3.5 C3

  • YOLOv5 中的 C3 模块在 CSP上进行了优化,非常相似但略有不同:
  • YOLOv5 一共使用过两种 CSP 模块
    • v4.0 版本之前的 BottleneckCSP,用的 LeakyReLU 作为激活函数
    • v4.0 版本之后的 C3,用的 SiLU 作为激活函数

3.5.1 BottleneckCSP

  • 结构特点:
    • 包含多个带 shortcut 的 Bottleneck
    • 输入通道被划分,一部分直接传递,一部分经过 Bottleneck 块
  • 激活函数:LeakyReLU
  • 用途:主要用于早期 YOLOv5 的 backbone
    请添加图片描述

3.5.2 C3

  • 结构特点:
    • 不再使用 shortcut(即 Bottleneck 不带残差连接)
    • 更加简洁,更适合部署
  • 激活函数:SiLU
  • 用途:广泛用于 backbone 和 neck(如 PANet)
    请添加图片描述

3.6 SPPF

  • 将卷积核大小变成相同,然后将并行变成了串行+并行,2个K5池化=1个K9池化,3个K5池化=1个K13池化,也就是结果相同的基础上,速度更快,计算量更小
  • 对于连续堆叠 n 层,每层使用大小为 k 的核的操作(例如卷积或池化),其等效感受野大小可以通过以下公式计算:K等效=1+n(k−1)K_{等效}=1+n(k−1)K等效=1+n(k1)
层数 n卷积核大小 k等效感受野
151+1×(5−1)=5
251+2×(5−1)=9
351+3×(5−1)=13

请添加图片描述

四,开源项目

4.1 项目构建

使用github或者gitee

  • GitHub 官方仓库
    https://github.com/ultralytics/yolov5

  • Gitee 镜像地址
    https://gitee.com/mirrors/YOLOv5

4.2 项目流程

4.2.1 下载源码

第一步:下载 yolov5 源码,前面的步骤已经完成

4.2.2 新建环境

第二步:新建环境,见
https://blog.csdn.net/m0_73338216/article/details/146123256

4.2.3 安装包

第三步:在 Python>=3.8.0 环境中安装 requirements.txt,且要求 PyTorch>=1.8,命令pip install -r requirements.txt,可以加上镜像地址提高下载速度,命令:pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

请添加图片描述

  • 详细安装的内容信息可以打开 yolov5 源码中的 requirements.txt 文件查看
  • **注意:**因为 pytorch 框架对应的内容,我们事先已经通过命令的方式安装好了,所以在安装 requirements.txt 内容之前,我们需要把安装 pytorch 框架相关的内容注释掉,如下:
    请添加图片描述

4.2.4 下载推理文件

第四步:下载 yolov5 推理模型,地址https://github.com/ultralytics/yolov5/tree/master/models

  • YOLOv5的一些主要模型变体:
    1. YOLOv5n:
      • 这是最小的变体,适用于嵌入式设备或资源受限的环境
      • 牺牲了一定的准确性以换取更快的速度
    2. YOLOv5s:选择
      • 较小的模型,适合在边缘设备上使用
      • 相比于更大的模型,它提供了更好的速度,但在精度上有所降低
    3. YOLOv5m:
      • 中等大小的模型,平衡了速度和精度
      • 适用于大多数常规硬件
    4. YOLOv5l:
      • 较大的模型,提供了更高的检测精度
      • 在高端硬件上可以运行良好,但速度较慢
    5. YOLOv5x:
      • 最大的模型,具有最高的精度
      • 需要高性能的硬件来保证实时处理速度
  • 各个模型测试速度参数:请添加图片描述
    下载好模型后将其复制在主目录下

4.2.5 常用命令

第五步:执行命令python detect.py --weights <weights_path> --source <source>,完成推理,结果默认保存到 runs/detect

参数作用示例与说明
detect.pyYOLOv5 提供的目标检测脚本运行检测的主入口
--weights <weights_path>指定模型权重文件路径--weights yolov5s.pt 使用 YOLOv5-s 预训练权重
--source <source>指定输入源,支持多种形式见下表,按类型分列
输入源类型示例说明
默认摄像头0使用电脑默认摄像头(内置或外接)
单张图像img.jpg直接指定一张图片
单个视频vid.mp4直接指定一个视频文件
屏幕截图screen实时截取屏幕作为输入(部分版本需验证支持)
目录path/目录下所有支持的图像/视频文件均作为输入
文本列表list.txt每行一个图像/视频路径
流媒体列表list.streams每行一个流媒体链接
Glob 模式'path/*.jpg'匹配目录下所有 .jpg 图片
YouTube 视频'https://youtu.be/LNwODJXcvt4'直接从 YouTube URL 读取视频流
网络流'rtsp://example.com/media.mp4'通过 RTSP / RTMP / HTTP 协议读取实时或点播视频

4.2.6 数据集

第六步:数据集标注

  • 模型训练的数据、验证的数据都是由专门的人标注制作的,常用的标注工具labelImg、labelme。 这里介绍 labelImg 的使用
    - 新建虚拟环境,略

  • 激活环境,输入命令pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple安装 labelimg 库
    在激活环境下,执行命令labelimg打开 labelimg请添加图片描述
    标注完成后的数据集,图示:

  • images:存放需要被标注的图片信息

  • labels:存放标注的图片的位置、类型信息
    在这里插入图片描述

4.2.7 模型训练

执行以下命令训练模型,结果默认保存到 runs/train

python train.py --data .\data\coco.yaml --img 640 --epochs 25 --weights .\yolov5s.pt --cfg .\models\yolov5s.yaml --batch-size 2 --device 0
参数说明示例/取值解释
train.py主训练脚本:负责加载数据、构建模型、设置优化器、定义损失函数并执行训练循环。直接运行 python train.py …
--data数据集配置文件路径(YAML),内含训练/验证集路径、类别数等信息。--data coco.yaml 或自定义 --data mydata.yaml
--img输入图像尺寸(正方形边长,像素)。--img 640 表示 640×640
--epochs训练总轮数(完整遍历数据集的次数)。--epochs 25 表示训练 25 个 epoch
--weights初始权重文件路径;空串 '' 表示从零开始训练。--weights ./yolov5s.pt 加载预训练权重
--cfg模型架构配置文件路径(YAML)。--cfg yolov5s.yaml 使用 YOLOv5-small 结构
--batch-size每轮迭代使用的样本数量;越大越稳定,但显存占用高。--batch-size 2
--device训练设备选择。
0:第 0 块 GPU
cpu:强制使用 CPU
-1:自动选择可用 GPU
--device 0
  • 训练结果,这个文件夹中包含了很多文件,重要内容如下:

  • weights 文件夹下,有两个后缀名为.pt的文件

    • best.pt:表示在整个训练过程中性能最佳的模型权重,用于推理
    • last.pt:表示训练结束时的最后一个模型权重,用于设置下次训练基于这个基础上继续训练,但是需要修改很多参数
      在这里插入图片描述

4.2.8 恢复训练

如果训练过程中意外停止,在训练指令后面加上 --resume 参数可以恢复训练,并且不需要同时指定 --weights 参数。--resume 会自动加载最近一次保存的检查点(包括模型权重、优化器状态等)

python train.py --weights runs/train/exp/weights/last.pt --resume	

4.2.9 导出onnx

python export.py --weights yolov5s.pt --img 640 --batch 1 --device 0 --include onnx

4.2.10 推理

使用 detect.run 进行推理:

from yolov5 import detect
detect.run(weights='yolov5s.onnx',  # 权重文件路径source='data/images',  # 输入源路径img_size=640,  # 输入图像尺寸conf_thres=0.25,  # 置信度阈值iou_thres=0.45,  # IoU阈值max_det=1000,  # 最大检测数量device='0',  # 设备view_img=False,  # 显示检测结果save_txt=False,  # 保存检测结果为txt文件save_conf=False,  # 保存置信度到txt文件save_crop=False,  # 裁剪并保存检测到的对象nosave=False,  # 保存图像/视频classes=None,  # 检测所有类agnostic_nms=False,  # 类无关的非极大值抑制augment=False,  # 推理增强visualize=False,  # 可视化特征图update=False,  # 更新所有模型project='runs/detect',  # 结果保存目录name='exp',  # 结果保存子目录exist_ok=False,  # 允许现有目录line_thickness=3,  # 画框线条粗细hide_labels=False,  # 隐藏标签hide_conf=False,  # 隐藏置信度half=False,  # 半精度推理dnn=False  # 使用OpenCV DNN模块
)

4.2.11 onnx推理

import onnxruntime as ort
import numpy as np
import cv2# 创建ONNX Runtime推理会话
providers = ['CUDAExecutionProvider']  # ['CPUExecutionProvider'] 这是指定CPU
session = ort.InferenceSession('yolov5s.onnx', providers=providers)
# 读取输入图像
img = cv2.imread('data/images/bus.jpg')
img = cv2.resize(img, (640, 640))
img = img.transpose((2, 0, 1))  # HWC to CHW
img = np.expand_dims(img, axis=0).astype(np.float32) / 255.0
# 进行推理
outputs = session.run(None, {'images': img})
print(outputs[0].shape)

4.3 模型应用

4.3.1 实例分割

下载yolov5s-seg.pt文件

 python segment/predict.py --weights yolov5s-seg.pt --source data/images/bus.jpg  

4.3.2 图像分类

下载yolov5s-cls.pt文件

python classify/predict.py --weights yolov5s-cls.pt --source data/images/bus.jpg  

五,优缺点

维度优点缺点
速度• 单阶段架构,推理极快,可达数百 FPS
• 轻量级,适合实时应用与边缘部署
• 计算量仍高于 YOLOv8-nano 等轻量模型
精度• COCO mAP≈56.8%,处于同期 SOTA 水平
• 数据增强 + 自适应锚框,泛化能力较强
• 小目标检测、密集重叠场景、旋转/倾斜目标易漏检
• 极端遮挡、低光照环境下精度下降
模型与训练• 代码开源完整,社区生态丰富
• 支持多 scale 训练、断点续训、混合精度
• anchor-based,需预设锚框,对形状不规则目标不友好
• 在新数据集上往往需要额外微调
部署• 支持 ONNX、TensorRT、OpenVINO、ncnn 等多种格式,跨平台方便• 对显存/内存仍有要求,极低算力嵌入式设备需做剪枝或量化
易用性• pip 一键安装,命令行/脚本接口简单• 超参数较多,新手调参门槛高于 YOLOv8 的“零参”模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919713.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux文本三剑客的使用及常见重点操作

文本三剑客指 Linux环境下的 grep&#xff08;搜索&#xff09;、sed&#xff08;编辑&#xff09;、awk&#xff08;分析&#xff09;三款用于文本处理的核心命令&#xff0c;三者分工明确、功能互补&#xff0c;是处理日志、配置文件、结构化数据等场景的 “刚需工具”。一、…

​​《开源字幕神器VideoCaptioner实战:基于Whisper+LLM的全链路方案,免费平替剪映会员》​​

&#x1f4cc; 大家好&#xff0c;我是智界工具库&#xff0c;每天分享好用实用且智能的开源项目&#xff0c;以及在JAVA语言开发中遇到的问题&#xff0c;如果本篇文章对您有所帮助&#xff0c;请帮我点个小赞小收藏小关注吧&#xff0c;谢谢喲&#xff01;&#x1f618; 博主…

redisIO模型

​​1. 总述核心​​“Redis采用了​​单线程的Reactor模型​​来处理网络IO和命令请求。其核心在于&#xff0c;​​它使用一个主线程通过IO多路复用机制来并发地处理大量的客户端连接&#xff0c;而实际的命令解析和执行则是单线程的​​。”这句话非常重要&#xff0c;它直接…

视觉采集模块的用法

一、图像源模块用法采集模块中最基础的单元就是图像源模块&#xff0c;其中图像的输入方式包括相机输入、本地图像、SDK三种。添加图像源后&#xff0c;需要对内部的参数进行对应的配置&#xff0c;正常我们连接相机后图像源选择我们对应的连接相机。配置所需要的相机参数&…

Linux下基于Electron的程序ibus输入法问题

Linux下基于Electron的程序ibus输入法问题 最近想体验一下KDE Plasma桌面&#xff0c;遇到一个问题&#xff0c;就是浏览器输入不了中文&#xff0c;Edge、Chrome都一样&#xff0c;当然它们都是基于Chromium的&#xff0c;出同样的问题很正常。后面发现Visual Code也有同样的问…

Ubuntu20系统上离线安装MongoDB

Ubuntu20系统上离线安装MongoDB 准备工作&#xff1a;下载安装包及依赖​ 下载MongoDB二进制包​ 在联网环境中访问MongoDB官网&#xff0c;选择以下配置&#xff1a; 下载地址&#xff1a;https://www.mongodb.com/try/download/community ​Version​&#xff1a;需与目标系统…

K-Means 聚类算法如何选择初始点

n_clusters 参数是告诉 K-Means 算法对 整个数据集 (X_scaled) 进行分簇。让我们分解一下这个过程的逻辑&#xff1a;目标&#xff1a;我们的目标不是要对数据进行分类&#xff0c;而是要从成百上千个数据点中&#xff0c;智能地挑选出大约30个点作为贝叶斯优化的“起点”。这些…

聚铭安全管家平台2.0实战解码 | 安服篇(四):重构威胁追溯体系

在企业安全运营中&#xff0c;两类问题常常让团队陷入被动 1、“看得见威胁&#xff0c;却追不到源头” 明明检测到多台内网设备遭攻击&#xff0c;却迟迟找不到攻击源头&#xff0c;更说不清攻击者用了什么手法&#xff0c;导致无法及时封禁或隔离。 2、“找到了源头&#xff…

【Microi吾码】:低代码加速业务和技术深度融合

目录 一.低代码优势&#xff1a; 1.1低代码平台和传统代码开发&#xff1a; 1.2低代码和0代码平台&#xff1a; 1.3低代码平台&#xff1a;Microi吾码 二.关于开源低代码平台&#xff1a;Microi吾码 2.1Mircroi吾码介绍&#xff1a; 2.2产品特点&#xff1a; 2.3产品团…

Mongodb操作指南

一、数据库操作1. 展示所有非空数据库show dbs该命令会列出所有包含数据的数据库。2. 显示当前数据库db此命令用于查看当前正在使用的数据库。3. 切换或创建数据库use 数据库名如果指定的数据库不存在&#xff0c;MongoDB 会在首次插入数据时自动创建它。如果已存在&#xff0c…

线性回归计算

一、理论&#xff1a;明确线性回归的核心逻辑模型本质&#xff1a;线性回归是通过属性的线性组合实现预测的模型&#xff0c;核心目标是找到最优的直线&#xff08;单变量&#xff09;、平面&#xff08;双变量&#xff09;或超平面&#xff08;多变量&#xff09;&#xff0c;…

pnpm : 无法加载文件 C:\Program Files\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本。

解决办法 1、以管理员身份运行window powershell 2、执行Get-ExecutionPolicy&#xff0c;显示Restricted 3、执行set-ExecutionPolicy&#xff0c;会提示输入参数&#xff0c;此时输入RemoteSigned回车 4、执行y回车

[特殊字符] TTS格局重塑!B站推出Index-TTS,速度、音质、情感表达全维度领先

B站维度之言&#xff1a;B 站 2025 新声计划&#xff1a;IndexTTS 全维度拆解 ——从开源血统到中文特调的架构复盘1&#xff1a;打破边界&#xff1a;Index-TTS 的技术动因场景野心&#xff1a;直播实时口播、无障碍字幕、AI 虚拟 UP 主……B 站需要一把“声音瑞士军刀”&…

第5.3节:awk数据类型

1 第5.3节&#xff1a;awk数据类型 awk并没有非常严格的数据类型&#xff0c;但在编写代码的过程中&#xff0c;大致可以分为以下数据类型&#xff1a; 1.1 数字型 #普通表示法 a 123 b 123.333 #科学表示法 c 1.33e13 d 1.05e-5代码示例&#xff1a; $ echo |awk { >…

基于coco和kitti数据集训练YOLOX

原文发表在知乎&#xff0c;辛苦移步&#xff5e;&#xff5e; 《基于coco和kitti数据集训练YOLOX》 yolox官方的指标数据是在coco数据集上训练出来的&#xff0c;yolox-s模型在11万coco数据集上训练后&#xff0c;mAP(0.5-0.95)40.5。手头有kitti的数据集&#xff0c;所以在…

声网AI语音体验太丝滑,支持随时打断提问

我们教培团队近期测试了一款整合声网语音引擎的对话式 AI 教学工具&#xff0c;体验远超预期。原本以为它仅适用于 1v1 口语练习&#xff0c;没想到已能支持小班课 —— 实测 3 人课堂中&#xff0c;学生轮流发言、提问、插话&#xff0c;AI 都能紧跟节奏&#xff0c;不打断讨论…

【GaussDB】内存资源告急:深度诊断一起“memory temporarily unavailable”故障

一、背景在客户测试环境中&#xff08;GaussDB 506.0 SPC0100 集中式&#xff09;&#xff0c;一个重度使用存储过程的系统&#xff0c;频繁出现内存临时不可用的问题(ERROR: memory is temporarily unavailable)。令人困惑的是&#xff0c;这个环境配置的内存大小已经数十倍于…

LeeCode 40.组合总和II

给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 。注意&#xff1a;解集不能包含重复的组合。 示例 1:输入: candidates [10,1,2,7,6,1,5], t…

数据结构:队列 二叉树

队列&#xff08;Queue&#xff09; 是一种先进先出&#xff08;First In First Out, FIFO&#xff09; 的线性数据结构。 队列的基本特性 1. FIFO 原则 • 最先进入的元素最先出去 • 就像现实生活中的排队&#xff1a;先来的人先接受服务 2. 两个主要操作端 • 队尾&#xff…

FTP工作原理及搭建实操

文章目录前言一、FTP概述二、FTP工作原理2.1 FTP的作用与模式2.2 FTP工作流程2.2.1 主动模式&#xff08;PORT模式&#xff09;2.2.2 被动模式&#xff08;PASV模式&#xff09;2.2.3 对比表格2.2.4 如何选择&#xff1f;2.2.5 补充&#xff1a;现代FTP服务器的常见做法三、FTP…