YOLOv10目标检测-训练自己的数据

yolov10
https://github.com/THU-MIG/yolov10?tab=readme-ov-file

1. 数据集

模型的建立需要收集图片并且进行标注。YOLOv10标注的文件格式如下(每张图片对应一个标签文件):
在这里插入图片描述

0 0.441753 0.815461 0.061021 0.042763
1 0.395895 0.759868 0.066198 0.046053
2 0.497781 0.744737 0.060651 0.039474
0 0.575629 0.787171 0.059541 0.042763
<object-class-id> <x> <y> <width> <height>

第一个数字表示目标框的类别(如类别0,1,2,…),后面四个长数字代表:标记框中心点的横纵坐标(x, y),标记框宽高的大小(w, h),且都是归一化后的值(图片左上角为坐标原点)。

1.1 标注工具

数据标注的工具有很多,比如LabelImg,LableMe,VIA等,在线标注工具Make Sense

1.2 格式转换

from PIL import Imagedef convert_to_yolo_format(bbox, img_size, class_id):"""将目标框 [xmin, ymin, xmax, ymax] 转换为 YOLO 格式参数:bbox: list,目标框的坐标 [xmin, ymin, xmax, ymax];img_size: img_width: 图像的宽度, img_height: 图像的高度;class_id: 目标的类别 ID返回:str: YOLO 格式的标注"""xmin, ymin, xmax, ymax = bboximg_width, img_height = img_size# 计算中心坐标和宽度、高度x_center = (xmin + xmax) / 2y_center = (ymin + ymax) / 2width = xmax - xminheight = ymax - ymin# 归一化坐标和尺寸x_center_normalized = x_center / img_widthy_center_normalized = y_center / img_heightwidth_normalized = width / img_widthheight_normalized = height / img_height# 返回 YOLO 格式的字符串return f"{class_id} {x_center_normalized:.6f} {y_center_normalized:.6f} {width_normalized:.6f} {height_normalized:.6f}"def write_to_yolo_txt(img_path, bboxes, classes, file_path):"""将多个目标框转换为 YOLO 格式并写入 .txt 文件"""with Image.open(img_path) as img:# img_width, img_height = img.sizeimg_size = img.sizewith open(file_path, 'w') as f:for i in range(len(bboxes)):bbox = bboxes[i]yolo_format = convert_to_yolo_format(bbox, img_size, classes[i])f.write(yolo_format + '\n')# 示例数据
bboxes = [[404, 233, 497, 326], [308, 233, 401, 329]]
img_path = "./data/0a1a9c2e5a64f54b5f5899f5114bdc6549b6.jpg"
classes = [0, 0]
output_file = 'output.txt'
write_to_yolo_txt(img_path, bboxes, classes, output_file)

voc(xml)转yolo格式

import os
import json
import argparse
import sys
import shutil
from lxml import etree
from tqdm import tqdmcategory_set = set()
image_set = set()
bbox_nums = 0def parse_xml_to_dict(xml):"""将xml文件解析成字典形式,参考tensorflow的recursive_parse_xml_to_dictArgs:xml: xml tree obtained by parsing XML file contents using lxml.etreeReturns:Python dictionary holding XML contents."""if len(xml) == 0:  # 遍历到底层,直接返回tag对应的信息return {xml.tag: xml.text}result = {}for child in xml:child_result = parse_xml_to_dict(child)  # 递归遍历标签信息if child.tag != 'object':result[child.tag] = child_result[child.tag]else:if child.tag not in result:  # 因为object可能有多个,所以需要放入列表里result[child.tag] = []result[child.tag].append(child_result[child.tag])return {xml.tag: result}def xyxy2xywhn(bbox, size):bbox = list(map(float, bbox))size = list(map(float, size))xc = (bbox[0] + (bbox[2] - bbox[0]) / 2.) / size[0]yc = (bbox[1] + (bbox[3] - bbox[1]) / 2.) / size[1]wn = (bbox[2] - bbox[0]) / size[0]hn = (bbox[3] - bbox[1]) / size[1]return (xc, yc, wn, hn)def parser_info(info: dict, only_cat=True, class_indices=None):filename = info['annotation']['filename']image_set.add(filename)objects = []width = int(info['annotation']['size']['width'])height = int(info['annotation']['size']['height'])for obj in info['annotation']['object']:obj_name = obj['name']category_set.add(obj_name)if only_cat:continuexmin = int(obj['bndbox']['xmin'])ymin = int(obj['bndbox']['ymin'])xmax = int(obj['bndbox']['xmax'])ymax = int(obj['bndbox']['ymax'])bbox = xyxy2xywhn((xmin, ymin, xmax, ymax), (width, height))if class_indices is not None:obj_category = class_indices[obj_name]object = [obj_category, bbox]objects.append(object)return filename, objectsvoc_dir = "./data/Annotations"
txt_dir = "./data/txt"
image_dir = "./data/Images"class_ind = {"person": 0}xml_files = [os.path.join(voc_dir, i) for i in os.listdir(voc_dir) if os.path.splitext(i)[-1] == '.xml']
for xml_file in xml_files:with open(xml_file, 'rb') as fid:xml_str = fid.read()xml = etree.fromstring(xml_str)info_dict = parse_xml_to_dict(xml) filename, objects = parser_info(info_dict, only_cat=False, class_indices=class_ind) # 273.jpeg [[0, (0.411, 0.7448418156808804, 0.21, 0.14718019257221457)], [0, (0.688, 0.7895460797799174, 0.212, 0.1485557083906465)]]image_p = image_dir + "/" + filenametxt_p = image_dir + "/" + os.path.splitext(os.path.basename(xml_file))[0] + ".txt"#################### 写入txtwith open(txt_p, 'w') as f:for obj in objects:f.write("{} {:.6f} {:.6f} {:.6f} {:.6f}\n".format(obj[0], obj[1][0], obj[1][1], obj[1][2], obj[1][3]))

参考:
https://blog.csdn.net/mywhyyds/article/details/143831918
https://blog.csdn.net/festaw/article/details/138039269

1.3 数据

1.3.1 数据集

在根目录下建data文件夹,存放数据,将原本数据集按照7:2:1的比例划分成训练集、验证集和测试集三类
在这里插入图片描述

import os
import random
import shutil# 创建文件夹
# dataset_path = "/data3/guoman/pay_check/seal_model/seal_detection/yolov10/data/dataset1"
# train_images_path = os.path.join(dataset_path,"train/images")
# train_labels_path = os.path.join(dataset_path,"train/labels")
# valid_images_path = os.path.join(dataset_path,"valid/images")
# valid_labels_path = os.path.join(dataset_path,"valid/labels")
# test_images_path = os.path.join(dataset_path,"test/images")
# test_labels_path = os.path.join(dataset_path,"test/labels")# os.makedirs(train_images_path, exist_ok=True)
# os.makedirs(train_labels_path, exist_ok=True)
# os.makedirs(valid_images_path, exist_ok=True)
# os.makedirs(valid_labels_path, exist_ok=True)
# os.makedirs(test_images_path, exist_ok=True)
# os.makedirs(test_labels_path, exist_ok=True)# 设置目录路径
image_dir = 'D:/ModelsDatas/test/allimgs'  # 改成你自己的原图片目录
label_dir = 'D:/ModelsDatas/test/alllables'  # 改成你自己的原标签目录# 获取图片和txt文件列表
images = os.listdir(image_dir)
labels = os.listdir(label_dir)# 设置随机种子,确保结果可复现
random.seed(2024)
# 随机打乱图片列表
random.shuffle(images)# 计算训练集、验证集和测试集的数量
total_images = len(images)
train_count = int(total_images * 0.7)
val_count = int(total_images * 0.2)
test_count = total_images - train_count - val_count# 分配文件到训练集、验证集和测试集
train_images = images[:train_count]
val_images = images[train_count:train_count + val_count]
test_images = images[train_count + val_count:]# 移动文件到对应的目录
for image in train_images:# 移动图片和标签到训练集目录shutil.move(os.path.join(image_dir, image), 'D:/ModelsDatas/YOLO_datasets/train/images') # 请改成你自己的训练集存放图片的文件夹目录shutil.move(os.path.join(label_dir, image[:-4]+'.txt'), 'D:/ModelsDatas/YOLO_datasets/train/labels')# 请改成你自己的训练集存放标签的文件夹目录for image in val_images:# 移动图片和标签到验证集目录shutil.move(os.path.join(image_dir, image), 'D:/ModelsDatas/YOLO_datasets/valid/images')# 请改成你自己的验证集存放图片的文件夹目录shutil.move(os.path.join(label_dir, image[:-4] + '.txt'), 'D:/ModelsDatas/YOLO_datasets/valid/labels')# 请改成你自己的验证集存放标签的文件夹目录for image in test_images:# 移动图片和标签到测试集目录shutil.move(os.path.join(image_dir, image), 'D:/ModelsDatas/YOLO_datasets/test/images')# 请改成你自己的测试集存放图片的文件夹目录shutil.move(os.path.join(label_dir, image[:-4] + '.txt'), 'D:/ModelsDatas/YOLO_datasets/test/labels')# 请改成你自己的测试集存放标签的文件夹目录

1.3.2 数据集文件配置

准备yaml文件,放在data路径下,用于后续训练

names: # class names- 0:fish # 类别号: 类别名称 (需要改成自己的)#-1:cat #如果还有其他类别,以此往下加就行了,类别号请认真和自己当时目标框labels文件中的一一对应#-2:dog
nc: 1 # number of classes 数据集中一共有几个类别,参考上面说的
path: ultralytics/datasets/det/fish2 # 数据集路径(需要改成自己的,也就是train、test和valid目录的上级目录)
train: train/images # 训练集路径(相对于数据集路径)
val: valid/images # 验证集路径(相对于数据集路径)
test: test/images # 测试集路径(相对于数据集路径)

2. 模型

2.1 模型文件配置

在ultralytics/cfg/models/v10文件夹下存放的是YOLOv10的各个版本的模型配置文件,检测的类别是coco数据的80类。在训练自己数据集的时候,只需要将其中的类别数修改成自己的大小。在根目录文件夹下新建yolov10n-test.yaml文件,此处以yolov10n.yaml文件中的模型为例,将其中的内容复制到yolov10n-test.yaml文件中 ,并将nc: 1 # number of classes 修改类别数` 修改成自己的类别数
在这里插入图片描述

2.2 训练文件配置

在进行模型训练之前,需要到官网下载预训练权重,权重地址为:Releases · THU-MIG/yolov10 · GitHub

根据所选择的模型下载相应的权重,比如yolov10n.pt,放在根目录weights/yolov10n.pt路径下。

YOLOv10的超参数配置在ultralytics/cfg文件夹下的default.yaml文件中。

YOLOv10有多种模型,可满足不同的应用需求:

  • YOLOv10-N:用于资源极其有限的环境的纳米版本。
  • YOLOv10-S:兼顾速度和精度的小型版本。
  • YOLOv10-M:通用中型版本。
  • YOLOv10-B:平衡型,宽度增加,精度更高。
  • YOLOv10-L:大型版本,精度更高,但计算资源增加。
  • YOLOv10-X:超大型版本可实现高精度和性能。

3. 模型训练

3.1 train(不对)

python train.py --weights weights/yolov5s.pt  --cfg models/yolov5s.yaml  --data data/myvoc.yaml --epoch 200 --batch-size 8 --img 640   --device 0

参数说明如下(注意epochs及device):

  • weights:指定预训练模型权重文件的路径。
  • cfg:模型配置文件的路径,定义网络结构。
  • data:数据集配置文件的路径。
  • epochs:训练的轮数,即模型将完整遍历数据集的次数(例如:200)。
  • batch-size:批次大小,即每次训练中处理的图片数量(例如:8)。
  • img:输入图像的尺寸,指定训练时图像的宽和高(例如:640)。
  • device:指定使用的设备,输入 cpu 表示在 CPU 上进行训练;输入数字如 0, 1, 2, 3 则表示对应的 GPU 编号。例如:
    (1)device 0 表示使用默认第一个 GPU;
    (2)device 0,1 表示同时使用第一个和第二个 GPU(适合多 GPU 训练)。
    (3)当有多个 GPU 时,可以通过 nvidia-smi 命令查看每个 GPU 的编号。

3.2 train

train.py

import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLOv10model_yaml_path = r'D:\project\yolov10-main\datasets\yolov10n.yaml'data_yaml_path = r'D:\project\yolov10-main\datasets\data.yaml'
#预训练模型
pre_model_name = 'yolov10n.pt'if __name__ == '__main__':model = YOLOv10(model_yaml_path).load(pre_model_name)results = model.train(data=data_yaml_path,epochs=100,batch=32,workers=0,device='0',project='runs/train',name='exp',)

4. 验证

from ultralytics import YOLOv10model = YOLOv10('./runs/train/exp5/weights/best.pt')
model.val(data='./data/dataset1/myvoc.yaml', batch=256)

5. 测试

from ultralytics import YOLOv10yolo = YOLOv10("./runs/train/exp5/weights/best.pt",task="detect")
result = yolo(source="./data/dataset1/test/images",save=True,save_conf=True,save_txt=True,name='output')

source后为要预测的图片数据集的的路径
save=True为保存预测结果
save_conf=True为保存坐标信息
save_txt=True为保存txt结果

6. 推理

from ultralytics import YOLOv10# Load a pretrained YOLOv10n model
model = YOLOv10("./runs/train/exp5/weights/best.pt")# Perform object detection on an image
results = model.predict("data/dataset1/test/images/f14e45acc1484e3a7b0ee890196e5bfd.jpg")
# Display the results
results[0].show()

参考:
https://blog.csdn.net/tqh267/article/details/139283703
https://openatomworkshop.csdn.net/6743dd743a01316874d7605d.html
https://blog.csdn.net/Natsuago/article/details/143647392
https://cloud.tencent.com/developer/article/2425073
https://blog.csdn.net/weixin_43694096/article/details/139422902
https://blog.csdn.net/c858845275/article/details/141089142
https://blog.csdn.net/tsg6698/article/details/139586476
https://developer.aliyun.com/article/1536979

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

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

相关文章

Redis学习(五)优惠券秒杀2——分布式锁

Redis学习&#xff08;五&#xff09;优惠券秒杀2 一、分布式锁-redission二、快速入门三、redission可重入锁原理四、redission锁的MutiLock原理 一、分布式锁-redission 基于setnx实现的分布式锁存在下面的问题&#xff1a; 重入问题&#xff1a;重入问题是指 获得锁的线程…

Flink调优----资源配置调优与状态及Checkpoint调优

目录 第 1 章 资源配置调优 1.1 内存设置 1.1.1 TaskManager 内存模型 1、内存模型详解 2、案例分析 1.1.2 生产资源配置示例 1.2 合理利用 cpu 资源 1.2.1 使用 DefaultResourceCalculator 策略 1.2.2 使用 DominantResourceCalculator 策略 1.2.3 使用 DominantRes…

Docker怎么关闭容器开机自启,批量好几个容器一起操作?

环境&#xff1a; WSL2 docker v25 问题描述&#xff1a; Docker怎么关闭容器开机自启&#xff0c;批量好几个容器一起操作&#xff1f; 解决方案&#xff1a; 在 Docker 中&#xff0c;您可以使用多种方法来关闭容器并配置它们是否在系统启动时自动启动。以下是具体步骤和…

模型的量化(Quantization)

文章目录 一、浮点数格式&#xff1a;FP64, FP32, FP16, BFLOAT16, TF32之间的相互区别1、关于浮点数2、常见的浮点数格式 二、量化&#xff08;Quantization&#xff09;1、基本概念2、量化的实现8bit量化4bit量化 三、QLora四、大语言模型量化方法对比&#xff1a;GPTQ、GGUF…

勤云远程稿件处理系统 SQL注入漏洞复现(XVE-2024-18393)

0x01 产品简介 勤云远程稿件处理系统(又称勤云采编系统)是北京勤云科技发展有限公司研发的一款产品,是一款全网络版期刊采编管理系统,旨在解决从投稿到稿件发表整个过程的信息化管理问题。该系统集成了搜索引擎、云计算等先进技术,为编辑部、作者和审稿人提供了便捷、高效…

谷歌Gemini与Anthropic Claude对比测试引发争议:AI竞赛暗流涌动

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

vLLM (2) - 架构总览

系列文章目录 vLLM (1) - Qwen2推理&部署 vLLM (2) - 架构总览 vLLM (3) - Sequence & SequenceGroup vLLM (4) - LLMEngine上篇 vLLM (5) - LLMEngine下篇 vLLM (6) - Scheduler & BlockSpaceManager 文章目录 系列文章目录前言一、官方资料二、原理简述三、架构…

QT从入门到精通(三)——实现文件列表遍历的图像浏览器

使用 Qt 实现文件列表遍历的图像浏览器 在本篇博客中将介绍如何使用 Qt 框架创建一个简单的图像浏览器应用程序。该应用程序能够选择文件夹&#xff0c;遍历其中的图像文件&#xff0c;并显示这些图像。我们将重点关注如何使用 Qt 的文件对话框和 OpenCV 库来处理图像。 1. 项…

强化特种作业管理,筑牢安全生产防线

在各类生产经营活动中&#xff0c;特种作业由于其操作的特殊性和高风险性&#xff0c;一直是安全生产管理的重点领域。有效的特种作业管理体系涵盖多个关键方面&#xff0c;从作业人员的资质把控到安全设施的配备维护&#xff0c;再到特种设备的精细管理以及作业流程的严格规范…

数据库管理-第274期 Oracle Enterprise Manager 24ai新特性一览(20241223)

数据库管理274期 2024-12-23 数据库管理-第274期 Oracle Enterprise Manager 24ai新特性一览&#xff08;20241223&#xff09;1 增强的企业管理联邦2 新的导航菜单3 EM仪表盘增强4 使用远程代理进行监控5 0停机监控6 新的作业系统控制台7 Oracle Key Vault支持8 自治数据库的引…

将Minio设置为Django的默认Storage(django-storages)

这里写自定义目录标题 前置说明静态文件收集静态文件 使用django-storages来使Django集成Minio安装依赖settings.py测试收集静态文件测试媒体文件 前置说明 静态文件 Django默认的Storage是本地&#xff0c;项目中的CSS、图片、JS都是静态文件。一般会将静态文件放到一个单独…

嵌入式单片机中蓝牙模块的详解

蓝牙模块的使用 蓝牙模块的特点可以看到蓝牙模块采用的TI公司设计的CC2541芯片,主要面向低功耗蓝牙通信方案,该模块的工作频段为2.4GHz,这个频段属于国际通用频段。 注意:蓝牙集成了一个状态指示灯,LED灯如果均匀慢速闪烁,就表示蓝牙未连接,如果LED灯常亮,表示蓝牙已连接…

互联网视频云平台EasyDSS无人机推流直播技术如何助力野生动植物保护工作?

在当今社会&#xff0c;随着科技的飞速发展&#xff0c;无人机技术已经广泛应用于各个领域&#xff0c;为我们的生活带来了诸多便利。而在动植物保护工作中&#xff0c;无人机的应用更是为这一领域注入了新的活力。EasyDSS&#xff0c;作为一款集视频处理、分发、存储于一体的综…

VMware虚拟机超详细安装Linux教程(最新版)

文章目录 前言一、下载二、安装VMware三、安装Linux&#xff08;操作系统&#xff09; 前言 VMware虚拟机的简单介绍&#xff1a; VMware虚拟机是一种功能强大且灵活的虚拟化解决方案&#xff0c;可以在Windows和Mac操作系统上运行。使用VMware虚拟机&#xff0c;可以在一个物…

YOLO原理讲解

一、YOLO的输入参数介绍 打标签后会生成一系列参数&#xff0c;包含&#xff1a; 置信度、预测框的位置&#xff08;中心点的位置、高度宽度&#xff09;、类别&#xff08;标签1、标签2、标签3......&#xff09; 二、处理图像和标签 首先YOLO会把图像均分为19*19个格子 &a…

【R语言遥感技术】“R+遥感”的水环境综合评价方法

R语言在遥感领域中是一个强大的工具&#xff0c;它提供了一系列的功能和优势&#xff0c;使得遥感数据的分析和应用更加高效和灵活。以下是R语言在遥感中的具体应用&#xff1a; 数据处理&#xff1a;R语言可以处理和清洗遥感数据&#xff0c;包括数据转换、滤波处理、去噪和数…

最新的强大的文生视频模型Pyramid Flow 论文阅读及复现

《PYRAMIDAL FLOW MATCHING FOR EFFICIENT VIDEO GENERATIVE MODELING》 论文地址&#xff1a;2410.05954https://arxiv.org/pdf/2410.05954 项目地址&#xff1a; jy0205/Pyramid-Flow&#xff1a; 用于高效视频生成建模的金字塔流匹配代码https://github.com/jy0205/Pyram…

P7——pytorch马铃薯病害识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 1.检查GPU import torch import torch.nn as nn import torchvision.transforms as transforms import torchvision from torchvision import transforms, data…

2021-04-08 VSC++: 降序折半查找。

void 降序折半查找(int* a, int aa, int aaa) {//缘由https://bbs.csdn.net/topics/399166569int aaaa aaa / 2; bool k 0;if (a[0] aa){cout << 0, cout << ends << "查找&#xff1a;" << aa << endl;k 1;return;}else if (a[aa…

【蓝桥杯——物联网设计与开发】拓展模块3 - 温度传感器模块

目录 一、温度传感器模块 &#xff08;1&#xff09;资源介绍 &#x1f505;原理图 &#x1f505;STS30-DIS-B &#x1f319;引脚分配 &#x1f319;通信 &#x1f319;时钟拉伸&#xff08;Clock Stretching&#xff09; &#x1f319;单次触发模式 &#x1f319;温度数据转…