* Add license line to .github/ISSUE_TEMPLATE/bug-report.yml * Add license line to .github/ISSUE_TEMPLATE/config.yml * Add license line to .github/ISSUE_TEMPLATE/feature-request.yml * Add license line to .github/ISSUE_TEMPLATE/question.yml * Add license line to .github/dependabot.yml * Add license line to .github/workflows/ci-testing.yml * Add license line to .github/workflows/cla.yml * Add license line to .github/workflows/codeql-analysis.yml * Add license line to .github/workflows/docker.yml * Add license line to .github/workflows/format.yml * Add license line to .github/workflows/greetings.yml * Add license line to .github/workflows/links.yml * Add license line to .github/workflows/merge-main-into-prs.yml * Add license line to .github/workflows/stale.yml * Add license line to benchmarks.py * Add license line to classify/predict.py * Add license line to classify/train.py * Add license line to classify/val.py * Add license line to data/Argoverse.yaml * Add license line to data/GlobalWheat2020.yaml * Add license line to data/ImageNet.yaml * Add license line to data/ImageNet10.yaml * Add license line to data/ImageNet100.yaml * Add license line to data/ImageNet1000.yaml * Add license line to data/Objects365.yaml * Add license line to data/SKU-110K.yaml * Add license line to data/VOC.yaml * Add license line to data/VisDrone.yaml * Add license line to data/coco.yaml * Add license line to data/coco128-seg.yaml * Add license line to data/coco128.yaml * Add license line to data/hyps/hyp.Objects365.yaml * Add license line to data/hyps/hyp.VOC.yaml * Add license line to data/hyps/hyp.no-augmentation.yaml * Add license line to data/hyps/hyp.scratch-high.yaml * Add license line to data/hyps/hyp.scratch-low.yaml * Add license line to data/hyps/hyp.scratch-med.yaml * Add license line to data/xView.yaml * Add license line to detect.py * Add license line to export.py * Add license line to hubconf.py * Add license line to models/common.py * Add license line to models/experimental.py * Add license line to models/hub/anchors.yaml * Add license line to models/hub/yolov3-spp.yaml * Add license line to models/hub/yolov3-tiny.yaml * Add license line to models/hub/yolov3.yaml * Add license line to models/hub/yolov5-bifpn.yaml * Add license line to models/hub/yolov5-fpn.yaml * Add license line to models/hub/yolov5-p2.yaml * Add license line to models/hub/yolov5-p34.yaml * Add license line to models/hub/yolov5-p6.yaml * Add license line to models/hub/yolov5-p7.yaml * Add license line to models/hub/yolov5-panet.yaml * Add license line to models/hub/yolov5l6.yaml * Add license line to models/hub/yolov5m6.yaml * Add license line to models/hub/yolov5n6.yaml * Add license line to models/hub/yolov5s-LeakyReLU.yaml * Add license line to models/hub/yolov5s-ghost.yaml * Add license line to models/hub/yolov5s-transformer.yaml * Add license line to models/hub/yolov5s6.yaml * Add license line to models/hub/yolov5x6.yaml * Add license line to models/segment/yolov5l-seg.yaml * Add license line to models/segment/yolov5m-seg.yaml * Add license line to models/segment/yolov5n-seg.yaml * Add license line to models/segment/yolov5s-seg.yaml * Add license line to models/segment/yolov5x-seg.yaml * Add license line to models/tf.py * Add license line to models/yolo.py * Add license line to models/yolov5l.yaml * Add license line to models/yolov5m.yaml * Add license line to models/yolov5n.yaml * Add license line to models/yolov5s.yaml * Add license line to models/yolov5x.yaml * Add license line to pyproject.toml * Add license line to segment/predict.py * Add license line to segment/train.py * Add license line to segment/val.py * Add license line to train.py * Add license line to utils/__init__.py * Add license line to utils/activations.py * Add license line to utils/augmentations.py * Add license line to utils/autoanchor.py * Add license line to utils/autobatch.py * Add license line to utils/aws/resume.py * Add license line to utils/callbacks.py * Add license line to utils/dataloaders.py * Add license line to utils/downloads.py * Add license line to utils/flask_rest_api/example_request.py * Add license line to utils/flask_rest_api/restapi.py * Add license line to utils/general.py * Add license line to utils/google_app_engine/app.yaml * Add license line to utils/loggers/__init__.py * Add license line to utils/loggers/clearml/clearml_utils.py * Add license line to utils/loggers/clearml/hpo.py * Add license line to utils/loggers/comet/__init__.py * Add license line to utils/loggers/comet/comet_utils.py * Add license line to utils/loggers/comet/hpo.py * Add license line to utils/loggers/wandb/wandb_utils.py * Add license line to utils/loss.py * Add license line to utils/metrics.py * Add license line to utils/plots.py * Add license line to utils/segment/augmentations.py * Add license line to utils/segment/dataloaders.py * Add license line to utils/segment/general.py * Add license line to utils/segment/loss.py * Add license line to utils/segment/metrics.py * Add license line to utils/segment/plots.py * Add license line to utils/torch_utils.py * Add license line to utils/triton.py * Add license line to val.py * Auto-format by https://ultralytics.com/actions * Update ImageNet1000.yaml Signed-off-by: Glenn Jocher <glenn.jocher@ultralytics.com> * Auto-format by https://ultralytics.com/actions --------- Signed-off-by: Glenn Jocher <glenn.jocher@ultralytics.com> Co-authored-by: Glenn Jocher <glenn.jocher@ultralytics.com>
96 lines
3.0 KiB
Python
96 lines
3.0 KiB
Python
# Ultralytics YOLOv5 🚀, AGPL-3.0 license
|
|
"""utils/initialization."""
|
|
|
|
import contextlib
|
|
import platform
|
|
import threading
|
|
|
|
|
|
def emojis(str=""):
|
|
"""Returns an emoji-safe version of a string, stripped of emojis on Windows platforms."""
|
|
return str.encode().decode("ascii", "ignore") if platform.system() == "Windows" else str
|
|
|
|
|
|
class TryExcept(contextlib.ContextDecorator):
|
|
# YOLOv5 TryExcept class. Usage: @TryExcept() decorator or 'with TryExcept():' context manager
|
|
def __init__(self, msg=""):
|
|
"""Initializes TryExcept with an optional message, used as a decorator or context manager for error handling."""
|
|
self.msg = msg
|
|
|
|
def __enter__(self):
|
|
"""Enter the runtime context related to this object for error handling with an optional message."""
|
|
pass
|
|
|
|
def __exit__(self, exc_type, value, traceback):
|
|
"""Context manager exit method that prints an error message with emojis if an exception occurred, always returns
|
|
True.
|
|
"""
|
|
if value:
|
|
print(emojis(f"{self.msg}{': ' if self.msg else ''}{value}"))
|
|
return True
|
|
|
|
|
|
def threaded(func):
|
|
"""Decorator @threaded to run a function in a separate thread, returning the thread instance."""
|
|
|
|
def wrapper(*args, **kwargs):
|
|
thread = threading.Thread(target=func, args=args, kwargs=kwargs, daemon=True)
|
|
thread.start()
|
|
return thread
|
|
|
|
return wrapper
|
|
|
|
|
|
def join_threads(verbose=False):
|
|
"""
|
|
Joins all daemon threads, optionally printing their names if verbose is True.
|
|
|
|
Example: atexit.register(lambda: join_threads())
|
|
"""
|
|
main_thread = threading.current_thread()
|
|
for t in threading.enumerate():
|
|
if t is not main_thread:
|
|
if verbose:
|
|
print(f"Joining thread {t.name}")
|
|
t.join()
|
|
|
|
|
|
def notebook_init(verbose=True):
|
|
"""Initializes notebook environment by checking requirements, cleaning up, and displaying system info."""
|
|
print("Checking setup...")
|
|
|
|
import os
|
|
import shutil
|
|
|
|
from ultralytics.utils.checks import check_requirements
|
|
|
|
from utils.general import check_font, is_colab
|
|
from utils.torch_utils import select_device # imports
|
|
|
|
check_font()
|
|
|
|
import psutil
|
|
|
|
if check_requirements("wandb", install=False):
|
|
os.system("pip uninstall -y wandb") # eliminate unexpected account creation prompt with infinite hang
|
|
if is_colab():
|
|
shutil.rmtree("/content/sample_data", ignore_errors=True) # remove colab /sample_data directory
|
|
|
|
# System info
|
|
display = None
|
|
if verbose:
|
|
gb = 1 << 30 # bytes to GiB (1024 ** 3)
|
|
ram = psutil.virtual_memory().total
|
|
total, used, free = shutil.disk_usage("/")
|
|
with contextlib.suppress(Exception): # clear display if ipython is installed
|
|
from IPython import display
|
|
|
|
display.clear_output()
|
|
s = f"({os.cpu_count()} CPUs, {ram / gb:.1f} GB RAM, {(total - free) / gb:.1f}/{total / gb:.1f} GB disk)"
|
|
else:
|
|
s = ""
|
|
|
|
select_device(newline=False)
|
|
print(emojis(f"Setup complete ✅ {s}"))
|
|
return display
|