mirror of
https://github.com/THU-MIG/yolov10.git
synced 2025-05-24 06:14:55 +08:00
Clean and bump dvc callback: settings, stacked images (#4343)
Co-authored-by: Glenn Jocher <glenn.jocher@ultralytics.com>
This commit is contained in:
parent
b5d1af42d8
commit
d704507217
@ -259,7 +259,7 @@ The table below provides an overview of the settings available for adjustment wi
|
|||||||
| `api_key` | `''` | `str` | Ultralytics HUB [API Key](https://hub.ultralytics.com/settings?tab=api+keys) |
|
| `api_key` | `''` | `str` | Ultralytics HUB [API Key](https://hub.ultralytics.com/settings?tab=api+keys) |
|
||||||
| `clearml` | `True` | `bool` | Whether to use ClearML logging |
|
| `clearml` | `True` | `bool` | Whether to use ClearML logging |
|
||||||
| `comet` | `True` | `bool` | Whether to use [Comet ML](https://bit.ly/yolov8-readme-comet) for experiment tracking and visualization |
|
| `comet` | `True` | `bool` | Whether to use [Comet ML](https://bit.ly/yolov8-readme-comet) for experiment tracking and visualization |
|
||||||
| `dvc` | `True` | `bool` | Whether to use DVC for version control |
|
| `dvc` | `True` | `bool` | Whether to use [DVC for experiment tracking](https://dvc.org/doc/dvclive/ml-frameworks/yolo) and version control |
|
||||||
| `hub` | `True` | `bool` | Whether to use [Ultralytics HUB](https://hub.ultralytics.com) integration |
|
| `hub` | `True` | `bool` | Whether to use [Ultralytics HUB](https://hub.ultralytics.com) integration |
|
||||||
| `mlflow` | `True` | `bool` | Whether to use MLFlow for experiment tracking |
|
| `mlflow` | `True` | `bool` | Whether to use MLFlow for experiment tracking |
|
||||||
| `neptune` | `True` | `bool` | Whether to use Neptune for experiment tracking |
|
| `neptune` | `True` | `bool` | Whether to use Neptune for experiment tracking |
|
||||||
|
@ -543,7 +543,8 @@ class BaseTrainer:
|
|||||||
|
|
||||||
def on_plot(self, name, data=None):
|
def on_plot(self, name, data=None):
|
||||||
"""Registers plots (e.g. to be consumed in callbacks)"""
|
"""Registers plots (e.g. to be consumed in callbacks)"""
|
||||||
self.plots[name] = {'data': data, 'timestamp': time.time()}
|
path = Path(name)
|
||||||
|
self.plots[path] = {'data': data, 'timestamp': time.time()}
|
||||||
|
|
||||||
def final_eval(self):
|
def final_eval(self):
|
||||||
"""Performs final evaluation and validation for object detection YOLO model."""
|
"""Performs final evaluation and validation for object detection YOLO model."""
|
||||||
|
@ -303,7 +303,8 @@ class BaseValidator:
|
|||||||
|
|
||||||
def on_plot(self, name, data=None):
|
def on_plot(self, name, data=None):
|
||||||
"""Registers plots (e.g. to be consumed in callbacks)"""
|
"""Registers plots (e.g. to be consumed in callbacks)"""
|
||||||
self.plots[name] = {'data': data, 'timestamp': time.time()}
|
path = Path(name)
|
||||||
|
self.plots[path] = {'data': data, 'timestamp': time.time()}
|
||||||
|
|
||||||
# TODO: may need to put these following functions into callback
|
# TODO: may need to put these following functions into callback
|
||||||
def plot_val_samples(self, batch, ni):
|
def plot_val_samples(self, batch, ni):
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
import pkg_resources as pkg
|
import pkg_resources as pkg
|
||||||
|
|
||||||
@ -32,13 +34,17 @@ _processed_plots = {}
|
|||||||
_training_epoch = False
|
_training_epoch = False
|
||||||
|
|
||||||
|
|
||||||
def _logger_disabled():
|
def _log_images(path, prefix=''):
|
||||||
return os.getenv('ULTRALYTICS_DVC_DISABLED', 'false').lower() == 'true'
|
|
||||||
|
|
||||||
|
|
||||||
def _log_images(image_path, prefix=''):
|
|
||||||
if live:
|
if live:
|
||||||
live.log_image(os.path.join(prefix, image_path.name), image_path)
|
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)
|
||||||
|
|
||||||
|
live.log_image(os.path.join(prefix, name), path)
|
||||||
|
|
||||||
|
|
||||||
def _log_plots(plots, prefix=''):
|
def _log_plots(plots, prefix=''):
|
||||||
@ -68,14 +74,10 @@ def _log_confusion_matrix(validator):
|
|||||||
def on_pretrain_routine_start(trainer):
|
def on_pretrain_routine_start(trainer):
|
||||||
try:
|
try:
|
||||||
global live
|
global live
|
||||||
if not _logger_disabled():
|
|
||||||
live = dvclive.Live(save_dvc_exp=True, cache_images=True)
|
live = dvclive.Live(save_dvc_exp=True, cache_images=True)
|
||||||
LOGGER.info(
|
LOGGER.info(
|
||||||
'DVCLive is detected and auto logging is enabled (can be disabled with `ULTRALYTICS_DVC_DISABLED=true`).'
|
f'DVCLive is detected and auto logging is enabled (can be disabled in the {SETTINGS.file} with `dvc: false`).'
|
||||||
)
|
)
|
||||||
else:
|
|
||||||
LOGGER.debug('DVCLive is detected and auto logging is disabled via `ULTRALYTICS_DVC_DISABLED`.')
|
|
||||||
live = None
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
LOGGER.warning(f'WARNING ⚠️ DVCLive installed but not initialized correctly, not logging this run. {e}')
|
LOGGER.warning(f'WARNING ⚠️ DVCLive installed but not initialized correctly, not logging this run. {e}')
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user