【YOLOV5-5.x 源码解读】torch_utils.py
目录
- 前言
- 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相关推荐
- PTMs:QLoRA技巧之源码解读(qlora.py文件)—解析命令与加载参数→数据预处理→模型训练+评估+推理
PTMs:QLoRA技巧之源码解读(qlora.py文件)-解析命令与加载参数→数据预处理→模型训练+评估+推理 目录 QLoRA技巧之源码解读(qlora.py文件)-解析命令与加载参数→数据预处理 ...
- 利用yolov5训练自己的数据集; yolov5的安装与使用 ; yolov5源码解读
*免责声明: 1\此方法仅提供参考 2\搬了其他博主的操作方法,以贴上路径. 3* 场景一:Anconda环境基本操作 场景二:yolov5的使用 场景三:yolo v5训练自己的数据集 场景四:yo ...
- YOLOV5源码解读(数据集加载和增强)
YOLOV5源码解读系列文章目录 数据集加载和增强 loss计算 前言 此篇为yolov5 3.1 版本,官方地址[https://github.com/ultralytics/yolov5] 看源代 ...
- 【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 ...
- faster rcnn源码解读(四)之数据类型imdb.py和pascal_voc.py(主要是imdb和roidb数据类型的解说)
转载自:faster rcnn源码解读(四)之数据类型imdb.py和pascal_voc.py(主要是imdb和roidb数据类型的解说) - 野孩子的专栏 - 博客频道 - CSDN.NET ht ...
- faster rcnn源码解读(三)train_faster_rcnn_alt_opt.py
转载自:faster rcnn源码解读(三)train_faster_rcnn_alt_opt.py - 野孩子的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/u ...
- Ubuntu 16.04下Caffe-SSD的应用(四)——ssd_pascal.py源码解读
前言 caffe-ssd所有的训练时的参数,全部由ssd_pascal.py来定义,之后再去调用相关的脚本和函数,所以想要训练自己的数据,首先要明白ssd_pascal.py各个定义参数的大体意思. ...
- 利用yolov7训练自己的数据集; yolov7的安装与使用 ; yolov7源码解读
*免责声明: 1\此方法仅提供参考 2\搬了其他博主的操作方法,以贴上路径. 3* 场景一:Anconda环境基本操作 场景二:yolov7的使用 场景三:yolov7训练自己的数据集 场景四:实用工 ...
- 【YOLOV5-5.x 源码解读】yolov5s.yaml
目录 前言 1.参数配置 2.anchors配置 3.backbone 4.head 5.整体模型 总结 Reference 前言 源码: YOLOv5源码. 链接: [YOLOV5-5.x 源码讲解 ...
- Bert系列(二)——源码解读之模型主体
本篇文章主要是解读模型主体代码modeling.py.在阅读这篇文章之前希望读者们对bert的相关理论有一定的了解,尤其是transformer的结构原理,网上的资料很多,本文内容对原理部分就不做过多 ...
最新文章
- 2013年蓝桥杯省赛C/C++A组真题解析
- dao层和service层和control_maven分模块构建SSM普通web项目:service层代码编写
- 对比less聊scss(1):scss特性
- 二维数组 赋值_3.9数组(数组基本使用、数组的循环、数组拷贝、数组排序、多维数组)...
- mariab修改mysql端口_修改mysql/MariaDB数据库的端口号+远程
- 《好未来编程题》 输入n个整数,输出出现次数大于等于数组长度一半的数
- java 不能反序列化_不能将“Java.Lang.Studio”实例反序列化到StaskObl对象令牌中
- [BZOJ4530][Bjoi2014]大融合 LCT + 启发式合并
- 深度学习-自动并行计算
- 2021温州市高考成绩查询,温州2021高考成绩排名榜单,温州各高中高考成绩喜报
- mysql in and in_完美解决mysql in条件语句只读取一条信息问题的2种方案
- 在Linux下安装bind服务,在Linux系统下安装DNS服务器BIND
- 安卓手机怎么root_怎么在腾讯手机管家中一键获取Root权限
- 机器学习(5)——决策树(预测隐形眼镜类型)
- Richard Hamming - You and Your Research
- 什么原因导致MacBook Pro过热?如何解决这一问题?
- 测试用例设计方法——判定表法
- 从零开始写一个武侠冒险游戏-4-第一次整合
- OpenCV图像特征SIFT
- cortana小娜不能文字搜索,只能用语音搜索【修复教程】
热门文章