YOLOv5源码逐行超详细注释与解读(1)——项目目录结构解析

前言
前面简单介绍了YOLOv5的网络结构和创新点(直通车:【YOLO系列】YOLOv5超详细解读(网络详解))
在接下来我们会进入到YOLOv5更深一步的学习,首先从源码解读开始。
因为我是纯小白,刚开始下载完源码时真的一脸懵,所以就先从最基础的项目目录结构开始吧~因为相关解读不是很多,所以有的是我根据作者给的英文文档自己翻译的,如有不对之处欢迎大家指正呀!这篇只是简单介绍每个文件是做什么的,大体上了解这个项目,具体的代码详解后期会慢慢更新,也欢迎大家关注我的专栏,和我一起学习呀!
源码下载地址:mirrors / ultralytics / yolov5 · GitCode
目录
前言
一、项目目录结构
1.1 .github文件夹
1.2 datasets
1.3 data文件夹
1.4 models文件夹
1.5 runs文件夹
1.6 utils文件夹
1.7其他一级目录文件
一、项目目录结构
将源码下载好并配置好环境之后,就可以看到YOLOv5的整体目录如上图所示。
接下来我们逐一分析
1.1 .github文件夹
github是存放关于github上的一些“配置”的,这个不重要,我们可以不管它。
1.2 datasets
我们刚下载下来的源码是不包含这个文件夹的,datasets用来存放自己的数据集,分为images和labels两部分。同时每一个文件夹下,又应该分为train,val。.cache文件为缓存文件,将数据加载到内存中,方便下次调用快速。可以自命名,比如我的火焰数据集就叫“fire_yolo_format”。
1.3 data文件夹
data文件夹主要是存放一些超参数的配置文件(如.yaml文件)是用来配置训练集和测试集还有验证集的路径的,其中还包括目标检测的种类数和种类的名称;还有一些官方提供测试的图片。YOLOv5 有大约 30 个超参数用于各种训练设置。更好的初始猜测会产生更好的最终结果,因此在演化之前正确初始化这些值很重要。
如果是训练自己的数据集的话,那么就需要修改其中的yaml文件。不过要注意,自己的数据集不建议放在这个路径下面,建议把数据集放到YOLOv5项目的同级目录下面。
详解:
- hyps文件夹 # 存放yaml格式的超参数配置文件
-
hyps.scratch-high.yaml # 数据增强高,适用于大型型号,即v3、v3-spp、v5l、v5x
-
hyps.scratch-low.yaml # 数据增强低,适用于较小型号,即v5n、v5s
-
hyps.scratch-med.yaml # 数据增强中,适用于中型型号。即v5m
-
- images # 存放着官方给的两张测试图片
- scripts # 存放数据集和权重下载shell脚本
- download_weights.sh # 下载权重文件,包括五种大小的P5版和P6版以及分类器版
-
get_coco.sh # 下载coco数据集
-
get_coco128.sh # 下载coco128(只有128张)
-
Argoverse.yaml # 后面的每个.yaml文件都对应一种标准数据集格式的数据
- coco.yaml # COCO数据集配置文件
- coco128.yaml # COCO128数据集配置文件
- voc.yaml # VOC数据集配置文件
1.4 models文件夹
models是模型文件夹。里面主要是一些网络构建的配置文件和函数,其中包含了该项目的四个不同的版本,分别为是s、m、l、x。从名字就可以看出,这几个版本的大小。他们的检测速度分别都是从快到慢,但是精确度分别是从低到高。如果训练自己的数据集的话,就需要修改这里面相对应的yaml文件来训练自己模型。
详解:
- hub # 存放yolov5各版本目标检测网络模型配置文件
- anchors.yaml # COCO数据的默认锚点
- yolov3-spp.yaml # 带spp的yolov3
- yolov3-tiny.yaml # 精简版yolov3
- yolov3.yaml # yolov3
- yolov5-bifpn.yaml # 带二值fpn的yolov5l
- yolov5-fpn.yaml # 带fpn的yolov5
- yolov5-p2.yaml # (P2, P3, P4, P5)都输出,宽深与large版本相同,相当于比large版本能检测更小物体
- yolov5-p34.yaml # 只输出(P3, P4),宽深与small版本相同,相当于比small版本更专注于检测中小物体
- yolov5-p6.yaml # (P3, P4, P5, P6)都输出,宽深与large版本相同,相当于比large版本能检测更大物体
- yolov5-p7.yaml # (P3, P4, P5, P6, P7)都输出,宽深与large版本相同,相当于比large版本能检测更更大物体
- yolov5-panet.yaml # 带PANet的yolov5l
- yolov5n6.yaml # (P3, P4, P5, P6)都输出,宽深与nano版本相同,相当于比nano版本能检测更大物体,anchor已预定义
- yolov5s6.yaml # (P3, P4, P5, P6)都输出,宽深与small版本相同,相当于比small版本能检测更大物体,anchor已预定义
- yolov5m6.yaml # (P3, P4, P5, P6)都输出,宽深与middle版本相同,相当于比middle版本能检测更大物体,anchor已预定义
- yolov5l6.yaml # (P3, P4, P5, P6)都输出,宽深与large版本相同,相当于比large版本能检测更大物体,anchor已预定义,推测是作者做实验的产物
- yolov5x6.yaml # (P3, P4, P5, P6)都输出,宽深与Xlarge版本相同,相当于比Xlarge版本能检测更大物体,anchor已预定义
- yolov5s-ghost.yaml # backbone的卷积换成了GhostNet形式的yolov5s,anchor已预定义
- yolov5s-transformer.yaml # backbone最后的C3卷积添加了Transformer模块的yolov5s,anchor已预定义
- _int_.py # 空的
- common.py # 放的是一些网络结构的定义通用模块,包括autopad、Conv、DWConv、TransformerLayer等
- experimental.py # 实验性质的代码,包括MixConv2d、跨层权重Sum等
- tf.py # tensorflow版的yolov5代码
- yolo.py # yolo的特定模块,包括BaseModel,DetectionModel,ClassificationModel,parse_model等
- yolov5l.yaml # yolov5l网络模型配置文件,large版本,深度1.0,宽度1.0
- yolov5m.yaml # yolov5m网络模型配置文件,middle版本,深度0.67,宽度0.75
- yolov5n.yaml # yolov5n网络模型配置文件,nano版本,深度0.33,宽度0.25
- yolov5s.yaml # yolov5s网络模型配置文件,small版本,深度0.33,宽度0.50
- yolov5x.yaml # yolov5x网络模型配置文件,Xlarge版本,深度1.33,宽度1.25
1.5 runs文件夹

runs是我们运行的时候的一些输出文件。每一次运行就会生成一个exp的文件夹。

详解:
- detect # 测试模型,输出图片并在图片中标注出物体和概率
- train # 训练模型,输出内容,模型(最好、最新)权重、混淆矩阵、F1曲线、超参数文件、P曲线、R曲线、PR曲线、结果文件(loss值、P、R)等expn
- expn # 第n次实验数据
- confusion_matrix.png # 混淆矩阵
- P_curve.png # 准确率与置信度的关系图线
- R_curve.png # 精准率与置信度的关系图线
- PR_curve.png # 精准率与召回率的关系图线
- F1_curve.png # F1分数与置信度(x轴)之间的关系
- labels_correlogram.jpg # 预测标签长宽和位置分布
- results.png # 各种loss和metrics(p、r、mAP等,详见utils/metrics)曲线
- results.csv # 对应上面png的原始result数据
- hyp.yaml # 超参数记录文件
- opt.yaml # 模型可选项记录文件
- train_batchx.jpg # 训练集图像x(带标注)
- val_batchx_labels.jpg # 验证集图像x(带标注)
- val_batchx_pred.jpg # 验证集图像x(带预测标注)
- weights # 权重
- best.pt # 历史最好权重
- last.pt # 上次检测点权重
- labels.jpg # 4张图, 4张图,(1,1)表示每个类别的数据量
(1,2)真实标注的 bounding_box
(2,1) 真实标注的中心点坐标
(2,2)真实标注的矩阵宽高
1.6 utils文件夹

utils工具文件夹。存放的是工具类的函数,里面有loss函数,metrics函数,plots函数等等。
详解:
- aws # 恢复中断训练,和aws平台使用相关的工具
- flask_rest_api # 和flask 相关的工具
- google_app_engine # 和谷歌app引擎相关的工具
- loggers # 日志打印
- _init_.py # notebook的初始化,检查系统软件和硬件
- activations.py # 激活函数
- augmentations # 存放各种图像增强技术
- autoanchor.py # 自动生成锚框
- autobatch.py # 自动生成批量大小
- benchmarks.py # 对模型进行性能评估(推理速度和内存占用上的评估)
- callbacks.py # 回调函数,主要为logger服务
- datasets # dateset和dateloader定义代码
- downloads.py # 谷歌云盘内容下载
- general.py # 全项目通用代码,相关实用函数实现
- loss.py # 存放各种损失函数
- metrics.py # 模型验证指标,包括ap,混淆矩阵等
- plots.py # 绘图相关函数,如绘制loss、ac曲线,还能单独将一个bbox存储为图像
- torch_utils.py # 辅助函数
1.7其他一级目录文件

详解:
- .dockerignore # docker的ignore文件
- .gitattributes # 用于将.ipynb后缀的文件剔除GitHub语言统计
- .gitignore # docker的ignore文件
- CONTRIBUTING.md # markdown格式说明文档
- detect.py # 目标检测预测脚本
- export.py # 模型导出
- hubconf.py # pytorch hub相关
- LICENSE # 证书
- README.md # markdown格式说明文档
- requirements.txt # 可以通过pip install requirement进行依赖环境下载
- setup.cfg # 项目打包文件
- train.py # 目标检测训练脚本
- tutorial.ipynb # 目标检测上手教程
- val.py # 目标检测验证脚本
- yolov5s.pt # coco数据集模型预训练权重,运行代码的时候会自动从网上下载
本文参考:
YOLOV5学习笔记(四)——项目目录及代码讲解
YOLOv5-6.2版本代码Project逐文件详解
相关文章:
YOLOv5源码逐行超详细注释与解读(1)——项目目录结构解析
前言 前面简单介绍了YOLOv5的网络结构和创新点(直通车:【YOLO系列】YOLOv5超详细解读(网络详解)) 在接下来我们会进入到YOLOv5更深一步的学习,首先从源码解读开始。 因为我是纯小白,刚开始下…...
前端开发总结的一些技巧和实用方法(2)
本文主要介绍一些JS中用到的小技巧和实用方法,可以在日常Coding中提升幸福度,也可以通过一些小细节来增加代码可读性,让代码看起来更加优雅,后续将不断更新1.数组 map 的方法 (不使用Array.Map) Array.from 还可以接受第二个参数…...
Docker搭建jenkins(Vue自动化部署)
前言 需要提前准备的条件 Docker环境 一、jenkins镜像 # 查询镜像 docker search jenkins# 下载镜像 # lts稳定版 docker pull jenkins/jenkins:lts#查看镜像 docker images二、启动Jenkins容器 创建挂载文件夹,并且进行文件授予权限 #创建文件夹 mkdir -p /home/j…...
ADCS攻击之CVE-2022–26923
CSDN自动博客文章迁移漏洞简介该漏洞允许低权限用户在安装了 Active Directory 证书服务 (AD CS) 服务器角色的默认 Active Directory 环境中将权限提升到域管理员。在默认安装的ADCS里就启用了Machine模板。漏洞利用添加机器账户,并将该机器账户dnsHostName指向DC[…...
AO3401-ASEMI低压P沟道MOS管AO3401
编辑:ll AO3401-ASEMI低压P沟道MOS管AO3401 型号:AO3401 品牌:ASEMI 封装:SOT-23 最大漏源电流:-4.2A 漏源击穿电压:-30V RDS(ON)Max:0.05Ω 引脚数量࿱…...
【STM32MP157应用编程】3.控制PWM
目录 PWM文件 指令操作PWM 程序操作PWM 程序说明 程序代码 3_PWM_1.c 启动交叉编译工具 编译 拷贝到开发板 测试 PWM文件 在/sys/class/pwm目录下,存放了PWM的文件。 pwmchip0和pwmchip4目录对应了MP157 SoC的2个PWM控制器,pwmchip0对应的是M…...
基于Python的selenium
一、安装 1.1安装Python,安装Python时需要勾选增加环境变量 如果之前已经安装过Python,需要将Python相关文件以及环境变量删除 1.2安装成功:在命令行界面下输入Python,最终展示>>>即可成功 2.1安装pycharm,直接自定义安装…...
Go底层原理:一起来唠唠GMP调度(一)
目录前言一、进程、线程、Goroutine1、进程与线程2、Goroutine二、Go调度器设计思想1、线程模型1.1 内核级线程模型1.2 用户级线程模型1.3 混合型线程模型2、 被废弃的 G-M 调度器2.1 了解 G-M 调度如何工作3、如今高效的 GMP 模型3.1 GMP模型调度流程3.2 GMP调度设计策略3.3 G…...
前端——1.相关概念
这篇文章主要介绍前端入门的相关概念 1.网页 1.1什么是网页? 网站:是指在因特网上根据一定的规则,使用HTML等制作的用于展示特定内容相关的网页集合 网页:是网站中的一“页”,通常是HTML格式的文件,它要…...
java四种线程池(基本使用)
标题java四种线程池及使用示例 1、线程工厂 1、我们先来写ThreadFactory,在创建线程池时候可以传入自定义的线程工厂,线程工厂说白了就是用来定制线程的一些属性:名字、优先级、是否为守护线程。直接看代码即可。 当然创建线程池的时候可以…...
float的表示范围为什么比long大
●很多人会有一个疑问, 一个用来表示小数的 float 为什么表示的范围会比 long 还要大呢 ? ●这次, 咱们就来详细说一说这个事情 从长计议 ●聊到这个话题, 我们就要从计算机存储数字这个位置说起了 ●计算机存储数字的方式其实就是 : 二进制 二进制是计算机中最基本的数字存储…...
Flutter Android 打包保姆式全流程 2023 版
大家好,我是 17。 为什么要写这篇文章呢?对于一没有 android 开发经验,从未有过打包经历的新人来说,要想成功打包,是很困难的。因为受到的阻碍太多,是完全陌生的领域,几乎是寸步难行。如果有老…...
C++笔记之lambda表达式
引言 Lambda表达式是从C 11版本引入的特性,利用它可以很方便的定义匿名函数对象,通常作为回调函数来使用。大家会经常拿它和函数指针,函数符放在一起比较,很多场合下,它们三者都可以替换着用。 语法 [ captures ] (…...
flink大数据处理流式计算详解
flink大数据处理 文章目录flink大数据处理二、WebUI可视化界面(测试用)三、Flink部署3.1 JobManager3.2 TaskManager3.3 并行度的调整配置3.4 区分 TaskSolt和parallelism并行度配置四、Source Operator(资源算子)五、Sink Operator(输出算子)六、Flink滑…...
Java面试题(二十三)DCL单例
懒汉式单例 private static SingletonInstance INSTANCE;private SingletonInstance(){}public static SingletonInstance getInstance() {if (INSTANCE null) {INSTANCE new SingletonInstance();}return INSTANCE;}构造方法私有化,然后判断是否为空,…...
UML-类图
一、类 一个类由三个格子组成,从上至下分别表示: 第一格:类名称(接口和抽象类,使用斜体) 第二格:类的属性(成员变量,可以没有) 第三格:类的操作&…...
PostgreSQL 数据库和 pgAdmin 4
PostgreSQL 数据库和 pgAdmin 4PostgreSQLPostgreSQL 数据库安装PostgreSQL 数据库安装 (Ubuntu)PostgreSQL 数据库其他系统安装PostgreSQL 数据库快速使用入门登录数据库访问数据库参考pgAdmin 4pgAdmin 4 安装使用 pgAdmin 4 登录数据库参考PostgreSQL PostgreSQL 数据库安装…...
quarkus 搭建与基础开发环境配置总结
quarkus搭建与基础开发环境配置总结 大纲 基础概念quarkus2.13.7脚手架工程配置配置maven3.8.7quarkus快速启动quarkus的三种打包方式quarkus将程序打包为二进制文件window环境下quarkus云原生二进制文件打包环境搭建使用GraalVM-java11替换本地java8运行二进制文件 基础概念…...
扩散模型DDPM开源代码的剖析【对应公式与作者给的开源项目,diffusion model】
扩散模型DDPM开源代码的剖析【对应公式与作者给的开源项目,diffusion model】一、简介二、扩散过程:输入是x_0和时刻num_steps,输出是x_t三、逆扩散过程:输入x_t,不断采样最终输出x_0四、具体参考算法流程图五、模型mo…...
C语言 学生记录管理系统
学生记录管理系统 1--添加 2--删除 3--查询:按姓名 4--查询:按班级 5--查询:按学号 0--退出 请选择操作序号(0—5):1 请输入新学生的学号:1 请输入新学生的…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
