diff --git a/ultralytics/engine/model.py b/ultralytics/engine/model.py index 1da36ffc6df..22b1294e599 100644 --- a/ultralytics/engine/model.py +++ b/ultralytics/engine/model.py @@ -12,7 +12,7 @@ from ultralytics.utils import (ASSETS, DEFAULT_CFG, DEFAULT_CFG_DICT, DEFAULT_CFG_KEYS, LOGGER, RANK, callbacks, emojis, yaml_load) from ultralytics.utils.checks import check_file, check_imgsz, check_pip_update_available, check_yaml -from ultralytics.utils.downloads import GITHUB_ASSET_STEMS +from ultralytics.utils.downloads import GITHUB_ASSETS_STEMS from ultralytics.utils.torch_utils import smart_inference_mode @@ -86,7 +86,7 @@ def __init__(self, model: Union[str, Path] = 'yolov8n.pt', task=None) -> None: # Load or create new YOLO model suffix = Path(model).suffix - if not suffix and Path(model).stem in GITHUB_ASSET_STEMS: + if not suffix and Path(model).stem in GITHUB_ASSETS_STEMS: model, suffix = Path(model).with_suffix('.pt'), '.pt' # add suffix, i.e. yolov8n -> yolov8n.pt if suffix in ('.yaml', '.yml'): self._new(model, task) diff --git a/ultralytics/hub/utils.py b/ultralytics/hub/utils.py index 2241a2310bb..e469987aed9 100644 --- a/ultralytics/hub/utils.py +++ b/ultralytics/hub/utils.py @@ -13,7 +13,7 @@ from ultralytics.utils import (ENVIRONMENT, LOGGER, ONLINE, RANK, SETTINGS, TESTS_RUNNING, TQDM_BAR_FORMAT, TryExcept, __version__, colorstr, get_git_origin_url, is_colab, is_git_dir, is_pip_package) -from ultralytics.utils.downloads import GITHUB_ASSET_NAMES +from ultralytics.utils.downloads import GITHUB_ASSETS_NAMES PREFIX = colorstr('Ultralytics HUB: ') HELP_MSG = 'If this issue persists please visit https://github.com/ultralytics/hub/issues for assistance.' @@ -197,7 +197,7 @@ def __call__(self, cfg): if len(self.events) < 25: # Events list limited to 25 events (drop any events past this) params = { **self.metadata, 'task': cfg.task, - 'model': cfg.model if cfg.model in GITHUB_ASSET_NAMES else 'custom'} + 'model': cfg.model if cfg.model in GITHUB_ASSETS_NAMES else 'custom'} if cfg.mode == 'export': params['format'] = cfg.format self.events.append({'name': cfg.mode, 'params': params}) diff --git a/ultralytics/utils/downloads.py b/ultralytics/utils/downloads.py index 08243250f14..f598e8d026e 100644 --- a/ultralytics/utils/downloads.py +++ b/ultralytics/utils/downloads.py @@ -15,15 +15,17 @@ from ultralytics.utils import LOGGER, TQDM_BAR_FORMAT, checks, clean_url, emojis, is_online, url2file -GITHUB_ASSET_NAMES = [f'yolov8{k}{suffix}.pt' for k in 'nsmlx' for suffix in ('', '6', '-cls', '-seg', '-pose')] + \ - [f'yolov5{k}u.pt' for k in 'nsmlx'] + \ - [f'yolov3{k}u.pt' for k in ('', '-spp', '-tiny')] + \ - [f'yolo_nas_{k}.pt' for k in 'sml'] + \ - [f'sam_{k}.pt' for k in 'bl'] + \ - [f'FastSAM-{k}.pt' for k in 'sx'] + \ - [f'rtdetr-{k}.pt' for k in 'lx'] + \ - ['mobile_sam.pt'] -GITHUB_ASSET_STEMS = [Path(k).stem for k in GITHUB_ASSET_NAMES] +# Define Ultralytics GitHub assets maintained at https://github.com/ultralytics/assets +GITHUB_ASSETS_REPO = 'ultralytics/assets' +GITHUB_ASSETS_NAMES = [f'yolov8{k}{suffix}.pt' for k in 'nsmlx' for suffix in ('', '6', '-cls', '-seg', '-pose')] + \ + [f'yolov5{k}u.pt' for k in 'nsmlx'] + \ + [f'yolov3{k}u.pt' for k in ('', '-spp', '-tiny')] + \ + [f'yolo_nas_{k}.pt' for k in 'sml'] + \ + [f'sam_{k}.pt' for k in 'bl'] + \ + [f'FastSAM-{k}.pt' for k in 'sx'] + \ + [f'rtdetr-{k}.pt' for k in 'lx'] + \ + ['mobile_sam.pt'] +GITHUB_ASSETS_STEMS = [Path(k).stem for k in GITHUB_ASSETS_NAMES] def is_url(url, check=True): @@ -327,7 +329,7 @@ def get_github_assets(repo='ultralytics/assets', version='latest', retry=False): version = f'tags/{version}' # i.e. tags/v6.2 url = f'https://api.github.com/repos/{repo}/releases/{version}' r = requests.get(url) # github api - if r.status_code != 200 and retry: + if r.status_code != 200 and r.reason != 'rate limit exceeded' and retry: # failed and not 403 rate limit exceeded r = requests.get(url) # try again if r.status_code != 200: LOGGER.warning(f'⚠️ GitHub assets check failure for {url}: {r.status_code} {r.reason}') @@ -358,24 +360,16 @@ def attempt_download_asset(file, repo='ultralytics/assets', release='v0.0.0'): LOGGER.info(f'Found {clean_url(url)} locally at {file}') # file already exists else: safe_download(url=url, file=file, min_bytes=1E5) - return file - # GitHub assets - assets = GITHUB_ASSET_NAMES - try: + elif repo == GITHUB_ASSETS_REPO and name in GITHUB_ASSETS_NAMES: + safe_download(url=f'https://github.com/{repo}/releases/download/{release}/{name}', file=file, min_bytes=1E5) + + else: tag, assets = get_github_assets(repo, release) - except Exception: - try: + if not assets: tag, assets = get_github_assets(repo) # latest release - except Exception: - try: - tag = subprocess.check_output(['git', 'tag']).decode().split()[-1] - except Exception: - tag = release - - file.parent.mkdir(parents=True, exist_ok=True) # make parent dir (if required) - if name in assets: - safe_download(url=f'https://github.com/{repo}/releases/download/{tag}/{name}', file=file, min_bytes=1E5) + if name in assets: + safe_download(url=f'https://github.com/{repo}/releases/download/{tag}/{name}', file=file, min_bytes=1E5) return str(file)