YOLOv11来了,使用YOLOv11训练自己的数据集和推理(附YOLOv11网络结构图)
文章目录
- 前言
- 一、YOLOv11代码下载地址
-
- 1.YOLOv11模型结构图
- 二、数据集准备
-
- 1.数据集标注软件
- 2.voc数据集格式转换
- 3.数据集划分
- 4.修改yolo的训练配置文件
- 三、YOLO环境配置教程
-
- 1.pytorch环境安装
- 2.其他依赖安装
- 四、YOLOv11训练
- 五、YOLOv11推理
- 六、解决训练过程中断怎么继续上次训练
- 总结
前言
YOLOv11 由 Ultralytics 团队在 2024 年 9 月 30 日发布, 最新的 YOLOv11 模型在之前的 YOLO 版本引入了新功能和改进,以进一步提高性能和灵活性。YOLO11 在快速、准确且易于使用,使其成为各种目标检测和跟踪、实例分割、图像分类和姿态估计任务的绝佳选择。可以看出官网 YOLOv11 在COCO数据集上的性能表现,如下图所示:
一、YOLOv11代码下载地址
手把手视频安装可以看这个视频: 视频安装教程
官网的源码下载地址 :官网源码
官网打不开的话,从我的网盘下载就行,网盘下载地址: YOLOv11原始版本源码下载,版本为ultralytics-8.3.6,提取码: ehhs
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 ETimport os, cv2import numpy as npfrom os import listdirfrom os.path import joinclasses = []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, shutilfrom sklearn.model_selection import train_test_splitval_size = 0.2#test_size = 0.2postfix = \'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 imagesval: E:\\Desktop\\new-yolov9\\yolotest\\images\\val # val images (relative to \'path\') 4 imagesnc: 2# class namesnames: [\'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.0numpy==1.24.4 # pinned by Snyk to avoid a vulnerabilityopencv-python>=4.6.0pillow>=7.1.2pyyaml>=5.3.1requests>=2.23.0scipy>=1.4.1tqdm>=4.64.0# Logging -------------------------------------# tensorboard>=2.13.0# dvclive>=2.12.0# clearml# comet# Plotting ------------------------------------pandas>=1.1.4seaborn>=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 utilizationpy-cpuinfo # display CPU infothop>=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 warningswarnings.filterwarnings(\'ignore\')from ultralytics import YOLOif __name__ == \'__main__\': model = YOLO(model=r\'D:\\2-Python\\1-YOLO\\YOLOv11\\ultralytics-8.3.2\\ultralytics\\cfg\\models\\11\\yolo11.yaml\') # model.load(\'yolo11n.pt\') # 加载预训练权重,改进或者做对比实验时候不建议打开,因为用预训练模型整体精度没有很明显的提升 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 YOLOif __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训练自己数据集和推理到此结束,有问题可以留言,创作不易,请帮忙点个爱心呗,谢谢