YOLOv5-4.0-google_utils.py 源代码导读

article/2025/11/7 20:56:49

YOLOv5介绍

YOLOv5为兼顾速度与性能的目标检测算法。笔者将在近期更新一系列YOLOv5的代码导读博客。YOLOv5为2021.1.5日发布的4.0版本。
YOLOv5开源项目github网址
本博客导读的代码为utils文件夹下的google_utils.py文件,更新日期为2021.1.14.

google_utils.py

该文件负责从github/googleleaps/google drive等网站下下载所需要的的一些文件。
相关导入模块及说明如下所示。

#谷歌云对应的链接
# Google utils: https://cloud.google.com/storage/docs/reference/librariesimport os          #与操作系统交互的模块
import platform    #提供获取操作系统相关信息的模块
import subprocess  #子进程定义及操作的模块
import time        #获取系统时间的模块
from pathlib import Path  #使字符串路径易于操作的模块import requests   #通过urllib3实现自动发送HTTP/1.1请求的第三方模块
import torch      #pytorch模块

gsutil_getsize 函数用于返回网站链接对应文件的大小

def gsutil_getsize(url=''):# gs://bucket/file size https://cloud.google.com/storage/docs/gsutil/commands/du#创建一个子进程在命令行执行 gsutil du url命令s = subprocess.check_output(f'gsutil du {url}', shell=True).decode('utf-8')return eval(s.split(' ')[0]) if len(s) else 0  # 返回文件的byte大小

attempt_download 函数实现 从几个云平台下载预训练模型

def attempt_download(file, repo='ultralytics/yolov5'):#如果对应的文件不存在 则尝试下载# .strip()删除字符串前后的空格 /n /t等 .replace()将'替换为空格 .lower()将字符串全部转换为小写 Path()将str转换为Path对象file = Path(str(file).strip().replace("'", '').lower())if not file.exists(): #如果这个文件路径 不存在文件try:# 利用github api 获取最新版本相关信息 这里response是一个大字典response = requests.get(f'https://api.github.com/repos/{repo}/releases/latest').json()# response['assets']为包含多个字典的列表 其中记录了每一个asset相关的信息assets = [x['name'] for x in response['assets']]  # release assets, i.e. ['yolov5s.pt', 'yolov5m.pt', ...]tag = response['tag_name']  # 当前版本信息i.e. 'v4.0'except:  # 退而求其次的计划 利用git命令强行补齐信息assets = ['yolov5.pt', 'yolov5.pt', 'yolov5l.pt', 'yolov5x.pt']tag = subprocess.check_output('git tag', shell=True).decode('utf-8').split('\n')[-2]name = file.name #返回路径最后的文件名称或路径名称if name in assets:# msg 为定义无法下载文件的错误信息msg = f'{file} missing, try downloading from https://github.com/{repo}/releases/'redundant = False  # second download optiontry:  # 尝试从Github上下载文件 url为文件的精确链接url = f'https://github.com/{repo}/releases/download/{tag}/{name}'print(f'Downloading {url} to {file}...')torch.hub.download_url_to_file(url, file)assert file.exists() and file.stat().st_size > 1E6  # 检查文件是否已经完成下载except Exception as e:  # 尝试从googleleaps(云服务器)上下载模型print(f'Download error: {e}')assert redundant, 'No secondary mirror'url = f'https://storage.googleapis.com/{repo}/ckpt/{name}'print(f'Downloading {url} to {file}...')os.system(f'curl -L {url} -o {file}')  # torch.hub.download_url_to_file(url, weights)finally:if not file.exists() or file.stat().st_size < 1E6:  # 检查文件是否存在 或大小小于10的6次方位file.unlink(missing_ok=True)  # 移除部分下载的文件print(f'ERROR: Download failure: {msg}')#打印错误信息print('')return

gdrive_download 函数用于从google drive上下载压缩文件

def gdrive_download(id='16TiPfZj7htmTyhntwcZyEEAejOUxuT6m', file='tmp.zip'):# 从Google Drive上下载文件 from yolov5.utils.google_utils import *; gdrive_download()t = time.time()file = Path(file)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# Attempt file downloadout = "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'):  # 如果文件较大 则需令牌才能够下载s = f'curl -Lb ./cookie "drive.google.com/uc?export=download&confirm={get_token()}&id={id}" -o {file}'else:  # 如果文件较小s = f'curl -s -L -o {file} "drive.google.com/uc?export=download&id={id}"'r = os.system(s)  # 执行命令并获得返回 如果cmd命令执行成功 则os.system()命令会返回0cookie.unlink(missing_ok=True)  # 再次移除已经存在的cookie# 下载错误检查if r != 0:file.unlink(missing_ok=True)  #移除部分下载的文件print('Download error ')  # raise Exception('Download error')return r# 如果是压缩文件则解压 .suffix方法为获取Path对象的后缀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

get_token 函数用于从cookie文件中获取令牌

def get_token(cookie="./cookie"): #这里是从cookie中获取令牌(token)with open(cookie) as f:for line in f:if "download" in line:return line.split()[-1]return ""

attempt_download 函数中,用github api 获得的response 变量结构如下:
github api
由此可见response是一个字典,其中的assets键对应的值为嵌套列表,其中包含每一个asset对应的详细信息。asset中主要包含官方的预训练模型。


http://chatgpt.dhexx.cn/article/9YHiAi7x.shtml

相关文章

只有一个源视频的Deepfakes简介

Deepfakes 简介 Deepfakes 是人工智能生成的任何人或名人的合成视频&#xff0c;它冒充真实的人&#xff0c;并让他们采取行动或说出他们从未做过的任何事情。 Deepfake 的创建过程在技术上很复杂&#xff0c;通常需要大量数据&#xff0c;然后将这些数据输入神经网络以训练和生…

Gmail文件工具:gDrive

用Gmail的空间来进行文件存储已经不是什么新鲜事了&#xff0c;Linux下有GmailFS&#xff0c;Windows下也有Gmail Driver。但是它们跟gDrive比起来&#xff0c;就实在是相形见拙了。gDrive是一个基于libgmailer的PHP脚本&#xff0c;当前版本为0.6。它可以利用Gmail的空间提供强…

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

目录 前言0、导入需要的包1、gsutil_getsize2、safe_download、attempt_download2.1、safe_download2.2、attempt_download 3、get_token、gdrive_download&#xff08;没使用&#xff09;3.1、get_token3.2、gdrive_download 4、作者注释的函数总结 前言 源码&#xff1a; YO…

千呼万唤始出来 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;后来出现了全字母的实体键…