YOLOv11来了,使用YOLOv11训练自己的数据集和推理(附YOLOv11网络结构图)



前言

YOLOv11 由 Ultralytics 团队在 2024 年 9 月 30 日发布, 最新的 YOLOv11 模型在之前的 YOLO 版本引入了新功能和改进,以进一步提高性能和灵活性。YOLO11 在快速、准确且易于使用,使其成为各种目标检测和跟踪、实例分割、图像分类和姿态估计任务的绝佳选择。可以看出官网 YOLOv11 在COCO数据集上的性能表现,如下图所示:
在这里插入图片描述


一、YOLOv11代码下载地址

手把手视频安装可以看这个视频: 视频安装教程
在这里插入图片描述

官网的源码下载地址 :官网源码

官网打不开的话,从我的网盘下载就行,链接: 我下载好的源码
提取码: eb9i

1.YOLOv11模型结构图

根据 yolov11.yaml 画出 yolo 整体结构图,如下图所示
在这里插入图片描述


二、数据集准备

1.数据集标注软件

数据集使用标注软件标注好,我这里推荐两个标注软件,一个是 labelimg,另外一个是 labelme,可以在python环境,使用 pip install labelimg 或者 pip install labelme 进行安装,看你选择哪个标注工具标注了,我使用 labelimg 标注工具

安装完成在终端输入命令启动标注软件
在这里插入图片描述
下面是软件界面
在这里插入图片描述
设置自动保存标注生成的标注文件
在这里插入图片描述

2.voc数据集格式转换

标注格式如果选择VOC格式,后面需要代码转换格式,如果选择yolo格式就不用转换,voc格式转换yolo格式代码如下:

import xml.etree.ElementTree as ET
import os, cv2
import numpy as np
from os import listdir
from os.path import join

classes = []

def convert(size, box):
    dw = 1. / (size[0])
    dh = 1. / (size[1])
    x = (box[0] + box[1]) / 2.0 - 1
    y = (box[2] + box[3]) / 2.0 - 1
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return (x, y, w, h)


def convert_annotation(xmlpath, xmlname):
    with open(xmlpath, "r", encoding='utf-8') as in_file:
        txtname = xmlname[:-4] + '.txt'
        txtfile = os.path.join(txtpath, txtname)
        tree = ET.parse(in_file)
        root = tree.getroot()
        filename = root.find('filename')
        img = cv2.imdecode(np.fromfile('{}/{}.{}'.format(imgpath, xmlname[:-4], postfix), np.uint8), cv2.IMREAD_COLOR)
        h, w = img.shape[:2]
        res = []
        for obj in root.iter('object'):
            cls = obj.find('name').text
            if cls not in classes:
                classes.append(cls)
            cls_id = classes.index(cls)
            xmlbox = obj.find('bndbox')
            b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
                 float(xmlbox.find('ymax').text))
            bb = convert((w, h), b)
            res.append(str(cls_id) + " " + " ".join([str(a) for a in bb]))
        if len(res) != 0:
            with open(txtfile, 'w+') as f:
                f.write('\n'.join(res))


if __name__ == "__main__":
    postfix = 'png'    # 图像后缀
    imgpath = r'E:\A-毕业设计代做数据\helmet\test\images'    # 图像文件路径
    xmlpath = r'E:\A-毕业设计代做数据\helmet\test\annotations'   # xml文件文件路径
    txtpath = r'E:\A-毕业设计代做数据\helmet\test\labels'      # 生成的txt文件路径
    
    if not os.path.exists(txtpath):
        os.makedirs(txtpath, exist_ok=True)
    
    list = os.listdir(xmlpath)
    error_file_list = []
    for i in range(0, len(list)):
        try:
            path = os.path.join(xmlpath, list[i])
            if ('.xml' in path) or ('.XML' in path):
                convert_annotation(path, list[i])
                print(f'file {list[i]} convert success.')
            else:
                print(f'file {list[i]} is not xml format.')
        except Exception as e:
            print(f'file {list[i]} convert error.')
            print(f'error message:\n{e}')
            error_file_list.append(list[i])
    print(f'this file convert failure\n{error_file_list}')
    print(f'Dataset Classes:{classes}')

代码需要修改的地方如下:
1.postfix参数填图片的后缀,需要注意图片格式要统一,是png格式就写png,是jpg格式就写jpg
2.imgpath参数填图片所在的路径
3.xmlpath参数填标注文件的路径
4.txtpath参数填生成的yolo格式的文件
在这里插入图片描述

3.数据集划分

划分训练集和验证集代码如下:

import os, shutil
from sklearn.model_selection import train_test_split


val_size = 0.2
#test_size = 0.2
postfix = 'jpg'
imgpath = r'E:\A-毕业设计代做数据\datasets\images'
txtpath =  r'E:\A-毕业设计代做数据\datasets\labels'



output_train_img_folder =r'E:\A-毕业设计代做数据\datasets\dataset_kengwa/images/train'
output_val_img_folder =  r'E:\A-毕业设计代做数据\datasets\dataset_kengwa/images/val'
output_train_txt_folder =  r'E:\A-毕业设计代做数据\datasets\dataset_kengwa\labels/train'
output_val_txt_folder =  r'E:\A-毕业设计代做数据\datasets\dataset_kengwa\labels/val'

os.makedirs(output_train_img_folder, exist_ok=True)
os.makedirs(output_val_img_folder, exist_ok=True)
os.makedirs(output_train_txt_folder, exist_ok=True)
os.makedirs(output_val_txt_folder, exist_ok=True)


listdir = [i for i in os.listdir(txtpath) if 'txt' in i]
train, val = train_test_split(listdir, test_size=val_size, shuffle=True, random_state=0)

#todo:需要test放开

# train, test = train_test_split(listdir, test_size=test_size, shuffle=True, random_state=0)
# train, val = train_test_split(train, test_size=val_size, shuffle=True, random_state=0)

for i in train:
    img_source_path = os.path.join(imgpath, '{}.{}'.format(i[:-4], postfix))
    txt_source_path = os.path.join(txtpath, i)

    img_destination_path = os.path.join(output_train_img_folder, '{}.{}'.format(i[:-4], postfix))
    txt_destination_path = os.path.join(output_train_txt_folder, i)

    shutil.copy(img_source_path, img_destination_path)
    shutil.copy(txt_source_path, txt_destination_path)

for i in val:
    img_source_path = os.path.join(imgpath, '{}.{}'.format(i[:-4], postfix))
    txt_source_path = os.path.join(txtpath, i)

    img_destination_path = os.path.join(output_val_img_folder, '{}.{}'.format(i[:-4], postfix))
    txt_destination_path = os.path.join(output_val_txt_folder, i)

    shutil.copy(img_source_path, img_destination_path)
    shutil.copy(txt_source_path, txt_destination_path)


#
# for i in train:
#     shutil.copy('{}/{}.{}'.format(imgpath, i[:-4], postfix), r'E:\1-cheng\4-yolo-dataset-daizuo\multi-classify\bird-boat-horse-aeroplane-sheep\dataset20231219/images/train/{}.{}'.format(i[:-4], postfix))
#     shutil.copy('{}/{}'.format(txtpath, i), r'E:\1-cheng\4-yolo-dataset-daizuo\multi-classify\bird-boat-horse-aeroplane-sheep\dataset20231219/labels/train/{}'.format(i))
#
# for i in val:
#     shutil.copy('{}/{}.{}'.format(imgpath, i[:-4], postfix), r'E:\1-cheng\4-yolo-dataset-daizuo\multi-classify\bird-boat-horse-aeroplane-sheep\dataset20231219/images/val/{}.{}'.format(i[:-4], postfix))
#     shutil.copy('{}/{}'.format(txtpath, i), r'E:\1-cheng\4-yolo-dataset-daizuo\multi-classify\bird-boat-horse-aeroplane-sheep\dataset20231219/labels/val/{}'.format(i))

#todo:需要test则放开

# for i in test:
#     shutil.copy('{}/{}.{}'.format(imgpath, i[:-4], postfix), 'images/test/{}.{}'.format(i[:-4], postfix))
#     shutil.copy('{}/{}'.format(txtpath, i), 'labels/test/{}'.format(i))

需要修改的地方如下
在这里插入图片描述
下面四个参数只需在自己电脑任意位置新建一个文件夹就行,用于存放生成的训练集和验证集,比如新建一个文件夹叫dataset_kengwa,后面的路径不用动,如下图左边的框出来的路径覆盖成你的就行
在这里插入图片描述
数据集有以下两种方式放置,都可以进行训练,常见的数据集放置是第一种,也有开源的数据集按照第二种方式放置的,我都遇见过,也能训练起来
在这里插入图片描述

4.修改yolo的训练配置文件

我们需要在项目下创建一个data.yaml的文件,文件名根据数据集名称取,我这里方便演示直接叫data.yaml,如下图所示
在这里插入图片描述
代码如下:

train: E:\Desktop\new-yolov9\yolotest\images\train  # train images (relative to 'path') 4 images
val: E:\Desktop\new-yolov9\yolotest\images\val  # val images (relative to 'path') 4 images

nc: 2

# class names
names: ['dog','cat']

三、YOLO环境配置教程

YOLOv11/YOLOv10/YOLOv9/YOLOv8/YOLOv7/YOLOv5 环境都是通用的,只需要安装一次就行

1.pytorch环境安装

基础环境配置参考教程链接:环境配置链接如果已经配置好环境可以忽略此步骤

2.其他依赖安装

安装requirements.txt文件的环境,需要注释掉下面两行,前面的步骤已经安装了,不注释的话会覆盖前面的会安装最新版本的pytorch,所以注释掉

在这里插入图片描述
没有这个文件可以自己新建一个requirements.txt,然后把下面代码复制进去就好了
在这里插入图片描述

在这里插入图片描述

# Ultralytics requirements
# Example: pip install -r requirements.txt

# Base ----------------------------------------
matplotlib>=3.3.0
numpy==1.24.4 # pinned by Snyk to avoid a vulnerability
opencv-python>=4.6.0
pillow>=7.1.2
pyyaml>=5.3.1
requests>=2.23.0
scipy>=1.4.1
tqdm>=4.64.0

# Logging -------------------------------------
# tensorboard>=2.13.0
# dvclive>=2.12.0
# clearml
# comet

# Plotting ------------------------------------
pandas>=1.1.4
seaborn>=0.11.0

# Export --------------------------------------
# coremltools>=7.0  # CoreML export
# onnx>=1.12.0  # ONNX export
# onnxsim>=0.4.1  # ONNX simplifier
# nvidia-pyindex  # TensorRT export
# nvidia-tensorrt  # TensorRT export
# scikit-learn==0.19.2  # CoreML quantization
# tensorflow>=2.4.1  # TF exports (-cpu, -aarch64, -macos)
# tflite-support
# tensorflowjs>=3.9.0  # TF.js export
# openvino-dev>=2023.0  # OpenVINO export

# Extras --------------------------------------
psutil  # system utilization
py-cpuinfo  # display CPU info
thop>=0.1.1  # FLOPs computation
# ipython  # interactive notebook
# albumentations>=1.0.3  # training augmentations
# pycocotools>=2.0.6  # COCO mAP
# roboflow


四、YOLOv11训练

(1)在根目录新建一个python文件,取名为:train.py,如果之前看过我的文章,已经新建过就不用重新新建了
在这里插入图片描述

(2)把训练代码复制到train.py文件,如果之前看过我的文章,已经复制过了就不用重新复制了,只需修改参数就行
训练的代码如下:

# -*- coding: utf-8 -*-
"""
@Auth : 挂科边缘
@File :trian.py
@IDE :PyCharm
@Motto:学习新思想,争做新青年
@Email :179958974@qq.com
"""
import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO

if __name__ == '__main__':
    # model.load('yolo11n.pt') # 加载预训练权重,改进或者做对比实验时候不建议打开,因为用预训练模型整体精度没有很明显的提升
    model = YOLO(model=r'D:\2-Python\1-YOLO\YOLOv11\ultralytics-8.3.2\ultralytics\cfg\models\11\yolo11.yaml')
    model.train(data=r'data.yaml',
                imgsz=640,
                epochs=50,
                batch=4,
                workers=0,
                device='',
                optimizer='SGD',
                close_mosaic=10,
                resume=False,
                project='runs/train',
                name='exp',
                single_cls=False,
                cache=False,
                )

注意注意注意:模型配置路径改成你自己的路径,还有数据集配置文件也修改成你自己的路径

在这里插入图片描述
训练代码的参数解释:

  • model参数:该参数填入模型配置文件的路径,改进的话建议不需要填预训练模型权重
  • data参数:该参数可以填入训练数据集配置文件的路径
  • imgsz参数:该参数代表输入图像的尺寸,指定为 640x640 像素
  • epochs参数:该参数代表训练的轮数
  • batch参数:该参数代表批处理大小,电脑显存越大,就设置越大,根据自己电脑性能设置
  • workers参数:该参数代表数据加载的工作线程数,出现显存爆了的话可以设置为0,默认是8
  • device参数:该参数代表用哪个显卡训练,留空表示自动选择可用的GPU或CPU
  • optimizer参数:该参数代表优化器类型
  • close_mosaic参数:该参数代表在多少个 epoch 后关闭 mosaic 数据增强
  • resume参数:该参数代表是否从上一次中断的训练状态继续训练。设置为False表示从头开始新的训练。如果设置为True,则会加载上一次训练的模型权重和优化器状态,继续训练。这在训练被中断或在已有模型的基础上进行进一步训练时非常有用。
  • project参数:该参数代表项目文件夹,用于保存训练结果
  • name参数:该参数代表命名保存的结果文件夹
  • single_cls参数:该参数代表是否将所有类别视为一个类别,设置为False表示保留原有类别
  • cache参数:该参数代表是否缓存数据,设置为False表示不缓存。

注意注意注意:一般做科研改进工作时候可以不用预训练权重,因为用预训练模型整体精度很难提高

我这里演示加载预训练权重,训练输出如下所示:
在这里插入图片描述

五、YOLOv11推理

(1)官网的预训练模型下载

在这里插入图片描述

进入官网的源码下载地址 :官网模型下载地址,往下面拉,看到模型位置,YOLOv11 针对不同的场景和应用提供了 YOLOv11n、YOLOv11s 等不同大小的模型,具体看官网提供的,需要下载哪个,鼠标左键单击下载就行。
在这里插入图片描述

我的源码包已经下载好了模型了,如果需要其他权重自行下载就行

(2)在根目录新建一个python文件,取名为:detect.py
在这里插入图片描述
(3)把推理代码复制到detect.py文件
注意注意注意:模型路径改成你自己的路径,还有预测图像也改成你自己的路径
推理的代码如下:

# -*- coding: utf-8 -*-
"""
@Auth : 挂科边缘
@File :detect.py
@IDE :PyCharm
@Motto:学习新思想,争做新青年
@Email :179958974@qq.com
"""

from ultralytics import YOLO

if __name__ == '__main__':

    # Load a model
    model = YOLO(model=r'D:\2-Python\1-YOLO\YOLOv11\ultralytics-8.3.2\yolo11n-seg.pt')  
    model.predict(source=r'D:\2-Python\1-YOLO\YOLOv11\ultralytics-8.3.2\ultralytics\assets\bus.jpg',
                  save=True,
                  show=True,
                  )

推理代码的参数解释
1.model参数:该参数可以填入模型文件路径
2.source参数:该参数可以填入需要推理的图片或者视频路径,如果打开摄像头推理则填入0就行
3.save参数:该参数填入True,代表把推理结果保存下来,默认是不保存的,所以一般都填入True
4.show参数:该参数填入True,代表把推理结果以窗口形式显示出来,默认是显示的,这个参数根据自己需求打开就行,不显示你就填False就行

分割模型推理结果如下:
在这里插入图片描述
目标检测模型推理结果如下:
在这里插入图片描述

六、解决训练过程中断怎么继续上次训练

在训练过程不小心中断了,那怎么继续上次的训练了,这里先不慌,官网也的代码写得非常好,它有这个断点训练功能,那么 YOLOv8 v10 v11 处理的方法都是一模一样,接下来直接看图操作就行:
在这里插入图片描述

  • model参数:该参数填入上次中断的模型,为 last.pt

  • resume参数:该参数设置为True,则会加载上一次训练的模型权重和优化器状态,继续训练。


总结

YOLOv11训练自己数据集和推理到此结束,有问题可以留言,创作不易,请帮忙点个爱心呗,谢谢
在这里插入图片描述

<think>好的,用户想了解如何使用YOLOv11进行数据集训练推理,并获取其网络结构图。首先,我需要确认YOLOv11是否存在,因为目前主流的版本是YOLOv5、v8v9。可能用户有笔误,或者YOLOv11是某个社区变体。不过根据提供的引用内容,用户提到了YOLOv9的PGIGELAN技术,所以可能用户对版本号有混淆。需要先澄清这一点。 接下来,假设YOLOv11确实存在,或者用户指的是YOLO的最新版本,我需要根据现有YOLO系列的通用步骤来回答。首先,数据集的准备是关键,用户之前可能看过关于YOLOv8的博客,所以可以引用参考中的Roboflow获取数据集的方法[^1]。需要提醒用户数据集格式应与YOLOv5相同,如引用[3]提到的[^3]。 然后是训练部分,YOLO训练通常涉及修改配置文件,指定数据集路径等。例如在YOLOv8中,用户需要找到train.py的位置,这可能与v5不同,如引用[3]提到的路径问题。对于v11,可能需要类似的操作,或者查看官方文档是否有更新。 关于网络结构图,通常YOLO的官方仓库会提供结构图,或者使用模型导出工具如Netron来可视化.pt或.onnx文件。需要指导用户如何导出模型并使用这些工具。 推理部分,YOLO通常使用detect.py脚本,用户需要指定训练好的权重输入数据。需要提醒用户注意路径参数设置。 可能用户提到的YOLOv11在CSDN上有相关博客,但应建议用户优先查阅官方文档或GitHub仓库以确保准确性,因为社区版本可能各有差异。此外,用户可能在搜索时混淆了版本号,需要确认是否存在v11,或者是否可能是指v9或其他版本,并适当建议检查版本信息。 最后,生成相关问题时要覆盖数据集准备、训练步骤、结构图获取以及与其他版本的比较,帮助用户深入理解。</think>### 如何使用YOLOv11进行数据集训练推理,并获取网络结构图? #### 1. **数据集准备与格式要求** YOLOv11延续了YOLO系列对数据集格式的要求,需遵循与YOLOv5相同的格式。数据集应包含以下内容: - `images`文件夹:存放训练/验证/测试的图片 - `labels`文件夹:对应图片的标注文件(.txt格式) - `data.yaml`配置文件:定义类别名称、数据集路径等信息 示例`data.yaml`配置: ```yaml train: ../train/images val: ../val/images names: 0: cat 1: dog ``` 建议使用Roboflow等工具进行数据格式转换与增强[^1]。 --- #### 2. **训练流程详解** 假设YOLOv11沿用了类似v8的代码结构,训练步骤如下: 1. 克隆官方仓库: ```bash git clone https://github.com/ultralytics/ultralytics ``` 2. 定位训练脚本:根据YOLOv8的经验,训练入口可能位于`ultralytics/models/yolo/v11/detect/train.py`[^3] 3. 启动训练命令: ```bash python train.py --data data.yaml --cfg yolov11s.yaml --weights '' --batch 16 --epochs 100 ``` 关键参数说明: - `--img-size`: 输入图像尺寸 - `--batch`: 批次大小 - `--device`: 指定GPU(如`0`或`0,1`) --- #### 3. **网络结构图获取方法** 建议通过以下方式获取结构图: 1. **官方文档**:查看GitHub仓库的`models`目录下的结构描述文件 2. **Netron可视化**: - 导出模型为ONNX格式: ```python from ultralytics import YOLO model = YOLO("yolov11.pt") model.export(format="onnx") ``` - 使用Netron工具打开`.onnx`文件 3. **代码生成**:通过`torchsummary`库输出结构摘要: ```python from torchsummary import summary summary(model, (3, 640, 640)) ``` --- #### 4. **推理部署实践** 训练完成后进行推理: ```python from ultralytics import YOLO # 加载自定义模型 model = YOLO("runs/train/weights/best.pt") # 单张图片推理 results = model.predict("test.jpg", save=True) # 视频流推理 results = model.predict("input.mp4", stream=True) ``` 支持多种输出格式: - `--save-txt`:保存检测结果到文本文件 - `--save-conf`:保留置信度分数 - `--hide-labels`:隐藏标签显示 --- #### 5. **技术特性解析** 若YOLOv11延续了YOLOv9的改进(参考PGIGELAN[^2]),可能包含: - **动态标签分配策略**:提升小目标检测能力 - **混合精度训练**:减少显存占用 - **跨阶段特征融合**:增强多尺度检测 ---
评论 185
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

挂科边缘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值