0


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 =[]defconvert(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)defconvert_annotation(xmlpath, xmlname):withopen(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 notin 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]))iflen(res)!=0:withopen(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文件路径ifnot os.path.exists(txtpath):
        os.makedirs(txtpath, exist_ok=True)list= os.listdir(xmlpath)
    error_file_list =[]for i inrange(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环境安装

手把书安装教程链接参考链接: pytorch环境安装教程视频

2.其他依赖安装

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

手把书安装教程链接参考链接:: 其他依赖安装


四、YOLOv11训练

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

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

# -*- coding: utf-8 -*-"""
@Auth : 挂科边缘
@File :trian.py
@IDE :PyCharm
@Motto:学习新思想,争做新青年
@Email :[email protected]
"""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,)

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

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

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


总结

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


本文转载自: https://blog.csdn.net/weixin_44779079/article/details/142676560
版权归原作者 挂科边缘 所有, 如有侵权,请联系我们删除。

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

还没有评论