《YOLOv5全面解析教程》​十三,downloads.py 详细解析
2023-01-02 16:26:36 来源:
前言

代码仓库地址:https://github.com/Oneflow-Inc/one-yolov5欢迎star one-yolov5项目 获取最新的动态。如果您有问题,欢迎在仓库给我们提出宝贵的意见。如果对您有帮助,欢迎来给我Star呀~

源码解读:utils/augmentations.py

这个文件主要是负责从github/googleleaps/google drive 等网站或者云服务器上下载所需的一些文件。由于微信会吃掉一些超链接影响阅读,欢迎大家查看原始文档网站解读文章:https://start.oneflow.org/oneflow-yolo-doc/source_code_interpretation/utils/downloads_py.html


(资料图片仅供参考)

是一个工具类,代码比较简单,函数也比较少,主要难点还是在于一些包可能大家不是很熟悉,下面一起来学习下。

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

1. 导入需要的包

"""Downloadutils"""importos#与操作系统进行交互的模块importplatform#提供获取操作系统相关信息的模块importshutil#Python的高阶文件操作模块importsubprocess#子进程定义及操作的模块importtime#时间模块importurllib#用于操作网页url并对网页的内容进行抓取处理如urllib.parse:解析urlfrompathlibimportPath#Path将str转换为Path对象使字符串路径易于操作的模块fromzipfileimportZipFile#导入文件解压模块importoneflowasflow#导入深度学习框架oneflow包importrequests#通过urllib3实现自动发送HTTP/1.1请求的第三方模块

2. gsutil_getsize

这个函数是用来返回网站链接 url 对应文件的大小。

defgsutil_getsize(url=""):"""用在downloads.py的print_mutation函数当中计算某个url对应的文件大小用于返回网站链接url对应文件的大小,注意单位是bytesgs://bucket/filesizehttps://cloud.google.com/storage/docs/gsutil/commands/du"""#创建一个子进程在命令行执行gsutilduurl命令(访问CloudStorage)返回执行结果(文件)#gs://bucket/filesizehttps://cloud.google.com/storage/docs/gsutil/commands/dus=subprocess.check_output(f"gsutildu{url}",shell=True).decode("utf-8")returneval(s.split("")[0])iflen(s)else0#bytes

3. safe_download、attempt_download

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

one-yolov5 仓库中 attempt_download 函数调用 safe_download 函数。

3.1 safe_download

这个函数是用来下载 url(github) 或者 url2(谷歌云服务器) 网页路径对应的文件,

通常是下载权重文件,经常用在 attempt_download 函数中,代码如下:

defsafe_download(file,url,url2=None,min_bytes=1e0,error_msg=""):"""经常用在attempt_download函数中,也可以单独使用下载url/url2网页路径对应的文件Attemptstodownloadfilefromurlorurl2,checksandremovesincompletedownloadsmin_bytes,assert_msg#checkexceptExceptionase:#url2url1不行就尝试从url2中下载文件一般是googleleaps(云服务器)#移除之前下载失败的不完整文件file.unlink(missing_ok=True)#removepartialdownloadsprint(f"ERROR:{e}\nRe-attempting{url2orurl}to{file}...")os.system(f"curl-L"{url2orurl}"-o"{file}"--retry3-C-")#curldownload,retryandresumeonfailfinally:#检查文件是否下载下来了或文件大小是否小于min_bytesifnotfile.exists()orfile.stat().st_size

url="https://github.com/Oneflow-Inc/one-yolov5/releases/download/v1.0.0/model_comparison.png"safe_download("op.png",url)

Downloading https://github.com/Oneflow-Inc/one-yolov5/releases/download/v1.0.0/model_comparison.png to op.png...  0%|          | 0.00/118k [00:00

fromPILimportImagedisplay(Image.open("op.png"))#显示下载的图片

image
3.2 attempt_download

这个函数是实现从几个云平台 (github/googleleaps云服务器/xxx) 下载文件(在one-yolov5中一般是预训练模型),

会调用上面的 safe_download 函数。会用在 experimental.py 中的 attempt_load 函数和 train.py 中,都是用来下载预训练权重。代码详解如下:

defattempt_download(file,repo="Oneflow-Inc/one-yolov5"):#fromutils.downloadsimport*;attempt_download()"""用在attempt_download函数中下载url/url2网页路径对应的文件Attemptstodownloadfilefromurlorurl2,checksandremovesincompletedownloads:/#name:要下载的文件名file=name.split("?")[0]#parseauthenticationhttps://url.com/file.txt?auth...#如果文件已经在本地存在了就不用下载了ifPath(file).is_file():print(f"Found{url}locallyat{file}")#filealreadyexistselse:safe_download(file=file,url=url,min_bytes=1e5)#下载文件returnfile#GitHubassetsfile.parent.mkdir(parents=True,exist_ok=True)#makeparentdir(ifrequired)try:#利用githubapi获取最新的版本相关信息这里的response是一个字典response=requests.get(f"https://api.github.com/repos/{repo}/releases/latest").json()#githubapiassets=[x["name"]forxinresponse["assets"]]#releaseassets,i.e.["yolov5s","yolov5m",...]tag=response["tag_name"]#i.e."v1.0"except:#fallbackplan获取失败就退而求其次直接利用git命令强行补齐版本信息assets=["yolov5n.zip","yolov5s.zip","yolov5m.zip","yolov5l.zip","yolov5x.zip","yolov5n6.zip","yolov5s6.zip","yolov5m6.zip","yolov5l6.zip","yolov5x6.zip",]try:#创建一个子进程在命令行执行gittag命令(返回版本号版本号信息一般在字典最后一个-1)返回执行结果(版本号tag)tag=subprocess.check_output("gittag",shell=True,stderr=subprocess.STDOUT).decode().split()[-1]except:#如果还是失败就强行自己补一个版本号tag="v1.1",比如这里在one-yolov5中直接补当前的最新版本v1.1.tag="v1.1"#currentreleaseif".zip"notinname:name=name+".zip"file=Path(name)ifnameinassets:safe_download(file,url=f"https://github.com/{repo}/releases/download/{tag}/{name}",#url2=f"https://storage.googleapis.com/{repo}/ckpt/{name}",#backupurl(optional)min_bytes=1e5,error_msg=f"{file}missing,trydownloadingfromhttps://github.com/{repo}/releases/",)if".zip"inname:new_dir=Path(name[:-4])else:new_dir=Path(name)ifnotos.path.exists(new_dir):#判断文件夹是否存在os.mkdir(new_dir)#新建文件夹if".zip"inname:print("unzipping...",end="")#ZipFile(new_file).extractall(path=file.parent)#unzipf=ZipFile(file)f.extractall(new_dir)os.remove(file)#removeziptmp_dir="/tmp/oneyolov5"ifos.path.isdir(tmp_dir):shutil.rmtree(tmp_dir)if".zip"inname:path1=os.path.join(name[:-4],name[:-4])else:path1=os.path.join(name,name)shutil.copytree(path1,tmp_dir)shutil.rmtree(new_dir)shutil.copytree(tmp_dir,new_dir)shutil.rmtree(tmp_dir)returnstr(file)

attempt_download("yolov5n")

Downloading https://github.com/Oneflow-Inc/one-yolov5/releases/download/v1.0.0/yolov5n.zip to yolov5n.zip...  0%|          | 0.00/3.53M [00:00

4. get_token & gdrive_download(没使用)

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

4.1 get_token

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

get_token函数代码:

defget_token(cookie="./cookie"):"""在gdrive_download中使用实现从cookie中获取令牌token"""withopen(cookie)asf:forlineinf:if"download"inline:returnline.split()[-1]return""

4.2 gdrive_download

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

gdrive_download函数代码:

defgdrive_download(id="16TiPfZj7htmTyhntwcZyEEAejOUxuT6m",file="tmp.zip"):"""实现从googledrive上下载压缩文件并将其解压,再删除掉压缩文件:paramsid:url的?后面的id参数的参数值:paramsfile:需要下载的压缩文件名"""t=time.time()#获取当前时间file=Path(file)#Path将str转换为Path对象cookie=Path("cookie")#gdrivecookieprint(f"Downloadinghttps://drive.google.com/uc?export=download&id={id}as{file}...",end="")file.unlink(missing_ok=True)#移除已经存在的文件(可能是下载失败/下载不完整的文件)cookie.unlink(missing_ok=True)#移除已经存在的cookie#尝试下载压缩文件out="NUL"ifplatform.system()=="Windows"else"/dev/null"#使用cmd命令从googledrive上下载文件os.system(f"curl-c./cookie-s-L"drive.google.com/uc?export=download&id={id}">{out}")ifos.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则下载错误ifr!=0:file.unlink(missing_ok=True)#下载错误移除下载的文件(可能不完整或者下载失败)print("Downloaderror")#raiseException("Downloaderror")returnr#如果是压缩文件就解压file.suffix方法可以获取file文件的后缀iffile.suffix==".zip":print("unzipping...",end="")os.system(f"unzip-q{file}")#cmd命令执行解压命令file.unlink()#移除.zip压缩文件print(f"Done({time.time()-t:.1f}s)")#打印下载+解压过程所需要的时间returnr

总结

这个文件的代码比较少,真正有用的函数也比较少。

也就是safe_download和attempt_download两个函数比较重要,大家重点掌握这两个函数即可。

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

京东联盟年货节京享红包来袭,活动期间可抽到3、20.23、666、9999元等面额不等的随机面额红包,现金红包可用于京东平台购物抵现!无门槛全平台全品类实物商品可使用,下单时可与任何优惠(例如东券、京券、京豆等)叠加使用,一笔订单可同时叠加使用多个红包~

发放红包时间:2022 年 12 月 29 日 - 2023 年 1 月15 日;使用红包时间:2022 年 12 月 29 日 20:00:00-2023 年 1 月17 日。

活动期间用户每日通过如下页面随机抽取,每日可中奖3次,每日首次参与可能获得红包+优惠券双重利益点。未在京东下过单的用户参与活动将有机会获得神秘新客京享红包,更有专属福利购!

活动会在1 月 3 日、1 月 9 日、1 月 13 日开启红包加码,加码期间可获得额外的抽奖次数,可随机获得京东红包、品类东券或店铺券等奖励。加码奖励限量,发完即止,建议用户在加码节点整点,准时参与活动!

《YOLOv5全面解析教程》​十三,downloads.py 详细解析

2023-01-02

猕猴桃为什么会鼓起来?|焦点热讯

2023-01-02

菱角烂根是什么原因?

2023-01-01

环球今亮点!那么债权转让协议何时生效呢?

2022-12-31

请室内设计师如何避坑?从量房到完工,完整流程是怎样的?

2022-12-30

因得罪了华仔,被封杀八年,被粉丝当街泼粪,被女友抛弃

2022-12-30

【有料评测】HyperX ProCast声岚专业麦克风:超大镀金隔膜电容 专业度高_全球观点

2022-12-30

小米华星打破高端屏垄断,“旗舰性能之王”首发顶级2K中国屏_世界即时看

2022-12-30

随时随地接单工作 互联网大厂推出的众包兼职靠谱吗? 每日资讯

2022-12-30

云闪贷逾期1千会影响征信吗

2022-12-29

国中水务:公司参与北京汇源不良资产破产重整计划为财务性投资_环球热推荐

2022-12-29

湖南景区落实“新十条” 旅游出行热度直线“攀升”|头条焦点

2022-12-29

全球信息:安路科技:融资净买入133.53万元,融资余额4611.29万元(12-28)

2022-12-29

环球实时:安科生物(300009.SZ):安科恒益通过高新技术企业认定

2022-12-29

Go定时器的三种实现方式 当前短讯

2022-12-29

【环球聚看点】华通热力:截至本公告日 赵一波累计质押股数约为3335万股

2022-12-28

每日关注!关于迎接年的跨年说说句子 跨年唯美句子精选

2022-12-28

板材挤出再添强将,先锋动力 发泡挤出线全新上市

2022-12-28

当前最新:南威软件(603636)12月27日主力资金净卖出2108.51万元

2022-12-28

河北平乡:西红柿丰收采摘忙

2022-12-27

外汇天眼:Interactive Brokers推出定期投资工具

2022-12-27

BeyonCa荣获“第十六届中国汽车年会”2022年度价值投资潜力企业奖

2022-12-27

全球今热点:荣耀路由X4 Pro发布,Wi-Fi 6路由杀到169元还带三个千兆网口

2022-12-27

国电南瑞副董事长、董事胡江溢辞职_全球快资讯

2022-12-26

三星电子平泽新工厂等设施建设成本上升 增加超过1万亿韩元-环球热点评

2022-12-26

英诺特:12月23日获融资买入527.42万元,占当日流入资金比例13.67%-世界播报

2022-12-26

应急管理部派出工作组 指导新疆西部黄金伊犁公司金矿坍塌事故救援处置_天天快资讯

2022-12-25

从“抢单热”到“招工潮” 民营经济抢抓新机遇 全球新视野

2022-12-24

中际联合入选最新北京企业100强 最新消息

2022-12-23

蔡英文嫌“国安会议”好无聊?林鹤明痛批炒作

2022-12-23

失职致使在押人员脱逃的罪怎么量刑_世界简讯

2022-12-23

焦点速读:2023年初级会计有哪些资格审核方式

2022-12-22

新瀚新材:公司募投项目一车间、二车间及附属配套工程已完成项目中交

2022-12-22

国美易卡网贷9万逾期还不起会不会面临被对方起诉的风险_天天消息

2022-12-22

每日热文:缓解居民“发热焦虑”——社区开通“家庭医生”热线电话

2022-12-21

格力电器入局预制菜行业 再一次让预制菜跨界投资升温

2022-12-21

世界观点:光威复材(300699.SZ):信聿合伙累计减持1.2494%股份

2022-12-07

当前播报:ST摩登董秘回复:控股股东资金占用不会因为破产清算而解决

2022-12-06

快递保价纠纷频发的背后 快递物流业保价规则亟需官方出面制定

2022-09-15

印度黄金进口量上升至10年来的最高水平 销售几乎翻了一番

2022-03-21

卡地亚母公司历峰集团收入大涨35%至56.6亿欧元

2022-03-21

世界钻石巨头Alrosa 2021年全年收入同比上涨49%

2022-03-21

2021年戴比尔斯四季度毛坯钻产量同比上升15%

2022-03-21

2021年彩钻均价上涨1.7% 其中蓝钻表现最佳

2022-03-21

博茨瓦纳银行2021年毛坯钻销售额同比上涨63.5%

2022-03-21

2021年全年金银珠宝零售总额3041亿元同比上涨29.8%

2022-03-21

黄金消费饰品化、年轻化是本轮黄金首饰消费的支撑力所在

2022-03-21

西班牙轻奢珠宝品牌TOUS 2021财年营收同比上涨37%

2022-03-21

培育钻石上游不存在产能限制更适合细分功能赛道

2022-03-21

因钻石价格稳步上涨 钻石珠宝制造商面临史无前例的艰难时期

2022-03-20

我国珠宝行业产业链毛利率呈现“微笑曲线”

2022-03-20

黄金类产品毛利率与金价具有一定正相关性

2022-03-20

股价一跌再跌!迪阿股份股价创上市以来新低

2022-03-20

婚庆钻饰存量和时尚饰品市场双击下 培育钻石前景广阔

2022-03-20

成品钻价格大幅上涨 1克拉RAPI飙升6.9%

2022-03-20

门店密度测算:一线城市门店密度上限与城市GDP成正比

2022-03-20

澳大利亚阿盖尔矿关闭!世界第四大钻石矿寿命即将到期

2022-03-20

终端需求强劲 大克拉裸钻整体提价明显

2022-03-20

2022年钻石及其制品将持续涨价且有价有市

2022-03-20

钻石价格已上调0% 现在是购买钻石的最佳时机

2022-03-20

钻石价格突然飚涨 创下2011年以来最大单月涨幅纪录

2022-03-20

珠宝行业有望受益于黄金工艺改善带来的高景气度

2022-03-20

四季度印度零售商铂金饰品销售额同比上涨40%

2022-03-20

2021年彩钻均价上涨1.7%黄钻平均上涨0.9% 蓝钻表现最佳

2022-03-20

博茨瓦纳2021年毛坯钻销售额同比上涨63.5%

2022-03-20

颜值时代下 美妆珠宝饰品需求旺盛 行业高景气度持续

2022-03-20

2月份黄金珠宝GMV同比上涨49%港资品牌表现亮眼

2022-03-20

珠宝首饰板块指数报398.71点 涨幅达0.16%

2022-03-20

再贵的蜜蜡 你戴上照样是丑 把蜜蜡戴出时尚范的秘诀

2022-03-20

设计界的天才!德国纪念钻石品牌Ode将亮相中国展区

2022-03-20

女生戒指的戴法和意义是什么呢?

2022-03-20

男士戒指的佩戴法和意义是什么?

2022-03-20

商务部:今年以来我国消费市场呈现稳步恢复态势

2022-03-20

苏州疫情防控再升级:通过铁路离开苏州旅客须提供48小时内核酸检测阴性证明

2022-02-16

“江歌案”二审开庭 江秋莲因身体原因未出庭

2022-02-16

从收受500元开始 他走向深渊

2022-02-16

春季学期即将开学 海南要求校园常态化开展师生核酸检测

2022-02-16

辽宁葫芦岛:派出124名渔业执法人员进驻22座渔港 设立检测点

2022-02-16

葫芦岛昨日采集核酸样本105.5万人 新出现病例的封控小区每人每日单检

2022-02-16

辽宁葫芦岛:截至15日农村地区共居家隔离4029人

2022-02-16

辽宁葫芦岛2月15日新增15例确诊病例 均为绥中县报告

2022-02-16

内蒙古新增本土确诊病例7例

2022-02-16

辽宁葫芦岛新增15例本土确诊病例行程轨迹公布

2022-02-16

江苏新增本土确诊病例19例 其中苏州市18例、南通市1例

2022-02-16

广东新增本土确诊病例3例 均为深圳报告

2022-02-16

广西新增本土确诊病例2例 百色市报告

2022-02-16

上海浦东一厂区生产设备倒塌6人被困 搜救工作正在进行

2022-02-16

辽宁省新增15例本土新冠肺炎确诊病例 为葫芦岛市报告

2022-02-16

我国中东部地区将有一次明显雨雪天气过程

2022-02-16

北京今日晴冷继续“控场” 最高气温仍不足0℃

2022-02-16

云南新增1例本土无症状感染者

2022-02-16

内蒙古呼和浩特发现3例核酸检测阳性人员

2022-02-16

撸猫狗追大象 这届年轻人为什么那么喜欢动物

2022-02-16

喊父母回家上班:一道超越亲情的复杂考题

2022-02-16

医护人员追求“事业蒸蒸日上”哪里做错了

2022-02-16

男子饭局后猝死家属索赔 法院判决同桌人承担责任

2022-02-16

女子推倒性骚扰男子致其死亡不担责 认定属于正当防卫

2022-02-16

江西瑞昌警方打掉一境外“杀猪盘”电诈团伙

2022-02-16

“杀熟”猖獗,为何还有人不断入局?

2022-02-16

规范医生直播行为需要多管齐下

2022-02-16