方法 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_dir
是 trainer
的属性, 在 trainer
初始化时通过 cfg = DEFAULT_CFG
传入训练参数, 所以通过给全局变量 DEFAULT_CFG
添加字段可以更改 save_dir
注意了: 当调用 model.train()
时才会初始化 trainer
, 直接更改 model.trainer.save_dir
会报错, 因为在调用 model.train()
之前 model.trainer
是 None
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.args
由 yaml
文件解析而来, 所以按官方的思路是需要在 yaml
中指定 save
路径
但是懒得自己创建 yaml
又不想改库里的 yaml
怎么办呢
很简单, 那就在 trainer
初始化前改 DEFAULT_CFG
方法 2
更改ultralytics库里的 yaml
文件: /ultralytics/yolo/cfg/default.yaml
添加字段
save_dir: ./runs/train1 # 自己设置路径