方法 1

先给代码

from ultralytics.utils import DEFAULT_CFG
from datetime import datetime
current_time = datetime.now()
time_str = current_time.strftime("%Y-%m-%d_%H-%M-%S") # 个人习惯, 用训练时间命名保存路径, 或者你自己自定义
DEFAULT_CFG.save_dir= f"../models/{time_str}"
model = YOLO('yolov8n.pt')
data = 'data.yaml'
result = model.train(data = data, epochs = 100, batch = 32, save = True, device = 0)

save_dirtrainer 的属性, 在 trainer 初始化时通过 cfg = DEFAULT_CFG 传入训练参数, 所以通过给全局变量 DEFAULT_CFG 添加字段可以更改 save_dir

注意了: 当调用 model.train() 时才会初始化 trainer, 直接更改 model.trainer.save_dir会报错, 因为在调用 model.train() 之前 model.trainerNone

我们来看BaseTrainer.__init__():

	def __init__(self, cfg=DEFAULT_CFG, overrides=None, _callbacks=None):
        """
        Initializes the BaseTrainer class.

        Args:
            cfg (str, optional): Path to a configuration file. Defaults to DEFAULT_CFG.
            overrides (dict, optional): Configuration overrides. Defaults to None.
        """
        self.args = get_cfg(cfg, overrides)
        self.device = select_device(self.args.device, self.args.batch)
        self.check_resume()
        self.validator = None
        self.model = None
        self.metrics = None
        self.plots = {}
        init_seeds(self.args.seed + 1 + RANK, deterministic=self.args.deterministic)

        # Dirs
        project = self.args.project or Path(SETTINGS['runs_dir']) / self.args.task
        name = self.args.name or f'{self.args.mode}'
        if hasattr(self.args, 'save_dir'):
            self.save_dir = Path(self.args.save_dir)
        else:
            self.save_dir = Path(
                increment_path(Path(project) / name, exist_ok=self.args.exist_ok if RANK in (-1, 0) else True))
        ...

get_cfg(cfg, overrides) 默认的 cfg 没有 save_dir 字段, overrides 也不能有(因为会用字段检验函数,如果有默认 cfg 中没有的字段就会报错)

所以默认的 save_dir 来自这句代码:

increment_path(Path(project) / name, exist_ok=self.args.exist_ok if RANK in (-1, 0) else True))

完全根据项目目录自动生成的路径

而官方留了一手:

		if hasattr(self.args, 'save_dir'):
            self.save_dir = Path(self.args.save_dir)

self.argsyaml 文件解析而来, 所以按官方的思路是需要在 yaml 中指定 save 路径
但是懒得自己创建 yaml 又不想改库里的 yaml 怎么办呢
很简单, 那就在 trainer 初始化前改 DEFAULT_CFG

方法 2

更改ultralytics库里的 yaml 文件: /ultralytics/yolo/cfg/default.yaml

添加字段

save_dir: ./runs/train1 # 自己设置路径
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐