YOLOV8在训练好的模型后增加epoch继续训练

1、首先在启动文件train.py中将resume设置为True,其他的设置随便设。

from ultralytics import YOLO
 
model = YOLO('runs/detect/train/weights/last.pt')
results = model.train(save=True, resume=True)

2、修改ultralytics/engine/trainer.py文件

        在ultralytics/engine/trainer.py中找到def check_resume(self),将resume = self.args.resume替换为resume = 'runs/detect/train/weights/last.pt';这个路径是你想要继续训练的权重文件。


def check_resume(self):
######       修改处       ###############
    # resume = self.args.resume
    resume = 'runs/detect/train/weights/last.pt';
######################################

        再找到def resume_training(self, ckpt):在第一行添加

        ckpt =torch.load('runs/detect/train/weights/last.pt')

        将start_epoch = ckpt['epoch'] + 1修改为上次训练的epoch数就可以,比如说上次训练了100次这次想继续训练50次就改为100

    def resume_training(self, ckpt):
        """Resume YOLO training from given epoch and best fitness."""
######       修改处       ###############
        ckpt = torch.load('runs/detect/train/weights/last.pt')
######################################
        if ckpt is None:
            return
        best_fitness = 0.0
######       修改处       ###############
        #start_epoch = ckpt['epoch'] + 1
        start_epoch = 100
######################################

        找到BaseTrainer下的

def __init__(self, cfg=DEFAULT_CFG, overrides=None, _callbacks=None):

将self.epochs = self.args.epochs修改为这次要训练的epochs,比如说上次训练了100次这次想继续训练50次就改为150

    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.check_resume(overrides)
        self.device = select_device(self.args.device, self.args.batch)
        self.validator = None
        self.model = None
        self.metrics = None
        self.plots = {}
        init_seeds(self.args.seed + 1 + RANK, deterministic=self.args.deterministic)

        # Dirs
        self.save_dir = get_save_dir(self.args)
        self.wdir = self.save_dir / 'weights'  # weights dir
        if RANK in (-1, 0):
            self.wdir.mkdir(parents=True, exist_ok=True)  # make dir
            self.args.save_dir = str(self.save_dir)
            yaml_save(self.save_dir / 'args.yaml', vars(self.args))  # save run args
        self.last, self.best = self.wdir / 'last.pt', self.wdir / 'best.pt'  # checkpoint paths
        self.save_period = self.args.save_period

        self.batch_size = self.args.batch
######       修改处       ###############
        #self.epochs = self.args.epochs
        self.epochs = 150
######################################
        self.start_epoch = 0

3、修改ultralytics/engine/model.py文件

在model.py文件中找到def train(self, trainer=None, **kwargs):进行如下修改

    def train(self, trainer=None, **kwargs):
        """
        Trains the model on a given dataset.

        Args:
            trainer (BaseTrainer, optional): Customized trainer.
            **kwargs (Any): Any number of arguments representing the training configuration.
        """
        self._check_is_pytorch_model()
        if self.session:  # Ultralytics HUB session
            if any(kwargs):
                LOGGER.warning('WARNING ⚠️ using HUB training arguments, ignoring local training arguments.')
            kwargs = self.session.train_args
        check_pip_update_available()

        overrides = yaml_load(check_yaml(kwargs['cfg'])) if kwargs.get('cfg') else self.overrides
        custom = {'data': TASK2DATA[self.task]}  # method defaults
        args = {**overrides, **custom, **kwargs, 'mode': 'train'}  # highest priority args on the right
        if args.get('resume'):
            args['resume'] = self.ckpt_path

        self.trainer = (trainer or self.smart_load('trainer'))(overrides=args, _callbacks=self.callbacks)
        if not args.get('resume'):  # manually set model only if not resuming
######       修改处       ###############
           # self.trainer.model = self.trainer.get_model(weights=self.model if self.ckpt else None, cfg=self.model.yaml)
           # self.model = self.trainer.model

            self.trainer.model = self.model
######################################
        self.trainer.hub_session = self.session  # attach optional HUB session
        self.trainer.train()
        # Update model and cfg after training
        if RANK in (-1, 0):
            ckpt = self.trainer.best if self.trainer.best.exists() else self.trainer.last
            self.model, _ = attempt_load_one_weight(ckpt)
            self.overrides = self.model.args
            self.metrics = getattr(self.trainer.validator, 'metrics', None)  # TODO: no metrics returned by DDP
        return self.metrics

最后运行train.py即可

!训练完成后把代码改回去 !

4、如果因为patience太小提前结束的训练,想要继续训练到指定epoch数只需要再修改patience即可,将patience修改为一个较大的值,这里我设置为300。

        ultralytics/engine/trainer.py:

    def _setup_train(self, world_size):
        """
        Builds dataloaders and optimizer on correct rank process.
        """

        # Model
        self.run_callbacks('on_pretrain_routine_start')
        ckpt = self.setup_model()
        self.model = self.model.to(self.device)
        self.set_model_attributes()

        # Freeze layers
        freeze_list = self.args.freeze if isinstance(
            self.args.freeze, list) else range(self.args.freeze) if isinstance(self.args.freeze, int) else []
        always_freeze_names = ['.dfl']  # always freeze these layers
        freeze_layer_names = [f'model.{x}.' for x in freeze_list] + always_freeze_names
        for k, v in self.model.named_parameters():
            # v.register_hook(lambda x: torch.nan_to_num(x))  # NaN to 0 (commented for erratic training results)
            if any(x in k for x in freeze_layer_names):
                LOGGER.info(f"Freezing layer '{k}'")
                v.requires_grad = False
            elif not v.requires_grad:
                LOGGER.info(f"WARNING ⚠️ setting 'requires_grad=True' for frozen layer '{k}'. "
                            'See ultralytics.engine.trainer for customization of frozen layers.')
                v.requires_grad = True

        # Check AMP
        self.amp = torch.tensor(self.args.amp).to(self.device)  # True or False
        if self.amp and RANK in (-1, 0):  # Single-GPU and DDP
            callbacks_backup = callbacks.default_callbacks.copy()  # backup callbacks as check_amp() resets them
            self.amp = torch.tensor(check_amp(self.model), device=self.device)
            callbacks.default_callbacks = callbacks_backup  # restore callbacks
        if RANK > -1 and world_size > 1:  # DDP
            dist.broadcast(self.amp, src=0)  # broadcast the tensor from rank 0 to all other ranks (returns None)
        self.amp = bool(self.amp)  # as boolean
        self.scaler = amp.GradScaler(enabled=self.amp)
        if world_size > 1:
            self.model = DDP(self.model, device_ids=[RANK])

        # Check imgsz
        gs = max(int(self.model.stride.max() if hasattr(self.model, 'stride') else 32), 32)  # grid size (max stride)
        self.args.imgsz = check_imgsz(self.args.imgsz, stride=gs, floor=gs, max_dim=1)

        # Batch size
        if self.batch_size == -1 and RANK == -1:  # single-GPU only, estimate best batch size
            self.args.batch = self.batch_size = check_train_batch_size(self.model, self.args.imgsz, self.amp)

        # Dataloaders
        batch_size = self.batch_size // max(world_size, 1)
        self.train_loader = self.get_dataloader(self.trainset, batch_size=batch_size, rank=RANK, mode='train')
        if RANK in (-1, 0):
            self.test_loader = self.get_dataloader(self.testset, batch_size=batch_size * 2, rank=-1, mode='val')
            self.validator = self.get_validator()
            metric_keys = self.validator.metrics.keys + self.label_loss_items(prefix='val')
            self.metrics = dict(zip(metric_keys, [0] * len(metric_keys)))
            self.ema = ModelEMA(self.model)
            if self.args.plots:
                self.plot_training_labels()

        # Optimizer
        self.accumulate = max(round(self.args.nbs / self.batch_size), 1)  # accumulate loss before optimizing
        weight_decay = self.args.weight_decay * self.batch_size * self.accumulate / self.args.nbs  # scale weight_decay
        iterations = math.ceil(len(self.train_loader.dataset) / max(self.batch_size, self.args.nbs)) * self.epochs
        self.optimizer = self.build_optimizer(model=self.model,
                                              name=self.args.optimizer,
                                              lr=self.args.lr0,
                                              momentum=self.args.momentum,
                                              decay=weight_decay,
                                              iterations=iterations)
        # Scheduler
        if self.args.cos_lr:
            self.lf = one_cycle(1, self.args.lrf, self.epochs)  # cosine 1->hyp['lrf']
        else:
            self.lf = lambda x: (1 - x / self.epochs) * (1.0 - self.args.lrf) + self.args.lrf  # linear
        self.scheduler = optim.lr_scheduler.LambdaLR(self.optimizer, lr_lambda=self.lf)
######       修改处       ###############
        #self.stopper, self.stop = EarlyStopping(patience=self.args.patience), False
        self.stopper, self.stop = EarlyStopping(patience=300), False
######################################
        self.resume_training(ckpt)
        self.scheduler.last_epoch = self.start_epoch - 1  # do not move
        self.run_callbacks('on_pretrain_routine_end')

最后运行train.py即可

!训练完成后把代码改回去 !

  • 4
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
基于YOLOv8的自行车识别检测系统源码(部署教程+训练好的模型+各项评估指标曲线).zip 平均准确率:0.98 类别:“自行车” 【资源介绍】 1、ultralytics-main ultralytics-main为YOLOv8源代码,里面涵盖基于yolov8分类、目标检测额、姿态估计、图像分割四部分代码,我们使用的是detect部分,也就是目标检测代码 2、搭建环境 安装anaconda 和 pycharm windows系统、mac系统、Linux系统都适配 在anaconda中新建一个新的envs虚拟空间(可以参考博客来),命令窗口执行:conda create -n YOLOv8 python==3.8 创建完YOLOv8-GUI虚拟空间后,命令窗口执行:source activate YOLOv8 激活虚拟空间 然后就在YOLOv8虚拟空间内安装requirements.txt中的所有安装包,命令窗口执行:pip install -r requirements.txt 使用清华源安装更快 3、训练模型过程 进入到\ultralytics-main\ultralytics\yolo\v8\detect\文件夹下,datasets即为我们需要准备好的数据集,训练其他模型同理。 data文件夹下的bicycle.yaml文件为数据集配置文件,该文件为本人训练自行车检测模型时创建,训练其他模型,可自行创建。博文有介绍https://blog.csdn.net/DeepLearning_?spm=1011.2415.3001.5343 train.py中238行,修改为data = cfg.data or './bicycle.yaml' # or yolo.ClassificationDataset("mnist") 237行修改自己使用的预训练模型 若自己有显卡,修改239行,如我有四张显卡,即改成args = dict(model=model, data=data, device=”0,1,2,3“) 以上配置完成后运行train.py开始训练模型训练完毕后会在runs/detect/文件夹下生成train*文件夹,里面包含模型和评估指标等 4、推理测试 训练模型,打开predict.py,修改87行,model = cfg.model or 'yolov8n.pt',把yolov8n.pt换成我们刚才训练完生成的模型路径(在\ultralytics-main\ultralytics\yolo\v8\detect\runs\detect文件夹下),待测试的图片或者视频存放于ultralytics\ultralytics\assets文件夹, 运行predict.py即可,检测结果会在runs/detect/train文件夹下生成。
### 回答1: 您好,要使用yolov5继续训练增加epoch,您需要执行以下步骤: 1. 确保您已经安装了yolov5,并且已经准备好了训练数据集。 2. 打开终端,进入yolov5的根目录。 3. 执行以下命令,继续训练模型增加epochpython train.py --weights /path/to/weights --epochs 100 --data /path/to/data.yaml --cfg /path/to/yolov5s.yaml --batch-size 16 其中,/path/to/weights是之前训练好的模型权重文件路径,/path/to/data.yaml是您的数据集配置文件路径,/path/to/yolov5s.yaml是您选择的yolov5模型配置文件路径,--epochs 100表示增加100个epoch,--batch-size 16表示每个批次的图像数量为16。 4. 等待训练完成后,您可以使用以下命令测试您的模型python detect.py --weights /path/to/weights --img 640 --conf .4 --source /path/to/images 其中,/path/to/images是您要测试的图像文件夹路径,--img 640表示输入图像的大小为640x640,--conf .4表示置信度阈值为.4。 希望这些信息对您有所帮助! ### 回答2: YOLOv5 是一种流行的目标检测算法,它基于深度学习进行训练,并且可以在较短的时间内高效地检测出图像中的目标。当YOLOv5的训练不足或者检测结果比较差时,我们可以采取增加epoch的方式来继续进行训练。 首先,我们需要明确epoch的概念。一个epoch表示模型对整个训练数据集进行一次完整的迭代训练YOLOv5的训练过程可以分为多个epoch,并且每个epoch都会更新模型的权重参数。当我们增加epoch时,模型会对数据进行更多的训练,从而进一步优化模型。当然,过多的epoch也可能导致模型过拟合,需要谨慎选择。 具体来说,我们可以通过增加epoch的方式来继续训练YOLOv5模型,步骤如下: 1. 导入已经训练好的模型。如果我们之前已经进行了一些训练,可以直接导入之前模型的权重参数。 2. 根据需要,调整训练的参数。例如,可以设置学习率、批量大小等参数。这些设置的目的是让模型更好地适应当前的数据集。 3. 进行额外的训练。我们可以设置增加训练epoch数,然后训练模型。在每个epoch完成后,模型的权重参数将会更新。 4. 评估模型的性能。通过训练数据集和测试数据集的误差,可以评估模型的性能,看看训练的效果是否改进。如果性能改进不大,可以考虑进行其他方式的优化。 需要注意的是,增加epoch并不能保证模型的效果一定会变好,这需要视具体情况而定。如果数据集比较小,训练次数过多也可能导致过拟合现象发生。因此,在进行epoch增加训练时,应该根据具体情况进行判断和调整,以获得更好的效果。 ### 回答3: YOLOv5 是一种先进的物体检测模型,由于其深度学习算法的高精度和快速响应,越来越受到人们的青睐。在使用 YOLOv5 进行物体检测过程中,经常会需要增加 epoch 进行持续训练,这可以提高模型检测的准确率。 增加 epoch 的方法是比较简单的。首先,需要设定训练次数(iterations),然后将其转化为 epoch 值。例如,如果一个模型需要进行 20000 次训练,而每次训练的图像数量为 32 张,那么每个 epoch 中就需要进行 20000/(数据集大小32)= 624 次迭代训练。如果每秒训练 20 张图像,那么进行 624 次迭代训练所需的时间为 31.2 秒。因此,将 epoch 设置为 100 可以让模型训练 100 个 epoch,进而增加模型的准确性。 另外,还需要在模型训练过程中控制学习率(learning rate),可以采用 step learning rate 或 cosine learning rate 等方法。在 step learning rate 方法中,可以设置一个初始学习率和一些 step 值,每个 step 值将学习率下降为其初始值的某个百分比。在 cosine learning rate 方法中,学习率将按照 cosine 曲线下降,直到达到最小值。这些方法都可以较好地控制学习率的变化,避免过早或过度地在训练过程中调整模型参数。 总之,将 YOLOv5 模型epoch 增加,是提高模型检测准确率的有效方法之一。同时在训练过程中,还需要针对具体情况进行学习率控制,以加快训练速度,并提高模型趋于稳定的程度,从而获得更好的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值