"""
Download utils
"""
import os
import platform
import subprocess
import time
import urllib
from pathlib import Path
from zipfile import ZipFile
import requests
import torch
def gsutil_getsize(url=''):
s = subprocess.check_output(f'gsutil du {url}', shell=True).decode('utf-8')
return eval(s.split(' ')[0]) if len(s) else 0
def safe_download(file, url, url2=None, min_bytes=1E0, error_msg=''):
file = Path(file)
assert_msg = f"Downloaded file '{file}' does not exist or size is < min_bytes={min_bytes}"
try:
print(f'Downloading {url} to {file}...')
torch.hub.download_url_to_file(url, str(file))
assert file.exists() and file.stat().st_size > min_bytes, assert_msg
except Exception as e:
file.unlink(missing_ok=True)
print(f'ERROR: {e}\nRe-attempting {url2 or url} to {file}...')
os.system(f"curl -L '{url2 or url}' -o '{file}' --retry 3 -C -")
finally:
if not file.exists() or file.stat().st_size < min_bytes:
file.unlink(missing_ok=True)
print(f"ERROR: {assert_msg}\n{error_msg}")
print('')
def attempt_download(file, repo='ultralytics/yolov5'):
file = Path(str(file).strip().replace("'", ''))
if not file.exists():
name = Path(urllib.parse.unquote(str(file))).name
if str(file).startswith(('http:/', 'https:/')):
url = str(file).replace(':/', '://')
file = name.split('?')[0]
if Path(file).is_file():
print(f'Found {url} locally at {file}')
else:
safe_download(file=file, url=url, min_bytes=1E5)
return file
file.parent.mkdir(parents=True, exist_ok=True)
try:
response = requests.get(f'https://api.github.com/repos/{repo}/releases/latest').json()
assets = [x['name'] for x in response['assets']]
tag = response['tag_name']
except:
assets = ['yolov5n.pt', 'yolov5s.pt', 'yolov5m.pt', 'yolov5l.pt', 'yolov5x.pt',
'yolov5n6.pt', 'yolov5s6.pt', 'yolov5m6.pt', 'yolov5l6.pt', 'yolov5x6.pt']
try:
tag = subprocess.check_output('git tag', shell=True, stderr=subprocess.STDOUT).decode().split()[-1]
except:
tag = 'v6.0'
if name in assets:
safe_download(file,
url=f'https://github.com/{repo}/releases/download/{tag}/{name}',
min_bytes=1E5,
error_msg=f'{file} missing, try downloading from https://github.com/{repo}/releases/')
return str(file)
def gdrive_download(id='16TiPfZj7htmTyhntwcZyEEAejOUxuT6m', file='tmp.zip'):
t = time.time()
file = Path(file)
cookie = Path('cookie')
print(f'Downloading https://drive.google.com/uc?export=download&id={id} as {file}... ', end='')
file.unlink(missing_ok=True)
cookie.unlink(missing_ok=True)
out = "NUL" if platform.system() == "Windows" else "/dev/null"
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)
cookie.unlink(missing_ok=True)
if r != 0:
file.unlink(missing_ok=True)
print('Download error ')
return r
if file.suffix == '.zip':
print('unzipping... ', end='')
ZipFile(file).extractall(path=file.parent)
file.unlink()
print(f'Done ({time.time() - t:.1f}s)')
return r
def get_token(cookie="./cookie"):
with open(cookie) as f:
for line in f:
if "download" in line:
return line.split()[-1]
return ""