diff --git a/docs/reference/utils/callbacks/tensorboard.md b/docs/reference/utils/callbacks/tensorboard.md index 95db2685..b2698fec 100644 --- a/docs/reference/utils/callbacks/tensorboard.md +++ b/docs/reference/utils/callbacks/tensorboard.md @@ -21,6 +21,10 @@ keywords: Ultralytics, YOLO, documentation, callback utilities, log_scalars, on_ ## ::: ultralytics.utils.callbacks.tensorboard.on_pretrain_routine_start

+--- +## ::: ultralytics.utils.callbacks.tensorboard.on_train_start +

+ --- ## ::: ultralytics.utils.callbacks.tensorboard.on_batch_end

diff --git a/tests/test_cli.py b/tests/test_cli.py index 37e5694c..2a97918e 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -63,7 +63,7 @@ def test_export(model, format): def test_rtdetr(task='detect', model='yolov8n-rtdetr.yaml', data='coco8.yaml'): # Warning: MUST use imgsz=640 - run(f'yolo train {task} model={model} data={data} imgsz=640 epochs=1 cache=disk') + run(f'yolo train {task} model={model} data={data} imgsz=640 epochs=1, cache = disk') # add coma, space to args run(f"yolo predict {task} model={model} source={ASSETS / 'bus.jpg'} imgsz=640 save save_crop save_txt") diff --git a/tests/test_python.py b/tests/test_python.py index cfdf1ae0..2a0d556f 100644 --- a/tests/test_python.py +++ b/tests/test_python.py @@ -145,13 +145,13 @@ def test_val(): def test_train_scratch(): model = YOLO(CFG) - model.train(data='coco8.yaml', epochs=2, imgsz=32, cache='disk', batch=-1, close_mosaic=1) + model.train(data='coco8.yaml', epochs=2, imgsz=32, cache='disk', batch=-1, close_mosaic=1, name='model') model(SOURCE) def test_train_pretrained(): model = YOLO(WEIGHTS_DIR / 'yolov8n-seg.pt') - model.train(data='coco8-seg.yaml', epochs=1, imgsz=32, cache='ram', copy_paste=0.5, mixup=0.5) + model.train(data='coco8-seg.yaml', epochs=1, imgsz=32, cache='ram', copy_paste=0.5, mixup=0.5, name=0) model(SOURCE) diff --git a/ultralytics/__init__.py b/ultralytics/__init__.py index 96d0cacb..4686f988 100644 --- a/ultralytics/__init__.py +++ b/ultralytics/__init__.py @@ -1,6 +1,6 @@ # Ultralytics YOLO 🚀, AGPL-3.0 license -__version__ = '8.0.161' +__version__ = '8.0.162' from ultralytics.models import RTDETR, SAM, YOLO from ultralytics.models.fastsam import FastSAM diff --git a/ultralytics/cfg/__init__.py b/ultralytics/cfg/__init__.py index a409ffca..2b17340c 100644 --- a/ultralytics/cfg/__init__.py +++ b/ultralytics/cfg/__init__.py @@ -110,7 +110,8 @@ def get_cfg(cfg: Union[str, Path, Dict, SimpleNamespace] = DEFAULT_CFG_DICT, ove # Merge overrides if overrides: overrides = cfg2dict(overrides) - overrides.pop('save_dir', None) # special override keys to ignore + if 'save_dir' not in cfg: + overrides.pop('save_dir', None) # special override keys to ignore check_dict_alignment(cfg, overrides) cfg = {**cfg, **overrides} # merge cfg and overrides dicts (prefer overrides) diff --git a/ultralytics/data/utils.py b/ultralytics/data/utils.py index d7ebb581..6bc2e30d 100644 --- a/ultralytics/data/utils.py +++ b/ultralytics/data/utils.py @@ -343,7 +343,7 @@ def check_cls_dataset(dataset: str, split=''): # Print to console for k, v in {'train': train_set, 'val': val_set, 'test': test_set}.items(): - prefix = f'{colorstr(k)} {v}...' + prefix = f'{colorstr(f"{k}:")} {v}...' if v is None: LOGGER.info(prefix) else: diff --git a/ultralytics/engine/trainer.py b/ultralytics/engine/trainer.py index 14f6410c..58e8071d 100644 --- a/ultralytics/engine/trainer.py +++ b/ultralytics/engine/trainer.py @@ -184,7 +184,7 @@ class BaseTrainer: # Command cmd, file = generate_ddp_command(world_size, self) try: - LOGGER.info(f'DDP command: {cmd}') + LOGGER.info(f'{colorstr("DDP:")} debug command {" ".join(cmd)}') subprocess.run(cmd, check=True) except Exception as e: raise e @@ -197,7 +197,7 @@ class BaseTrainer: """Initializes and sets the DistributedDataParallel parameters for training.""" torch.cuda.set_device(RANK) self.device = torch.device('cuda', RANK) - LOGGER.info(f'DDP info: RANK {RANK}, WORLD_SIZE {world_size}, DEVICE {self.device}') + # LOGGER.info(f'DDP info: RANK {RANK}, WORLD_SIZE {world_size}, DEVICE {self.device}') os.environ['NCCL_BLOCKING_WAIT'] = '1' # set to enforce timeout dist.init_process_group( 'nccl' if dist.is_nccl_available() else 'gloo', @@ -299,8 +299,7 @@ class BaseTrainer: self.epoch_time_start = time.time() self.train_time_start = time.time() nb = len(self.train_loader) # number of batches - nw = max(round(self.args.warmup_epochs * - nb), 100) if self.args.warmup_epochs > 0 else -1 # number of warmup iterations + nw = max(round(self.args.warmup_epochs * nb), 100) if self.args.warmup_epochs > 0 else -1 # warmup iterations last_opt_step = -1 self.run_callbacks('on_train_start') LOGGER.info(f'Image sizes {self.args.imgsz} train, {self.args.imgsz} val\n' @@ -557,7 +556,7 @@ class BaseTrainer: n = len(metrics) + 1 # number of cols s = '' if self.csv.exists() else (('%23s,' * n % tuple(['epoch'] + keys)).rstrip(',') + '\n') # header with open(self.csv, 'a') as f: - f.write(s + ('%23.5g,' * n % tuple([self.epoch] + vals)).rstrip(',') + '\n') + f.write(s + ('%23.5g,' * n % tuple([self.epoch + 1] + vals)).rstrip(',') + '\n') def plot_metrics(self): """Plot and display metrics visually.""" diff --git a/ultralytics/engine/validator.py b/ultralytics/engine/validator.py index f8f4007d..bf249611 100644 --- a/ultralytics/engine/validator.py +++ b/ultralytics/engine/validator.py @@ -222,7 +222,7 @@ class BaseValidator: Args: pred_classes (torch.Tensor): Predicted class indices of shape(N,). true_classes (torch.Tensor): Target class indices of shape(M,). - iou (torch.Tensor): IoU thresholds from 0.50 to 0.95 in space of 0.05. + iou (torch.Tensor): An NxM tensor containing the pairwise IoU values for predictions and ground of truth Returns: (torch.Tensor): Correct tensor of shape(N,10) for 10 IoU thresholds. diff --git a/ultralytics/utils/callbacks/tensorboard.py b/ultralytics/utils/callbacks/tensorboard.py index b9a1704d..4cd5708b 100644 --- a/ultralytics/utils/callbacks/tensorboard.py +++ b/ultralytics/utils/callbacks/tensorboard.py @@ -23,7 +23,7 @@ def _log_scalars(scalars, step=0): def _log_tensorboard_graph(trainer): - # Log model graph to TensorBoard + """Log model graph to TensorBoard.""" try: import warnings @@ -48,11 +48,16 @@ def on_pretrain_routine_start(trainer): WRITER = SummaryWriter(str(trainer.save_dir)) prefix = colorstr('TensorBoard: ') LOGGER.info(f"{prefix}Start with 'tensorboard --logdir {trainer.save_dir}', view at http://localhost:6006/") - _log_tensorboard_graph(trainer) except Exception as e: LOGGER.warning(f'WARNING ⚠️ TensorBoard not initialized correctly, not logging this run. {e}') +def on_train_start(trainer): + """Log TensorBoard graph.""" + if WRITER: + _log_tensorboard_graph(trainer) + + def on_batch_end(trainer): """Logs scalar statistics at the end of a training batch.""" _log_scalars(trainer.label_loss_items(trainer.tloss, prefix='train'), trainer.epoch + 1) @@ -65,5 +70,6 @@ def on_fit_epoch_end(trainer): callbacks = { 'on_pretrain_routine_start': on_pretrain_routine_start, + 'on_train_start': on_train_start, 'on_fit_epoch_end': on_fit_epoch_end, 'on_batch_end': on_batch_end}