diff --git a/docker/Dockerfile b/docker/Dockerfile index be45271..66acc38 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -9,10 +9,9 @@ FROM pytorch/pytorch:2.0.0-cuda11.7-cudnn8-runtime ADD https://ultralytics.com/assets/Arial.ttf https://ultralytics.com/assets/Arial.Unicode.ttf /root/.config/Ultralytics/ # Install linux packages -ENV DEBIAN_FRONTEND noninteractive +# g++ required to build 'tflite_support' package RUN apt update -RUN TZ=Etc/UTC apt install -y tzdata -RUN apt install --no-install-recommends -y gcc git zip curl htop libgl1-mesa-glx libglib2.0-0 libpython3-dev gnupg g++ + && apt install --no-install-recommends -y gcc git zip curl htop libgl1-mesa-glx libglib2.0-0 libpython3-dev gnupg g++ # RUN alias python=python3 # Security updates @@ -35,17 +34,14 @@ RUN pip install --no-cache . albumentations comet gsutil notebook tensorboard # Set environment variables ENV OMP_NUM_THREADS=1 -# Cleanup -ENV DEBIAN_FRONTEND teletype - # Usage Examples ------------------------------------------------------------------------------------------------------- -docker pull ultralytics/ultralytics:latest-hub-export-edgetpu-paddle + # Build and Push # t=ultralytics/ultralytics:latest && sudo docker build -f docker/Dockerfile -t $t . && sudo docker push $t # Pull and Run -# t=ultralytics/ultralytics/ultralytics:latest-hub-export-edgetpu-paddle && sudo docker pull $t && sudo docker run -it --ipc=host $t +# t=ultralytics/ultralytics:latest && sudo docker pull $t && sudo docker run -it --ipc=host $t # Pull and Run with local directory access # t=ultralytics/ultralytics:latest && sudo docker pull $t && sudo docker run -it --ipc=host --gpus all -v "$(pwd)"/datasets:/usr/src/datasets $t diff --git a/docker/Dockerfile-arm64 b/docker/Dockerfile-arm64 index d0fabc2..a74de06 100644 --- a/docker/Dockerfile-arm64 +++ b/docker/Dockerfile-arm64 @@ -9,10 +9,8 @@ FROM arm64v8/ubuntu:rolling ADD https://ultralytics.com/assets/Arial.ttf https://ultralytics.com/assets/Arial.Unicode.ttf /root/.config/Ultralytics/ # Install linux packages -ENV DEBIAN_FRONTEND noninteractive -RUN apt update -RUN TZ=Etc/UTC apt install -y tzdata -RUN apt install --no-install-recommends -y python3-pip git zip curl htop gcc libgl1-mesa-glx libglib2.0-0 libpython3-dev +RUN apt update \ + && apt install --no-install-recommends -y python3-pip git zip curl htop gcc libgl1-mesa-glx libglib2.0-0 libpython3-dev # RUN alias python=python3 # Create working directory @@ -28,9 +26,6 @@ ADD https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8n.pt /u RUN python3 -m pip install --upgrade pip wheel RUN pip install --no-cache . albumentations gsutil notebook -# Cleanup -ENV DEBIAN_FRONTEND teletype - # Usage Examples ------------------------------------------------------------------------------------------------------- diff --git a/docker/Dockerfile-cpu b/docker/Dockerfile-cpu index 0f1c16d..567c908 100644 --- a/docker/Dockerfile-cpu +++ b/docker/Dockerfile-cpu @@ -9,10 +9,9 @@ FROM ubuntu:rolling ADD https://ultralytics.com/assets/Arial.ttf https://ultralytics.com/assets/Arial.Unicode.ttf /root/.config/Ultralytics/ # Install linux packages -ENV DEBIAN_FRONTEND noninteractive -RUN apt update -RUN TZ=Etc/UTC apt install -y tzdata -RUN apt install --no-install-recommends -y python3-pip git zip curl htop libgl1-mesa-glx libglib2.0-0 libpython3-dev gnupg g++ +# g++ required to build 'tflite_support' package +RUN apt update \ + && apt install --no-install-recommends -y python3-pip git zip curl htop libgl1-mesa-glx libglib2.0-0 libpython3-dev gnupg g++ # RUN alias python=python3 # Create working directory @@ -29,9 +28,6 @@ RUN python3 -m pip install --upgrade pip wheel RUN pip install --no-cache . albumentations gsutil notebook tensorboard \ --extra-index-url https://download.pytorch.org/whl/cpu -# Cleanup -ENV DEBIAN_FRONTEND teletype - # Usage Examples ------------------------------------------------------------------------------------------------------- diff --git a/ultralytics/__init__.py b/ultralytics/__init__.py index cd8d97d..8b7d0a2 100644 --- a/ultralytics/__init__.py +++ b/ultralytics/__init__.py @@ -1,6 +1,6 @@ # Ultralytics YOLO 🚀, AGPL-3.0 license -__version__ = '8.0.77' +__version__ = '8.0.78' from ultralytics.hub import start from ultralytics.yolo.engine.model import YOLO diff --git a/ultralytics/yolo/engine/validator.py b/ultralytics/yolo/engine/validator.py index 5ccd276..d6d8d34 100644 --- a/ultralytics/yolo/engine/validator.py +++ b/ultralytics/yolo/engine/validator.py @@ -174,9 +174,9 @@ class BaseValidator: self.run_callbacks('on_val_batch_end') stats = self.get_stats() self.check_stats(stats) - self.print_results() self.speed = dict(zip(self.speed.keys(), (x.t / len(self.dataloader.dataset) * 1E3 for x in dt))) self.finalize_metrics() + self.print_results() self.run_callbacks('on_val_end') if self.training: model.float() diff --git a/ultralytics/yolo/utils/__init__.py b/ultralytics/yolo/utils/__init__.py index 295fff0..ccb8190 100644 --- a/ultralytics/yolo/utils/__init__.py +++ b/ultralytics/yolo/utils/__init__.py @@ -220,13 +220,24 @@ def set_logging(name=LOGGING_NAME, verbose=True): 'propagate': False}}}) +class EmojiFilter(logging.Filter): + """ + A custom logging filter class for removing emojis in log messages. + + This filter is particularly useful for ensuring compatibility with Windows terminals + that may not support the display of emojis in log messages. + """ + + def filter(self, record): + record.msg = emojis(record.msg) + return super().filter(record) + + # Set logger set_logging(LOGGING_NAME, verbose=VERBOSE) # run before defining LOGGER LOGGER = logging.getLogger(LOGGING_NAME) # define globally (used in train.py, val.py, detect.py, etc.) if WINDOWS: # emoji-safe logging - info_fn, warning_fn = LOGGER.info, LOGGER.warning - setattr(LOGGER, info_fn.__name__, lambda x: info_fn(emojis(x))) - setattr(LOGGER, warning_fn.__name__, lambda x: warning_fn(emojis(x))) + LOGGER.addFilter(EmojiFilter()) def yaml_save(file='data.yaml', data=None): diff --git a/ultralytics/yolo/utils/checks.py b/ultralytics/yolo/utils/checks.py index fadeb9d..3fadd46 100644 --- a/ultralytics/yolo/utils/checks.py +++ b/ultralytics/yolo/utils/checks.py @@ -197,7 +197,19 @@ def check_python(minimum: str = '3.7.0') -> bool: @TryExcept() def check_requirements(requirements=ROOT.parent / 'requirements.txt', exclude=(), install=True, cmds=''): - # Check installed dependencies meet YOLOv5 requirements (pass *.txt file or list of packages or single package str) + """ + Check if installed dependencies meet YOLOv5 requirements and attempt to auto-update if needed. + + Args: + requirements (Union[Path, str, List[str]]): Path to a requirements.txt file, a single package requirement as a + string, or a list of package requirements as strings. + exclude (Tuple[str]): Tuple of package names to exclude from checking. + install (bool): If True, attempt to auto-update packages that don't meet requirements. + cmds (str): Additional commands to pass to the pip install command when auto-updating. + + Returns: + None + """ prefix = colorstr('red', 'bold', 'requirements:') check_python() # check python version file = None @@ -209,8 +221,8 @@ def check_requirements(requirements=ROOT.parent / 'requirements.txt', exclude=() elif isinstance(requirements, str): requirements = [requirements] - s = '' - n = 0 + s = '' # console string + n = 0 # number of packages updates for r in requirements: try: pkg.require(r) @@ -226,7 +238,7 @@ def check_requirements(requirements=ROOT.parent / 'requirements.txt', exclude=() LOGGER.info(f"{prefix} YOLOv8 requirement{'s' * (n > 1)} {s}not found, attempting AutoUpdate...") try: assert is_online(), 'AutoUpdate skipped (offline)' - LOGGER.info(subprocess.check_output(f'pip install {s} {cmds}', shell=True).decode()) + LOGGER.info(subprocess.check_output(f'pip install --no-cache {s} {cmds}', shell=True).decode()) s = f"{prefix} {n} package{'s' * (n > 1)} updated per {file or requirements}\n" \ f"{prefix} ⚠️ {colorstr('bold', 'Restart runtime or rerun command for updates to take effect')}\n" LOGGER.info(s) diff --git a/ultralytics/yolo/v8/classify/val.py b/ultralytics/yolo/v8/classify/val.py index 6138da2..6e3b212 100644 --- a/ultralytics/yolo/v8/classify/val.py +++ b/ultralytics/yolo/v8/classify/val.py @@ -12,7 +12,6 @@ class ClassificationValidator(BaseValidator): super().__init__(dataloader, save_dir, pbar, args, _callbacks) self.args.task = 'classify' self.metrics = ClassifyMetrics() - self.save_dir = save_dir def get_desc(self): return ('%22s' + '%11s' * 2) % ('classes', 'top1_acc', 'top5_acc') @@ -37,6 +36,8 @@ class ClassificationValidator(BaseValidator): def finalize_metrics(self, *args, **kwargs): self.confusion_matrix.process_cls_preds(self.pred, self.targets) + if self.args.plots: + self.confusion_matrix.plot(save_dir=self.save_dir, names=list(self.names.values())) self.metrics.speed = self.speed self.metrics.confusion_matrix = self.confusion_matrix @@ -55,8 +56,6 @@ class ClassificationValidator(BaseValidator): def print_results(self): pf = '%22s' + '%11.3g' * len(self.metrics.keys) # print format LOGGER.info(pf % ('all', self.metrics.top1, self.metrics.top5)) - if self.args.plots: - self.confusion_matrix.plot(save_dir=self.save_dir, names=list(self.names.values())) def val(cfg=DEFAULT_CFG, use_python=False):