yolov9训练自己的数据—vehicle 4类

yolov9训练自己的数据

  • 1 conda环境
    • 安装指定版本torch
  • 2 预训练模型测试
  • 3 训练自己的数据集
    • 3.1 制作数据
    • 3.2 创建模型配置文件
    • 3.3 创建数据加载配置文件
    • 3.4 使用ClearML跟踪训练日志
    • 3.5 训练
    • 3.6 模型测试
    • 3.7 转换成TensorRT模型
  • 4 参考文档

1 conda环境

下载yolov9代码,并执行以下命令

$ git clone https://github.com/WongKinYiu/yolov9.git
$ cd yolov9
$ conda create --name yolov9 python=3.8
$ pip install -r requirement.txt

安装指定版本torch

到pytorch官网下载安装。

在这里插入图片描述

pip install torch==2.0.0 torchvision==0.15.1 -index-url https://download.pytorch.org/whl/cu118

torch安装失败,到上面地址手动下载v2.0.0,再安装。

在这里插入图片描述

 $ pip install torch-2.0.0+cu118-cp38-cp38-linux_x86_64.whl$ pip install torchvision-0.15.1+cu118-cp38-cp38-linux_x86_64.whl

2 预训练模型测试

# inference converted yolov9 models
$ python detect.py --source ./data/images/horses.jpg --img 640 --device 0 --weights ./weights/yolov9-c-converted.pt --conf 0.1# inference yolov9 models
# python detect_dual.py --source ./data/images/horses.jpg --img 640 --device 0 --weights ./weights/yolov9-c.pt# inference gelan models
# python detect.py --source ./data/images/horses.jpg --img 640 --device 0 --weights ./weights/gelan-c.pt
detect: weights=['./weights/yolov9-c-converted.pt'], source=./data/images/horses.jpg, data=data/coco128.yaml, imgsz=[640, 640], conf_thres=0.25, iou_thres=0.4e, save_txt=False, save_conf=False, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False, visualize=False, update=False, project=run_thickness=3, hide_labels=False, hide_conf=False, half=False, dnn=False, vid_stride=1
YOLOv5 🚀 v0.1-35-g9660d12 Python-3.8.18 torch-2.0.0+cu118 CUDA:0 (NVIDIA GeForce RTX 3090, 24260MiB)Fusing layers...
gelan-c summary: 387 layers, 25288768 parameters, 64944 gradients, 102.1 GFLOPs
image 1/1 /home/hard_disk/waf/projects-test/yolov9/data/images/horses.jpg: 448x640 5 horses, 89.3ms
Speed: 0.2ms pre-process, 89.3ms inference, 40.3ms NMS per image at shape (1, 3, 640, 640)
Results saved to runs/detect/exp

在这里插入图片描述

3 训练自己的数据集

3.1 制作数据

标注好的数据划分成train和val,调整成以下目录结构。images内放图片,labels放对应标签,图片名和标签名要一致。

vehicle/
├── train
│   ├── images
│   │   ├── 000000000064.jpg
│   ├── labels
│   │   ├── 000000000064.txt
├── val
│   ├── images
│   │   ├── 00000000724.jpg
│   ├── labels
│   │   ├── 000000000724.txt
├── train.txt
├── val.txt

train.txt内容为图像完整路径。

/home/hard_disk/waf/data/vehicle/train/images/000000000064.jpg
/home/hard_disk/waf/data/vehicle/train/images/000000000071.jpg
...

3.2 创建模型配置文件

yolov9/models/detect/目录下创建yolov9-c_vehicle.yaml,拷贝yolov9-c.yaml内容,并修改nc值为待训练的类别数。
在这里插入图片描述

3.3 创建数据加载配置文件

yolov9/data/目录下创建vehicle.yaml,内容为

path: /home/hard_disk/waf/data/vehicle/  # dataset root dir
train: train.txt  # train images (relative to 'path') 20960 images,19335+1625(uav)
val: val.txt  # val images (relative to 'path') 100 images
test: # Classes
names:0: car1: bus2: truck3: train

3.4 使用ClearML跟踪训练日志

(1)ClearML官网注册账号。
(2)右上角进入个人主页,依次点“Setting”–“Workspace”–“+Creat new credentials”,复制这段api:
在这里插入图片描述
(3)终端安装clearml

pip install clearml -i https://pypi.tuna.tsinghua.edu.cn/simple/

运行 clearml-init 连接ClearML 服务器,按照提示粘贴之前复制的api。

3.5 训练

#gpu单卡训练
$ python train_dual.py --workers 8 --device 0 --batch 16 --data data/vehicle.yaml --img 640 --cfg models/detect/yolov9-c_vehicle.yaml --weights '' --name yolov9-c --hyp data/hyps/hyp.scratch-high.yaml --min-items 0 --epochs 500 --close-mosaic 15 --cache

在这里插入图片描述

3.6 模型测试

python detect.py --source E:\DJI_20240307133038_0001.MP4 --img 640 --device 0 --weights weights\yolov9-c_vehicle.pt

在这里插入图片描述

3.7 转换成TensorRT模型

(1)Re-parameterization,将 reparameterize.py放到yolov9目录下,perform re-parameterization:

python reparameterize.py weights\yolov9-c_vehicle.pt weights\yolov9-c_vehicle_converted_cuda.pt

reparameterize.py代码如下,nc修改为训练的类别数,device也可以设置为cpu

import argparse
import torch
from models.yolo import Modeldef main(input_model_path, output_model_path):device = torch.device("cuda")cfg = "./models/detect/gelan-c.yaml"model = Model(cfg, ch=3, nc=4, anchors=3)#model = model.half()model = model.to(device)_ = model.eval()ckpt = torch.load(input_model_path, map_location='cuda')model.names = ckpt['model'].namesmodel.nc = ckpt['model'].ncidx = 0for k, v in model.state_dict().items():if "model.{}.".format(idx) in k:if idx < 22:kr = k.replace("model.{}.".format(idx), "model.{}.".format(idx+1))model.state_dict()[k] -= model.state_dict()[k]model.state_dict()[k] += ckpt['model'].state_dict()[kr]elif "model.{}.cv2.".format(idx) in k:kr = k.replace("model.{}.cv2.".format(idx), "model.{}.cv4.".format(idx+16))model.state_dict()[k] -= model.state_dict()[k]model.state_dict()[k] += ckpt['model'].state_dict()[kr]elif "model.{}.cv3.".format(idx) in k:kr = k.replace("model.{}.cv3.".format(idx), "model.{}.cv5.".format(idx+16))model.state_dict()[k] -= model.state_dict()[k]model.state_dict()[k] += ckpt['model'].state_dict()[kr]elif "model.{}.dfl.".format(idx) in k:kr = k.replace("model.{}.dfl.".format(idx), "model.{}.dfl2.".format(idx+16))model.state_dict()[k] -= model.state_dict()[k]model.state_dict()[k] += ckpt['model'].state_dict()[kr]else:while True:idx += 1if "model.{}.".format(idx) in k:breakif idx < 22:kr = k.replace("model.{}.".format(idx), "model.{}.".format(idx+1))model.state_dict()[k] -= model.state_dict()[k]model.state_dict()[k] += ckpt['model'].state_dict()[kr]elif "model.{}.cv2.".format(idx) in k:kr = k.replace("model.{}.cv2.".format(idx), "model.{}.cv4.".format(idx+16))model.state_dict()[k] -= model.state_dict()[k]model.state_dict()[k] += ckpt['model'].state_dict()[kr]elif "model.{}.cv3.".format(idx) in k:kr = k.replace("model.{}.cv3.".format(idx), "model.{}.cv5.".format(idx+16))model.state_dict()[k] -= model.state_dict()[k]model.state_dict()[k] += ckpt['model'].state_dict()[kr]elif "model.{}.dfl.".format(idx) in k:kr = k.replace("model.{}.dfl.".format(idx), "model.{}.dfl2.".format(idx+16))model.state_dict()[k] -= model.state_dict()[k]model.state_dict()[k] += ckpt['model'].state_dict()[kr]_ = model.eval()m_ckpt = {'model': model.half(),'optimizer': None,'best_fitness': None,'ema': None,'updates': None,'opt': None,'git': None,'date': None,'epoch': -1}torch.save(m_ckpt, output_model_path)if __name__ == "__main__":parser = argparse.ArgumentParser(description="Script to convert YOLO model")parser.add_argument("input_model_path", type=str, help="Path to the input YOLO model")parser.add_argument("output_model_path", type=str, help="Path to save the converted YOLO model")args = parser.parse_args()main(args.input_model_path, args.output_model_path)    

(2)导出onnx模型,在yolov9目录下执行以下命令,生成yolov9-c_vehicle_converted_cuda.onnx

python export.py --weights  weights\yolov9-c_vehicle_converted_cuda.pt --include onnx

(3)Build a TensorRT engine:

trtexec.exe --onnx=yolov9-c_vehicle_converted_cuda.onnx --explicitBatch --saveEngine=yolov9-c_vehicle_converted_cuda.engine --fp16

4 参考文档

(1) yolov9 训练自己数据集<日志>
(2) How to Train YOLOv9 on a Custom Dataset
(3) Convert YOLOv9-C
(4) spacewalk01/TensorRT-YOLOv9
(5) yolov5/tutorials/train_custom_data
(6) RuntimeError: The size of tensor a (3) must match the size of tensor b(64) at non-singleton dimension 1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/797367.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言:顺序表专题

目录 一、数据结构之顺序表/链表1.数据结构相关概念1.1什么是数据结构1.2为什么需要数据结构 二、顺序表1.顺序表的概念及结构2.顺序表分类3.动态顺序表的实现 一、数据结构之顺序表/链表 1.数据结构相关概念 1.1什么是数据结构 数据结构是由“数据”和“结构”两词组合而来…

解锁ETLCloud中Kettle的用法

随着大数据时代的到来&#xff0c;数据的处理和管理成为各行各业不可或缺的一环。ETL&#xff08;Extract-Transform-Load&#xff09;工具作为数据处理的重要环节&#xff0c;扮演着将数据从源端抽取出来、经过转换处理&#xff0c;最终加载至目标端的关键角色。在众多ETL工具…

【Python】数据挖掘与机器学习(一)

【Python】数据挖掘与机器学习(一) 大家好 我是寸铁&#x1f44a; 总结了一篇【Python】数据挖掘与机器学习(一)sparkles: 喜欢的小伙伴可以点点关注 &#x1f49d; 【实验1】预测鲍鱼年龄 问题描述 请从一份数据中预测鲍鱼的年龄&#xff0c;数据集在abalone.cvs中&#xff…

【Qt】:常用控件(二:QWidget核心属性)

常用控件&#xff08;二&#xff09; 一.cursor&#xff08;光标形状&#xff09;二.font&#xff08;字体信息&#xff09;三.toolTip&#xff08;提示显示&#xff09;四.focusPolicy&#xff08;焦点&#xff09;五.styleSheet&#xff08;文本样式&#xff09; 一.cursor&a…

Java BigDecimal类

原因 为什么要有BigDecimal类因为二进制的缘故&#xff0c;直接对浮点数进行运算&#xff0c;会导致精度丢失的问题下例&#xff1a;出现了0.1 0.2 <> 0.3 常见的API 这些API中&#xff0c;并不推荐由double类型转换的BigDecimal,因为底层还是double推荐使用由string 类…

QT5-qmediaplayer播放视频及进度条控制实例

qmediaplayer是QT5的播放视频的一个模块。它在很多时候还是要基于第三方的解码器。这里以Ubuntu系统为例&#xff0c;记录其用法及进度条qslider的控制。 首先&#xff0c;制作一个简单的界面文件mainwindow.ui&#xff1a; 然后&#xff0c;下载一个mp4或其他格式视频&#x…

【算法集训】基础算法:二分查找 | 概念篇

二分枚举&#xff0c;也叫二分查找&#xff0c;指的就是给定一个区间&#xff0c;每次选择区间的中点&#xff0c;并且判断区间中点是否满足某个条件&#xff0c;从而选择左区间继续求解还是右区间继续求解&#xff0c;直到区间长度不能再切分为止。 由于每次都是把区间折半&am…

小程序实现订阅功能和测试发送订阅信息

现在一次性订阅是只能用户点一次才能发送一次&#xff0c;而针对长期模板只有规定的几种类目政务、民生、交通等等的才可以&#xff0c;所以说感觉这功能其实已经不是很适合使用了&#xff0c;只适合一些特别的场景才可以使用。 地址&#xff1a;https://developers.weixin.qq…

where 函数

Pandas 中的 where 函数 在 Pandas 中&#xff0c;where 函数用于替换不满足条件的值。具体来说&#xff0c;它返回一个与原始 DataFrame 或 Series 形状相同的新对象&#xff0c;但所有不满足条件的值都被替换为指定的值&#xff08;默认为 NaN&#xff09;。 对于 DataFram…

【Web应用技术基础】JavaScript(7)——案例:点击文字则放大字体

视频已发。截图如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

2024.4.6-day11-CSS 背景和精灵图

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业2024.4.6学习笔记1 背景2 背景图片3 CSS 精灵图 作业 <!DOCTYPE html&…

项目中 使用 spring cache redis 出现大量keys* 慢查询排查以及修复

前言 业务反馈 redis里有大量的慢查询 而且全是keys 的命令 排查 首先登录 阿里云查看redis的慢查询日志 如下 主要使用到redis cache的注解功能 分别是 CacheEvict 和 Cacheable 注意 CacheEvict 这个比较特殊 会进行驱逐缓存 说白就会删除缓存或者让缓存失效 第一时间想…

第十四届蓝桥杯省赛大学C组(C/C++)填充

原题链接&#xff1a;填充 有一个长度为 n 的 01 串&#xff0c;其中有一些位置标记为 ?&#xff0c;这些位置上可以任意填充 0 或者 1&#xff0c;请问如何填充这些位置使得这个 01 串中出现互不重叠的 0 和 1 子串最多&#xff0c;输出子串个数。 输入格式 输入一行包含一…

【保姆级教程】如何在 Windows 上实现和 Linux 子系统的端口映射

写在前面 上次分享【保姆级教程】Windows上安装Linux子系统&#xff0c;搞台虚拟机玩玩&#xff0c;向大家介绍了什么是虚拟机以及如何在Windows上安装Linux虚拟机。对于开发同学而言&#xff0c;经常遇到的一个问题是&#xff1a;很多情况下代码开发需要依赖 Linux 系统&…

多线程代码设计模式之单例模式

目录 设计模式引入 饿汉模式 懒汉模式 单例模式总结 设计模式引入 1.1.什么是设计模式 &#xff08;1&#xff09;设计模式就是一种代码的套用模板。例如&#xff1a;一类题型的步骤分别有哪些&#xff0c;是可以直接套用的。 &#xff08;2&#xff09;像棋谱&#xff…

代码随想录算法训练营DAY17|C++二叉树Part.4|110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和

文章目录 110.平衡二叉树思路伪代码CPP代码 257.二叉树的所有路径思路伪代码实现CPP代码 404.左叶子之和思路伪代码CPP代码 110.平衡二叉树 力扣题目链接 文章讲解&#xff1a;110.平衡二叉树 视频讲解&#xff1a;后序遍历求高度&#xff0c;高度判断是否平衡 | LeetCode&…

lua学习笔记6(经典问题输出99乘法表)

print("************for循环的99乘法表*************") for i 1, 9 dolocal line "" -- 创建一个局部变量来累积每行的输出--local 是一个关键字&#xff0c;用于声明一个局部变量。for j 1, i doline line .. j .. "*" .. i .. ""…

电脑桌面上表格不见了怎么找回?这5个方法不要错过

在日常的办公和学习中&#xff0c;电脑桌面上的各种文件、文件夹和表格等无疑是我们较为频繁使用的资源。然而&#xff0c;有时我们可能会因为一些操作失误或者电脑问题&#xff0c;突然发现桌面上的某个表格文件神秘失踪了。面对这种情况&#xff0c;很多人可能会感到焦虑和不…

[WIP]Sora相关工作汇总VQGAN、MAGVIT、VideoPoet

视觉任务相对语言任务种类较多(detection, grounding, etc.)、粒度不同 (object-level, patch-level, pixel-level, etc.)&#xff0c;且部分任务差异较大&#xff0c;利用Tokenizer核心则为如何把其他模态映射到language space&#xff0c;并能让语言模型更好理解不同的视觉任…

Python-VBA函数基础知识-001

一、函数的定义&#xff1a; 函数(Function)是一段可重复使用的代码块&#xff0c;用于执行特定的任务或计算&#xff0c;并可以接受输入参数和返回输出结果。函数可以将复杂的问题分解为更小的子问题&#xff0c;提高代码的可读性和可维护性。 二、函数的组成&#xff1a; 在…