diff --git a/hubconf.py b/hubconf.py index 86aa07b9466f..4e05149026b3 100644 --- a/hubconf.py +++ b/hubconf.py @@ -36,6 +36,7 @@ def _create(name, pretrained=True, channels=3, classes=80, autoshape=True, verbo if not verbose: LOGGER.setLevel(logging.WARNING) + check_requirements(exclude=('tensorboard', 'thop', 'opencv-python')) name = Path(name) path = name.with_suffix('.pt') if name.suffix == '' else name # checkpoint path @@ -65,63 +66,63 @@ def _create(name, pretrained=True, channels=3, classes=80, autoshape=True, verbo raise Exception(s) from e -def custom(path='path/to/model.pt', autoshape=True, verbose=True, device=None): +def custom(path='path/to/model.pt', autoshape=True, _verbose=True, device=None): # YOLOv5 custom or local model - return _create(path, autoshape=autoshape, verbose=verbose, device=device) + return _create(path, autoshape=autoshape, verbose=_verbose, device=device) -def yolov5n(pretrained=True, channels=3, classes=80, autoshape=True, verbose=True, device=None): +def yolov5n(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None): # YOLOv5-nano model https://github.com/ultralytics/yolov5 - return _create('yolov5n', pretrained, channels, classes, autoshape, verbose, device) + return _create('yolov5n', pretrained, channels, classes, autoshape, _verbose, device) -def yolov5s(pretrained=True, channels=3, classes=80, autoshape=True, verbose=True, device=None): +def yolov5s(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None): # YOLOv5-small model https://github.com/ultralytics/yolov5 - return _create('yolov5s', pretrained, channels, classes, autoshape, verbose, device) + return _create('yolov5s', pretrained, channels, classes, autoshape, _verbose, device) -def yolov5m(pretrained=True, channels=3, classes=80, autoshape=True, verbose=True, device=None): +def yolov5m(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None): # YOLOv5-medium model https://github.com/ultralytics/yolov5 - return _create('yolov5m', pretrained, channels, classes, autoshape, verbose, device) + return _create('yolov5m', pretrained, channels, classes, autoshape, _verbose, device) -def yolov5l(pretrained=True, channels=3, classes=80, autoshape=True, verbose=True, device=None): +def yolov5l(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None): # YOLOv5-large model https://github.com/ultralytics/yolov5 - return _create('yolov5l', pretrained, channels, classes, autoshape, verbose, device) + return _create('yolov5l', pretrained, channels, classes, autoshape, _verbose, device) -def yolov5x(pretrained=True, channels=3, classes=80, autoshape=True, verbose=True, device=None): +def yolov5x(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None): # YOLOv5-xlarge model https://github.com/ultralytics/yolov5 - return _create('yolov5x', pretrained, channels, classes, autoshape, verbose, device) + return _create('yolov5x', pretrained, channels, classes, autoshape, _verbose, device) -def yolov5n6(pretrained=True, channels=3, classes=80, autoshape=True, verbose=True, device=None): +def yolov5n6(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None): # YOLOv5-nano-P6 model https://github.com/ultralytics/yolov5 - return _create('yolov5n6', pretrained, channels, classes, autoshape, verbose, device) + return _create('yolov5n6', pretrained, channels, classes, autoshape, _verbose, device) -def yolov5s6(pretrained=True, channels=3, classes=80, autoshape=True, verbose=True, device=None): +def yolov5s6(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None): # YOLOv5-small-P6 model https://github.com/ultralytics/yolov5 - return _create('yolov5s6', pretrained, channels, classes, autoshape, verbose, device) + return _create('yolov5s6', pretrained, channels, classes, autoshape, _verbose, device) -def yolov5m6(pretrained=True, channels=3, classes=80, autoshape=True, verbose=True, device=None): +def yolov5m6(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None): # YOLOv5-medium-P6 model https://github.com/ultralytics/yolov5 - return _create('yolov5m6', pretrained, channels, classes, autoshape, verbose, device) + return _create('yolov5m6', pretrained, channels, classes, autoshape, _verbose, device) -def yolov5l6(pretrained=True, channels=3, classes=80, autoshape=True, verbose=True, device=None): +def yolov5l6(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None): # YOLOv5-large-P6 model https://github.com/ultralytics/yolov5 - return _create('yolov5l6', pretrained, channels, classes, autoshape, verbose, device) + return _create('yolov5l6', pretrained, channels, classes, autoshape, _verbose, device) -def yolov5x6(pretrained=True, channels=3, classes=80, autoshape=True, verbose=True, device=None): +def yolov5x6(pretrained=True, channels=3, classes=80, autoshape=True, _verbose=True, device=None): # YOLOv5-xlarge-P6 model https://github.com/ultralytics/yolov5 - return _create('yolov5x6', pretrained, channels, classes, autoshape, verbose, device) + return _create('yolov5x6', pretrained, channels, classes, autoshape, _verbose, device) if __name__ == '__main__': - model = _create(name='yolov5s', pretrained=True, channels=3, classes=80, autoshape=True, verbose=True) # pretrained + model = _create(name='yolov5s', pretrained=True, channels=3, classes=80, autoshape=True, verbose=True) # model = custom(path='path/to/model.pt') # custom # Verify inference diff --git a/train.py b/train.py index 876e1097e8e8..50501fc94091 100644 --- a/train.py +++ b/train.py @@ -54,7 +54,7 @@ from utils.loggers.wandb.wandb_utils import check_wandb_resume from utils.loss import ComputeLoss from utils.metrics import fitness -from utils.plots import check_font, plot_evolve, plot_labels +from utils.plots import plot_evolve, plot_labels from utils.torch_utils import EarlyStopping, ModelEMA, de_parallel, select_device, torch_distributed_zero_first LOCAL_RANK = int(os.getenv('LOCAL_RANK', -1)) # https://pytorch.org/docs/stable/elastic/run.html @@ -105,8 +105,6 @@ def train(hyp, opt, device, callbacks): # hyp is path/to/hyp.yaml or hyp dictio init_seeds(1 + RANK) with torch_distributed_zero_first(LOCAL_RANK): data_dict = data_dict or check_dataset(data) # check if None - if not is_ascii(data_dict['names']): # non-latin labels, i.e. asian, arabic, cyrillic - check_font('Arial.Unicode.ttf', progress=True) train_path, val_path = data_dict['train'], data_dict['val'] nc = 1 if single_cls else int(data_dict['nc']) # number of classes names = ['item'] if single_cls and len(data_dict['names']) != 1 else data_dict['names'] # class names diff --git a/utils/downloads.py b/utils/downloads.py index 23433cb4549f..776a8bba1755 100644 --- a/utils/downloads.py +++ b/utils/downloads.py @@ -3,6 +3,7 @@ Download utils """ +import logging import os import platform import subprocess @@ -23,27 +24,30 @@ def gsutil_getsize(url=''): def safe_download(file, url, url2=None, min_bytes=1E0, error_msg=''): # Attempts to download file from url or url2, checks and removes incomplete downloads < min_bytes + from utils.general import LOGGER + file = Path(file) assert_msg = f"Downloaded file '{file}' does not exist or size is < min_bytes={min_bytes}" try: # url1 - print(f'Downloading {url} to {file}...') - torch.hub.download_url_to_file(url, str(file)) + LOGGER.info(f'Downloading {url} to {file}...') + torch.hub.download_url_to_file(url, str(file), progress=LOGGER.level <= logging.INFO) assert file.exists() and file.stat().st_size > min_bytes, assert_msg # check except Exception as e: # url2 file.unlink(missing_ok=True) # remove partial downloads - print(f'ERROR: {e}\nRe-attempting {url2 or url} to {file}...') + LOGGER.info(f'ERROR: {e}\nRe-attempting {url2 or url} to {file}...') os.system(f"curl -L '{url2 or url}' -o '{file}' --retry 3 -C -") # curl download, retry and resume on fail finally: if not file.exists() or file.stat().st_size < min_bytes: # check file.unlink(missing_ok=True) # remove partial downloads - print(f"ERROR: {assert_msg}\n{error_msg}") - print('') + LOGGER.info(f"ERROR: {assert_msg}\n{error_msg}") + LOGGER.info('') def attempt_download(file, repo='ultralytics/yolov5'): # from utils.downloads import *; attempt_download() # Attempt file download if does not exist - file = Path(str(file).strip().replace("'", '')) + from utils.general import LOGGER + file = Path(str(file).strip().replace("'", '')) if not file.exists(): # URL specified name = Path(urllib.parse.unquote(str(file))).name # decode '%2F' to '/' etc. @@ -51,7 +55,7 @@ def attempt_download(file, repo='ultralytics/yolov5'): # from utils.downloads i url = str(file).replace(':/', '://') # Pathlib turns :// -> :/ file = name.split('?')[0] # parse authentication https://url.com/file.txt?auth... if Path(file).is_file(): - print(f'Found {url} locally at {file}') # file already exists + LOGGER.info(f'Found {url} locally at {file}') # file already exists else: safe_download(file=file, url=url, min_bytes=1E5) return file diff --git a/utils/general.py b/utils/general.py index 31abd9420134..67f01b54ab88 100755 --- a/utils/general.py +++ b/utils/general.py @@ -490,6 +490,7 @@ def check_dataset(data, autodownload=True): else: raise Exception(emojis('Dataset not found ❌')) + check_font('Arial.ttf' if is_ascii(data['names']) else 'Arial.Unicode.ttf', progress=True) # download fonts return data # dictionary diff --git a/utils/plots.py b/utils/plots.py index 842894e745df..c0d196188751 100644 --- a/utils/plots.py +++ b/utils/plots.py @@ -66,9 +66,6 @@ def check_pil_font(font=FONT, size=10): class Annotator: - if RANK in (-1, 0): - check_pil_font() # download TTF if necessary - # YOLOv5 Annotator for train/val mosaics and jpgs and detect/hub inference annotations def __init__(self, im, line_width=None, font_size=None, font='Arial.ttf', pil=False, example='abc'): assert im.data.contiguous, 'Image not contiguous. Apply np.ascontiguousarray(im) to Annotator() input images.'