YOLOv10目标检测算法的使用

目录

一、环境安装

1、创建虚拟环境

2、安装依赖

二、数据集准备

1、预训练权重

2、数据划分

3、建立数据集的yaml文件

 三、训练

1、终端运行指令

2、建立一个 python 文件运行

四、验证

1、终端运行指令

2、建立一个 python 文件运行

五、模型推理

1、单张图片推理

2、视频推理

六、导出报告

七、报错处理

1、提示数据集.yaml文件错误:RuntimeError: Dataset 'datasets/fire.yaml' error

八、附录

1、xml转txt脚本


一、环境安装

1、创建虚拟环境

conda create -n yolov10 python=3.8# 激活yolov9 env
conda activate yolov10

2、安装依赖

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

二、数据集准备

1、预训练权重

预训练权重下载:

import os
import urllib.request# Create a directory for the weights in the current working directory
weights_dir = os.path.join(os.getcwd(), "weights")
os.makedirs(weights_dir, exist_ok=True)# URLs of the weight files
urls = ["https://github.com/jameslahm/yolov10/releases/download/v1.0/yolov10n.pt","https://github.com/jameslahm/yolov10/releases/download/v1.0/yolov10s.pt","https://github.com/jameslahm/yolov10/releases/download/v1.0/yolov10m.pt","https://github.com/jameslahm/yolov10/releases/download/v1.0/yolov10b.pt","https://github.com/jameslahm/yolov10/releases/download/v1.0/yolov10x.pt","https://github.com/jameslahm/yolov10/releases/download/v1.0/yolov10l.pt"
]# Download each file
for url in urls:file_name = os.path.join(weights_dir, os.path.basename(url))urllib.request.urlretrieve(url, file_name)print(f"Downloaded {file_name}")

2、数据划分

 将需要训练的数据集,放入项目目录下,格式如下(目前的图片和标签是这个样子的):

Moon_Cake├─images└─all└─labels└─all

现在通过脚本将数据集进行划分,格式如下:

├── yolov10_dataset└── train└── images (folder including all training images)└── labels (folder including all training labels)└── test└── images (folder including all testing images)└── labels (folder including all testing labels)└── valid└── images (folder including all testing images)└── labels (folder including all testing labels)

划分代码:

import os
import random
import shutildef copy_files(src_dir, dst_dir, filenames, extension):os.makedirs(dst_dir, exist_ok=True)missing_files = 0for filename in filenames:src_path = os.path.join(src_dir, filename + extension)dst_path = os.path.join(dst_dir, filename + extension)# Check if the file exists before copyingif os.path.exists(src_path):shutil.copy(src_path, dst_path)else:print(f"Warning: File not found for {filename}")missing_files += 1return missing_filesdef split_and_copy_dataset(image_dir, label_dir, output_dir, train_ratio=0.7, valid_ratio=0.15, test_ratio=0.15):# 获取所有图像文件的文件名(不包括文件扩展名)image_filenames = [os.path.splitext(f)[0] for f in os.listdir(image_dir)]# 随机打乱文件名列表random.shuffle(image_filenames)# 计算训练集、验证集和测试集的数量total_count = len(image_filenames)train_count = int(total_count * train_ratio)valid_count = int(total_count * valid_ratio)test_count = total_count - train_count - valid_count# 定义输出文件夹路径train_image_dir = os.path.join(output_dir, 'train', 'images')train_label_dir = os.path.join(output_dir, 'train', 'labels')valid_image_dir = os.path.join(output_dir, 'valid', 'images')valid_label_dir = os.path.join(output_dir, 'valid', 'labels')test_image_dir = os.path.join(output_dir, 'test', 'images')test_label_dir = os.path.join(output_dir, 'test', 'labels')# 复制图像和标签文件到对应的文件夹train_missing_files = copy_files(image_dir, train_image_dir, image_filenames[:train_count], '.jpg')train_missing_files += copy_files(label_dir, train_label_dir, image_filenames[:train_count], '.txt')valid_missing_files = copy_files(image_dir, valid_image_dir, image_filenames[train_count:train_count + valid_count], '.jpg')valid_missing_files += copy_files(label_dir, valid_label_dir, image_filenames[train_count:train_count + valid_count], '.txt')test_missing_files = copy_files(image_dir, test_image_dir, image_filenames[train_count + valid_count:], '.jpg')test_missing_files += copy_files(label_dir, test_label_dir, image_filenames[train_count + valid_count:], '.txt')# Print the count of each datasetprint(f"Train dataset count: {train_count}, Missing files: {train_missing_files}")print(f"Validation dataset count: {valid_count}, Missing files: {valid_missing_files}")print(f"Test dataset count: {test_count}, Missing files: {test_missing_files}")# 使用例子
image_dir = 'datasets/coco128/images/train2017'
label_dir = 'datasets/coco128/labels/train2017'
output_dir = './my_dataset'split_and_copy_dataset(image_dir, label_dir, output_dir)

划分后的样子:

3、建立数据集的yaml文件

自己建立的,写成绝对路径,防止出错:

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: /hy-tmp/yolov10/datasets/dataset_split
train: train # train images
val: val # val images
test: test # test images (optional) # number of classes
nc: 2# Classes,这个类别也可以这样写:names: [ 'sleep' , 'phone' ]
names:0: sleep1: phone

下面的自带的:

path: ../datasets/coco128  # dataset root dir
train: images/train2017  # train images (relative to 'path') 128 images
val: images/train2017  # val images (relative to 'path') 128 images
test:  # test images (optional)# Classes
names:0: person1: bicycle2: car''''''79: toothbrush

 三、训练

YOLov10 提供两种训练方式,终端运行指令和新建一个 python 文件运行

1、终端运行指令

通过命令直接进行训练在其中指定参数,命令如下(注意:如果是Windows系统,Workers最好设置成0,否则容易报线程的错误):

# 从YAML构建一个新模型,从头开始训练
yolo task=detect mode=train model=yolov10n.yaml data=替换你数据集的yaml文件地址 batch=16 epochs=100 imgsz=640 workers=0 device=0# 从预训练的*.pt模型开始训练
yolo task=detect mode=train model=yolov10n.pt data=替换你数据集的yaml文件地址 batch=16 epochs=100 imgsz=640 workers=0 device=0# 从YAML中构建一个新模型,将预训练的权重转移到它并开始训练
yolo task=detect mode=train model=yolov10n.yaml pretrained=yolov10n.pt data=替换你数据集的yaml文件地址 batch=16 epochs=100 imgsz=640 workers=0 device=0

通过指定cfg直接进行训练,配置好ultralytics/cfg/default.yaml这个文件之后,可以直接执行这个文件进行训练,这样就不用在命令行输入其它的参数了:

yolo cfg=ultralytics/cfg/default.yaml

2、建立一个 python 文件运行

有些教程写的是,需要导入YOLOv10模块,而不是YOLO模块(参考),但是实际上也没啥问题(推荐这个,注意修改yolov10n.yaml模型配置文件的类别数)。

from ultralytics import YOLO# 模型配置文件
model_yaml_path = "ultralytics/cfg/models/v10/yolov10n.yaml"
#数据集配置文件
data_yaml_path = 'datasets/fire.yaml'
#预训练模型
pre_model_name = 'yolov10n.pt'if __name__ == '__main__':#加载预训练模型model = YOLO(model_yaml_path).load(pre_model_name)#训练模型results = model.train(data=data_yaml_path,epochs=20,batch=4,name='train_v10')

而应对指令命令的三种形式如下:

from ultralytics import YOLOv10# Load a model # 三选一
model = YOLOv10('yolov10n.yaml')  # build a new model from YAML
model = YOLOv10('yolov10n.pt')  # load a pretrained model (recommended for training)
model = YOLOv10('yolov10n.yaml').load('yolov10n.pt')  # build from YAML and transfer weights# Train the model
model.train(data='coco128.yaml', epochs=100, imgsz=640)

可以通过tensorboard查看实时训练效果:

tensorboard --logdir runs\detect\train2

四、验证

1、终端运行指令

yolo task=detect mode=val model=yolov10n.pt
# mode=val 就是看验证集
yolo task=detect mode=val split=val model=runs/detect/train2/weights/best.pt  data=ultralytics/datasets/MoonCake.yaml # 替换你数据集的yaml文件地址
# mode=test 就是看测试集
yolo task=detect mode=val split=test model=runs/detect/train2/weights/best.pt  data=ultralytics/datasets/MoonCake.yaml

2、建立一个 python 文件运行

from ultralytics import YOLOv10# Load a model
model = YOLOv10('yolov10n

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

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

相关文章

Android开发实用必备的几款插件,提高你的开发速度

1.GsonFormat 使用方法:快捷键AltS也可以使用AltInsert选择GsonFormat,作用:速将json字符串转换成一个Java Bean,免去我们根据json字符串手写对应Java Bean的过程。 2.ButterKnife Zelezny 又叫黄油刀 使用方法:CtrlS…

【Nodejs 日志库 】

总结了几个比较好用的Nodejs日志库,我认为一个 合格的日志库 需要 支持多种传输,如文件、控制台、HTTP 等。可定制的日志级别和格式。异步日志记录。 根据上述的需求,挑选出 几款比较好用的日志库, 1. Winston(Gith…

直流电机三级串电阻启动

直流电动机在工农业生产中拥有广泛的应用,这主要得益于其调速范围广、调速平稳、过载能力强以及启动和制动转矩大的优点。为了降低起动电流和起动转矩,研究者们探索了直流电动机串电阻起动方法。这种方法通过在直流电动机电枢绕组中串入电阻,…

192.回溯算法:电话号码的字母组合(力扣)

代码解决 class Solution { public:// 定义每个数字对应的字母映射const string letterMap[10] {"", // 0"", // 1"abc", // 2"def", // 3"ghi", // 4"jkl", // 5"mno", // 6"pqrs&…

vscode+picgo+gitee实现Markdown图床

vscode中编辑Markdown文件,复制的图片默认是保存在本地的。当文档上传csdn时,会提示图片无法识别 可以在gitee上创建图床仓库,使用picgo工具上传图片,在Markdown中插入gitee链接的方式来解决该问题。 一、 安装picgo工具 1.1 v…

Kimichat使用案例027:有效使用 kimichat 的15个高级技巧

文章目录 一、明确具体:表达清晰、避免使用模糊措辞。二、提供背景信息:提供相关的细节和背景信息。三、每次只问一个问题四、设定明确的标准五、要求解释六、管理期望七、确定问题类型八、调整语言水平九、提供范例十、及时提供反馈十一、明确对话角色十二、 保持对话的连贯…

Tableau数据可视化与仪表盘搭建

Tableau的主要目的 数据赋能和数据探索。 数据赋能: 1.分析师可以将数据看板发布到线上给其他部门使用 2.自动更新看板 3.自由下载数据 4.线上修改图表 5.邮件发送数据 6.设置数据预警 数据探索: 1.支持亿级数据的连接和处理 2.自由地对字段进行各种…

目前哪个充电宝品牌比较好?四款优质充电宝分享

在电量成为现代生活不可或缺的生产资源的时代,选择一款优质的充电宝无疑是保证移动设备持续运作的关键。面对市场上众多品牌和型号的充电宝,消费者在选择时可能会感到困惑和迷茫。本文将为您揭示哪些品牌真正代表了耐用性和质量的典范,让自己…

gbase8s获取表的serial字段下一个insert序列值

serial字段,有个函数可以获取到最后插入的序列值,但是好像只能获取到当前会话最后一次插入的序列值,不论是SELECT dbinfo(sqlca.sqlerrd1) FROM dual;,还是select dbinfo(bigserial) from dual;,或者select dbinfo(ser…

如果申请小程序地理位置接口权限之前刷到这一篇就好了

小程序地理位置接口有什么功能? 通常情况下,我们在开发小程序时,可能会用到获取用户地理位置信息的功能。小程序开发者开放平台的新规定指出,如果没有申请开通微信小程序地理位置接口(getLocation)&#xf…

4.XSS-反射型(get)利用:获取cookie

GET反射型XSS利用:获取cookie 修改一下配置文件\pikachu\pkxss\xcookie\cookie.php 我这里将对应的IP地址修改为本地pikachu的主站IP地址,这样给用户造成一种正常视觉上的欺骗,容易上当。重定向到pikachu主页面 基于IP搭建的pkxss平台(入侵…

合并有序链表

合并有序链表 图解代码如下 图解 虽然很复杂,但能够很好的理解怎么使用链表,以及对链表的指针类理解 代码如下 Node* merge_list_two_pointer(List& list1, List& list2) {Node* new_head1 list1.head;Node* new_head2 list2.head;Node* s…

认识微服务

单体架构 单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。 优点: 架构简单部署成本低缺点: 团队协作成本高系统发布效率低系统可用性差 总结: 单体架构适合开发功能相对简单,规模较小…

【从0实现React18】 (二) JSX 的转换 jsx到底是什么?React是如何把jsx转换为ReactElement?

react项目结构 React(宿主环境的公用方法)React-reconciler(协调器的实现,宿主环境无关)各种宿主环境的包shared(公用辅助方法,宿主环境无关) 当前实现的JSX转换属于 react****包 初始化react包 先创建react package并初始化 更新package.json文件&a…

微服务——重复消费(幂等解决方案)

目录 一、唯一ID机制二、幂等性设计三、状态检查机制四、利用缓存和消息队列五、分布式锁总结 在微服务中,防止重复消费的核心思想是通过设计使得操作一次与多次产生相同的效果,并为每次操作生成唯一的ID。这样,即使在消息被重复发送的情况下…

K8S - 实现statefulset 有状态service的灰度发布

什么是灰度发布 Canary Release 参考 理解 什么是 滚动更新,蓝绿部署,灰度发布 以及它们的区别 配置partition in updateStrategy/rollingUpdate 这次我为修改了 statefulset 的1个yaml file statefulsets/stateful-nginx-without-pvc.yaml: --- apiVe…

Android - 跳转到应用商店进行应用打分功能实现

2.将过滤出的这些应用商店展示给用户,如果没有安装任何相关应用商店则提示用户“暂无安装相关应用商店”。 3.用户点击了某应用商店之后,则跳转到该应用商店的APP详情页。 4.下面列出了比较核心的代码,可进行参考。 /** 过滤出已经安装的包…

不同交换机之间相同VLAN间主机通信

1、搭建网络拓扑 搭建拓扑,分配IP地址,划分vlan,分配端口 2、配置交换机 //进入全局配置模式 Switch>enable Switch#config terminal Enter configuration commands, one per line. End with CNTL/Z. Switch(config)#hostname SW1 …

ubuntu 20.04 访问csdn报错 Secure connection failed

打扰了,csdn服务器的问题,和源没关系,后面又重新测试了一下。刚好那一刻网站连上了。 暂时没有好办法,等待一段时间就连上了,改host似乎也不太行。 问题原因: 我一边更新源 sudo apt update & apt up…

OPENCV中0x00007FFE5F35F39C发生异常

原因:读取图片时已经为灰度图像,又进行了一次灰度处理cvtColor 解决方法:如上图所示,将cv::imread的第二个参数改为cv::IMREAD_COLOR;或者保留cv::IMREAD_GRAYSCALE,删去后面的cv::cvtColor