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

2024-09-02 22:12

本文主要是介绍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.resumeresume = '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  # reinstateexcept 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 eself.resume = resumedef resume_training(self, ckpt):ckpt = torch.load('runs/detect/exp/weights/last.pt')if ckpt is None:returnbest_fitness = 0.0start_epoch = ckpt['epoch'] + 1if ckpt['optimizer'] is not None:self.optimizer.load_state_dict(ckpt['optimizer'])  # optimizerbest_fitness = ckpt['best_fitness']if self.ema and ckpt.get('ema'):self.ema.ema.load_state_dict(ckpt['ema'].float().state_dict())  # EMAself.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 epochsself.best_fitness = best_fitnessself.start_epoch = start_epoch

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

这篇关于yolov8代码记录---(tasks.py中的c1、c2和args) / (断点续训)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131206

相关文章

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

统一返回JsonResult踩坑的记录

《统一返回JsonResult踩坑的记录》:本文主要介绍统一返回JsonResult踩坑的记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录统一返回jsonResult踩坑定义了一个统一返回类在使用时,JsonResult没有get/set方法时响应总结统一返回

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

java对接海康摄像头的完整步骤记录

《java对接海康摄像头的完整步骤记录》在Java中调用海康威视摄像头通常需要使用海康威视提供的SDK,下面这篇文章主要给大家介绍了关于java对接海康摄像头的完整步骤,文中通过代码介绍的非常详细,需... 目录一、开发环境准备二、实现Java调用设备接口(一)加载动态链接库(二)结构体、接口重定义1.类型

IDEA如何实现远程断点调试jar包

《IDEA如何实现远程断点调试jar包》:本文主要介绍IDEA如何实现远程断点调试jar包的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录问题步骤总结问题以jar包的形式运行Spring Boot项目时报错,但是在IDEA开发环境javascript下编译

深入解析 Java Future 类及代码示例

《深入解析JavaFuture类及代码示例》JavaFuture是java.util.concurrent包中用于表示异步计算结果的核心接口,下面给大家介绍JavaFuture类及实例代码,感兴... 目录一、Future 类概述二、核心工作机制代码示例执行流程2. 状态机模型3. 核心方法解析行为总结:三

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L