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: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

D4代码AC集

贪心问题解决的步骤: (局部贪心能导致全局贪心)    1.确定贪心策略    2.验证贪心策略是否正确 排队接水 #include<bits/stdc++.h>using namespace std;int main(){int w,n,a[32000];cin>>w>>n;for(int i=1;i<=n;i++){cin>>a[i];}sort(a+1,a+n+1);int i=1

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

html css jquery选项卡 代码练习小项目

在学习 html 和 css jquery 结合使用的时候 做好是能尝试做一些简单的小功能,来提高自己的 逻辑能力,熟悉代码的编写语法 下面分享一段代码 使用html css jquery选项卡 代码练习 <div class="box"><dl class="tab"><dd class="active">手机</dd><dd>家电</dd><dd>服装</dd><dd>数码</dd><dd