自定义数据集训练 Yolo V10

上次介绍了Yolo 推理,本文我们将使用自己的数据集训练 Yolo V10,训练过程简单:

  1. 首先准备数据集,包括图片、标注
  2. 训练
  3. 推理

数据集准备

本次采用的数据集为内部数据,标注方法为 VOC 格式,首先我们需要建 VOC 格式的标注数据装换为 Yolo 格式的标注文件。

VOC 格式标注文件

VOC 为 XML 格式文件,坐标为标注框的左上和右下。
在这里插入图片描述

YOLO格式标注文件

YOLO 标注文件格式为

  • 类别ID:表示对象类别的整数。
  • 中心X:边界框中心的x坐标,归一化为图像宽度的值(介于0和1之间)。
  • 中心Y:边界框中心的y坐标,归一化为图像高度的值(介于0和1之间)。
  • 宽度:边界框的宽度,归一化为图像宽度的值(介于0和1之间)。
  • 高度:边界框的高度,归一化为图像高度的值(介于0和1之间)。

在这里插入图片描述

VOC 装 YOLO 格式

通过Python 讲 VOC 格式转换为 YOLO 格式。

import os
import xml.etree.ElementTree as ET# 从文件中读取类别名称并创建类别到索引的映射
def load_classes(file_path):with open(file_path, 'r') as file:classes = file.read().strip().split('\n')return {cls: idx for idx, cls in enumerate(classes)}# 将VOC XML注释转换为YOLO格式
def convert_voc_to_yolo(xml_file, output_dir, class_mapping):tree = ET.parse(xml_file)root = tree.getroot()image_filename = root.find('filename').textimage_path = os.path.join(output_dir, os.path.splitext(image_filename)[0] + '.txt')size = root.find('size')width = int(size.find('width').text)height = int(size.find('height').text)with open(image_path, 'w') as yolo_file:for obj in root.findall('object'):class_name = obj.find('name').textif class_name not in class_mapping:continueclass_id = class_mapping[class_name]xmlbox = obj.find('bndbox')xmin = int(xmlbox.find('xmin').text)ymin = int(xmlbox.find('ymin').text)xmax = int(xmlbox.find('xmax').text)ymax = int(xmlbox.find('ymax').text)# 计算YOLO格式的中心坐标、宽度和高度x_center = (xmin + xmax) / 2.0 / widthy_center = (ymin + ymax) / 2.0 / heightbbox_width = (xmax - xmin) / float(width)bbox_height = (ymax - ymin) / float(height)yolo_file.write(f"{class_id} {x_center} {y_center} {bbox_width} {bbox_height}\n")voc_annotation_dir = 'datasets/TG/TJHVOC2007/Annotations/'
yolo_output_dir = 'datasets/TG/TJHVOC2007/labels'
classes_file = 'classes.txt'if not os.path.exists(yolo_output_dir):os.makedirs(yolo_output_dir)class_mapping = load_classes(classes_file)for xml_file in os.listdir(voc_annotation_dir):if xml_file.endswith('.xml'):convert_voc_to_yolo(os.path.join(voc_annotation_dir, xml_file), yolo_output_dir, class_mapping)
#class.txt, 根据自己的分类进行修改
行人
汽车
红绿灯

拆分为训练集和验证集

将上面装换的数据集进行拆分,分为数据集和验证集,代码如下

import os
import shutil
import random# Set the path to your images and annotations
image_dir = './images'
annotation_dir = './labels'# Set the paths for the train and val directories
train_image_dir = '../images/train'
val_image_dir = '../images/val'
train_annotation_dir = '../labels/train'
val_annotation_dir = '../labels/val'# Create directories if they don't exist
os.makedirs(train_image_dir, exist_ok=True)
os.makedirs(val_image_dir, exist_ok=True)
os.makedirs(train_annotation_dir, exist_ok=True)
os.makedirs(val_annotation_dir, exist_ok=True)# Get list of all files
images = [f for f in os.listdir(image_dir) if os.path.isfile(os.path.join(image_dir, f))]
annotations = [f for f in os.listdir(annotation_dir) if os.path.isfile(os.path.join(annotation_dir, f))]# Ensure that the number of images and annotations match
assert len(images) == len(annotations), "Number of images and annotations do not match!"# Combine images and annotations into a list of tuples
data = list(zip(images, annotations))# Shuffle the data
random.shuffle(data)# Define the split ratio
train_ratio = 0.8
val_ratio = 0.2# Calculate the number of training samples
num_train_samples = int(train_ratio * len(data))# Split the data into training and validation sets
train_data = data[:num_train_samples]
val_data = data[num_train_samples:]# Copy files to the respective directories
for image, annotation in train_data:shutil.copy(os.path.join(image_dir, image), os.path.join(train_image_dir, image))shutil.copy(os.path.join(annotation_dir, annotation), os.path.join(train_annotation_dir, annotation))for image, annotation in val_data:shutil.copy(os.path.join(image_dir, image), os.path.join(val_image_dir, image))shutil.copy(os.path.join(annotation_dir, annotation), os.path.join(val_annotation_dir, annotation))print(f"Training data: {len(train_data)} samples")
print(f"Validation data: {len(val_data)} samples")

运行训练

创建配置文件VOC.yaml,运行训练

## VOC.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: TG
train: # train images (relative to 'path')  16551 images- TJHVOC2007
val: # val images (relative to 'path')  4952 images- TJHVOC2007
test: # test images (optional)- TJHVOC2007# Classes 按需修改
names:0: 人## 执行
results = model.train(data="./VOC.yaml", epochs=20, imgsz=1920, batch=4)

运行结果

精确率 71%,召回率 89%,不是很高,增大 epoch,结果应该会好一下。
在这里插入图片描述

推理

模型路径改为训练好的模型位置,之后进行推理即可。

YOLOv10('runs/detect/train25/weights/best.pt')

总结

训练比较简单,本文采用的是参数比较少的模型,由于图片尺寸较大,如果 Batch 过大会导致内存溢出,可以根据 GPU 内存情况进行调整。

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

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

相关文章

智能辅导班技术架构:运用人工智能提升教育领域的学习效果

在教育领域,随着人工智能的发展,智能辅导班逐渐成为一种趋势。它利用先进的技术和创新的教学方法,为学生提供个性化的学习体验和全方位的辅导服务。本文将介绍智能辅导班的技术架构,探讨如何运用人工智能来提升学习效果。 ### 1. …

力扣之链表专题

1. (LeetCode-21)合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]示例 2: 输入:l1 …

微服务架构-微服务实施

目录 一、概述 二、微服务拆分 2.1 概述 2.2 拆分原则 2.3 拆分方法 2.3.1 以数据为维度进行拆分 2.3.2 按照使用场景拆分 2.3.3 重要和非重要的拆分 2.3.4 变和不变的拆分 三、微服务通信 3.1 概述 3.2 微服务通信方式选择 3.3 微服务编排 3.4 API接口设计 3.5 …

「计网」网络初识

🎇个人主页:Ice_Sugar_7 🎇所属专栏:计网 🎇欢迎点赞收藏加关注哦! 网络初识 🍉IP 地址 & 端口号🍉网络协议🍌TCP/IP 网络协议 🍉封装和分用&#x1f349…

乡村振兴与乡村旅游创新:创新乡村旅游产品,提升旅游服务水平,打造特色乡村旅游品牌,助力美丽乡村建设

目录 一、引言 二、乡村旅游产品的创新 (一)挖掘乡村特色资源 (二)注重产品体验性 (三)创新旅游产品形态 三、旅游服务水平的提升 (一)加强基础设施建设 (二&…

如何上传模型素材创建3D漫游作品?

一、进入3D空间漫游互动工具编辑器 进入720云官网-点击“开始创作”-选择3D空间漫游-进入到作品创建页面。 二、上传模型及素材,创建生成3D空间漫游模型 1.创建3D空间作品:您可以选择新建空白作品或使用720云提供的预设空间模板,本篇主要介绍…

[手游] Florence逝去的爱弗洛伦斯

图片处理工具箱Hummingbird : Hummingbird使用智能压缩技术来减少文件的大小,支持:jpg、png、webp、svg、gif、gif、css、js、html、mp4、mov,可以设置压缩的同时等比例缩放图片或视频的尺寸。可以拖放文件夹压缩,一次最多可处理1…

【vue3 + Echarts 】中国地图省市区下钻,并返回上级

实现效果如果&#xff1a; echarts版本&#xff1a; 地图数据来源&#xff1a;阿里云数据可视化平台 代码 <template><div class"mapWrapper"><a-button type"primary" click"goBack">返回上级</a-button><div…

一步步实现知乎热榜采集:Scala与Sttp库的应用

背景 在大数据时代&#xff0c;网络爬虫技术发挥着不可或缺的作用。它不仅能够帮助我们快速地获取互联网上的信息&#xff0c;还能处理和分析这些数据&#xff0c;为我们提供深刻的洞察。知乎&#xff0c;作为中国领先的问答社区&#xff0c;汇聚了各行各业的专家和广大用户的…

【LeetCode刷题】二分查找:寻找旋转排序数组中的最小值、点名

【LeetCode刷题】Day 14 题目1&#xff1a;153.寻找旋转排序数组中的最小值思路分析&#xff1a;思路1&#xff1a;二分查找&#xff1a;以A为参照思路2&#xff1a;二分查找&#xff0c;以D为参照 题目2&#xff1a;LCR 173.点名思路分析&#xff1a;思路1&#xff1a;遍历查找…

(2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X

Lumina-T2X: Transforming Text into Any Modality, Resolution, and Duration via Flow-based Large Diffusion Transformers 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 …

使用Streamlit和MistralAI创建AI聊天机器人应用

大家好&#xff0c;创建交互式和用户友好型的应用程序通常需要复杂的框架和耗时的开发过程。Streamlit是一个Python库&#xff0c;它简化了以数据为重点的网络应用程序的创建过程&#xff0c;使开发人员和数据科学家能够快速将他们的想法转化为交互式仪表盘和原型。本文将介绍使…

『 Linux 』文件系统

文章目录 磁盘构造磁盘抽象化 磁盘的寻址方式磁盘控制器磁盘数据传输文件系统Inode数据块(Data Blocks)超级块(SuperBlock)块组描述符(Group Descriptor) 磁盘构造 磁盘内部构造由磁头臂,磁头,主轴,盘片,盘面,磁道,柱面,扇区构成; 磁头臂&#xff1a;控制磁头的移动,可以精确地…

vs2019 QT UI 添加新成员或者控件代码不提示问题解决方法

右键点击头文件&#xff0c;添加ui的头文件 添加现有项 找到uic目录的头文件 打开ui,QtWidgetsApplication2.ui,进行测试 修改一个名字&#xff1a; 重点&#xff1a; 设置一个布局&#xff1a; 点击生成解决方案&#xff1a; 以后每次添加控件后&#xff0c;记得点击保存 这样…

flink 作业报日志类冲突的解决方案

文章目录 背景思考初步解决方案深入思考下终极解决方案总结 背景 实时作业在页面提交任务后&#xff0c;报NoSuchMethodException 方法&#xff0c;看了下是关于log4j的&#xff0c;首先是作业升级了很多依赖的版本&#xff0c;其次flink 也升级 到了1.19版本 思考 打的Jar有…

CSS选择器的常见用法

大家好&#xff0c;本期博客整理了前端语言 CSS 中选择器的入门级常见用法&#xff0c;希望能对大家有所帮助 CSS 选择器的主要功能就是选中⻚⾯指定的标签元素&#xff0c;选中了元素&#xff0c;才可以设置元素的属性。 那么&#xff0c;css选择器有哪几种呢&#xff1f; 以…

全面理解渗透测试

揭秘网络安全的秘密武器&#xff1a;全面理解渗透测试 在数字化时代&#xff0c;网络安全已成为人们关注的焦点。网络攻击和数据泄露事件频发&#xff0c;给个人、企业和国家带来了巨大的损失。为了应对这一挑战&#xff0c;渗透测试作为一种重要的网络安全评估手段&#xff0…

Docker-----emqx部署

emqx通过Docker容器化部署流程 1.创建持久化挂载目录 mkdir -p /home/emqx/etc ------挂载emqx的配置文件目录 mkdir -p /home/emqx/data ------挂载emqx的存储目录 mkdir -p /home/emqx/log ------挂载emqx的日志目录 [root home]# mkdir -p /home/emqx/etc [root home]# mkd…

【Redis】 使用Java操作Redis的客户端

文章目录 &#x1f343;前言&#x1f334;项目的创建&#x1f38b;引入依赖&#x1f333;配置端⼝转发&#x1f332;更改 Redis 配置文件&#x1f384;连接 Redis Server⭕总结 &#x1f343;前言 我们使用 Java 操作 Redis 客户端时我们需要进行以下操作。 注意&#xff1a;J…

Linux上部署和安装MinIO

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法&#xff0c;大数据&#xff0c;深度学习 &#x1f492; 公众号…