mirror of
https://github.com/THU-MIG/yolov10.git
synced 2025-05-24 06:14:55 +08:00
fix multiple dirs in DDP mode (#113)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Laughing-q <1185102784@qq.com>
This commit is contained in:
parent
34829a6b29
commit
100e21ee80
@ -126,6 +126,7 @@ class YOLO:
|
|||||||
"""
|
"""
|
||||||
overrides = self.overrides.copy()
|
overrides = self.overrides.copy()
|
||||||
overrides.update(kwargs)
|
overrides.update(kwargs)
|
||||||
|
overrides["mode"] = "predict"
|
||||||
predictor = self.PredictorClass(overrides=overrides)
|
predictor = self.PredictorClass(overrides=overrides)
|
||||||
|
|
||||||
# check size type
|
# check size type
|
||||||
@ -151,6 +152,7 @@ class YOLO:
|
|||||||
|
|
||||||
overrides = self.overrides.copy()
|
overrides = self.overrides.copy()
|
||||||
overrides.update(kwargs)
|
overrides.update(kwargs)
|
||||||
|
overrides["mode"] = "val"
|
||||||
args = get_config(config=DEFAULT_CONFIG, overrides=overrides)
|
args = get_config(config=DEFAULT_CONFIG, overrides=overrides)
|
||||||
args.data = data or args.data
|
args.data = data or args.data
|
||||||
args.task = self.task
|
args.task = self.task
|
||||||
|
@ -46,9 +46,9 @@ class BasePredictor:
|
|||||||
|
|
||||||
def __init__(self, config=DEFAULT_CONFIG, overrides={}):
|
def __init__(self, config=DEFAULT_CONFIG, overrides={}):
|
||||||
self.args = get_config(config, overrides)
|
self.args = get_config(config, overrides)
|
||||||
project = overrides.get("project") or self.args.task
|
project = self.args.project or f"runs/{self.args.task}"
|
||||||
name = overrides.get("name") or self.args.mode
|
name = self.args.name or f"{self.args.mode}"
|
||||||
self.save_dir = increment_path(Path("runs") / project / name, exist_ok=self.args.exist_ok)
|
self.save_dir = increment_path(Path(project) / name, exist_ok=self.args.exist_ok)
|
||||||
(self.save_dir / 'labels' if self.args.save_txt else self.save_dir).mkdir(parents=True, exist_ok=True)
|
(self.save_dir / 'labels' if self.args.save_txt else self.save_dir).mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
self.done_setup = False
|
self.done_setup = False
|
||||||
|
@ -24,7 +24,7 @@ import ultralytics.yolo.utils as utils
|
|||||||
import ultralytics.yolo.utils.callbacks as callbacks
|
import ultralytics.yolo.utils.callbacks as callbacks
|
||||||
from ultralytics import __version__
|
from ultralytics import __version__
|
||||||
from ultralytics.yolo.data.utils import check_dataset, check_dataset_yaml
|
from ultralytics.yolo.data.utils import check_dataset, check_dataset_yaml
|
||||||
from ultralytics.yolo.utils import LOGGER, ROOT, TQDM_BAR_FORMAT, colorstr
|
from ultralytics.yolo.utils import LOGGER, RANK, ROOT, TQDM_BAR_FORMAT, colorstr
|
||||||
from ultralytics.yolo.utils.checks import check_file, print_args
|
from ultralytics.yolo.utils.checks import check_file, print_args
|
||||||
from ultralytics.yolo.utils.configs import get_config
|
from ultralytics.yolo.utils.configs import get_config
|
||||||
from ultralytics.yolo.utils.dist import ddp_cleanup, generate_ddp_command
|
from ultralytics.yolo.utils.dist import ddp_cleanup, generate_ddp_command
|
||||||
@ -32,7 +32,6 @@ from ultralytics.yolo.utils.files import get_latest_run, increment_path, save_ya
|
|||||||
from ultralytics.yolo.utils.torch_utils import ModelEMA, de_parallel, init_seeds, one_cycle, strip_optimizer
|
from ultralytics.yolo.utils.torch_utils import ModelEMA, de_parallel, init_seeds, one_cycle, strip_optimizer
|
||||||
|
|
||||||
DEFAULT_CONFIG = ROOT / "yolo/utils/configs/default.yaml"
|
DEFAULT_CONFIG = ROOT / "yolo/utils/configs/default.yaml"
|
||||||
RANK = int(os.getenv('RANK', -1))
|
|
||||||
|
|
||||||
|
|
||||||
class BaseTrainer:
|
class BaseTrainer:
|
||||||
@ -48,9 +47,9 @@ class BaseTrainer:
|
|||||||
self.callbacks = defaultdict(list)
|
self.callbacks = defaultdict(list)
|
||||||
|
|
||||||
# dirs
|
# dirs
|
||||||
project = overrides.get("project") or self.args.task
|
project = self.args.project or f"runs/{self.args.task}"
|
||||||
name = overrides.get("name") or self.args.mode
|
name = self.args.name or f"{self.args.mode}"
|
||||||
self.save_dir = increment_path(Path("runs") / project / name, exist_ok=self.args.exist_ok)
|
self.save_dir = increment_path(Path(project) / name, exist_ok=self.args.exist_ok if RANK == -1 else True)
|
||||||
self.wdir = self.save_dir / 'weights' # weights dir
|
self.wdir = self.save_dir / 'weights' # weights dir
|
||||||
self.wdir.mkdir(parents=True, exist_ok=True) # make dir
|
self.wdir.mkdir(parents=True, exist_ok=True) # make dir
|
||||||
self.last, self.best = self.wdir / 'last.pt', self.wdir / 'best.pt' # checkpoint paths
|
self.last, self.best = self.wdir / 'last.pt', self.wdir / 'best.pt' # checkpoint paths
|
||||||
|
@ -8,7 +8,7 @@ from tqdm import tqdm
|
|||||||
from ultralytics.nn.autobackend import AutoBackend
|
from ultralytics.nn.autobackend import AutoBackend
|
||||||
from ultralytics.yolo.data.utils import check_dataset, check_dataset_yaml
|
from ultralytics.yolo.data.utils import check_dataset, check_dataset_yaml
|
||||||
from ultralytics.yolo.engine.trainer import DEFAULT_CONFIG
|
from ultralytics.yolo.engine.trainer import DEFAULT_CONFIG
|
||||||
from ultralytics.yolo.utils import LOGGER, TQDM_BAR_FORMAT
|
from ultralytics.yolo.utils import LOGGER, RANK, TQDM_BAR_FORMAT
|
||||||
from ultralytics.yolo.utils.files import increment_path
|
from ultralytics.yolo.utils.files import increment_path
|
||||||
from ultralytics.yolo.utils.ops import Profile
|
from ultralytics.yolo.utils.ops import Profile
|
||||||
from ultralytics.yolo.utils.torch_utils import check_imgsz, de_parallel, select_device, smart_inference_mode
|
from ultralytics.yolo.utils.torch_utils import check_imgsz, de_parallel, select_device, smart_inference_mode
|
||||||
@ -32,9 +32,10 @@ class BaseValidator:
|
|||||||
self.speed = None
|
self.speed = None
|
||||||
self.jdict = None
|
self.jdict = None
|
||||||
|
|
||||||
project = self.args.project if self.args.project != "runs/train" else self.args.task
|
project = self.args.project or f"runs/{self.args.task}"
|
||||||
name = self.args.name if self.args.name != "exp" else self.args.mode
|
name = self.args.name or f"{self.args.mode}"
|
||||||
self.save_dir = increment_path(Path("runs") / project / name, exist_ok=self.args.exist_ok)
|
self.save_dir = save_dir or increment_path(Path(project) / name,
|
||||||
|
exist_ok=self.args.exist_ok if RANK == -1 else True)
|
||||||
(self.save_dir / 'labels' if self.args.save_txt else self.save_dir).mkdir(parents=True, exist_ok=True)
|
(self.save_dir / 'labels' if self.args.save_txt else self.save_dir).mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
@smart_inference_mode()
|
@smart_inference_mode()
|
||||||
|
@ -15,8 +15,8 @@ nosave: False
|
|||||||
cache: False # True/ram, disk or False
|
cache: False # True/ram, disk or False
|
||||||
device: '' # cuda device, i.e. 0 or 0,1,2,3 or cpu
|
device: '' # cuda device, i.e. 0 or 0,1,2,3 or cpu
|
||||||
workers: 8
|
workers: 8
|
||||||
project: 'runs/train'
|
project: null
|
||||||
name: 'exp'
|
name: null
|
||||||
exist_ok: False
|
exist_ok: False
|
||||||
pretrained: False
|
pretrained: False
|
||||||
optimizer: 'SGD' # choices=['SGD', 'Adam', 'AdamW', 'RMSProp']
|
optimizer: 'SGD' # choices=['SGD', 'Adam', 'AdamW', 'RMSProp']
|
||||||
|
@ -45,7 +45,7 @@ class ClassificationTrainer(BaseTrainer):
|
|||||||
return batch
|
return batch
|
||||||
|
|
||||||
def get_validator(self):
|
def get_validator(self):
|
||||||
return v8.classify.ClassificationValidator(self.test_loader, self.device, logger=self.console)
|
return v8.classify.ClassificationValidator(self.test_loader, self.save_dir, logger=self.console)
|
||||||
|
|
||||||
def criterion(self, preds, batch):
|
def criterion(self, preds, batch):
|
||||||
loss = torch.nn.functional.cross_entropy(preds, batch["cls"])
|
loss = torch.nn.functional.cross_entropy(preds, batch["cls"])
|
||||||
|
@ -171,7 +171,7 @@ class DetectionValidator(BaseValidator):
|
|||||||
pad=0.5,
|
pad=0.5,
|
||||||
rect=self.args.rect,
|
rect=self.args.rect,
|
||||||
workers=self.args.workers,
|
workers=self.args.workers,
|
||||||
prefix=colorstr(f'{val}: '),
|
prefix=colorstr(f'{self.args.mode}: '),
|
||||||
shuffle=False,
|
shuffle=False,
|
||||||
seed=self.args.seed)[0] if self.args.v5loader else \
|
seed=self.args.seed)[0] if self.args.v5loader else \
|
||||||
build_dataloader(self.args, batch_size, img_path=dataset_path, stride=gs, mode="val")[0]
|
build_dataloader(self.args, batch_size, img_path=dataset_path, stride=gs, mode="val")[0]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user