|
|
|
@ -1,6 +1,8 @@
|
|
|
|
|
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
|
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
import re
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
|
|
|
|
import pkg_resources as pkg
|
|
|
|
|
|
|
|
|
@ -32,13 +34,17 @@ _processed_plots = {}
|
|
|
|
|
_training_epoch = False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _logger_disabled():
|
|
|
|
|
return os.getenv('ULTRALYTICS_DVC_DISABLED', 'false').lower() == 'true'
|
|
|
|
|
def _log_images(path, prefix=''):
|
|
|
|
|
if live:
|
|
|
|
|
name = path.name
|
|
|
|
|
|
|
|
|
|
# Group images by batch to enable sliders in UI
|
|
|
|
|
if m := re.search(r'_batch(\d+)', name):
|
|
|
|
|
ni = m.group(1)
|
|
|
|
|
new_stem = re.sub(r'_batch(\d+)', '_batch', path.stem)
|
|
|
|
|
name = (Path(new_stem) / ni).with_suffix(path.suffix)
|
|
|
|
|
|
|
|
|
|
def _log_images(image_path, prefix=''):
|
|
|
|
|
if live:
|
|
|
|
|
live.log_image(os.path.join(prefix, image_path.name), image_path)
|
|
|
|
|
live.log_image(os.path.join(prefix, name), path)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _log_plots(plots, prefix=''):
|
|
|
|
@ -68,14 +74,10 @@ def _log_confusion_matrix(validator):
|
|
|
|
|
def on_pretrain_routine_start(trainer):
|
|
|
|
|
try:
|
|
|
|
|
global live
|
|
|
|
|
if not _logger_disabled():
|
|
|
|
|
live = dvclive.Live(save_dvc_exp=True, cache_images=True)
|
|
|
|
|
LOGGER.info(
|
|
|
|
|
'DVCLive is detected and auto logging is enabled (can be disabled with `ULTRALYTICS_DVC_DISABLED=true`).'
|
|
|
|
|
)
|
|
|
|
|
else:
|
|
|
|
|
LOGGER.debug('DVCLive is detected and auto logging is disabled via `ULTRALYTICS_DVC_DISABLED`.')
|
|
|
|
|
live = None
|
|
|
|
|
live = dvclive.Live(save_dvc_exp=True, cache_images=True)
|
|
|
|
|
LOGGER.info(
|
|
|
|
|
f'DVCLive is detected and auto logging is enabled (can be disabled in the {SETTINGS.file} with `dvc: false`).'
|
|
|
|
|
)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
LOGGER.warning(f'WARNING ⚠️ DVCLive installed but not initialized correctly, not logging this run. {e}')
|
|
|
|
|
|
|
|
|
|