yolo ultralytics之yolov8.yaml文件简介
核心概念
YOLOv8 的 .yaml
文件是一个模型结构定义文件。它不包含训练参数(如学习率、优化器),而是精确地描述了神经网络每一层的类型、参数以及层与层之间的连接方式。
你可以把它看作是一张乐高模型的搭建说明书,指明了:
需要哪些积木(层的类型,如
Conv
,C2f
,SPPF
)。积木的属性(层的参数,如输入/输出通道数、卷积核大小)。
积木的拼接顺序(从输入到输出的流水线)。
如何组装(哪一层的输出应该作为哪一层的输入)。
文件结构详解
一个典型的 yolov8n.yaml
文件包含以下三个主要部分:
1. 基础参数 (nc
, scales
, depth_multiple
, width_multiple
)
yaml
# Ultralytics YOLO 🚀, AGPL-3.0 license # YOLOv8n object detection model with 80 classes. For usage examples see https://docs.ultralytics.com/tasks/detect# Parameters nc: 80 # number of classes (类别数,COCO数据集是80类) scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8n.yaml with scale 'n'# [depth, width, max_channels] 深度、宽度、最大通道数的缩放系数n: [0.33, 0.25, 1024] # YOLOv8n: 深度缩放0.33,宽度缩放0.25s: [0.33, 0.50, 1024] # YOLOv8s: (small)m: [0.67, 0.75, 1024] # YOLOv8m: (medium)l: [1.00, 1.00, 1024] # YOLOv8l: (large)x: [1.00, 1.25, 1024] # YOLOv8x: (extra large)# YOLOv8.0n backbone backbone:# [from, number, module, args]... # YOLOv8.0n head head:...
nc
: 模型需要检测的类别数量。scales
: 模型缩放系数,这是 YOLOv8 的一个关键设计。depth_multiple
(深度缩放):控制模块的重复次数(如C2f
中的n
)。n: 0.33
意味着所有模块的基准重复次数会乘以 0.33。width_multiple
(宽度缩放):控制模块的通道数(如Conv
中的c2
)。n: 0.25
意味着所有模块的基准通道数会乘以 0.25。max_channels
: 限制所有层的最大通道数,防止宽度缩放得太大。
backbone
: 主干网络定义,负责从输入图像中提取多层次的特征图。head
: 检测头定义,负责从主干网络提取的特征图中进行目标定位和分类。
2. 主干网络 (backbone
)
主干网络通常由卷积层、C2f 模块和下采样层组成。
yaml
backbone:# [from, number, module, args]- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2 (第0层,输出为P1/2分辨率)- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4- [-1, 3, C2f, [128, True]]- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8- [-1, 6, C2f, [256, True]]- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16- [-1, 6, C2f, [512, True]]- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32- [-1, 3, C2f, [1024, True]]- [-1, 1, SPPF, [1024, 5]] # 9
每一行的格式 [from, number, module, args]
:
from
: 输入来源。-1
表示来自上一层的输出。2
表示来自第 2 层的输出(层数从 0 开始)。
number
: 该模块的重复次数(会与depth_multiple
相乘得到实际次数)。module
: 模块的类型(如Conv
,C2f
,SPPF
)。这些模块在ultralytics/nn/modules.py
中定义。args
: 传递给模块构造函数的参数列表。对于
Conv
:[ch_out, kernel_size, stride, ...]
对于
C2f
:[ch_out, shortcut]
对于
SPPF
:[ch_out, kernel_size]
关键模块:
Conv
: 标准的卷积 + BN + SiLU
模块。C2f
: YOLOv8 的核心模块,是C3
模块的升级版,设计更高效。它包含了丰富的梯度流和跨层连接(类似残差结构)。SPPF
: 空间金字塔池化快速版,将不同尺度的特征进行融合,极大地增加了感受野,对检测不同大小的物体非常有效。
特征金字塔:
注意注释中的 P1/2
, P2/4
, P3/8
, P4/16
, P5/32
。这表示主干网络在不同深度输出了5种不同尺度的特征图(P1最大,P5最小),它们构成了特征金字塔,用于检测不同大小的物体。
3. 检测头 (head
)
检测头接收主干网络输出的多尺度特征图,并最终输出检测结果。
yaml
head:- [-1, 1, nn.Upsample, [None, 2, 'nearest']] # 上采样- [[-1, 6], 1, Concat, [1]] # cat backbone P4 (拼接)- [-1, 3, C2f, [512]] # 12- [-1, 1, nn.Upsample, [None, 2, 'nearest']]- [[-1, 4], 1, Concat, [1]] # cat backbone P3- [-1, 3, C2f, [256]] # 15 (P3/8-small)- [-1, 1, Conv, [256, 3, 2]]- [[-1, 12], 1, Concat, [1]] # cat head P4- [-1, 3, C2f, [512]] # 18 (P4/16-medium)- [-1, 1, Conv, [512, 3, 2]]- [[-1, 9], 1, Concat, [1]] # cat head P5- [-1, 3, C2f, [1024]] # 21 (P5/32-large)- [[15, 18, 21], 1, Detect, [nc]] # Detect(P3, P4, P5) (检测层)
关键操作:
Upsample
+Concat
: 这是 FPN (Feature Pyramid Network) 结构的体现。通过上采样将深层的小特征图放大,然后与浅层的大特征图进行拼接,融合了高层的语义信息和底层的细节信息。Detect
: 检测层,是最终的输出层。它接收来自P3
,P4
,P5
三个尺度的特征图。在每个尺度上,它都会应用卷积来预测:边界框(xywh)、置信度(objectness)、分类分数(class scores)。
例如,对于 COCO 80 类,
P3/8
尺度的输出维度为(batch_size, 4+1+80, height, width)
。
总结:YOLOv8 架构的核心思想
模块化设计:通过
.yaml
文件清晰定义,易于修改和扩展。复合缩放:通过
scales
参数轻松缩放模型大小(n, s, m, l, x),在速度和精度间取得平衡。现代化的主干:使用
C2f
和SPPF
等高效模块,提升特征提取能力。PAFPN 风格颈部:使用上采样和拼接操作,有效地融合了来自主干网络的多尺度特征。
解耦头:YOLOv8 的
Detect
层将分类和回归任务在一定程度上分离,提升了检测性能。
总而言之,yolov8.yaml
文件是 YOLOv8 模型的蓝图。 Ultralytics 的框架会读取这个文件,根据其中的指令动态地构建出对应的 PyTorch 模型。这种设计将模型结构与代码完全分离,使得研究和实验变得非常灵活。