当前位置: 首页 > article >正文

yolov8代码记录---(tasks.py中的c1、c2和args) / (断点续训)

一、task中的c1、c2和args参数解析
如果你想在yolov8中修改或添加 新的结构块,基本都会修改到task.py中的c1、c2和args参数。
此处以Conv所在的判断分支代码为例:

if m in (Classify, Conv, ConvTranspose, ..., C3x, RepC3):
    c1, c2 = ch[f], args[0]
    if c2 != nc:
        c2 = make_divisible(min(c2, max_channels) * width, 8)
    args = [c1, c2, *args[1:]]

yaml文件里backbone部分第一个Conv对应的参数:

- [-1, 1, Conv, [64, 3, 2]]

解析:
1、c1
c1表示这个模块的输入通道数,如下组合c1=ch[f],其中ch[f]就是上个模块的输出通道数,因此c1=ch[f]的意思就是将上个模块的输出通道数作为这个模块的输入通道数。
2、c2
c2就是这个模块的输出通道数,说c2之前要先弄懂args。
3、args
初始的args就是backbone部分每个模块里的第4个参数,此处为args=[64, 3, 2],由此可得c2=args[0]=64,由代码可见还要改变输出通道数c2的值,这就跟不同大小的模型n、s、m等联系起来了。

width:就是yaml文件里的width_multiple用于调节模型大小;
函数make_divisible(x, 8)的作用就是找一个能被8整除的最小的整数x,所以make_divisible(8, 8)=8,make_divisible(15, 8)=16,make_divisible(17, 8)=24。
然后yaml文件里还可设置max_channels,用于限制通道数。

当采用yolov8n模型时那c2=make_divisible(min(64, 1024) * 0.25, 8)=16了。

可以看到args最后也重新赋值了,由上解释可知args[1:]=[3, 2],前面加个 * 的作用就是去掉中括号[],那最终args=[3, 16, 3, 2],不加 * 就是args=[3, 16, [3, 2]],显然是要加 * 的,因为要将得到的参数args=[3, 16, 3, 2]传入conv.py里的Conv类,3、2分别表示卷积核的尺寸是3*3和步幅为2。

二、断点续训
当yolov8在训练的时候,如果训练中断,可通过修改代码,从上一次断掉处重新训练,实现断点续训。

第一种方法:
按照官方给出的恢复训练代码,用yolo命令格式,这种情况必须是环境以安装了yolo和ultralytics两个包:
yolov8:

yolo task=detect mode=train model=runs/detect/exp/weights/last.pt data=ultralytics/datasets/mydata.yaml epochs=100 save=True resume=True

第二种方法:
在ultralytics/yolo/engine/trainer.py中找到check_resume和resume_training。
注释check_resume中resume = self.args.resume,改成需要断点恢复的last.pt。
在resume_training里面添加一行ckpt的值:

def check_resume(self):
        # resume = self.args.resume
        resume = 'runs/detect/exp/weights/last.pt';
        if resume:
            try:
                last = Path(
                    check_file(resume) if isinstance(resume, (str,
                                                              Path)) and Path(resume).exists() else get_latest_run())
                self.args = get_cfg(attempt_load_weights(last).args)
                self.args.model, resume = str(last), True  # reinstate
            except Exception as e:
                raise FileNotFoundError("Resume checkpoint not found. Please pass a valid checkpoint to resume from, "
                                        "i.e. 'yolo train resume model=path/to/last.pt'") from e
        self.resume = resume
 
    def resume_training(self, ckpt):
        ckpt = torch.load('runs/detect/exp/weights/last.pt')
        if ckpt is None:
            return
        best_fitness = 0.0
        start_epoch = ckpt['epoch'] + 1
        if ckpt['optimizer'] is not None:
            self.optimizer.load_state_dict(ckpt['optimizer'])  # optimizer
            best_fitness = ckpt['best_fitness']
        if self.ema and ckpt.get('ema'):
            self.ema.ema.load_state_dict(ckpt['ema'].float().state_dict())  # EMA
            self.ema.updates = ckpt['updates']
        if self.resume:
            assert start_epoch > 0, \
                f'{self.args.model} training to {self.epochs} epochs is finished, nothing to resume.\n' \
                f"Start a new training without --resume, i.e. 'yolo task=... mode=train model={self.args.model}'"
            LOGGER.info(
                f'Resuming training from {self.args.model} from epoch {start_epoch + 1} to {self.epochs} total epochs')
        if self.epochs < start_epoch:
            LOGGER.info(
                f"{self.model} has been trained for {ckpt['epoch']} epochs. Fine-tuning for {self.epochs} more epochs.")
            self.epochs += ckpt['epoch']  # finetune additional epochs
        self.best_fitness = best_fitness
        self.start_epoch = start_epoch

最后记住,断点续训结束后,将trainer.py还原,否则影响下次训练。


http://www.kler.cn/a/287768.html

相关文章:

  • 螺旋矩阵II(leetcode 59)
  • 2024年09月CCF-GESP编程能力等级认证Python编程三级真题解析
  • 为正在运行的 Docker 容器重启策略,以提高服务的可用性
  • SpringBoot+React养老院管理系统 附带详细运行指导视频
  • 性能高于Transformer模型1.7-2倍,彩云科技发布基于DCFormer架构通用大模型云锦天章
  • 微信小程序设置屏幕安全距离
  • bladeX默认审批流flowable如何设置
  • VBA字典与数组第十八讲:VBA中静态数组的定义及创建
  • WordPress资源产品展示类主题 官网主题 CeoNova-Pro_v4.4
  • 【科研积累】NSAI 神经符号人工智能 学习笔记
  • [HZNUCTF 2023 preliminary]ppppop
  • 万能的开题答辩稿,赶快收藏吧
  • golang并发编程——概述
  • RKNPU2从入门到实践 ---- 【9】使用RKNPU2的C API接口将RKNN模型部署在RK3588开发板上
  • 当敏捷开发遇上AI
  • Go发布自定义包
  • 华为云征文|遥遥领先的华为云Flexus云服务器X它来了~~~~
  • vrrp协议,主备路由器的选举
  • 关于VUE3开发频繁引入ref,reactive,computed等基础函数。
  • mac电脑里面的 磁盘分区,容器,宗卷,宗卷组的理解和使用
  • 【HarmonyOS NEXT开发】鸿蒙开发环境准备,ArkTS基础语法入门
  • 【JavaScript + ES6】前端八股文面试题
  • 笔记:如何使用Process Explorer分析句柄泄露溢出问题
  • 【高校科研前沿】三峡大学黄进副教授等人在环境科学Top期刊JCP发文:人类活动如何在气候变化下影响和降低生态敏感性:以中国长江经济带为例
  • react + ts + material-ui V5版本的table封装
  • css-50 Projects in 50 Days(2)