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

article/2025/11/7 21:24:02

目录

  • 前言
  • 0、导入需要的包
  • 1、gsutil_getsize
  • 2、safe_download、attempt_download
    • 2.1、safe_download
    • 2.2、attempt_download
  • 3、get_token、gdrive_download(没使用)
    • 3.1、get_token
    • 3.2、gdrive_download
  • 4、作者注释的函数
  • 总结

前言

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

这个文件主要是负责从github/googleleaps/google drive 等网站或者云服务器上下载所需的一些文件。是一个工具类,代码比较简单,函数也比较少,主要难点还是在于一些包可能大家不是很熟悉,下面一起来学习下。

这个文件比较重要的是两个函数:safe_download和attempt_download。在train.py或者yolo.py等文件中都会用到。

0、导入需要的包

import os          # 与操作系统进行交互的模块
import platform    # 提供获取操作系统相关信息的模块
import subprocess  # 子进程定义及操作的模块
import time
import urllib      # 用于操作网页 URL,并对网页的内容进行抓取处理  如urllib.parse: 解析url
from pathlib import Path  # Path将str转换为Path对象 使字符串路径易于操作的模块import requests    # 通过urllib3实现自动发送HTTP/1.1请求的第三方模块
import torch       # pytorch框架

1、gsutil_getsize

这个函数是用来返回网站链接url对应文件的大小。用的不是很多,只用在google_utils.py的print_mutation函数当中 计算某个url对应的文件大小如:
在这里插入图片描述
gsutil_getsize函数代码:

def gsutil_getsize(url=''):"""用在google_utils.py的print_mutation函数当中 计算某个url对应的文件大小用于返回网站链接url对应文件的大小gs://bucket/file size https://cloud.google.com/storage/docs/gsutil/commands/du"""# 创建一个子进程在命令行执行 gsutil du url 命令(访问 Cloud Storage) 返回执行结果(文件)s = subprocess.check_output(f'gsutil du {url}', shell=True).decode('utf-8')# 返回文件的bytes大小return eval(s.split(' ')[0]) if len(s) else 0

2、safe_download、attempt_download

这两个函数主要是用来从github或者googleleaps云服务器中下载文件的,主要是下载权重文件。attempt_download函数调用safe_download函数。

2.1、safe_download

这个函数是用来下载 url(github) 或者 url2(googleleaps云服务器) 路径对应的网页文件,通常是下载权重文件,会用在attempt_download函数中如:
在这里插入图片描述
safe_download函数代码:

def safe_download(file, url, url2=None, min_bytes=1E0, error_msg=''):"""用在attempt_download函数中下载 url/url2 路径对应的网页文件Attempts to download file from url or url2, checks and removes incomplete downloads < min_bytes:params file: 要下载的文件名:params url: 第一个下载地址 一般是github:params url2: 第二个下载地址(第一个下载地址下载失败后使用) 一般是googleleaps等云服务器:params min_bytes: 判断文件是否下载下来 只有文件存在且文件大小要大于min_bytes才能判断文件已经下载下来了:params error_msg: 文件下载失败的显示信息 初始化默认’‘"""file = Path(file)assert_msg = f"Downloaded file '{file}' does not exist or size is < min_bytes={min_bytes}"try:  # 尝试从url中下载文件 一般是githubprint(f'Downloading {url} to {file}...')# 从url中下载文件torch.hub.download_url_to_file(url, str(file))# 判断文件是否下载下来了(文件存在且文件大小要大于min_bytes)assert file.exists() and file.stat().st_size > min_bytes, assert_msg  # checkexcept Exception as e:  # 不行就尝试从url2中下载文件  一般是googleleaps(云服务器)# 移除之前下载失败的文件file.unlink(missing_ok=True)  # remove partial downloadsprint(f'ERROR: {e}\nRe-attempting {url2 or url} to {file}...')os.system(f"curl -L '{url2 or url}' -o '{file}' --retry 3 -C -")  # curl download, retry and resume on failfinally:# 检查文件是否下载下来了(是否存在) 或 文件大小是否小于min_bytesif not file.exists() or file.stat().st_size < min_bytes:  # check# 下载失败 移除下载失败的文件 remove partial downloadsfile.unlink(missing_ok=True)# 打印错误信息print(f"ERROR: {assert_msg}\n{error_msg}")print('')

2.2、attempt_download

这个函数是实现从几个云平台(github/googleleaps云服务器)下载文件(预训练模型),会调用上面的 safe_download 函数。会用在experimental.py中的attempt_load函数和train.py中,都是用来下载预训练权重 如:

attempt_load函数:在这里插入图片描述
train.py:
在这里插入图片描述
attempt_download函数代码:

def attempt_download(file, repo='ultralytics/yolov5'):"""用在experimental中的attempt_load函数和train.py中下载预训练权重实现从几个云平台(github/googleleaps云服务器)下载文件(预训练模型):params file: 如果是文件路径 且这个路径不存在文件就尝试下载文件果是url地址 就直接下载文件如果只是一个要下载的文件名, 那就获取版本号开始下载(github/googleleaps):params repo: 下载文件的github仓库名 默认是'ultralytics/yolov5'"""# .strip()删除字符串前后空格 /n /t等  .replace将 ' 替换为空格  Path将str转换为Path对象file = Path(str(file).strip().replace("'", ''))# 如果这个文件路径不存在文件 就尝试下载if not file.exists():# urllib.parse: 解析url   .unquote: 对url进行解码  decode '%2F' to '/' etc.name = Path(urllib.parse.unquote(str(file))).name# 如果解析的文件名是http:/ 或 https:/ 开头就直接下载if str(file).startswith(('http:/', 'https:/')):  # download# url: 下载路径 urlurl = str(file).replace(':/', '://')  # Pathlib turns :// -> :/# name: 要下载的文件名name = name.split('?')[0]  # parse authentication https://url.com/file.txt?auth...# 下载文件safe_download(file=name, url=url, min_bytes=1E5)return name# GitHub assetsfile.parent.mkdir(parents=True, exist_ok=True)  # make parent dir (if required)try:# 利用github api 获取最新的版本相关信息  这里的response是一个打字典response = requests.get(f'https://api.github.com/repos/{repo}/releases/latest').json()  # github api# response['assets']中包含多个字典的列表 其中记录每一个asset的相关信息# release assets, i.e. ['yolov5s.pt', 'yolov5m.pt', ...]assets = [x['name'] for x in response['assets']]# tag: 当前最新版本号 如'v5.0'tag = response['tag_name']except:   # 获取失败 就退而求其次 直接利用git命令强行补齐版本信息assets = ['yolov5s.pt', 'yolov5m.pt', 'yolov5l.pt', 'yolov5x.pt','yolov5s6.pt', 'yolov5m6.pt', 'yolov5l6.pt', 'yolov5x6.pt']try:# 创建一个子进程在命令行执行 git tag 命令(返回版本号 版本号信息一般在字典最后 -1) 返回执行结果(版本号tag)tag = subprocess.check_output('git tag', shell=True, stderr=subprocess.STDOUT).decode().split()[-1]except:# 如果还是失败 就强行自己补一个版本号 tag='v5.0'tag = 'v5.0'  # current releaseif name in assets:# 开始从github中下载文件# file: 要下载的文件名# url: 第一个下载地址 一般是github  repo: github仓库名  tag: 版本号  name: 文件名 .pt# url2: 第二个备用的下载地址 一般是googleapis(云服务器)# min_bytes: 判断文件是否下载下来 只有文件存在且文件大小要大于min_bytes才能判断文件已经下载下来了# error_msg: 下载失败的显示信息safe_download(file,url=f'https://github.com/{repo}/releases/download/{tag}/{name}',url2=f'https://storage.googleapis.com/{repo}/ckpt/{name}',  # backup url (optional)min_bytes=1E5,error_msg=f'{file} missing, try downloading from https://github.com/{repo}/releases/')return str(file)

3、get_token、gdrive_download(没使用)

这两个函数是实现从google drive上下载压缩文件并将其解压, 再删除掉压缩文件。但是这好像并没有在代码中使用,所以这两个函数可以随便了解下就好,主要还是要掌握上面的两个下载函数用的比较多。

3.1、get_token

这个函数实现从cookie中获取令牌token。会在gdrive_download中被调用。

get_token函数代码:

def get_token(cookie="./cookie"):"""在gdrive_download中使用实现从cookie中获取令牌token """with open(cookie) as f:for line in f:if "download" in line:return line.split()[-1]return ""

3.2、gdrive_download

这个函数实现从google drive上下载压缩文件并将其解压, 再删除掉压缩文件。这个函数貌似没用到,随便看下就好。

gdrive_download函数代码:

def gdrive_download(id='16TiPfZj7htmTyhntwcZyEEAejOUxuT6m', file='tmp.zip'):"""实现从google drive上下载压缩文件并将其解压, 再删除掉压缩文件:params id: url ?后面的id参数的参数值:params file: 需要下载的压缩文件名"""t = time.time()  # 获取当前时间file = Path(file)   # Path将str转换为Path对象cookie = Path('cookie')  # gdrive cookieprint(f'Downloading https://drive.google.com/uc?export=download&id={id} as {file}... ', end='')file.unlink(missing_ok=True)  # 移除已经存在的文件(可能是下载失败/下载不完全)cookie.unlink(missing_ok=True)  # 移除已经存在的cookie# 尝试下载压缩文件out = "NUL" if platform.system() == "Windows" else "/dev/null"# 使用cmd命令从google drive上下载文件os.system(f'curl -c ./cookie -s -L "drive.google.com/uc?export=download&id={id}" > {out}')if os.path.exists('cookie'):# 如果文件较大 就需要有令牌get_token(存在cookie才有令牌)的指令s才能下载# get_token()函数在下面定义了 用于获取当前cookie的令牌tokens = f'curl -Lb ./cookie "drive.google.com/uc?export=download&confirm={get_token()}&id={id}" -o {file}'else:# 小文件就不需要带令牌的指令s 直接下载就行s = f'curl -s -L -o {file} "drive.google.com/uc?export=download&id={id}"'# 执行下载指令s 并获得返回 如果cmd命令执行成功 则os.system()命令会返回0r = os.system(s)cookie.unlink(missing_ok=True)  # 再次移除已经存在的cookie# 下载错误检测  如果r != 0 则下载错误if r != 0:file.unlink(missing_ok=True)  # 下载错误 移除下载的文件(可能不完全或者下载失败)print('Download error ')  # raise Exception('Download error')return r# 如果是压缩文件 就解压  file.suffix方法可以获取file文件的后缀if file.suffix == '.zip':print('unzipping... ', end='')os.system(f'unzip -q {file}')  # cmd命令执行解压命令file.unlink()  # 移除.zip压缩文件print(f'Done ({time.time() - t:.1f}s)')  # 打印下载 + 解压过程所需要的时间return r

4、作者注释的函数

最后还有两个作者注释的函数,更加不重要了,可以不看。

# --------------------------------------- 下面两个函数没什么用 可以不看 ---------------------------------------------------
# def upload_blob(bucket_name, source_file_name, destination_blob_name):
#     # Uploads a file to a bucket
#     # https://cloud.google.com/storage/docs/uploading-objects#storage-upload-object-python
#
#     storage_client = storage.Client()
#     bucket = storage_client.get_bucket(bucket_name)
#     blob = bucket.blob(destination_blob_name)
#
#     blob.upload_from_filename(source_file_name)
#
#     print('File {} uploaded to {}.'.format(
#         source_file_name,
#         destination_blob_name))
#
#
# def download_blob(bucket_name, source_blob_name, destination_file_name):
#     # Uploads a blob from a bucket
#     storage_client = storage.Client()
#     bucket = storage_client.get_bucket(bucket_name)
#     blob = bucket.blob(source_blob_name)
#
#     blob.download_to_filename(destination_file_name)
#
#     print('Blob {} downloaded to {}.'.format(
#         source_blob_name,
#         destination_file_name))

总结

这个文件的代码比较少,真正有用的函数也比较少,也就是safe_download和attempt_download两个函数比较重要,大家重点掌握这两个函数即可。

–2021.07.31 13:06


http://chatgpt.dhexx.cn/article/e5626luJ.shtml

相关文章

千呼万唤始出来 Google GDrive将于4月初正式推出

早在5年前&#xff0c;WSJ就有传言称Google将推出云存储服务&#xff0c;而Google也在2010年宣称这项服务将允许用户进行文件和资料的在线存储&#xff0c;但一直没有正式推出该项服务。这次&#xff0c;看来Google是来真的了。 如果消息属实&#xff0c;Google GDrive将可能在…

Google云存储服务GDrive再度浮出水面

Google 要推出GDrive的传闻已经有一段时间了&#xff0c;而现在一个Google 搜索结果页面再度证实了这一传闻。在Google 搜索中如果你输入Writely&#xff0c;搜索的结果中你可以看到一个名为Platypus&#xff08;GDrive&#xff09;的测试页面。Writely.com是Google 于2006年收…

GDrive首次现身!

还记得GDrive么&#xff1f;自从它第一次出现在Google的泄露文档上&#xff0c;它就成为了世界关注的焦点。根据传言&#xff0c;GDrive将会是Google要推出的网络存储服务&#xff0c;类似于网络硬盘&#xff0c;但它的容量是无限的。在这个消息泄露后&#xff0c;Google马上把…

Google的GDrive美如水中之月

GDrive GDrive(网络硬盘),被称为“谷歌迄今为止推出的最令人期待的产品”。GDrive可以让用户将个人文件和操作系统存储在谷歌的服务器上&#xff0c;并可通过网络访问&#xff0c;PC将成为一种用于访问网络的简单而便宜的设备&#xff0c;用户甚至可以通过谷歌的手机操作系统An…

Google网络硬盘(GDrive):千呼万唤不出来

几年来人们一直猜测Google会利用其强大的实力提供专业在线数据存储服务&#xff0c;比如说“Google网络硬盘&#xff08;GDrive&#xff09;”。最近相关传言再次兴起&#xff0c;并且更加有意思。 Google网络硬盘有什么好处呢&#xff1f;廉价&#xff08;免费&#xff1f;&am…

linux 安装 gdrive

1.下载https://www.dongganboy.com/app/gdrive-linux-x64 参考链接&#xff1a;Linux 定时备份网站文件至Google Drive - 主机宝贝 [教程]Gdrive&#xff1a;Linux下谷歌网盘同步工具、自动备份VPS文件到Google Drive – 爱玩吧 2. 复制到相应的文件夹下&#xff1b;修改权限…

win7出现问题事件名称APPCRASH的解决方法

问题故障提示&#xff1a; 在网上找了很多解决方式都没有解决&#xff0c;什么下载个 Windows清理助手64位啦&#xff0c;什么重新卸载重装啦&#xff0c; 什么删除 User Data 文件啦&#xff0c;什么删除注册表啦&#xff0c;一点用都没有&#xff0c;这个问题是由于 兼容 问…

vs2015启动无法工作,问题事件名称: APPCRASH,故障模块名称: KERNELBASE.dll

尝试了网上多种方法&#xff0c;删除注册表内容&#xff1b;安全模式&#xff1b;重启&#xff1b;修复&#xff1b;管理员权限等等&#xff0c;都以失败为告终。利用程序自带的修复了3、4次&#xff0c;也没有任何作用。一启动还是VS2015软件奔溃&#xff0c;无法工作。显示下…

IOS —— Crash分析

Crash分析 1. Crash2. 奔溃处理2.1 选择器方法未定义2.2 容器越界 2.3 NSSetUncaughtExceptionHandler 1. Crash 应用崩溃是影响 APP 体验的重要一环&#xff0c; 而崩溃定位也常常让开发者头疼。Crash的出现就是做了一些违背代码规则的操作&#xff0c;常见crash类型有&#…

iOS crash 问题分析汇总

在这里插入图片描述 iOS crash 问题分析 iOS crash 常用分析工具IOS 崩溃日志 iOS crash 原因分析1.调用悬浮指针2.数组越界访问3.调用了未实现的方法4.调用的库函数版本高于本机5.返回空cell6.类释放时未remove通知&#xff0c;之后收到通知7.类释放时delegate未置空&#xf…

安装计算机一级出现appcrash,appcrash错误如何解决

APPCRASH是Vista和Win7中特有的故障&#xff0c;导出APPCRASH问题的原因有很多&#xff0c;恶意插件&#xff0c;文件丢失或者文件错误等等。下面&#xff0c;我就给大家介绍一下APPCRASH问题的解决方法&#xff0c;有需要就一起来了解一下吧 如何解决APPCRASH错误问题呢&#…

06、app anr分析/crash/崩溃

1、anr ANR 全称&#xff1a;application not responding&#xff0c;即app无响应 分析思路&#xff1a;使用排除法去分析问题&#xff0c;对用的内容需要开发提供对应的日志监控&#xff0c;重现这个过程&#xff0c;去获取这个日志 2、crash 一般crash原因有以下几种 1&a…

Android程序Crash时的异常上报

转载请注明来源&#xff1a;http://blog.csdn.net/singwhatiwanna/article/details/17289479 前言 大家都知道&#xff0c;android应用不可避免的会发生crash&#xff0c;无论你的程序写的多完美&#xff0c;总是无法完全避免crash的发生&#xff0c;可能是由于android系统底层…

iOS Crash报告分析

文章目录 相关概念什么是 dSYM 文件dSYM 文件有什么作用 分析crash报告解析工具 umcrashtool 相关概念 什么是 dSYM 文件 Xcode编译项目后&#xff0c;我们会看到一个同名的 dSYM 文件&#xff0c;dSYM 是保存 16 进制函数地址映射信息的中转文件&#xff0c;我们调试的 symb…

Android 平台的Crash崩溃捕获-全

上层-java/kotlin&#xff1a; Android应用层java/kotlin的crash捕获相对容易。直接实现Thread.UncaughtExceptionHandler即可处理收集。Thread.UncaughtExceptionHandler&#xff1a;当某一线程因未捕获的异常而即将终止时&#xff0c;Java 虚拟机将使用 Thread.getUncaughtE…

服务器appcrash的问题怎么修复,电脑appcrash的问题怎么修复?

电脑是很复杂的程序代码设计的&#xff0c;因而有时会遇到一些奇怪的问题&#xff0c;而APPCRASH错误也是其中一种&#xff0c;如运行程序出现APPCRASH错误&#xff0c;我们在日志中查看事件名称为APPCRASH&#xff0c;这时很多朋友不知道怎么解决&#xff0c;下面小编和大家一…

iOS中“事件”的前因后果

iOS的事件是一个由触发行为到响应的过程。本文旨在表达事件如何处理响应&#xff0c;如何传递事件的。 1. 前言 国内智能手机要从2000年开始说起&#xff0c;手机的进化是飞速的&#xff0c;单从操作来看&#xff0c;最开始是数字实体键盘&#xff0c;后来出现了全字母的实体键…

AppCrash explorer问题(解决方法)

AppCrash 顾名思义 程序崩溃了 先上问题&#xff1a; 资源管理器不断地显示停止工作&#xff08;关闭后10s又出来报错&#xff09; 我也在网上找了很多资料&#xff0c;还去Google搜了一下&#xff0c;但我的错误和dll这个无关&#xff0c;修改注册表等方法都无法解决此问题&a…

win7 APPCRASH问题解决!

真是废了老劲了。。什么清理插件&#xff0c;各种运行msconfig/启动都试了 问题&#xff1a;**.exe已停止工作 问题事件名称: APPCRASH 应用程序名: compute_image_mean.exe 应用程序版本: 0.0.0.0 应用程序时间戳: 579c50f5 故障模块名称: MSVCR120.dll 故障模块版本: 12.0.21…

mysql安装appcrash_appcrash事件怎么解决-appcrash问题解决方法 - 系统家园

在电脑上运行程序的时候常常会遇到很多的问题然后提示appcrash错误&#xff0c;为此下面就给你们带来了appcrash问题解决方法&#xff0c;一直遇到这个问题的小伙伴就快来解决一下吧。 appcrash事件怎么解决&#xff1a; 方法一&#xff1a; 1、出现appcrash错误会提示给你故障…