当前位置: 首页>行业 >

要闻速递:《YOLOv5全面解析教程》​十三,downloads.py 详细解析

来源: | 时间: 2023-01-02 16:50:49 |

前言

代码仓库地址: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 详细解析

前言❝代码仓库地址:https: github com Oneflow-Inc one-yolov5欢迎starone-yolov5项目获取最新的动态。如

2023-01-02

株洲市优惠产假最新天数

产假最多休158天,包括法定产假98天以及地方规定60天。

2023-01-02

快报:新疆阿克苏改善生态环境——戈壁滩变身“金果园”

“900箱苹果,已装运发车!”2022年12月21日,果农侯佳望着逐渐远去的货车,对电话那端的成都采购商兴奋地说道。侯佳在新疆阿克苏种苹果已20年

2023-01-01

“急功近利”的黄磊,终将付出代价 世界看热讯

黄磊的人生,颇有些传奇色彩。当演员并非他最初的本意,而且十分抵触,结果却事与愿违。来不及学表演就被陈凯歌“赶鸭子上架”,拉去拍电影。

2022-12-31

中建集团发布《中国建筑碳达峰行动方案》-焦点滚动

中建集团12月30日发布《中国建筑碳达峰行动方案》,将推动建造方式变革,加快探索绿色建造、智慧建造及工业化建造等新型建造方式,对传统业务

2022-12-30

通力科技跌4.5%创新低 超募2.1亿安信证券赚0.5亿|当前简讯

中国经济网北京12月30日讯今日,通力科技(301255 SZ)股价创新低,盘中最低报34 09元,截至收盘报34 25元,下跌4 54%,总市值23 29亿元。目前,

2022-12-30

ST泰禾:监管层对上市公司的强制退市有明确的制度规定|当前视点

ST泰禾(000732)12月30日在投资者关系平台上答复了投资者关心的问题。

2022-12-30

“数字资产创新探索计划”发布首批成果 “数元”多模态数字资源综合平台正式上线

12月29日,“数字资产创新探索计划”在第六届可信区块链峰会上正式启动。该计划由中国信通院、中科院计算机网络信息中心、国

2022-12-30

天天即时:Mysteel解读:棉价稳中偏强,仓单数量骤增

进入12月下旬,新疆棉已大量上市,国内现货价格持稳,市场交投一般;下游棉纱交投较前期有所放缓,纺企停产增多,开机率明显下滑,预期兑现需

2022-12-30

武汉汉秀具体演出地点在哪里?

武汉汉秀具体演出地点在哪里?答:演出地点在湖北省武汉市武昌区水果湖街东湖路138号-2栋(楚河汉街东端汉秀剧场)汉秀”有哪些特效表演?特效

2022-12-29

方城县凤瑞街道:抓实“五星”支部创建 推动基层治理“加速跑”

今年以来,方城县凤瑞街道将创建“五星”支部列为“书记工程”,扎实开展创建活动,凝聚党建合力,推动基层治理“加速跑”。据统计,2022年,

2022-12-29

热讯:冬至都过了,北半球的日照越来越长,为什么天气却越来越冷了呢?

当太阳辐射给地球表面加热的时候,其实地球表面同时也在向太空辐射出热量。

2022-12-29

快看:乌国家核电公司:乌控区域内9台核电机组满负荷运行

据央视新闻消息,乌克兰国家核电公司12月28日宣布,在乌克兰控制区域内的所有3座核电站的9台机组都在以最大容量运行,这些核电站包括罗夫诺核

2022-12-29

世界快报:索菲亚:12月28日融券卖出金额57.35万元,占当日流出金额的0.67%

同花顺数据中心显示,索菲亚12月28日获融资买入1039 73万元,占当日买入金额的15 22%,当前融资余额2 21亿元,占流通市值的1 87%,低于历史40%

2022-12-29

Go定时器的三种实现方式

很多时候需要周期性的执行某些操作,就需要用到定时器。定时器有三种思路。Sleep使用休眠,让当前Goroutine休眠一定的时间来实现定时的效果,

2022-12-29

世界热点!这一冷门板块大爆发!

这一冷门板块大爆发!

2022-12-28

A股震荡收跌,电力旅游强势上行,关注安全与创新、疫后修复两条主线

12月28日,A股三大指数集体低开,早盘市场探底后回升,深成指、创业板指一度跌超1%;午后A股再度陷入低迷,市场震荡走弱,三大指数全线收跌。

2022-12-28

热点!光伏股早盘集体走高,截至发稿,信义能源(03868.HK)涨9.33%,报2.46港元

光伏股早盘集体走高,截至发稿,信义能源涨9 33%,报2 46港元;协鑫新能源(00451 HK)涨7 44%,报1 3港元;信义光能(00968 HK)涨7 34%,报8 77

2022-12-28

环球聚焦:四大坚果分别是指什么?

栗子、核桃、杏仁、松子、榛子等坚果营养丰富,而且每种坚果的营养成分都不同,除了根据个人的口味喜好进行选择外,我们还可以根据身体状况和

2022-12-28

当前速读:正邦科技: 第七届监事会第五次会议决议公告

正邦科技:第七届监事会第五次会议决议公告

2022-12-27

资讯

北京推出14条秋游文化线路

金秋时节,北京市文化和旅游局以赏银杏品文化为主题,推出14条“叶落的季节——漫步北京赏银杏品文化主题线路”,邀市民和游客以步行、骑行

2021-10-27     
基因编辑发力 培育高质量人源化供体猪

此次人体试验,仅仅验证了基因编辑猪克服异种器官移植的超急性排斥反应,还需解决延迟性排斥反应、消耗性血栓等问题。但通过这次试验,能更

2021-10-27     
中国经济高质量发展步伐稳健 长期向好基本面未变

在全球疫情走势和经济走势趋于复杂的背景下,中国经济巨轮将驶向何方,举世关注。2020年10月26日至29日,党的十九届五中全会在京举行,明确

2021-10-27     
南美解放者杯决赛允许近4.5万观众入场

南美洲足联主席多明格斯25日与今年解放者杯决赛对阵的两支俱乐部负责人会晤,宣布决赛现场观众人数增加到球场容量的75%,即近4 5万人。今年

2021-10-27     
22年从警生涯 面对荣誉他说不要给我报功

9月24日,时任安徽省安庆市公安局迎江分局刑警大队大要案中队中队长周磊因在工作中激烈搏斗引发心源性猝死,倒在了工作岗位上,经医院抢救

2021-10-27     
走近冬奥|五棵松体育中心场馆“黑科技”全面上岗 助力冬

“相约北京”冰球国内测试活动将于2021年11月7日至10日在五棵松体育中心场馆举行,在疫情防控方面,场馆引入了诸多“黑科技”,为防疫安全

2021-10-27