diff --git a/tests/test_explorer.py b/tests/test_explorer.py index 12960dd2..5b11c447 100644 --- a/tests/test_explorer.py +++ b/tests/test_explorer.py @@ -1,10 +1,10 @@ # Ultralytics YOLO 🚀, AGPL-3.0 license +import PIL + from ultralytics import Explorer from ultralytics.utils import ASSETS -import PIL - def test_similarity(): """Test similarity calculations and SQL queries for correctness and response length.""" diff --git a/ultralytics/__init__.py b/ultralytics/__init__.py index 60d4b009..97aa35fe 100644 --- a/ultralytics/__init__.py +++ b/ultralytics/__init__.py @@ -1,6 +1,6 @@ # Ultralytics YOLO 🚀, AGPL-3.0 license -__version__ = "8.1.12" +__version__ = "8.1.13" from ultralytics.data.explorer.explorer import Explorer from ultralytics.models import RTDETR, SAM, YOLO diff --git a/ultralytics/engine/trainer.py b/ultralytics/engine/trainer.py index 770bad1b..e03aa9de 100644 --- a/ultralytics/engine/trainer.py +++ b/ultralytics/engine/trainer.py @@ -337,8 +337,8 @@ class BaseTrainer: if self.args.close_mosaic: base_idx = (self.epochs - self.args.close_mosaic) * nb self.plot_idx.extend([base_idx, base_idx + 1, base_idx + 2]) - epoch = self.epochs # predefine for resume fully trained model edge cases - for epoch in range(self.start_epoch, self.epochs): + epoch = self.start_epoch + while True: self.epoch = epoch self.run_callbacks("on_train_epoch_start") self.model.train() @@ -423,7 +423,7 @@ class BaseTrainer: if self.args.val or final_epoch or self.stopper.possible_stop or self.stop: self.metrics, self.fitness = self.validate() self.save_metrics(metrics={**self.label_loss_items(self.tloss), **self.metrics, **self.lr}) - self.stop |= self.stopper(epoch + 1, self.fitness) + self.stop |= self.stopper(epoch + 1, self.fitness) or final_epoch if self.args.time: self.stop |= (time.time() - self.train_time_start) > (self.args.time * 3600) @@ -455,6 +455,7 @@ class BaseTrainer: self.stop = broadcast_list[0] if self.stop: break # must break all DDP ranks + epoch += 1 if RANK in (-1, 0): # Do final val with best.pt