目录

  • 前言
  • 0、导入需要的包
  • 1、torch_distributed_zero_first
  • 2、init_torch_seeds
  • 3、git_describe、date_modified、select_device
    • 3.1、git_describe
    • 3.2、date_modified
    • 3.3、select_device
  • 4、intersect_dicts
  • 5、time_synchronized
  • 6、profile、model_info
    • 6.1、profile(没用到)
    • 6.2、model_info
  • 7、initialize_weights
  • 8、find_modules(没用到)
  • 9、sparsity、prune
    • 9.1、sparsity
    • 9.2、prune
  • 10、fuse_conv_and_bn
  • 11、load_classifier
  • 12、scale_img
  • 13、de_parallel
  • 14、is_parallel、copy_attr、ModelEMA类
    • 14.1、is_parallel
    • 14.2、copy_attr
    • 14.3、class ModelEMA
  • 总结

前言

源码: YOLOv5源码.
导航: 【YOLOV5-5.x 源码讲解】整体项目文件导航.
注释版全部项目文件已上传至GitHub: yolov5-5.x-annotations.

这个文件主要是基于torch的一些实用工具类,整个项目的文件都可能会用到,并不涉及太多的矩阵操作,大多都是一些torch相关工具的使用。废话不多说,下面开始介绍每个函数。

0、导入需要的包

import datetime    # 时间模块  基于time进行了封装 更高级
import logging     # 日志功能生成模块
import math        # 数学函数模块
import os          # 与操作系统进行交互的模块
import platform    # 提供获取操作系统相关信息的模块
import subprocess  # 子进程定义及操作的模块
import time        # 时间模块 更底层
from contextlib import contextmanager  # 用于进行上下文管理的模块
from copy import deepcopy  # 实现深度复制的模块
from pathlib import Path   # Path将str转换为Path对象 使字符串路径易于操作的模块# 以下是一些基本的torch相关的类
import torch
import torch.backends.cudnn as cudnn
import torch.distributed as dist
import torch.nn as nn
import torch.nn.functional as F
import torchvisiontry:import thop  # 用于Pytorch模型的FLOPS计算工具模块
except ImportError:thop = None
logger = logging.getLogger(__name__)  # 初始化日志

1、torch_distributed_zero_first

这个函数是用来处理模型进行分布式训练时的同步问题,用在train.py中如:

torch_distributed_zero_first函数代码:

@contextmanager    # 这个是上下文管理器
def torch_distributed_zero_first(local_rank: int):"""train.py用于处理模型进行分布式训练时同步问题基于torch.distributed.barrier()函数的上下文管理器,为了完成数据的正常同步操作(yolov5中拥有大量的多线程并行操作)Decorator to make all processes in distributed training wait for each local_master to do something.:params local_rank: 代表当前进程号  0代表主进程  1、2、3代表子进程"""if local_rank not in [-1, 0]:# 如果执行create_dataloader()函数的进程不是主进程,即rank不等于0或者-1,# 上下文管理器会执行相应的torch.distributed.barrier(),设置一个阻塞栅栏,# 让此进程处于等待状态,等待所有进程到达栅栏处(包括主进程数据处理完毕);dist.barrier()yield  # yield语句 中断后执行上下文代码,然后返回到此处继续往下执行if local_rank == 0:# 如果执行create_dataloader()函数的进程是主进程,其会直接去读取数据并处理,# 然后其处理结束之后会接着遇到torch.distributed.barrier(),# 此时,所有进程都到达了当前的栅栏处,这样所有进程就达到了同步,并同时得到释放。dist.barrier()

2、init_torch_seeds

这个函数用于初始化随机种子并确定训练模式,会被用在general.py中的init_seeds联合一起作几个随机数种子的初始化操作:

init_torch_seeds函数代码:

def init_torch_seeds(seed=0):"""用在general.py的init_seeds函数用于初始化随机种子并确定训练模式Speed-reproducibility tradeoff https://pytorch.org/docs/stable/notes/randomness.html"""# 为CPU设置随机种子,方便下次复现实验结果  to seed the RNG for all devices (both CPU and CUDA)torch.manual_seed(seed)# benchmark模式会自动寻找最优配置 但由于计算的随机性 每次网络进行前向传播时会有差异# 避免这种差异的方法就是将deterministic设置为True(表明每次卷积的高效算法相同)# 速度与可重复性之间的权衡  涉及底层卷积算法优化if seed == 0:# slower, more reproducible  慢 但是具有可重复性 适用于网络的输入数据在每次iteration都变化的话cudnn.benchmark, cudnn.deterministic = False, Trueelse:# faster, less reproducible 快 但是不可重复  适用于网络的输入数据维度或类型上变化不大cudnn.benchmark, cudnn.deterministic = True, False

3、git_describe、date_modified、select_device

下面三个函数是一起完成自动选择系统设备的操作,在select_device函数中会调用git_describe函数和date_modified函数。下面我依次介绍这三个函数。

3.1、git_describe

这个函数用于返回path文件可读的git描述,用于select_device函数中。

git_describe函数代码:

def git_describe(path=Path(__file__).parent):"""用在select_device用于返回path文件可读的git描述  return human-readable git description  i.e. v5.0-5-g3e25f1ehttps://git-scm.com/docs/git-describepath: 需要在git中查询(文件描述)的文件名  默认当前文件的父路径"""# path must be a directorys = f'git -C {path} describe --tags --long --always'try:# 创建一个子进程在命令行执行 s(git) 命令(返回path文件的描述) 返回执行结果(path文件的描述)return subprocess.check_output(s, shell=True, stderr=subprocess.STDOUT).decode()[:-1]except subprocess.CalledProcessError as e:# 发生异常 path not a git repository 返回''return ''

3.2、date_modified

这个函数是返回人类可读的修改日期,用于select_device函数中。

date_modified函数代码:

def date_modified(path=__file__):"""返回path文件人类可读的修改日期return human-readable file modification date, i.e. '2021-3-26':params path: 文件名 默认当前文件"""t = datetime.datetime.fromtimestamp(Path(path).stat().st_mtime)return f'{t.year}-{t.month}-{t.day}'

3.3、select_device

这个函数才是主角,用于自动选择本机模型训练的设备,并输出日志信息。广泛用于train.py、test.py、detect.py等文件中,如:

select_device函数代码:

def select_device(device='', batch_size=None):"""广泛用于train.py、test.py、detect.py等文件中用于选择模型训练的设备 并输出日志信息:params device: 输入的设备  device = 'cpu' or '0' or '0,1,2,3':params batch_size: 一个批次的图片个数"""# git_describe(): 返回当前文件父文件的描述信息(yolov5)   date_modified(): 返回当前文件的修改日期# s: 之后要加入logger日志的显示信息s = f'YOLOv5 												

【YOLOV5-5.x 源码解读】torch_utils.py相关推荐

  1. PTMs:QLoRA技巧之源码解读(qlora.py文件)—解析命令与加载参数→数据预处理→模型训练+评估+推理

    PTMs:QLoRA技巧之源码解读(qlora.py文件)-解析命令与加载参数→数据预处理→模型训练+评估+推理 目录 QLoRA技巧之源码解读(qlora.py文件)-解析命令与加载参数→数据预处理 ...

  2. 利用yolov5训练自己的数据集; yolov5的安装与使用 ; yolov5源码解读

    *免责声明: 1\此方法仅提供参考 2\搬了其他博主的操作方法,以贴上路径. 3* 场景一:Anconda环境基本操作 场景二:yolov5的使用 场景三:yolo v5训练自己的数据集 场景四:yo ...

  3. YOLOV5源码解读(数据集加载和增强)

    YOLOV5源码解读系列文章目录 数据集加载和增强 loss计算 前言 此篇为yolov5 3.1 版本,官方地址[https://github.com/ultralytics/yolov5] 看源代 ...

  4. 【YOLOV5-5.x 源码解读】metrics.py

    目录 前言 0.导入需要的包 1.fitness 2.ap_per_class.compute_ap 2.1.ap_per_class 2.2.compute_ap 3.ConfusionMatrix ...

  5. faster rcnn源码解读(四)之数据类型imdb.py和pascal_voc.py(主要是imdb和roidb数据类型的解说)

    转载自:faster rcnn源码解读(四)之数据类型imdb.py和pascal_voc.py(主要是imdb和roidb数据类型的解说) - 野孩子的专栏 - 博客频道 - CSDN.NET ht ...

  6. faster rcnn源码解读(三)train_faster_rcnn_alt_opt.py

    转载自:faster rcnn源码解读(三)train_faster_rcnn_alt_opt.py - 野孩子的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/u ...

  7. Ubuntu 16.04下Caffe-SSD的应用(四)——ssd_pascal.py源码解读

    前言 caffe-ssd所有的训练时的参数,全部由ssd_pascal.py来定义,之后再去调用相关的脚本和函数,所以想要训练自己的数据,首先要明白ssd_pascal.py各个定义参数的大体意思. ...

  8. 利用yolov7训练自己的数据集; yolov7的安装与使用 ; yolov7源码解读

    *免责声明: 1\此方法仅提供参考 2\搬了其他博主的操作方法,以贴上路径. 3* 场景一:Anconda环境基本操作 场景二:yolov7的使用 场景三:yolov7训练自己的数据集 场景四:实用工 ...

  9. 【YOLOV5-5.x 源码解读】yolov5s.yaml

    目录 前言 1.参数配置 2.anchors配置 3.backbone 4.head 5.整体模型 总结 Reference 前言 源码: YOLOv5源码. 链接: [YOLOV5-5.x 源码讲解 ...

  10. Bert系列(二)——源码解读之模型主体

    本篇文章主要是解读模型主体代码modeling.py.在阅读这篇文章之前希望读者们对bert的相关理论有一定的了解,尤其是transformer的结构原理,网上的资料很多,本文内容对原理部分就不做过多 ...

最新文章

  1. 2013年蓝桥杯省赛C/C++A组真题解析
  2. dao层和service层和control_maven分模块构建SSM普通web项目:service层代码编写
  3. 对比less聊scss(1):scss特性
  4. 二维数组 赋值_3.9数组(数组基本使用、数组的循环、数组拷贝、数组排序、多维数组)...
  5. mariab修改mysql端口_修改mysql/MariaDB数据库的端口号+远程
  6. 《好未来编程题》 输入n个整数,输出出现次数大于等于数组长度一半的数
  7. java 不能反序列化_不能将“Java.Lang.Studio”实例反序列化到StaskObl对象令牌中
  8. [BZOJ4530][Bjoi2014]大融合 LCT + 启发式合并
  9. 深度学习-自动并行计算
  10. 2021温州市高考成绩查询,温州2021高考成绩排名榜单,温州各高中高考成绩喜报
  11. mysql in and in_完美解决mysql in条件语句只读取一条信息问题的2种方案
  12. 在Linux下安装bind服务,在Linux系统下安装DNS服务器BIND
  13. 安卓手机怎么root_怎么在腾讯手机管家中一键获取Root权限
  14. 机器学习(5)——决策树(预测隐形眼镜类型)
  15. Richard Hamming - You and Your Research
  16. 什么原因导致MacBook Pro过热?如何解决这一问题?
  17. 测试用例设计方法——判定表法
  18. 从零开始写一个武侠冒险游戏-4-第一次整合
  19. OpenCV图像特征SIFT
  20. cortana小娜不能文字搜索,只能用语音搜索【修复教程】

热门文章

  1. 智能小车设计思路简述
  2. 信息化基础建设 里程碑
  3. python错误修复_如何修复这个dll加载python的错误?
  4. 网络——TCP连接管理
  5. Java 时间日期操作
  6. CCF认证 2019-9
  7. win10直升win11并更新显卡最新驱动
  8. 一个很精妙的高精度电压基准电路
  9. this.$parent
  10. 阿里的odps是什么?