YOLOv11训练自己的数据集(从代码下载到实例测试)

news2024/12/24 23:59:24

文章目录

  • 前言
  • 一、YOLOv11模型结构图
  • 二、环境搭建
  • 三、构建数据集
  • 四、修改配置文件
    • ①数据集文件配置
    • ②模型文件配置
    • ③训练文件配置
  • 五、模型训练和测试
    • 模型训练
    • 模型验证
    • 模型推理
  • 总结


前言

提示:本文是YOLOv11训练自己数据集的记录教程,需要大家在本地已配置好CUDA,cuDNN等环境,没配置的小伙伴可以查看我的往期博客:在Windows10上配置CUDA环境教程

2024年9月30日,YOLOv11Ultralytics最新发布的计算机视觉模型。支持多种任务,包括目标检测、实例分割、图像分类、姿态估计、有向目标检测以及物体跟踪等,本文主要讲述其检测任务的模型搭建训练流程。

在这里插入图片描述

在这里插入图片描述

代码地址:https://github.com/ultralytics/ultralytics

在这里插入图片描述


一、YOLOv11模型结构图

二、环境搭建

在配置好CUDA环境,并且获取到YOLOv11源码后,建议新建一个虚拟环境专门用于YOLOv11模型的训练。将YOLOv11加载到环境后,安装剩余的包。在运行测试过程中,依次安装缺少的包

pip install ...

三、构建数据集

YOLOv11模型的训练需要原图像及对应的YOLO格式标签,还未制作标签的可以参考我这篇文章:LabelImg安装与使用教程。

我的原始数据存放在根目录的data文件夹(新建的)下,里面包含图像和标签。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
标签内的格式如下:
在这里插入图片描述
具体格式为 class_id x y w h,分别代表物体类别,标记框中心点的横纵坐标(x, y),标记框宽高的大小(w, h),且都是归一化后的值,图片左上角为坐标原点。

将原本数据集按照8:1:1的比例划分成训练集、验证集和测试集三类,划分代码如下。

# 将图片和标注数据按比例切分为 训练集和测试集
import shutil
import random
import os
 
# 原始路径
image_original_path = "data/images/"
label_original_path = "data/labels/"
 
cur_path = os.getcwd()
# 训练集路径
train_image_path = os.path.join(cur_path, "datasets/images/train/")
train_label_path = os.path.join(cur_path, "datasets/labels/train/")
 
# 验证集路径
val_image_path = os.path.join(cur_path, "datasets/images/val/")
val_label_path = os.path.join(cur_path, "datasets/labels/val/")
 
# 测试集路径
test_image_path = os.path.join(cur_path, "datasets/images/test/")
test_label_path = os.path.join(cur_path, "datasets/labels/test/")
 
# 训练集目录
list_train = os.path.join(cur_path, "datasets/train.txt")
list_val = os.path.join(cur_path, "datasets/val.txt")
list_test = os.path.join(cur_path, "datasets/test.txt")
 
train_percent = 0.8
val_percent = 0.1
test_percent = 0.1
 
 
def del_file(path):
    for i in os.listdir(path):
        file_data = path + "\\" + i
        os.remove(file_data)
 
 
def mkdir():
    if not os.path.exists(train_image_path):
        os.makedirs(train_image_path)
    else:
        del_file(train_image_path)
    if not os.path.exists(train_label_path):
        os.makedirs(train_label_path)
    else:
        del_file(train_label_path)
 
    if not os.path.exists(val_image_path):
        os.makedirs(val_image_path)
    else:
        del_file(val_image_path)
    if not os.path.exists(val_label_path):
        os.makedirs(val_label_path)
    else:
        del_file(val_label_path)
 
    if not os.path.exists(test_image_path):
        os.makedirs(test_image_path)
    else:
        del_file(test_image_path)
    if not os.path.exists(test_label_path):
        os.makedirs(test_label_path)
    else:
        del_file(test_label_path)
 
 
def clearfile():
    if os.path.exists(list_train):
        os.remove(list_train)
    if os.path.exists(list_val):
        os.remove(list_val)
    if os.path.exists(list_test):
        os.remove(list_test)
 
 
def main():
    mkdir()
    clearfile()
 
    file_train = open(list_train, 'w')
    file_val = open(list_val, 'w')
    file_test = open(list_test, 'w')
 
    total_txt = os.listdir(label_original_path)
    num_txt = len(total_txt)
    list_all_txt = range(num_txt)
 
    num_train = int(num_txt * train_percent)
    num_val = int(num_txt * val_percent)
    num_test = num_txt - num_train - num_val
 
    train = random.sample(list_all_txt, num_train)
    # train从list_all_txt取出num_train个元素
    # 所以list_all_txt列表只剩下了这些元素
    val_test = [i for i in list_all_txt if not i in train]
    # 再从val_test取出num_val个元素,val_test剩下的元素就是test
    val = random.sample(val_test, num_val)
 
    print("训练集数目:{}, 验证集数目:{}, 测试集数目:{}".format(len(train), len(val), len(val_test) - len(val)))
    for i in list_all_txt:
        name = total_txt[i][:-4]
 
        srcImage = image_original_path + name + '.jpg'
        srcLabel = label_original_path + name + ".txt"
 
        if i in train:
            dst_train_Image = train_image_path + name + '.jpg'
            dst_train_Label = train_label_path + name + '.txt'
            shutil.copyfile(srcImage, dst_train_Image)
            shutil.copyfile(srcLabel, dst_train_Label)
            file_train.write(dst_train_Image + '\n')
        elif i in val:
            dst_val_Image = val_image_path + name + '.jpg'
            dst_val_Label = val_label_path + name + '.txt'
            shutil.copyfile(srcImage, dst_val_Image)
            shutil.copyfile(srcLabel, dst_val_Label)
            file_val.write(dst_val_Image + '\n')
        else:
            dst_test_Image = test_image_path + name + '.jpg'
            dst_test_Label = test_label_path + name + '.txt'
            shutil.copyfile(srcImage, dst_test_Image)
            shutil.copyfile(srcLabel, dst_test_Label)
            file_test.write(dst_test_Image + '\n')
 
    file_train.close()
    file_val.close()
    file_test.close()

 
if __name__ == "__main__":
    main()

划分完成后将会在datasets文件夹下生成划分好的文件,其中images为划分后的图像文件,里面包含用于train、val、test的图像,已经划分完成;labels文件夹中包含划分后的标签文件,已经划分完成,里面包含用于train、val、test的标签;train.tet、val.txt、test.txt中记录了各自的图像路径。

在这里插入图片描述

在这里插入图片描述

在训练过程中,也是主要使用这三个txt文件进行数据的索引。

四、修改配置文件

①数据集文件配置

数据集划分完成后,在根目录文件夹下新建data.yaml文件。用于指明数据集路径和类别,我这边只有一个类别,只留了一个,多类别的在name内加上类别名即可。data.yaml中的内容为:

path: ../datasets  # 数据集所在路径
train: train.txt  # 数据集路径下的train.txt
val: val.txt  # 数据集路径下的val.txt
test: test.txt  # 数据集路径下的test.txt

# Classes
names:
  0: wave

在这里插入图片描述

②模型文件配置

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

在这里插入图片描述

在这里插入图片描述

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLO11 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect

# Parameters
nc: 1 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolo11n.yaml' will call yolo11.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.50, 0.25, 1024] # summary: 319 layers, 2624080 parameters, 2624064 gradients, 6.6 GFLOPs
  s: [0.50, 0.50, 1024] # summary: 319 layers, 9458752 parameters, 9458736 gradients, 21.7 GFLOPs
  m: [0.50, 1.00, 512] # summary: 409 layers, 20114688 parameters, 20114672 gradients, 68.5 GFLOPs
  l: [1.00, 1.00, 512] # summary: 631 layers, 25372160 parameters, 25372144 gradients, 87.6 GFLOPs
  x: [1.00, 1.50, 512] # summary: 631 layers, 56966176 parameters, 56966160 gradients, 196.0 GFLOPs

# YOLO11n backbone
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
  - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
  - [-1, 2, C3k2, [256, False, 0.25]]
  - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
  - [-1, 2, C3k2, [512, False, 0.25]]
  - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
  - [-1, 2, C3k2, [512, True]]
  - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
  - [-1, 2, C3k2, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]] # 9
  - [-1, 2, C2PSA, [1024]] # 10

# YOLO11n head
head:
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 6], 1, Concat, [1]] # cat backbone P4
  - [-1, 2, C3k2, [512, False]] # 13

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 4], 1, Concat, [1]] # cat backbone P3
  - [-1, 2, C3k2, [256, False]] # 16 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 13], 1, Concat, [1]] # cat head P4
  - [-1, 2, C3k2, [512, False]] # 19 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 10], 1, Concat, [1]] # cat head P5
  - [-1, 2, C3k2, [1024, True]] # 22 (P5/32-large)

  - [[16, 19, 22], 1, Detect, [nc]] # Detect(P3, P4, P5)


修改完成后,模型文件就配置好啦。

③训练文件配置

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

在这里插入图片描述

在模型训练中,比较重要的参数是modeldataepochsbatchimgszdevice以及workers

  • model表示训练的模型结构。

  • data是配置数据集文件的路径,用于指定自己的数据集yaml文件。

  • epochs指训练的轮次,默认是100次,只要模型能收敛即可。

  • batch是表示一次性将多少张图片放在一起训练,越大训练的越快,如果设置的太大会报OOM错误,我这边在default中设置16,表示一次训练16张图像。设置的大小为2的幂次,1为2的0次,16为2的4次。

  • imgsz表示送入训练的图像大小,会统一进行缩放。要求是32的整数倍,尽量和图像本身大小一致。

  • device指训练运行的设备。该参数指定了模型训练所使用的设备,例如使用 GPU 运行可以指定为device=0,或者使用多个 GPU 运行可以指定为 device=0,1,2,3,如果没有可用的 GPU,可以指定为 device=cpu 使用 CPU 进行训练。

  • workers是指数据装载时cpu所使用的线程数,默认为8,过高时会报错:[WinError 1455] 页面文件太小,无法完成操作,此时就只能将workers调成0了。

模型训练的相关基本参数就是这些啦,其余的参数可以等到后期训练完成进行调参时再详细了解。

五、模型训练和测试

YOLOv11在训练和测试过程中,具体的参数信息可在ultralytics/yolo/cfg/default.yaml路径下找到。

模型训练

在根目录新建train.py,输入以下代码:

from ultralytics import YOLO
 
if __name__ == '__main__':
    model = YOLO(r'yolov11m.yaml')  # 此处以 m 为例,只需写yolov11m即可定位到m模型
    model.train(data=r'data.yaml',
                imgsz=640,
                epochs=100,
                single_cls=True,  
                batch=16,
                workers=10,
                device='0',
                )

训练情况:

在这里插入图片描述

在这里插入图片描述

模型验证

在根目录新建val.py,输入以下代码:

import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO
 
if __name__ == '__main__':
    model = YOLO('runs/train/exp/weights/best.pt')
    model.val(data='data.yaml',
                imgsz=640,
                batch=16,
                split='test',
                workers=10,
                device='0',
                )
 

在验证阶段,mode模式为验证,mode=val,模型使用训练完成的权重文件:runs/train/exp/weights/best.ptbest.pt就是训练完成后的最佳权重。

验证结果:

在这里插入图片描述

模型推理

在根目录新建detect.py,输入以下代码:

import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO
 
if __name__ == '__main__':
    model = YOLO('runs/train/exp/weights/best.pt')
    model.predict(source='images',
                imgsz=640,
                device='0',
                )

在推理阶段,mode模式为预测,mode= predict,模型使用训练完成的权重文件:runs/train/exp/weights/best.ptsource表示需要预测的图像文件路径,images中存放了准备预测的图像


总结

以上就是YOLOv11训练自己数据集的全部过程啦,欢迎大家在评论区交流~

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

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

相关文章

PC流量转移动流量,提升网盘拉新收益

首先,以夸克网盘举例,请看收益明细表。 做网盘拉新,要有高收益,还得靠移动拉新和转存,PC端拉新就2块钱一个人,太少了。 但是,除抖音、小红书这种主打移动端的自媒体平台外。 借助百度和Bing等…

游戏找不到xinput1_3.dll的原因及解决方法

1. xinput1_3.dll 基本信息 1.1 文件名 xinput1_3.dll 是一个动态链接库(DLL)文件,它属于 Microsoft DirectX for Windows 的一部分。这个文件主要负责处理与 Xbox 360 控制器和其他兼容 XInput 标准的游戏手柄相关的输入信号,确…

这款工具在手,前端开发轻松搞定!

这款工具在手,前端开发轻松搞定! 引言 在之前的一篇文章中,已经给大家分享了一款AI助手。尽管该助手能够生成前端代码,但遗憾的是缺少了实时预览的功能。而现在,这一缺憾已经被弥补——你只需要描述你的设计想法&…

土体沉降计在沉降监测中起到什么作用

在土木工程和地质工程领域,对土体的沉降和变形进行精确监测是确保工程安全和质量的关键环节。而土体沉降计作为一种用于测量土体沉降和变形的仪器,在这一过程中发挥了重要的作用。本文将从土体沉降计的工作原理、优点及其在沉降监测中的具体应用等方面进…

基于Spring Boot的旅游网站

目录 前言 功能设计 系统实现 获取源码 博主主页:百成Java 往期系列:Spring Boot、SSM、JavaWeb、python、小程序 前言 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势&#xff0c…

面试中考察栈和队列的经典算法题

💝💝💝如果你对顺序表的概念与理解还存在疑惑,欢迎观看我之前的作品👉【栈和列队详解】 上篇文章👉 【面试中顺序表常考的十大题目解析】 目录 💯前言 💯栈相关题目 ⭐有效的括号…

WebSocket 2024/9/30

WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。 与HTTP协议的区别 实现

深入解析Excel文件格式:.xls与.xlsx的差异与应用指南

在当今的数据处理和办公自动化领域,Microsoft Excel 无疑是一款极为重要的工具。 它不仅广泛应用于日常的数据录入、计算和图表制作,而且也是数据分析、财务建模等专业 领域不可或缺的软件。Excel 的文件格式经历了多个版本的迭代,其中 .xl…

YOLOv11改进策略【注意力机制篇】| 添加SE、CBAM、ECA、CA、Swin Transformer等注意力和多头注意力机制

前言 这篇文章带来一个经典注意力模块的汇总,虽然有些模块已经发布很久了,但后续的注意力模块也都是在此基础之上进行改进的,对于初学者来说还是有必要去学习了解一下,以加深对模块,模型的理解。 文章目录 前言一、为…

uniapp生物识别示例(人脸识别、指纹识别)

准备工作&#xff1a; mainfest.json设置勾选&#xff1a; 勾选完成后打 App自定义调试基座测试包 示例代码&#xff1a; <template><view class"content"><button v-if"supportSoterAuthenticationArray.includes(facial)" click"…

QT使用qss控制样式实现动态换肤

文章目录 设计QSS样式表动态加载QSS文件主函数调用QT提供了一种非常灵活的方式来使用QSS(Qt Style Sheet,类似于 CSS 的样式表),实现界面的动态换肤功能。QSS可以改变Qt应用程序中几乎所有可视组件的外观,包括颜色、字体、边框等。下面介绍一下如何通过QSS实现动态换肤。 设…

大模型时代的企业AI发展趋势浅析

在当前技术飞速进步的时代背景下&#xff0c;生成式人工智能与大型模型正逐渐成为推动产业变革的关键力量。随着人工智能技术的持续成熟与普及&#xff0c;其应用范围已从个人领域拓展至企业层面&#xff0c;广泛渗透至各个行业。那么&#xff0c;这些新兴技术究竟将为产业界带…

手把手教你使用YOLOv11训练自己数据集(含环境搭建 、数据集查找、模型训练)

一、前言 本文内含YOLOv11网络结构图 训练教程 推理教程 数据集获取等有关YOLOv11的内容&#xff01; 官方代码地址&#xff1a;https://github.com/ultralytics/ultralytics/tree/main/ultralytics/cfg/models/11 二、整体网络结构图 三、环境搭建 项目环境如下&#xf…

天融信运维安全审计系统 synRequest 远程命令执行漏洞复现

0x01 产品描述&#xff1a; 天融信运维安全审计系统TopSAG是基于自主知识产权NGTOS安全操作系统平台和多年网络安全防护经验积累研发而成&#xff0c;系统以4A管理理念为基础、安全代理为核心&#xff0c;在运维管理领域持续创新&#xff0c;为客户提供事前预防、事中监控、事后…

一文了解构建工具——Maven与Gradle的区别

目录 一、Maven和Gradle是什么&#xff1f; 构建工具介绍 Maven介绍 Gradle介绍 二、使用时的区别&#xff1a; 1、新建项目 Maven&#xff1a; Gradle&#xff1a; 2、配置项目 Maven&#xff1a; Gradle&#xff1a; 3、构建项目——生成项目的jar包 Gradle&…

Linux之实战命令20:split应用实例(五十四)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

【C++】692.前K个高频单词

692. 前K个高频单词 - 力扣&#xff08;LeetCode&#xff09; 思路分析&#xff1a; 使用map统计单词的次数。map是按单词从小到大排序的。对单词再按照次数从大到小排序。有两种方法&#xff1a; 将pair<string&#xff0c;int>键值对放到vector中&#xff0c;用sort排序…

【Linux系统编程】第二十五弹---Shell编程入门:打造一个简易版Shell

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、简易的shell 1.1、输出一个命令行 1.2、获取用户命令字符串 1.3、命令行字符串分割 1.4、检查命令是否是内建命令 1.5、…

LeetCode24. 两两交换链表中的节点(2024秋季每日一题 32)

给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出&#xff1a;[2,1,…

Llama微调以及Ollama部署

1 Llama微调 在基础模型的基础上&#xff0c;通过一些特定的数据集&#xff0c;将具有特定功能加在原有的模型上。 1.1 效果对比 特定数据集 未使用微调的基础模型的回答 使用微调后的回答 1.2 基础模型 基础大模型我选择Mistral-7B-v0.3-Chinese-Chat-uncensored&#x…