【跟我学YOLO】(2)YOLO11 训练自己的模型

欢迎关注『跟我学 YOLO』系列
【跟我学YOLO】(1)YOLO11 环境配置与基本应用
【跟我学YOLO】(2)YOLO11 训练自己的模型



YOLO11 由 Ultralytics 团队在 2024年9月30日发布,在之前 YOLO 版本的基础上进行了显著的架构和训练方法的改进,具有快速、准确和易于使用的特点,成为图像分类、目标检测、跟踪、实例分割和姿态估计任务的最佳选择。

上节介绍了 YOLO11 的下载、配置和推理,本节介绍使用用户自己的数据集训练 YOLO11 模型,建立特定任务的私有模型。
创建自定义模型来检测对象,包括图像的采集和标注、训练模型、模型部署,以及使用部署的模型进行推理。

YOLO11 官方下载:GitHub - ultralytics/YOLO11
Ultralytics 官方文档: YOLO11 使用指南(中文版)


1. 准备 YOLO11 训练数据集

YOLO11 项目中提供了不同数据集转换的指南和例程,位于 “.\docs\en\datasets” 路径,例如在文件 coco.md 中介绍了使用 COCO 数据集来训练 YOLOv11 目标检测模型。


1.1 YOLOv11 数据集的格式

  1. 数据集的组织
    YOLOv11 数据集通常包含图像文件和标注文件。图像文件通常是 jpg、png 等图像格式,包含了待检测的目标。标注文件则是包含每张图像中目标对象的类别和位置信息的文本文件。

YOLOv11 默认使用 COCO2017 数据集进行训练,结构如下。

  • images 目录包含 train、valid 文件夹,这两个文件夹下包含模型训练所需要的图片文件;
  • labels 目录包含 train、valid 文件夹,这两个文件夹下包含模型训练图片所对应的标注文件;
  • images\test 文件夹包含测试所用的图片文件。
dataset
├── images
│   ├── train
│   ├── valid
│   ├── test (option)
├── labels
│   ├── train
│   ├── valid
│   ├── test (option)

  1. 标注文件的格式

YOLO格式的标注文件通常是一个文本文件,每一行代表一个目标物体的标注信息。
标注信息通常包含类别编号、目标中心横坐标(相对于图像宽度)、目标中心纵坐标(相对于图像高度)、目标宽度(相对于图像宽度)和目标高度(相对于图像高度),具体格式如下:

<object-class-id> <x> <y> <width> <height>

其中:

<object-class-id>是目标对象的类别编号,整数表示。
<x>和<y>是目标中心位置的坐标,经过归一化处理(即目标的真实x、y值除以图像的宽度和高度),是小于1的浮点数。
<width>和<height>是目标的宽度和高度(同样经过归一化处理),也是小于1的浮点数。

例如,某一行的标注信息为 “2 0.3 0.6 0.25 0.40”,其中“2”表示类别编号,后面的 4个数字表示目标在图像中的位置 <x> <y> 和宽高 <width> <height>。


1.2 下载 YOLOv11 数据集

Roboflow Annotate是一个简单的基于网络的工具,用于管理和标记用户的图像集,并以YOLO的注释格式导出。无论是否使用 Roboflow 标记图像,都可以使用它将数据集转换为YOLO格式,创建YOLOv11 YAML配置文件,并将其托管以导入训练脚本。

  1. 打开 Roboflow 网站,从Roboflow 公开数据集中选择一个数据集,下载到本地。

本文选择 “水族馆数据集(Aquarium Dataset)”。该数据集由 Roboflow 从美国两个水族馆收集的 638 张图像组成:Henry Doorly Zoo 和 National Aquarium in Baltimore。Roboflow对这些图像进行了标记,以便进行物体检测。图像和注释在知识共享署名许可下发布。

该数据集标记了 7 个类别:鱼类(fish)、水母(jellyfish)、企鹅(penguins)、鲨鱼(sharks)、海雀(puffins)、黄貂鱼(stingrays)和海星(starfish)。大多数图像包含多个边界框。

  1. Roboflow 提供了多种下载格式,主要是数据集组织和标注格式的区别。注意要以YOLOv11 格式导出,如下图所示。

在这里插入图片描述

选择 YOLO11 格式,下载 水族馆数据集(Aquarium Dataset)。

在这里插入图片描述

  1. 下载后将数据集解压缩。

下载的 Aquarium 数据集的文件路径如下:

- Dataset_Aquarium
   - test
      - images
      - labels
   - train
      - images
      - labels
   - valid
      - images
      - labels
   - data.yaml

下载的 Aquarium 数据集设有 test,train,valid 这三个文件夹,分别用作测试、训练和检验,每个文件夹下设有 images,labels 两个文件夹,分别保存图像文件和标注文件。

一个典型的标注文件的内容如下。共有 3 行,每行表示一个检测目标。每行有 5个参数,第1列是类别标签(Yes/No),后 4个参数是 BoundingBox 的坐标位置。

0 0.31875 0.59762 0.05583 0.13175
0 0.31917 0.29127 0.12833 0.32540
0 0.52708 0.16746 0.12417 0.28413

如果自己收集和标注数据集,也要按照以上格式来组织数据集和标注文件。

  1. 数据集配置文件 .yaml

下载数据集配置文件中给出了数据集的路径,训练集、检验集和验证集的路径,分类任务的类别数量 nc 和类名列表 names。

Aquarium Dataset 数据集配置文件 data.yaml 位于数据集的根目录,内容如下:

train: ../train/images
val: ../valid/images
test: ../test/images

nc: 7
names: ['fish', 'jellyfish', 'penguin', 'puffin', 'shark', 'starfish', 'stingray']

roboflow:
  workspace: brad-dwyer
  project: aquarium-combined
  version: 2
  license: CC BY 4.0
  url: https://universe.roboflow.com/brad-dwyer/aquarium-combined/dataset/2

其中,train 表示训练集图像文件夹的路径,val 表示验证集图像文件夹的路径,test 表示测试集图像文件夹的路径。nc:7 表示类别数为 7,names 表示类别名。

注意,nc 是由数据集的标注内容决定的,不能自行修改。


1.3 重新整理 YOLOv8 数据集

YOLO11 模型训练对于格式的要求非常严格,需要重新组织样本图片和标签。

  1. 为了方便在不同项目中使用数据集,将 YOLO11_Aquarium 项目和 DatasetAquariumYolo11 数据集都保存在 Projects 目录下。其中,我们把 YOLO11 项目另存为 YOLO11_Aquarium,以便与下载的 YOLO11 区别。
- Projects
  - DatasetAquariumYolo11
  - YOLO11_Aquarium
  1. 按照 YOLO11 的数据格式组织数据集的样本图片和标签。
- Projects
  - DatasetAquariumYolo11
    - images
      - test
      - train
      - val
    - labels
      - test
      - train
      - val
  - YOLO11_Aquarium
    - dataAquariumYolo11.yaml
    - yolo11_Aquarium.yaml
  1. 编写数据集配置文件 YAML(dataAquariumYolo11.yaml )。

YOLO11 模型训练时,要调用数据集配置文件 YAML 文件,用于指定数据集的路径和分类类别。

在 YOLO11 项目中,提供了多个数据集配置文件,例如:“\YOLOv11\ultralytics\cfg\datasets\coco8.yaml” 可供参考。其内容如下。

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/coco8 # dataset root dir
train: images/train # train images (relative to 'path') 4 images
val: images/val # val images (relative to 'path') 4 images
test: # test images (optional)

# Classes
names:
  0: person
  1: bicycle
  2: car
  3: motorcycle
  4: airplane
  5: bus
  6: train
  7: truck
  8: boat
  9: traffic light
  10: fire hydrant
  ...

现在,我们根据Aquarium Dataset 数据集配置文件 data.yaml ,编写本项目的数据集配置文件 dataAquarium.yaml,保存到 YOLO11_Aquarium 项目的根目录,内容如下。

# Ultralytics YOLO 🚀, AGPL-3.0 license
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../DatasetAquariumYolo11  # dataset root dir
train: images/train  # train images (relative to 'path')
val: images/valis  # val images (relative to 'path')
test: images/test # test images (optional)

# Classes
names:
  0: fish
  1: jellyfish
  2: penguin
  3: puffin
  4: shark
  5: starfish
  6: stingray

注意:

  • (1)配置文件 coco8.yaml 中的 “path: …/datasets/coco8” 表示该数据集位于 YOLO11 目录下级的 “Projects\YOLO11_Aquarium\datasets” 路径。而配置文件 dataAquarium.yaml 中的 “path: …/DatasetAquariumYolo11” 表示该数据集位于位于 YOLO11 目录同级的 “Projects\DatasetAquariumYolo11” 路径。
  • (2)本文将配置文件 dataAquarium.yaml 保存在 YOLO11_Aquarium 项目的根目录 “Projects\YOLO11_Aquarium\dataAquarium.yaml”,也可以保存在数据集的根目录或其它目录,但要在使用时指示相应的配置文件路径。

在这里插入图片描述


3. YOLO11 自定义数据集的训练

3.1 下载 YOLO11 预训练模型

在 YOLO/GitHub 项目仓,提供了在 COCO数据集上训练达到的检测(Detection)、分类(Classification)、分割(Segmentation)、姿态估计(Pose)、定向边界框检测(OBB)等任务的预训练模型。YOLO11 有多个不同规模的模型,从小到大依次是:YOLO11n、YOLO11s、YOLO11m、YOLO11l、YOLO11x。这些模型与各种操作模式兼容,包括推理、验证、训练和导出,便于在部署和开发的不同阶段使用。详见 YOLO11项目根目录下的帮助文件 README.zh-CN.md。

在这里插入图片描述

本文选择 YOLO11n,参数约 2.6M。下载完成后,将下载的预训练模型文件 yolo11n.pt 保存在 YOLO11 项目的根目录路径下,例如 “C:\Python\Projects\YOLO11_Aquarium”。


3.2 使用 Python 接口的模型训练

虽然 YOLO11 也支持在命令行(CLI)中使用 ‘yolo’ 命令对数据集训练,但是在涉及各种模型和数据集的路径设置和参数设置时使用较不方便。因此本文采用在 Python 环境中编程实现用户模型的训练。

YOLO11 提供了 Python 接口的调用方式。它提供了加载和运行模型以及处理模型输出的函数。该界面设计易于使用,以便用户可以在他们的项目中快速实现目标检测。

使用 Aquarium 数据集进行模型训练的 Python 参考例程如下。

from ultralytics import YOLO

if __name__ == '__main__':
    # 创建 YOLO 模型对象,加载指定的模型配置
    model = YOLO(model=r'yolo11_Aquarium.yaml')
    # 加载预训练的权重文件,加速训练并提升模型性能
    model.load('yolo11n.pt')
    # 用指定数据集训练模型
    model.train(data=r'dataAquariumYolo11.yaml',  # 指定训练数据集的配置文件路径
               cache=False,  # 是否缓存数据集以加快后续训练速度
               imgsz=640,  # 指定训练时使用的图像尺寸
               epochs=100,  # 设置训练的总轮数为100轮
               batch=16,  # 设置每个训练批次的大小为16
               close_mosaic=10,  # 设置在训练的最后 10 轮中关闭 Mosaic 数据增强
               workers=4,  # 设置用于数据加载的线程数为4
               device='0',  # 运行设备, 指定使用的 CPU/GPU 设备
               optimizer='SGD'  # 设置优化器为SGD(随机梯度下降)
               )

注意:
(1)本例程使用的环境配置文件 settings.json 中的 “datasets_dir” 路径为 “C:\Python\Projects\Yolo11” 。
(2)本例程使用的模型配置文件路径为 “./Projects/YOLO11_Aquarium/yolo11_Aquarium.yaml” 。
(3)本例程使用的训练数据集配置文件路径为 “./Projects/YOLO11_Aquarium/dataAquariumYolo11.yaml” 。
(4)本例程运行后的训练模型及训练日志保存在 “./Projects/YOLO11_Aquarium/runs/detect/train” 目录下。

在这里插入图片描述

在 PyCharm 编译并运行程序,就实现对 Aquarium 数据集进行模型训练。运行时在 PyCham 窗口中输出模型训练的信息如下。

C:\Users\Administrator\.conda\envs\yolo8\python.exe C:\Python\Yolo11\YOLOv11_Aquarium\train01.py 
WARNING ⚠️ no model scale passed. Assuming scale='n'.
New https://pypi.org/project/ultralytics/8.3.76 available 😃 Update with 'pip install -U ultralytics'
Ultralytics 8.3.57 🚀 Python-3.8.20 torch-2.4.1+cu121 CUDA:0 (NVIDIA GeForce RTX 3060, 12288MiB)
engine\trainer: task=detect, mode=train, model=yolo11_Aquarium.yaml, data=dataAquariumYolo11.yaml, epochs=100, time=None, patience=100, batch=16, imgsz=640, save=True, save_period=-1, cache=False, device=0, workers=4, project=None, name=train2, exist_ok=False, pretrained=True, optimizer=SGD, verbose=True, seed=0, deterministic=True, single_cls=False, rect=False, cos_lr=False, close_mosaic=10, resume=False, amp=True, fraction=1.0, profile=False, freeze=None, multi_scale=False, overlap_mask=True, mask_ratio=4, dropout=0.0, val=True, split=val, save_json=False, save_hybrid=False, conf=None, iou=0.7, max_det=300, half=False, dnn=False, plots=True, source=None, vid_stride=1, stream_buffer=False, visualize=False, augment=False, agnostic_nms=False, classes=None, retina_masks=False, embed=None, show=False, save_frames=False, save_txt=False, save_conf=False, save_crop=False, show_labels=True, show_conf=True, show_boxes=True, line_width=None, format=torchscript, keras=False, optimize=False, int8=False, dynamic=False, simplify=True, opset=None, workspace=None, nms=False, lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=7.5, cls=0.5, dfl=1.5, pose=12.0, kobj=1.0, nbs=64, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, bgr=0.0, mosaic=1.0, mixup=0.0, copy_paste=0.0, copy_paste_mode=flip, auto_augment=randaugment, erasing=0.4, crop_fraction=1.0, cfg=None, tracker=botsort.yaml, save_dir=runs\detect\train2
WARNING ⚠️ no model scale passed. Assuming scale='n'.

                   from  n    params  module                                       arguments                     
  0                  -1  1       464  ultralytics.nn.modules.conv.Conv             [3, 16, 3, 2]                 
  1                  -1  1      4672  ultralytics.nn.modules.conv.Conv             [16, 32, 3, 2]                
  2                  -1  1      6640  ultralytics.nn.modules.block.C3k2            [32, 64, 1, False, 0.25]      
  3                  -1  1     36992  ultralytics.nn.modules.conv.Conv             [64, 64, 3, 2]                
  4                  -1  1     26080  ultralytics.nn.modules.block.C3k2            [64, 128, 1, False, 0.25]     
  5                  -1  1    147712  ultralytics.nn.modules.conv.Conv             [128, 128, 3, 2]              
  6                  -1  1     87040  ultralytics.nn.modules.block.C3k2            [128, 128, 1, True]           
  7                  -1  1    295424  ultralytics.nn.modules.conv.Conv             [128, 256, 3, 2]              
  8                  -1  1    346112  ultralytics.nn.modules.block.C3k2            [256, 256, 1, True]           
  9                  -1  1    164608  ultralytics.nn.modules.block.SPPF            [256, 256, 5]                 
 10                  -1  1    249728  ultralytics.nn.modules.block.C2PSA           [256, 256, 1]                 
 11                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']          
 12             [-1, 6]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           
 13                  -1  1    111296  ultralytics.nn.modules.block.C3k2            [384, 128, 1, False]          
 14                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']          
 15             [-1, 4]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           
 16                  -1  1     32096  ultralytics.nn.modules.block.C3k2            [256, 64, 1, False]           
 17                  -1  1     36992  ultralytics.nn.modules.conv.Conv             [64, 64, 3, 2]                
 18            [-1, 13]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           
 19                  -1  1     86720  ultralytics.nn.modules.block.C3k2            [192, 128, 1, False]          
 20                  -1  1    147712  ultralytics.nn.modules.conv.Conv             [128, 128, 3, 2]              
 21            [-1, 10]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           
 22                  -1  1    378880  ultralytics.nn.modules.block.C3k2            [384, 256, 1, True]           
 23        [16, 19, 22]  1    432037  ultralytics.nn.modules.head.Detect           [7, [64, 128, 256]]           
YOLO11_Aquarium summary: 319 layers, 2,591,205 parameters, 2,591,189 gradients, 6.4 GFLOPs

Freezing layer 'model.23.dfl.conv.weight'
AMP: running Automatic Mixed Precision (AMP) checks...
AMP: checks passed ✅
train: Scanning C:\Python\Yolo11\DatasetAquariumYolo11\labels\train... 448 images, 1 backgrounds, 0 corrupt: 100%|██████████| 448/448 [00:00<00:00, 854.23it/s]
train: New cache created: C:\Python\Yolo11\DatasetAquariumYolo11\labels\train.cache
val: Scanning C:\Python\Yolo11\DatasetAquariumYolo11\labels\valid... 127 images, 0 backgrounds, 0 corrupt: 100%|██████████| 127/127 [00:00<00:00, 624.66it/s]
val: New cache created: C:\Python\Yolo11\DatasetAquariumYolo11\labels\valid.cache
Plotting labels to runs\detect\train2\labels.jpg... 
optimizer: SGD(lr=0.01, momentum=0.937) with parameter groups 81 weight(decay=0.0), 88 weight(decay=0.0005), 87 bias(decay=0.0)
Image sizes 640 train, 640 val
Using 4 dataloader workers
Logging results to runs\detect\train2
Starting training for 100 epochs...

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      1/100      2.84G      4.108      4.872      4.239        170        640: 100%|██████████| 28/28 [00:04<00:00,  5.62it/s]
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 4/4 [00:00<00:00,  4.48it/s]
                   all        127        909   0.000205     0.0177   0.000108   2.57e-05
  0%|          | 0/28 [00:00<?, ?it/s]

...

100 epochs completed in 0.137 hours.
Optimizer stripped from runs\detect\train5\weights\last.pt, 5.5MB
Optimizer stripped from runs\detect\train5\weights\best.pt, 5.5MB

Validating runs\detect\train5\weights\best.pt...
Ultralytics 8.3.57 🚀 Python-3.8.20 torch-2.4.1+cu121 CUDA:0 (NVIDIA GeForce RTX 3060, 12288MiB)
YOLO11_Aquarium summary (fused): 238 layers, 2,583,517 parameters, 0 gradients, 6.3 GFLOPs
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 4/4 [00:01<00:00,  3.17it/s]
                   all        127        909      0.805       0.72      0.767      0.459
                  fish         63        459      0.813      0.749      0.811      0.448
             jellyfish          9        155      0.838      0.903      0.925      0.509
               penguin         17        104      0.703      0.702      0.735      0.309
                puffin         15         74      0.692      0.516       0.56      0.289
                 shark         28         57      0.717      0.684      0.687      0.458
              starfish         17         27      0.945      0.639      0.774      0.549
              stingray         23         33      0.924      0.848      0.875      0.648
Speed: 0.2ms preprocess, 2.6ms inference, 0.0ms loss, 1.2ms postprocess per image
Results saved to runs\detect\train

3.4 训练日志

训练日志的图表对于评估和理解模型的性能非常重要,可以帮助我们分析模型的优势和弱点。

  1. 训练完成后,训练的最优模型保存为文件: “./Projects/YOLO11_Aquarium/runs/detect/train/weights/best.py”。
- weights 文件夹
    - best.pt:损失值最小的模型文件
    - last.pt:训练到最后的模型文件
- args.yaml:模型训练的配置参数

在这里插入图片描述

  1. 混淆矩阵
  • confusion_matrix.png 展示了分类模型的性能。图中的每一行代表模型预测的类别,每一列代表实际的类别。对角线上的数值表示模型正确预测的数量。对角线上较深的颜色表示该类别预测正确的数量较多。
  • confusion_matrix_normalized.png:标准化混淆矩阵,显示每个类别的预测正确比例。

在这里插入图片描述


  1. F1-置信度曲线
  • F1_curve.png:F1-置信度曲线,显示了F1得分随着置信度阈值的变化。
    F1得分是精确度和召回率的调和平均值,曲线的峰值表示给定置信度阈值下精确度和召回率的最佳平衡点。

在这里插入图片描述

  1. 标签分布图和标签相关图
  • labels.jpg:标签分布图和边界框分布图。
    柱状图显示了不同类别的实例分布数量。散点图则展示了目标检测任务中边界框的空间分布情况,反映了常见的尺寸和长宽比。
  • labels_correlogram.jpg:标签相关图
    相关图提供了不同类别标签之间的关系,以及它们在图像中位置的相关性。这有助于理解模型在识别不同类别时可能出现的关联或混淆。
  1. P/PR/R 曲线
  • P_curve.png:精确度-置信度曲线,展示了模型预测的精确度随着置信度阈值的变化。
    精确度是模型预测正确正例与预测为正例总数的比值。
  • PR_curve.png:精确度-召回曲线,展示了模型的精确度与召回率之间的关系。
    理想情况下,模型应在精确度和召回率之间保持良好的平衡。
  • R_curve.png:召回-置信度曲线,显示了模型的召回率随置信度阈值的变化。
    召回率是模型正确预测的正例与实际正例总数的比值。

在这里插入图片描述


  1. 训练结果图表和数据
  • results.png 和 results.csv:训练结果图表和数据
    展示了模型在训练过程中的性能变化,包括损失函数的变化和评估指标(如精确度、召回率和mAP)的变化。

在这里插入图片描述


3.5 断点训练

YOLO11 提供了参数 “resume” 进行断点训练。

对于大型数据集,使用 YOLO11 进行模型训练所需的时间很长,如果训练中断或者出现异常,可以接着从上一次中断时的模型继续训练。

  1. 将 “resume” 参数修改为 “True”,则会加载上一次训练的模型权重和优化器状态,继续从断点开始训练。

  2. 加载预训练模型权重文件时,使用上次中断的模型或最后一次训练的权重(last.pt)。

from ultralytics import YOLO

if __name__ == '__main__':
    # 创建 YOLO 模型对象,加载指定的模型配置
    model = YOLO(model=r'yolo11_Aquarium.yaml')
    # 加载预训练的权重文件,加速训练并提升模型性能
    model.load("\runs\detect\train\weights\last.pt")
    # 用指定数据集训练模型
    model.train(data=r'dataAquariumYolo11.yaml',  # 指定训练数据集的配置文件路径
               cache=False,  # 是否缓存数据集以加快后续训练速度
               imgsz=640,  # 指定训练时使用的图像尺寸
               epochs=100,  # 设置训练的总轮数为100轮
               batch=16,  # 设置每个训练批次的大小为16
               close_mosaic=10,  # 设置在训练的最后 10 轮中关闭 Mosaic 数据增强
               workers=4,  # 设置用于数据加载的线程数为4
               device='0',  # 运行设备, 指定使用的 CPU/GPU 设备
               optimizer='SGD'  # 设置优化器为SGD(随机梯度下降)
               resume = 'True'  # 设置
               )

4. 模型验证与模型预测

4.1 模型验证

训练后验证。

  1. 将训练好的模型 best.pt 保存在项目的根目录,并将文件名改为 “yolo11nAquarium.pt”。
  2. 模型验证程序如下。
from ultralytics import YOLO

if __name__ == '__main__':
    # 读取模型,传入训练好的模型
    model = YOLO('yolo11nAquarium.pt')
    # 验证模型
    metrics = model.val()  # 无需参数,使用 best.pt中的配置文件
  1. 运行模型验证程序,结果保存在 “.\runs\detect\val” 文件夹。
C:\Python\miniconda3\envs\yolo11\python.exe C:\Python\Projects\YOLOv11_Aquarium\test01.py 
Ultralytics 8.3.57 🚀 Python-3.8.20 torch-2.4.1+cpu CPU (Intel Core(TM) i7-4790 3.60GHz)
YOLO11_Aquarium summary (fused): 238 layers, 2,583,517 parameters, 0 gradients, 6.3 GFLOPs
val: Scanning C:\Python\Projects\DatasetAquariumYolo11\labels\valid.cache... 127 images, 0 backgrounds, 0 corrupt: 100%|██████████| 127/127 [00:00<?, ?it/s]
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 8/8 [00:12<00:00,  1.51s/it]
                   all        127        909      0.568      0.441      0.469      0.216
                  fish         63        459      0.654      0.458      0.531      0.243
             jellyfish          9        155      0.595      0.748      0.766      0.379
               penguin         17        104      0.356      0.538      0.419      0.146
                puffin         15         74      0.541      0.175      0.234       0.08
                 shark         28         57      0.651      0.351      0.424      0.184
              starfish         17         27      0.584      0.333       0.38      0.243
              stingray         23         33      0.592      0.485      0.531      0.236
Speed: 1.3ms preprocess, 70.8ms inference, 0.0ms loss, 7.0ms postprocess per image
Results saved to runs\detect\val

在这里插入图片描述


4.2 模型预测

训练后验证。

  1. 将训练好的模型 best.pt 保存在项目的根目录,并改名为 “yolo11nAquarium.pt”。
  2. 模型预测程序如下。
    参数 source 可以是一个或多个图片文件,一个视频文件,也可以是一个文件夹,或视频采集设备。
from ultralytics import YOLO

if __name__ == '__main__':
    # 读取模型,传入训练好的模型
    model = YOLO('yolo11nAquarium.pt')
    outputs = model.predict(source="./datasets/Aquarium/images/val", save=True)  # treat predict as a Python generator
    for output in outputs:
        # each output here is a dict.
        # for detection
        print(output["det"])  # np.ndarray, (N, 6), xyxy, score, cls
  1. 运行模型预测程序,结果保存在 “.\runs\detect\predict” 文件夹。

>


5. 报错处理

5.1 路径配置报错:RuntimeError: Dataset ‘data.yaml’ error

raise RuntimeError(emojis(f"Dataset '{clean_url(self.args.data)}' error ❌ {e}")) from e
RuntimeError: Dataset 'dataAquariumYolo11.yaml' error  
Dataset 'dataAquariumYolo11.yaml' images not found , missing path 'C:\Python\PythonProjects\Yolo11\DatasetAquariumYolo11\images\valid'
Note dataset download directory is 'C:\Python\PythonProjects\Yolo11\datasets'. You can update this in 'C:\Users\David Huang\AppData\Roaming\Ultralytics\settings.json'

问题分析与解决方法:
这是由于路径配置错误或数据集结构不正确。需要用户检查YAML文件中的路径配置,并验证实际文件结构,确保程序在正确的位置寻找数据集。

具体地,以项目绝对路径 “C:\Python\Projects\YOLO11_Aquarium”、数据集绝对路径 “C:\Python\PythonProjects\Yolo11\DatasetAquariumYolo11” 为例,检查用户目录下 “AppData\Roaming\Ultralytics\settings.json” 中的下载目录设置,修改 “datasets_dir” 如下:

{
   ...
  "datasets_dir": "C:\\Python\\Projects\\YOLO11",
   ...
}

5.2 拉取 Arial.ttf 报错:Downloading https://ultralytics.com/assets/Arial.ttf to…

在 Downloading https://ultralytics.com/assets/Arial.ttf to /home/zelan/.config/Ultralytics/Arial.ttf…卡住并报错:“Remote Disconnected: Remote end closed connection without response”。

问题分析与解决方法:

进行训练时会自动下载 Arial.ttf 字体,可能由于网络原因无法下载或者下载很慢。可以预先下载 Arial.ttf 并保存到用户目录下 “AppData\Roaming\Ultralytics\Arial.ttf”。注意不是保存到当前的 YOLO11 项目的根目录下。

Arial.ttf 下载地址


5.3 虚拟内存不足报错:OSError: [WinError 1455]

Error loading “C:\Python\Anaconda\anaconda3\envs\torch1.8\lib\site-packages\torch\lib\cudnn_cnn_infer64_8.dll” or one of its dependencies

问题分析与解决方法:
dll 文件或其依赖项时出现了问题,原因是页面文件(即虚拟内存)的大小不足以完成操作。通过降低数据加载的线程数可以解决这个问题。

例如设置线程数 “workers” 为 1,减小每个训练批次的大小 “batch”:

               batch=4,  # 设置每个训练批次的大小为4
               close_mosaic=10,  # 设置在训练的最后 10 轮中关闭 Mosaic 数据增强
               workers=1,  # 设置用于数据加载的线程数为1

【本节完】


版权声明:
欢迎关注『跟我学YOLO』系列
转发必须注明原文链接:
【跟我学YOLO】(2)YOLO11 训练自己的模型
Copyright by youcans@qq.com 2025
Crated:2025-02


当前可获得的信息集中于YOLOv5至YOLOv8版本的训练方法以及相关细节,对于提到的YOLOv11,实际上并不存在这一特定版本[^1]。YOLO系列最新稳定版为YOLOv8,在此之前有广泛使用的YOLOv5等版本。 针对使用YOLO框架训练自定义数据集模型的一般流程可以基于现有资料进行概括: ### 使用YOLO训练自定义数据集 #### 创建项目结构 确保创建合理的文件夹结构来组织代码、配置文件和数据集。通常情况下,这包括但不限于`data`, `models`, 和`runs`这样的子目录。 #### 配置数据集 准备适用于YOLO的数据集意味着要按照指定格式整理图像及其对应的标签文件。每张图片应有一个同名(除了扩展名不同).txt结尾的标注文件,其中包含了目标的位置信息和其他属性。 #### 安装依赖库 为了能够顺利执行YOLO的相关操作,需先安装必要的Python包。可以通过pip工具完成对`ultralytics`以及其他可能需要的支持库的安装。 ```bash pip install ultralytics ``` #### 编写训练脚本 编写一个简单的Python脚本来加载预训练模型或初始化新的网络架构,并调用`.train()`接口启动训练过程。这里给出一段基于YOLOv8风格的例子作为参考: ```python from ultralytics import YOLO model = YOLO("path_to_your_model.yaml") # 或者 "path_to_pretrained_weights.pt" results = model.train( data="path/to/your/dataset.yaml", epochs=100, batch=16, imgsz=640, # 图像尺寸大小可以根据需求调整 ) ``` 上述代码片段展示了如何利用给定的数据集路径(`dataset.yaml`)来进行模型训练的过程,同时指定了迭代次数(epochs),批次大小(batch size)及其他超参数设置[^2]。 由于目前并没有关于YOLOv11的具体描述,建议关注官方文档或是社区资源获取最前沿的技术更新和发展动态。如果确实存在更高版本,则其基本使用模式预计会延续以往的设计理念和技术路线。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

youcans_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值