YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的约瑟夫-雷德蒙(Joseph Redmon)和阿里-法哈迪(Ali Farhadi)开发。YOLO于2015年推出,因其高速度和高精确度而迅速受到欢迎。

与传统的两阶段检测器(如R-CNN系列)不同,YOLO采用了一种端到端的单阶段方法,将检测视为一个回归问题,直接从全图像中同时推理边界框和类别概率。

YOLO因其高效和准确的特点,被广泛应用于多个领域,包括但不限于自动驾驶汽车、无人机视觉、安防监控系统以及医疗成像分析等。

网址导航:

安装

pytorch安装

在安装yolo之前,需要安装GPU版本的torch(除非没有显卡)

进入pytorch官网:Start Locally | PyTorch

若为CPU版本,则使用如下命令(直接在官网复制也可)直接安装即可

pip install torch torchvision torchaudio

若为GPU版本,首先输入如下命令查看本机的cuda版本:

nvidia-smi

图中可以得知,cuda版本为12.6

之后在pytorch官网选择对应版本的pytorch安装即可(如果高于里面所有的版本,可以选择相对低一点的版本安装),例如pytroch官网中,支持的cuda最高版本为12.4,而本机cuda版本为12.6,则可以安装cuda版本为12.4的pytorch

复制上面的命令即可(比较大,请耐心等待):

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124

在安装完毕后,执行以下代码检查是否成功安装GPU版本的pytorch

import torch

print(torch.cuda.is_available()) # 为True则成功安装GPU版本的pytorch

ultralytics-YOLO安装

接下来安装YOLO,使用如下命令安装YOLO:

pip install ultralytics

ultralytics是管理YOLO的团队,他们管理了大部分的YOLO版本,所以直接安装该库比较方便

安装完毕后,命令行使用yolo检查是否安装成功

Quick Start

为了快速认识YOLO,我们做两个例子

数据准备

使用如下网址下载数据集:

https://github.com/ultralytics/assets/releases/download/v0.0.0/coco8.zip

更新设置

我们可以自定义设置数据集、权重和运行记录路径

在运行时会根据该位置寻找对应的资料

from ultralytics import settings

settings.update({
    "datasets_dir": BaseProperty.datasets_path,
    "weights_dir": BaseProperty.weights_path,
    "runs_dir": BaseProperty.output_path,
})

若想恢复为默认设置,则可以这样:

settings.reset()

推理

执行如下代码推理,首先载入权重(进入ultralytics官方文档下载即可),然后执行推理:

from ultralytics import YOLO

model = YOLO("yolov11m.pt")
results = model.predict(FilePathUtils.path_joint_str(BaseProperty.datasets_path, "coco8", "images", "train", "000000000009.jpg"))

for result in results:
    print(result.boxes.data)
    result.show()  # uncomment to view each result image

训练

在datasets文件夹下放coco8.yaml和coco8数据集

image-kzuz.png

coco8.yaml中,将path这一项改成coco8。这里直接写datasets名字是因为,datasets的路径在上面的设置中指定了,系统会根据上面设置的路径去找到path中的coco8数据集

trainval的路径会在path的基础下寻找,假设为如下设置:

# 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: 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)

train的路径会为:$datasets_dir/coco8/images/train

val的路径会为:$datasets_dir/coco8/images/val

接下来调用如下代码执行训练:

from ultralytics import YOLO

model = YOLO("yolov11n.yaml").load("yolov11n.pt")
results = model.train(data="coco8.yaml", epochs=100, workers=0)
print(results)

注意:在windows平台中,workers要设置为0,如果不设置为0,则会报错(尚未找到解决的办法)。

任务

目前YOLO可使用如下几个任务

图像分类

图像分类是YOLO的一个基本任务,它用于识别图像中包含的对象类别。通过训练,YOLO模型能够对输入图像进行分类,并输出每个类别的概率。

目标检测

目标检测是YOLO的另一个重要任务,它不仅需要识别图像中的对象类别,还需要确定对象在图像中的具体位置。YOLO模型通过在图像中划分网格,并在每个网格单元中推理边界框和类别概率来实现这一任务。

实例分割

实例分割是目标检测的扩展,它不仅需要识别和定位图像中的对象,还需要为每个对象生成像素级别的分割遮罩。YOLO通过推理每个对象的边界框和物体遮罩来实现实例分割。

姿态检测

姿态检测是YOLO的一个高级任务,它用于识别和定位图像中人体的关键点,如关节和肢体位置。YOLO模型通过推理人体关键点的位置来实现这一任务。

OBB(Oriented Bounding Box)

OBB是目标检测的一个变种,它使用定向边界框来更准确地表示对象的形状。与传统的轴对齐边界框(AABB)相比,OBB能够更好地适应对象的实际方向和形状,从而提高检测的准确性。

支持的YOLO版本

YOLO的不同版本会支持不同的任务,也有一些版本是所有的任务都可以支持

支持以上所有任务的YOLO版本如下:

  1. YOLOV8

  2. YOLOV11

如果想查看某个特定的YOLO版本支持的任务,可以查看该版本的官方文档: https://docs.ultralytics.com/models/

以下教程皆以YOLOV11为例

全局设置

推理

官方文档: https://docs.ultralytics.com/modes/predict/

以下会对predict函数进行一系列详细的讲解

加载模型

在推理之前,需要加载模型

不同的模型支持不同的任务,在做对应的任务时,请使用对应的模型

YOLOV11不同任务支持的模型请查看对应官方文档:https://docs.ultralytics.com/models/yolo11/#supported-tasks-and-modes

下载对应任务的模型,使用下面的例子转载对应的模型:

from ultralytics import YOLO
​
model = YOLO("yolo11m.pt") # 加载目标追踪任务的模型
model = YOLO("yolo11m-seg.pt") # 加载实例分割任务的模型
model = YOLO("yolo11m-pose.pt") # 加载姿态检测任务的模型
model = YOLO("yolo11m-cls.pt") # 加载图像分类任务的模型
model = YOLO("yolo11m-obb.pt") # 加载OBB任务的模型
​
source = "image.png"
results = model.predict(source)

除此之外,如果有自己的自定义模型或者社区模型,也可以直接加载该模型进行推理:

from ultralytics import YOLO
​
model = YOLO("/path/to/model.pt") # 加载自定义模型
​
source = "image.png"
results = model.predict(source)

资源支持

官方文档: https://docs.ultralytics.com/modes/predict/#inference-sources

使用predict函数时, 它支持的资源不仅仅是图片。YOLO支持推理的资源包括:

数据源

示例

类型

备注

图像

'image.jpg'

str 或 Path

单个图像文件。

URL

'https://ultralytics.com/images/bus.jpg'

str

图像的URL。

截屏

'screen'

str

捕获屏幕截图。

PIL

Image.open('image.jpg')

PIL.Image

HWC格式,带有RGB通道。

OpenCV

cv2.imread('image.jpg')

np.ndarray

HWC格式,带有BGR通道,uint8 (0-255)。

numpy

np.zeros((640,1280,3))

np.ndarray

HWC格式,带有BGR通道,uint8 (0-255)。

torch

torch.zeros(16,3,320,640)

torch.Tensor

BCHW格式,带有RGB通道,float32 (0.0-1.0)。

CSV

'sources.csv'

str 或 Path

包含图像、视频或目录路径的CSV文件。

视频 ✅

'video.mp4'

str 或 Path

如MP4、AVI等格式的视频文件。

目录 ✅

'path/'

str 或 Path

包含图像或视频的目录路径。

glob ✅

'path/*.jpg'

str

匹配多个文件的glob模式。使用*字符作为通配符。

YouTube ✅

'https://youtu.be/LNwODJXcvt4'

str

YouTube视频的URL。

流 ✅

'rtsp://example.com/media.mp4'

str

如RTSP、RTMP、TCP或IP地址等流媒体协议的URL。

多流 ✅

'list.streams'

str 或 Path

每行一个流媒体URL的*.streams文本文件,即8个流将以批处理大小8运行。

网络摄像头 ✅

0

int

要运行推理的连接摄像头设备的索引。

✅ 表示该数据源支持在视频或实时流上运行推理(将参数stream设置为True)。

以视频为例:

from ultralytics import YOLO
​
# 加载预训练的YOLOV11n模型
model = YOLO("yolo11n.pt")
​
# 定义视频文件的路径
source = "path/to/video.mp4"
​
# 在源文件上进行推理
# results = model(source, stream=True)
results = model.predict(source, stream=True)

predict函数参数

官方文档: https://docs.ultralytics.com/modes/predict/#inference-arguments

predict函数的参数支持如下:

基础参数:

参数

类型

默认值

描述

source

str

'ultralytics/assets'

决定推理所用的数据来源,比如是一张图片、一个视频文件、一个文件夹、一个网址或者实时视频流。支持多种输入格式。

conf

float

0.25

设定一个置信度门槛,低于这个分数的检测将被忽略。调整这个值可以帮助减少错误的检测。

iou

float

0.7

用于非极大值抑制(NMS)的交并比(IoU)阈值,帮助合并重叠的检测框,避免重复检测。

imgsz

int 或 tuple

640

设置推理时图像的大小。可以是640这样的整数(表示方形图像),或者是一个指定高度和宽度的元组。

half

bool

False

是否使用半精度(FP16)进行推理,可以在某些GPU上加速处理,且对结果准确度影响不大。

device

str

None

指定运行推理的设备,比如CPU、某个特定的GPU或其他计算设备。

max_det

int

300

限制每张图像可以检测到的最大对象数量,避免在很拥挤的场景中输出过多的检测结果。

vid_stride

int

1

对于视频输入,决定每隔多少帧处理一次。设置为1表示每帧都处理,设置更高的值可以加快处理速度,但会牺牲一些连贯性。

stream_buffer

bool

False

是否缓冲视频流中的帧。如果关闭缓冲,旧帧会被新帧替换,适合实时应用。如果开启,可以确保所有帧都被处理,但可能会有延迟。

visualize

bool

False

是否在推理过程中显示模型的内部特征,有助于理解和调试模型。

augment

bool

False

是否在测试时对图像进行数据增强,可以提高检测的鲁棒性,但会增加计算时间。

agnostic_nms

bool

False

是否进行类无关的非极大值抑制,即在执行NMS时忽略类别差异,适用于多个类别之间有大量重叠的情况。

classes

list[int]

None

指定只检测特定类别的对象,其他类别的检测结果会被忽略。在多类检测任务中很有用。

retina_masks

bool

False

如果模型支持,是否使用高分辨率的分割遮罩,这能提供更精细的分割结果。

embed

list[int]

None

指定从模型的哪些层提取特征向量,这通常用于后续的特征聚类或相似度分析。

project

str

None

设置保存推理结果的项目文件夹名称。

name

str

None

设置推理任务的名称,便于在项目文件夹中组织和管理推理输出。

针对可视化(保存的图片等等)的参数:

参数

类型

默认值

描述

show

bool

False

如果开启,会在窗口中展示带有标注的图片或视频,方便你在开发和测试时看到实时的视觉效果。

save

bool

False 或 True

是否保存标注后的图片或视频。这对于记录结果、进一步分析或与他人分享都很有用。在命令行界面默认开启,在Python中默认关闭。

save_frames

bool

False

如果在处理视频时开启这个选项,会将每一帧都保存为图片。这对于需要详细分析每一帧或提取特定帧的场景很有帮助。

save_txt

bool

False

是否将检测的结果保存成文本文件,格式是 [class] [x_center] [y_center] [width] [height] [confidence]。这对于后续的分析或其他工具的集成很有用。

save_conf

bool

False

是否在保存的文本文件中包含每个检测的置信度分数,这可以提供更多的信息用于后处理和分析。

save_crop

bool

False

是否保存检测对象的裁剪图像,这对于创建专门的数据集、数据增强或深入分析特定对象很有用。

show_labels

bool

True

是否在图像或视频的视觉输出中显示每个检测对象的标签,这能让你快速了解检测到的是什么。

show_conf

bool

True

是否在检测对象的标签旁边显示置信度分数,这能提供有关模型对每个检测结果的确信度信息。

show_boxes

bool

True

是否在检测到的对象周围绘制边界框,这对于识别和定位图像或视频中的对象至关重要。

line_width

None 或 int

None

设置边界框线条的宽度。如果设置为空,线条宽度会根据图像大小自动调整,这让你可以自定义视觉效果以增强可读性。

例子:

from ultralytics import YOLO
​
# 加载预训练的YOLOV11n模型
model = YOLO("yolo11n.pt")
​
# 在源文件上进行推理,并指定一些特定的参数
model.predict("bus.jpg", save=True, imgsz=320, conf=0.5)

Results对象

官方文档: https://docs.ultralytics.com/modes/predict/#working-with-results

推理完毕后, YOLO会返回一个Results对象, 这个对象包含了推理结果

Results对象具有如下属性:

属性

类型

描述

orig_img

numpy.ndarray

作为numpy数组的原始图像。

orig_shape

tuple

原始图像的形状,格式为 (height, width)。

boxes

Boxes, 可选

包含检测边界框的Boxes对象(适用于物体检测)。如果模型不支持该功能则返回None。

masks

Masks, 可选

包含检测物体遮罩的Masks对象(适用于实例分割)。如果模型不支持该功能则返回None。

probs

Probs, 可选

包含检测物体的类别和类别置信度的Probs对象(适用于图像分类)。如果模型不支持该功能则返回None。

keypoints

Keypoints, 可选

包含检测物体关节的Keypoints对象(适用于姿态检测)。如果模型不支持该功能则返回None。

obb

OBB, 可选

包含检测物体方向边界框的OBB对象(适用于OBB)。如果模型不支持该功能则返回None。

speed

dict

包含图像预处理、推理和后处理速度的字典,单位为每张图像的毫秒数。

names

dict

图像中类别名称的字典(通常在物体做追踪的时候, 返回的是0或者1这样的类别标识, 可以通过该属性找对标识对应的具体分类)。

path

str

图像文件的路径。

例子如下:

from ultralytics import YOLO
​
model = YOLO("yolo11n.pt")
model.predict("bus.jpg", save=True, imgsz=320, conf=0.5)
​
for result in results:
    boxes = result.boxes  # 保存图像边界框信息的Boxes对象
    masks = result.masks  # 保存物体遮罩信息的Masks对象
    keypoints = result.keypoints  # 保存姿态检测信息的Keypoints对象
    probs = result.probs  # 保存图像分类信息的Probs对象
    obb = result.obb  # 保存定向边界框信息的Oriented boxes对象
    result.show()  # 展示推理的结果

除了show()方法, result对象也支持如下方法对推理结果进行处理:

方法

返回类型

描述

update()

更新 Results 对象的 boxes、masks 和 probs 属性。

cpu()

Results

返回一个所有张量都在 CPU 内存上的 Results 对象副本。

numpy()

Results

返回一个所有张量都是 numpy 数组的 Results 对象副本。

cuda()

Results

返回一个所有张量都在 GPU 内存上的 Results 对象副本。

to()

Results

返回一个在指定设备和 dtype 上的张量的 Results 对象副本。

new()

Results

返回一个新的 Results 对象,具有相同的图像、路径和名称。

plot()

numpy.ndarray

绘制检测结果。返回带有注释的图像的 numpy 数组。

show()

在屏幕上显示带有注释的结果。

save()

将带有注释的结果保存到文件。

verbose()

str

返回每个任务的日志字符串。

save_txt()

将推理结果保存到 txt 文件中。

save_crop()

将裁剪的推理结果保存到 save_dir/cls/file_name.jpg。

tojson()

str

将对象转换为 JSON 格式。

训练

train函数

想要训练属于自己的YOLO模型,我们可以使用train函数进行训练,例子如下:

from ultralytics import YOLO, settings

settings.update({
    "datasets_dir": BaseProperty.datasets_path,
    "weights_dir": BaseProperty.weights_path,
    "runs_dir": BaseProperty.output_path,
})

model = YOLO("yolov11m.yaml").load("yolov11m.pt")
results = model.train(data="coco8.yaml", epochs=5, workers=0) # 在windows平台中,workers要设置为0,如果不设置为0,则会报错
print(results)

settings.reset()

这里train设置了数据集配置文件coco8.yaml,并且设置了5个epoch

train函数更多的设置如下(官方文档:https://docs.ultralytics.com/modes/train/#train-settings):

参数

默认值

描述

model

None

指定用于训练的模型文件。接受预训练模型(.pt 文件)或配置文件(.yaml 文件)的路径。用于定义模型结构或初始化权重。

data

None

指定数据集配置文件的路径(例如 coco8.yaml)。该文件包含数据集的具体参数,包括训练和验证数据的路径、类别名称和类别数量。

epochs

100

总训练轮数。每个轮次代表对整个数据集的一次完整遍历。调整此值会影响训练时间和模型性能。

time

None

最大训练时间(小时)。如果设置,将覆盖 epochs 参数,允许训练在指定时间后自动停止。适用于时间受限的训练场景。

patience

100

在验证指标没有改进的情况下等待的轮次数,用于提前停止训练。有助于防止过拟合,当性能停滞时停止训练。

batch

16

批次大小,有三种模式:设置为整数(例如 batch=16)、自动模式以利用 60% 的 GPU 内存(batch=-1),或指定内存利用率的自动模式(batch=0.70)。

imgsz

640

训练的目标图像尺寸。所有图像在输入模型前都会调整到此尺寸。影响模型精度和计算复杂度。

save

True

启用保存训练检查点和最终模型权重。有助于恢复训练或模型部署。

save_period

-1

保存模型检查点的频率,以轮次为单位。值为 -1 表示禁用此功能。适用于在长时间训练过程中保存中间模型。

cache

False

启用数据集图像的缓存,可以在内存中(True/ram)、磁盘上(disk)或禁用(False)。通过减少磁盘 I/O 提高训练速度,但会增加内存使用。

device

None

指定用于训练的计算设备:单个 GPU(device=0)、多个 GPU(device=0,1)、CPU(device=cpu)或 Apple 芯片的 MPS(device=mps)。

workers

8

数据加载的线程数(多 GPU 训练时每个 RANK)。影响数据预处理和输入模型的速度,特别适用于多 GPU 设置。

project

None

保存训练输出的项目目录名称。允许组织存储不同的实验。

name

None

训练运行的名称。用于在项目文件夹内创建子目录,其中存储训练日志和输出。

exist_ok

False

如果为 True,允许覆盖现有的项目/名称目录。适用于迭代实验,无需手动清除之前的输出。

pretrained

True

确定是否从预训练模型开始训练。可以是布尔值或特定模型的路径(从该模型加载权重)。增强训练效率和模型性能。

optimizer

'auto'

选择优化器。选项包括 SGD、Adam、AdamW、NAdam、RAdam、RMSProp 等,或自动选择(auto),基于模型配置自动选择。影响收敛速度和稳定性。

verbose

False

启用详细的训练输出,提供详细的日志和进度更新。适用于调试和密切监控训练过程。

seed

0

设置训练的随机种子,确保相同配置下多次运行的结果可重现。

deterministic

True

强制使用确定性算法,确保结果可重现,但可能因非确定性算法的限制而影响性能和速度。

single_cls

False

将多类数据集中的所有类视为单个类进行训练。适用于二分类任务或关注对象存在而非分类的情况。

rect

False

启用矩形训练,优化批次组成以最小化填充。可以提高效率和速度,但可能影响模型精度。

cos_lr

False

使用余弦学习率调度器,按照余弦曲线调整学习率。有助于管理学习率以实现更好的收敛。

close_mosaic

10

在最后 N 个轮次中禁用马赛克数据增强,以在训练结束前稳定训练。设置为 0 禁用此功能。

resume

False

从最后一个保存的检查点恢复训练。自动加载模型权重、优化器状态和轮次计数,无缝继续训练。

amp

True

启用自动混合精度(AMP)训练,减少内存使用并可能加快训练速度,对精度影响较小。

fraction

1.0

指定用于训练的数据集部分。允许在数据集的子集上进行训练,适用于实验或资源受限的情况。

profile

False

启用训练期间的 ONNX 和 TensorRT 速度分析,有助于优化模型部署。

freeze

None

冻结模型的前 N 层或指定层,减少可训练参数。适用于微调或迁移学习。

lr0

0.01

初始学习率(例如 SGD=1E-2, Adam=1E-3)。调整此值对优化过程至关重要,影响模型权重的更新速度。

lrf

0.01

最终学习率,作为初始学习率的分数(lr0 * lrf),与调度器结合使用以随时间调整学习率。

momentum

0.937

动量因子,对于 SGD 优化器或 Adam 优化器的 beta1,影响过去梯度在当前更新中的融合。

weight_decay

0.0005

L2 正则化项,惩罚大权重以防止过拟合。

warmup_epochs

3.0

学习率预热的轮次数,逐渐将学习率从低值增加到初始学习率,以在训练早期稳定训练。

warmup_momentum

0.8

预热阶段的初始动量,逐渐调整到设定的动量。

warmup_bias_lr

0.1

预热阶段的偏置参数学习率,有助于在初始轮次中稳定模型训练。

box

7.5

损失函数中边界框损失的权重,影响对准确预测边界框坐标的重视程度。

cls

0.5

损失函数中分类损失的权重,影响正确分类相对于其他组件的重要性。

dfl

1.5

分布焦点损失的权重,某些 YOLO 版本中用于细粒度分类。

pose

12.0

用于姿态估计模型的姿态损失的权重,影响对准确预测姿态关键点的重视程度。

kobj

2.0

用于姿态估计模型的关键点对象性损失的权重,平衡检测置信度与姿态准确性。

label_smoothing

0.0

应用标签平滑,将硬标签软化为目标标签和均匀分布标签的混合,可以提高泛化能力。

nbs

64

损失归一化的名义批次大小。

overlap_mask

True

确定分割掩码在训练期间是否重叠,适用于实例分割任务。

mask_ratio

4

分割掩码的降采样比例,影响训练期间使用的掩码分辨率。

dropout

0.0

分类任务中的 dropout 率,通过随机省略单元进行正则化,防止过拟合。

val

True

启用验证,在训练期间定期评估模型在独立数据集上的性能。

plots

False

生成并保存训练和验证指标的图表以及预测示例,提供模型性能和学习进展的可视化洞察。

模型结构

YOLO在训练前,需要加载模型结构,通常这些模型结构都存放在$python_path$/Lib/site-packages/ultralytics/cfg/models 中,打开YOLOV11的模型结构文件夹(通常带有11或者V11的字样):

这些yaml保存了模型结构,以yolo11.yaml为例:

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLO11 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect

# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolo11n.yaml' will call yolo11.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.50, 0.25, 1024] # summary: 319 layers, 2624080 parameters, 2624064 gradients, 6.6 GFLOPs
  s: [0.50, 0.50, 1024] # summary: 319 layers, 9458752 parameters, 9458736 gradients, 21.7 GFLOPs
  m: [0.50, 1.00, 512] # summary: 409 layers, 20114688 parameters, 20114672 gradients, 68.5 GFLOPs
  l: [1.00, 1.00, 512] # summary: 631 layers, 25372160 parameters, 25372144 gradients, 87.6 GFLOPs
  x: [1.00, 1.50, 512] # summary: 631 layers, 56966176 parameters, 56966160 gradients, 196.0 GFLOPs

# YOLO11n backbone
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
  - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
  - [-1, 2, C3k2, [256, False, 0.25]]
  - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
  - [-1, 2, C3k2, [512, False, 0.25]]
  - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
  - [-1, 2, C3k2, [512, True]]
  - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
  - [-1, 2, C3k2, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]] # 9
  - [-1, 2, C2PSA, [1024]] # 10

# YOLO11n head
head:
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 6], 1, Concat, [1]] # cat backbone P4
  - [-1, 2, C3k2, [512, False]] # 13

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 4], 1, Concat, [1]] # cat backbone P3
  - [-1, 2, C3k2, [256, False]] # 16 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 13], 1, Concat, [1]] # cat head P4
  - [-1, 2, C3k2, [512, False]] # 19 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 10], 1, Concat, [1]] # cat head P5
  - [-1, 2, C3k2, [1024, True]] # 22 (P5/32-large)

  - [[16, 19, 22], 1, Detect, [nc]] # Detect(P3, P4, P5)

配置文件中定义了类别的数量(ncnumber of classes)、模型规模(scales)、主干网络(backbone)以及头部网络(head

模型规模中指定了模型的规模和复杂度(深度、宽度以及最大通道数),每个规模所对应的神经网络隐藏层的数量、参数数量、梯度数量以及GFLOPs值(GFLOPs表示每秒可以执行的十亿次浮点运算,用来评估深度学习模型的计算复杂度。模型的 GFLOPs 值越高,通常意味着模型的计算需求越大,对硬件的要求也越高)可以在注释中看到,这些不同规模的模型在性能和计算复杂度之间提供了不同的平衡

在实际训练加载模型结构时,调用model=yolo11m.yaml就会调用yolo11.yaml 文件中的规模m

Head是模型的头部部分,负责基于Backbone提取的特征图进行具体的任务,如目标检测、分类、回归等。在 YOLO 中,Head 主要负责生成边界框和类别预测。Backbone则是模型的主干部分,负责从输入图像中提取特征。它的主要功能是生成高质量的特征图,这些特征图会被后续的Head部分用于进一步的处理。

from ultralytics import YOLO, settings

settings.update({
    "datasets_dir": BaseProperty.datasets_path,
    "weights_dir": BaseProperty.weights_path,
    "runs_dir": BaseProperty.output_path,
})

# 加载模型
model = YOLO("yolo11m.yaml")
model = YOLO("yolo11m.yaml").load("yolo11m.pt")

# 开始训练
results = model.train(data="coco8.yaml", epochs=100, imgsz=640)

加载模型结构时有两种方法,一种是只加载模型结构,就是model = YOLO("yolo11m.yaml") ,这样就可以训练一个全新的模型(注意,从头训练一个复杂的模型需要大量的时间和计算资源)。

另外一种是模型结构后,将现有的预训练的权重加载到模型结构中,就是model = YOLO("yolo11m.yaml").load("yolo11m.pt")。如果想使用自己的模型结构,并且想节省计算资源的情况下得到一个比较好的性能的模型,这个方法是一个不错的选择

预训练模型

预训练模型在深度学习中非常常见,预训练模型通常是在大规模数据集上训练得到的,这些模型已经学到了一些通用的特征表示,可以在许多任务中复用。使用预训练模型可以显著减少训练时间和计算资源,同时提高模型的性能。

我们进入网址(https://docs.ultralytics.com/models/yolo11/#supported-tasks-and-modes)下载的xxxxx.pt,即是官方训练好的预训练模型,里面保存了在ImageNet等大型数据集上面训练好的权重。

微调

微调(Fine-Tuning)通过在预训练模型的基础上进行少量的训练,使其适应新的任务或数据集。微调可以显著提高模型在新任务上的性能,同时减少训练时间和计算资源。

如果不使用微调技术,从零开始训练一个复杂的模型(如 YOLO),通常需要大量的标注数据。具体来说:

  • 目标检测任务:通常需要数千到数万张标注图像。例如,COCO 数据集包含超过 11 万个图像,每个图像平均有 5 个标注对象。

  • 分类任务:对于简单的分类任务,可能需要几百到几千张图像。但对于复杂的多类别分类任务,可能需要数万张图像。

  • 分割任务:分割任务通常需要更多的标注数据,因为每个像素都需要标注。通常需要数千张高质量的标注图像。

使用预训练模型进行微调可以显著减少所需的数据量,因为预训练模型已经在大规模数据集上学习到了丰富的特征表示。具体来说:

  • 目标检测任务:通常需要几百到几千张标注图像。对于一些简单的任务,甚至几十张图像也可能足够。

  • 分类任务:对于简单的分类任务,可能只需要几十到几百张图像。对于复杂的多类别分类任务,可能需要几百到几千张图像。

  • 分割任务:虽然分割任务仍然需要较多的标注数据,但通常几百到几千张图像就足以达到较好的性能。

from ultralytics import YOLO, settings

settings.update({
    "datasets_dir": BaseProperty.datasets_path,
    "weights_dir": BaseProperty.weights_path,
    "runs_dir": BaseProperty.output_path,
})

# 加载模型
model = YOLO("yolo11m.pt")
model = YOLO("/path/to/model.pt")
model = YOLO("yolo11m.yaml").load("yolo11m.pt")

# 开始训练
results = model.train(data="coco8.yaml", epochs=100, imgsz=640)

模型微调有几种方式,一种是直接加载预训练模型,即是model = YOLO("yolo11m.pt") ,或者加载自己的模型model = YOLO("/path/to/model.pt") ,后面直接训练,这样就可以达到微调的效果

也可以将现有的预训练的权重加载到模型结构中,后面直接训练即可,这个方法上面有介绍,这里不再阐述

文章作者: Vsoapmac
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 soap的会员制餐厅
人工智能 第三方库 个人分享
喜欢就支持一下吧