YOLOv12环境设置,手把手教你利用YOLOv12训练自己的数据集和推理(附YOLOv12 ...

打印 上一主题 下一主题

主题 1045|帖子 1045|积分 3135



  

媒介

YOLO 体系尊嘟太卷了吧,YOLOv11 还没玩明确,YOLOv12 就重磅来袭,YOLOv12 是由纽约州立大学联合中科院在 2025年2月19 日发布,从 YOLOv12 论文标题我们大概就知道做了那些更新 ,下图是YOLOv12 在 COCO 数据集上的性能体现

YOLOv12 创新点:


  • 引入区域注意力机制(area-attention):通过引入十字形窗口自我注意机制,沿程度和垂直条纹计算注意力机制,纵横交错的注意机制。如下图所示,区域注意力采用最多简朴的等分方法,将特性地图垂直或程度分别为 L 个区域。(默认值为4)。这样可以制止复杂操作时同时包管接收野大,服从高。

  • 作者计划了残差高效层聚合网络 (R-ELAN):R-ELAN结构类似CSPNet,结构如下图的(d)所示,可以看到该结构中间层是A2(区域注意力机制),更多详细信息可以看 YOLOv12 的中的 A2C2f 模块代码

    理论详解可以参考链接:论文地点

一、YOLOv12代码下载地点

官网的源码下载地点 :官网源码
假如官网打不开的话,我已经下载好 YOLOv12 源码+预训练模型+训练脚本+推理脚本+训练测试数据集+数据集处置惩罚脚本,从公众号发送关键字 :YOLOv12源码 ,即可获取完备源码
1.YOLOv12模型结构图

根据 yolov12.yaml 画出 yolo 整体结构图,对比 YOLOv11 网络结构,YOLOv12 网络结构做了优化,减少总层数,YOLOv12 模型结构如下图所示:


二、YOLO环境设置教程

YOLOv12/YOLOv11/YOLOv10/YOLOv9/YOLOv8/YOLOv7/YOLOv5 环境都是通用的,只需要安装一次就行
我用之前的环境运行,报错:mportError: cannot import name ‘scaled_dot_product_attention’ from ‘torch.nn.functional’ ,我猜应该是 pytorch 版本太低了,没有这个模块,那我只能在创建一个虚拟环境用于YOLOv12,那么接下来重新创建新的虚拟环境

1.创建虚拟环境

python 版本为 3.9、 3.10、3.11 都行,我选择3.11版本的
终端输入命令创建,(-n 背面接你要创建虚拟环境的名称,这个可以自己起一个名称,不愿定要跟我一样):
  1. conda create -n yolov12 python=3.11
复制代码

输入 y 回车,等待下载即可

2.激活虚拟环境

激活虚拟环境语法是 conda activate myenv,myenv是自己的虚拟环境名称,命令如下:
  1. conda activate yolov12
复制代码
激活成功括号酿成你刚刚创建虚拟环境名字

3.查询自己电脑可支持最高cuda版本是多少(无显卡的同砚可以跳过这个步骤)

那怎么知道电脑有没有显卡,在开始菜单搜索设备管理器打开


有显卡的同砚还需要进行查询自己电脑支持最高 cuda 版本是多少,在终端输入命令 nvidia-smi 查看

可以看到我电脑支持最高 cuda 版本是 12.5,以是可以安装向下版本的 cuda,那么知道这个有什么用,当然有用,可以看到 pytorch 官网安装命令都带有 cuda 版本号

假设你电脑都不支持这么高的cuda 版本,你安装了 pytorch 那么你就用不了 GPU 了。假如你电脑支持cuda太低,你可以更新英伟达驱动,更新英伟达驱动直达地点: 英伟达驱动,根据自己电脑选择下载,安装超级简朴,直接下一步下一步就行,安装完成之后重启电脑,在终端输入 nvidia-smi 命令,来查看可支持的最高 cuda 版本
4.pytorch安装

看了一眼官网的设置文件,官网安装pytorch是2.2.2的

电脑有英伟达显卡就安装带 cuda 的 pytorch,电脑没有显卡则安装 cpu 的 pytorch,去 pytorch 官网找到合适版本复制命令安装就行 pytorch官网直达地点是:pytorch官网,复制命令时候 -c 背面不用复制

复制命令到终端,出现下图这样,或者安装不了的,不急,我们换一种方式安装,就是通过离线下载安装库进行安装,我换源还是安装不了,那么我们就通过别的一种方式安装,就是下载 whl 安装包,这种成功率达到 99% 。

把这个下图这几个版本记住,之后离线下载对应版本就行

离线安装包下载地点:pytorch离线安装包下载地点
打开链接,找到版本下载即可,说一下文件名的意思,


  • cu118:是 cuda 版本是 11.8,cu102 就是 cuda 版本是 10.2 的,依次类推
  • cp311:是 Python 的版本是3.11,cp39就是Python版本是3.9,依次类推
  • win:是 Windows 操作体系的意思,这个各人应该看得懂的
因为前面我按照 python 版本为 3.11 的,那么就选择 cp311 的,体系选择 win,这个版本号肯定要对上 python 的版本号哦 ,之后点击下载就行,各人根据自己需求选择安装即可

假如没有显卡就选择 cpu 的

除了下载 pytorch,还需要下载对应版本的 torchvision 和 torchaudio(前面叫你记住版本号了哦)
在下载对应版本 torchvision,我的是 torchvision==0.17.2

在下载对应版本的 torchaudio,我的应该是 torchaudio==2.2.2

下载完成,在终端进入文件地点的位置,我的在 E:\3-浏览器下载的文件,先进入E盘,再 cd 切换路径,之后 pip install 文件名 安装即可,(小技巧:打文件名时候可以用 tab 键补全,关注我不仅学到一个实用的小技巧哦)

记得激活虚拟环境在安装

把刚刚下载三个文件按照序次安装即可,序次是: 起首是 torch,其次是 torchvision,末了是 torchaudio
5.验证 PyTorch GPU 是否可用(没有显卡的同砚不用看这个步骤)

安装完成后,测试 GPU 是否可用,假如输出为 True 则体现 GPU 可以利用,要是输出 False 代表不可以利用 GPU 加速,输出 False 也是可以利用的,一般 CPU 训练会很慢,慢到你怀疑人生那种,不过用来推理还是可以的。要是没有显卡租一个服务器训练模型就行,假如这个反响比较大,我也会出一期在服务器怎么训练的教程。
在终端输入 python

复制下面命令到终端即可
  1. import torch
  2. print(torch.__version__)
  3. print(torch.cuda.is_available())
  4. print(torch.cuda.device_count())
复制代码

看到这里 pytorch 安装完成
6.安装其他依赖

安装 requirements.txt 文件的环境,可以看到 YOLOv12 官网给出了很多库版本,其实有些我们用不到,我拿 YOLOv8 的 requirements.txt 来安装即可,到时候缺什么我们在单独安装,不仅减少电脑内存
下图是 YOLOv12 官网的 requirements.txt 文件,把里面内容删了,复制我给的库到 requirements.txt 文件里面

  1. # Ultralytics requirements
  2. # Example: pip install -r requirements.txt
  3. # Base ----------------------------------------
  4. matplotlib>=3.3.0
  5. numpy==1.24.4 # pinned by Snyk to avoid a vulnerability
  6. opencv-python>=4.6.0
  7. pillow>=7.1.2
  8. pyyaml>=5.3.1
  9. requests>=2.23.0
  10. scipy>=1.4.1
  11. tqdm>=4.64.0
  12. # Logging -------------------------------------
  13. # tensorboard>=2.13.0
  14. # dvclive>=2.12.0
  15. # clearml
  16. # comet
  17. # Plotting ------------------------------------
  18. pandas>=1.1.4
  19. seaborn>=0.11.0
  20. # Export --------------------------------------
  21. # coremltools>=7.0  # CoreML export
  22. # onnx>=1.12.0  # ONNX export
  23. # onnxsim>=0.4.1  # ONNX simplifier
  24. # nvidia-pyindex  # TensorRT export
  25. # nvidia-tensorrt  # TensorRT export
  26. # scikit-learn==0.19.2  # CoreML quantization
  27. # tensorflow>=2.4.1  # TF exports (-cpu, -aarch64, -macos)
  28. # tflite-support
  29. # tensorflowjs>=3.9.0  # TF.js export
  30. # openvino-dev>=2023.0  # OpenVINO export
  31. # Extras --------------------------------------
  32. psutil  # system utilization
  33. py-cpuinfo  # display CPU info
  34. thop>=0.1.1  # FLOPs computation
  35. # ipython  # interactive notebook
  36. # albumentations>=1.0.3  # training augmentations
  37. # pycocotools>=2.0.6  # COCO mAP
  38. # roboflow
复制代码
复制完如下图所示:

接下来正常安装就行,这个安装步骤我之前视频讲过,各人有爱好可以看我之前的安装视频,在自己的虚拟环境里面安装,安装命令如下:
  1. pip install -r requirements.txt
复制代码

安装完成我们测试推理,运行推理文件报错,人家提示你没有安装这个库,之后缺什么就安装什么库

安装命令如下:
  1. pip install huggingface-hub==0.23.2
复制代码

末了完美推理成功

7.增补(flash_attn环境)

从官网的环境设置文件看出还给出了 flash_attn 库,从库的名字看出是在linux 下安装的,那么在 windows 体系当然安装不了 linux 版本的库,如需在 windows 安装 flash_attn 库,则需要找 windows 版本的 flash_attn 库。网上应该有教程在 windows 版本安装 flash_attn 库(需要安装自行网上搜索找找看,后续有这个安装需求我也更新安装步骤出来),我就没有安装照样是可以训练和推理的,下文继承详细讲一下。

从官网代码可以看出,AAttn 类中的 forward 方法中人家已经写好了,安装有 flash_attn 的话,则利用 flash_attn_func 函数计算,未安装或未启用flash_attn,则利用标准的缩放点积注意力(sdpa)函数来计算;末了一种环境是在 cpu 训练,则是实行末了一段代码。也就说有没有安装 flash_attn库,照样可以训练,只是注意力计算方式有所区别,应该不会对效果产生很大影响吧(各人详细实验试试)。

假如安装有 flash_attn ,不想用 flash_attn_func 计算,可以通过 USE_FLASH_ATTN = True 参数设置,不需要设置 False 即可


三、数据集准备

1.数据集标注软件

数据集利用标注软件标注好,我这里推荐两个标注软件,一个是 labelimg,别的一个是 labelme,可以在python环境,利用 pip install labelimg 或者 pip install labelme 进行安装,看你选择哪个标注工具标注了,我利用 labelimg 标注工具
安装完成在终端输入命令启动标注软件

下面是软件界面

设置自动生存标注生成的标注文件

2.voc数据集格式转换

标注格式假如选择VOC格式,背面需要代码转换格式,假如选择yolo格式就不用转换,voc格式转换yolo格式代码如下:
  1. # -*- coding: utf-8 -*-
  2. """
  3. @Auth :挂科边缘
  4. @File :xml转txt.py
  5. @IDE :PyCharm
  6. @Motto :学习新思想,争做新青年
  7. @Email :179958974@qq.com
  8. """
  9. import xml.etree.ElementTree as ET
  10. import os, cv2
  11. import numpy as np
  12. classes = []
  13. def convert(size, box):
  14.     dw = 1. / (size[0])
  15.     dh = 1. / (size[1])
  16.     x = (box[0] + box[1]) / 2.0 - 1
  17.     y = (box[2] + box[3]) / 2.0 - 1
  18.     w = box[1] - box[0]
  19.     h = box[3] - box[2]
  20.     x = x * dw
  21.     w = w * dw
  22.     y = y * dh
  23.     h = h * dh
  24.     return (x, y, w, h)
  25. def convert_annotation(xmlpath, xmlname):
  26.     with open(xmlpath, "r", encoding='utf-8') as in_file:
  27.         txtname = xmlname[:-4] + '.txt'
  28.         txtfile = os.path.join(txtpath, txtname)
  29.         tree = ET.parse(in_file)
  30.         root = tree.getroot()
  31.         filename = root.find('filename')
  32.         img = cv2.imdecode(np.fromfile('{}/{}.{}'.format(imgpath, xmlname[:-4], postfix), np.uint8), cv2.IMREAD_COLOR)
  33.         h, w = img.shape[:2]
  34.         res = []
  35.         for obj in root.iter('object'):
  36.             cls = obj.find('name').text
  37.             if cls not in classes:
  38.                 classes.append(cls)
  39.             cls_id = classes.index(cls)
  40.             xmlbox = obj.find('bndbox')
  41.             b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
  42.                  float(xmlbox.find('ymax').text))
  43.             bb = convert((w, h), b)
  44.             res.append(str(cls_id) + " " + " ".join([str(a) for a in bb]))
  45.         if len(res) != 0:
  46.             with open(txtfile, 'w+') as f:
  47.                 f.write('\n'.join(res))
  48. if __name__ == "__main__":
  49.     postfix = 'png'  # 图像后缀
  50.     imgpath = r'E:\A-毕业设计代做数据\helmet\test\images'  # 图像文件路径
  51.     xmlpath = r'E:\A-毕业设计代做数据\helmet\test\annotations'  # xml文件文件路径
  52.     txtpath = r'E:\A-毕业设计代做数据\helmet\test\labels'  # 生成的txt文件路径
  53.     if not os.path.exists(txtpath):
  54.         os.makedirs(txtpath, exist_ok=True)
  55.     list = os.listdir(xmlpath)
  56.     error_file_list = []
  57.     for i in range(0, len(list)):
  58.         try:
  59.             path = os.path.join(xmlpath, list[i])
  60.             if ('.xml' in path) or ('.XML' in path):
  61.                 convert_annotation(path, list[i])
  62.                 print(f'file {list[i]} convert success.')
  63.             else:
  64.                 print(f'file {list[i]} is not xml format.')
  65.         except Exception as e:
  66.             print(f'file {list[i]} convert error.')
  67.             print(f'error message:\n{e}')
  68.             error_file_list.append(list[i])
  69.     print(f'this file convert failure\n{error_file_list}')
  70.     print(f'Dataset Classes:{classes}')
复制代码
代码需要修改的地方如下:
1.postfix参数填图片的后缀,需要注意图片格式要同一,是png格式就写png,是jpg格式就写jpg
2.imgpath参数填图片地点的路径
3.xmlpath参数填标注文件的路径
4.txtpath参数填生成的yolo格式的文件

3.数据集分别

分别训练集和验证集代码如下:
  1. # -*- coding: utf-8 -*-
  2. """
  3. @Auth : 挂科边缘
  4. @File :划分.py
  5. @IDE :PyCharm
  6. @Motto:学习新思想,争做新青年
  7. @Email :179958974@qq.com
  8. """
  9. import os, shutil
  10. from sklearn.model_selection import train_test_split
  11. val_size = 0.2
  12. postfix = 'jpg'
  13. imgpath = r'E:\A-毕业设计代做数据\datasets\images'
  14. txtpath =  r'E:\A-毕业设计代做数据\datasets\labels'
  15. output_train_img_folder =r'E:\A-毕业设计代做数据\datasets\dataset_kengwa/images/train'
  16. output_val_img_folder =  r'E:\A-毕业设计代做数据\datasets\dataset_kengwa/images/val'
  17. output_train_txt_folder =  r'E:\A-毕业设计代做数据\datasets\dataset_kengwa\labels/train'
  18. output_val_txt_folder =  r'E:\A-毕业设计代做数据\datasets\dataset_kengwa\labels/val'
  19. os.makedirs(output_train_img_folder, exist_ok=True)
  20. os.makedirs(output_val_img_folder, exist_ok=True)
  21. os.makedirs(output_train_txt_folder, exist_ok=True)
  22. os.makedirs(output_val_txt_folder, exist_ok=True)
  23. listdir = [i for i in os.listdir(txtpath) if 'txt' in i]
  24. train, val = train_test_split(listdir, test_size=val_size, shuffle=True, random_state=0)
  25. for i in train:
  26.     img_source_path = os.path.join(imgpath, '{}.{}'.format(i[:-4], postfix))
  27.     txt_source_path = os.path.join(txtpath, i)
  28.     img_destination_path = os.path.join(output_train_img_folder, '{}.{}'.format(i[:-4], postfix))
  29.     txt_destination_path = os.path.join(output_train_txt_folder, i)
  30.     shutil.copy(img_source_path, img_destination_path)
  31.     shutil.copy(txt_source_path, txt_destination_path)
  32. for i in val:
  33.     img_source_path = os.path.join(imgpath, '{}.{}'.format(i[:-4], postfix))
  34.     txt_source_path = os.path.join(txtpath, i)
  35.     img_destination_path = os.path.join(output_val_img_folder, '{}.{}'.format(i[:-4], postfix))
  36.     txt_destination_path = os.path.join(output_val_txt_folder, i)
  37.     shutil.copy(img_source_path, img_destination_path)
  38.     shutil.copy(txt_source_path, txt_destination_path)
复制代码
需要修改的地方如下

下面四个参数只需在自己电脑任意位置新建一个文件夹就行,用于存放生成的训练集和验证集,比如新建一个文件夹叫dataset_kengwa,背面的路径不用动,如下图左边的框出来的路径覆盖成你的就行

数据集有以下两种方式放置,都可以进行训练,常见的数据集放置是第一种,也有开源的数据集按照第二种方式放置的,我都遇见过,也能训练起来

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

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

代码如下:
  1. train: E:\Desktop\new-yolov9\yolotest\images\train  # train images (relative to 'path') 4 images
  2. val: E:\Desktop\new-yolov9\yolotest\images\val  # val images (relative to 'path') 4 images
  3. nc: 2
  4. # class names
  5. names: ['dog','cat']
复制代码

四、YOLOv12推理

(1)官网的预训练模型下载
进入官网的源码下载地点 :官网模型下载地点,往下面拉,看到模型位置,YOLOv12 针对不同的场景和应用提供了 YOLOv12n、YOLOv12s 等不同巨细的模型,详细看官网提供的,需要下载哪个,鼠标左键单击下载就行。

我的源码包已经下载好了模型了,假如需要其他权重自行下载就行
(2)在根目录新建一个python文件,取名为:detect.py

(3)把推理代码复制到detect.py文件
注意注意注意:模型路径改成你自己的路径,还有预测图像也改成你自己的路径
推理的代码如下:
  1. # -*- coding: utf-8 -*-
  2. """
  3. @Auth : 挂科边缘
  4. @File :detect.py
  5. @IDE :PyCharm
  6. @Motto:学习新思想,争做新青年
  7. @Email :179958974@qq.com
  8. """
  9. from ultralytics import YOLO
  10. if __name__ == '__main__':
  11.     # Load a model
  12.     model = YOLO(model=r'D:\2-Python\1-YOLO\YOLOv11\ultralytics-8.3.2\yolo11n-seg.pt')  
  13.     model.predict(source=r'D:\2-Python\1-YOLO\YOLOv11\ultralytics-8.3.2\ultralytics\assets\bus.jpg',
  14.                   save=True,
  15.                   show=False,
  16.                   )
复制代码
推理代码的参数表明
1.model参数:该参数可以填入模型文件路径
2.source参数:该参数可以填入需要推理的图片或者视频路径,假如打开摄像头推理则填入0就行
3.save参数:该参数填入True,代表把推理效果生存下来,默认是不生存的,以是一般都填入True
4.show参数:该参数填入True,代表把推理效果以窗口形式显示出来,默认是显示的,这个参数根据自己需求打开就行,不显示你就填False就行
目标检测模型推理效果如下:


五、YOLOv12训练

(1)在根目录新建一个python文件,取名为:train.py,假如之前看过我的文章,已经新建过就不用重新新建了

(2)把训练代码复制到train.py文件,假如之前看过我的文章,已经复制过了就不用重新复制了,只需修改参数就行
训练的代码如下:
  1. # -*- coding: utf-8 -*-
  2. """
  3. @Auth : 挂科边缘
  4. @File :trian.py
  5. @IDE :PyCharm
  6. @Motto:学习新思想,争做新青年
  7. @Email :179958974@qq.com
  8. """
  9. import warnings
  10. warnings.filterwarnings('ignore')
  11. from ultralytics import YOLO
  12. if __name__ == '__main__':
  13.     model = YOLO(model=r'D:\2-Python\1-YOLO\YOLOv12\yolov12-main\ultralytics\cfg\models\v12\yolov12.yaml')
  14.     # model.load('yolo11n.pt') # 加载预训练权重,改进或者做对比实验时候不建议打开,因为用预训练模型整体精度没有很明显的提升
  15.     model.train(data=r'data.yaml',
  16.                 imgsz=640,
  17.                 epochs=50,
  18.                 batch=4,
  19.                 workers=0,
  20.                 device='',
  21.                 optimizer='SGD',
  22.                 close_mosaic=10,
  23.                 resume=False,
  24.                 project='runs/train',
  25.                 name='exp',
  26.                 single_cls=False,
  27.                 cache=False,
  28.                 )
复制代码
注意注意注意:模型设置路径改成你自己的路径,还有数据集设置文件也修改成你自己的路径

训练代码的参数表明:


  • 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体现不缓存。
注意注意注意:一般做科研改进工作时候可以不用预训练权重,因为用预训练模型整体精度很难提高
没有加载预训练模型,训练成功:

我这里演示加载预训练权重,训练输出如下所示:


六、解决训练过程停止怎么继承上次训练

在训练过程不警惕停止了,那怎么继承上次的训练了,这里先不慌,官网也的代码写得非常好,它有这个断点训练功能,那么 YOLOv8 v10 v11 v12 处置惩罚的方法都是一模一样,接下来直接看图操作就行:



  • model参数:该参数填入上次停止的模型,为 last.pt
  • resume参数:该参数设置为True,则会加载上一次训练的模型权重和优化器状态,继承训练。

总结

YOLOv12 训练自己数据集和推理到此竣事,我已经下载好 YOLOv12 源码+预训练模型+训练脚本+推理脚本+训练测试数据集+数据集处置惩罚脚本,从公众号发送关键字 :YOLOv12源码,即可获取完备源码,有问题可以留言,创作不易,请帮忙点个爱心呗,谢谢


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表