Part 2 Ultralytics 模型定义
约 791 字大约 3 分钟
2025-08-07
1 Ultralytics 简介
Ultralytics 是一个开源的深度学习框架,旨在简化训练、评估和部署视觉模型的过程。该框架提供了一系列流行的视觉模型,包括YOLOv5、YOLOv8、YOLOv11等,并提供了训练、评估和推理的工具和实用程序。
你可以在 Ultralytics 仓库中找到源代码。
我们主要关注仓库下的 ultralytics
文件夹,这里是框架的主要实现部分。
ultralytics
assets
…
cfg提供了全部模型的配置文件
datasets
…
modelsYOLO 系列模型定义在这里
…
trackers
…
...
data提供 DataLoader
…
engine
…
hub
…
models
…
nn提供神经网络主要组件
modules
activation.py
block.py
conv.py
head.py
transformer.py
utils.py
...
solutions
…
trackers
…
utils
…
2 YOLOv8 模型定义
在 Ultralytics 框架中,模型并不是硬编码在 Python 文件中,而是使用 YAML 文件进行配置。
YOLOv8 的配置存储在 ultralytics/cfg/models/v8/yolov8.yaml
中。
2.1 nc
nc: 80
其中nc
属性定义了类别数量为 80。
2.2 scales
scales:
n: [0.33, 0.25, 1024]
s: [0.33, 0.50, 1024]
m: [0.67, 0.75, 768]
l: [1.00, 1.00, 512]
x: [1.00, 1.25, 512]
scales
属性定义了不同尺寸型号的参数,这和我们在结构图中看到的一致。每个型号的参数以数组[depth, width, max_channels]
的形式存储。
2.3 backbone
backbone:
- [-1, 1, Conv, [64, 3, 2]]
- [-1, 1, Conv, [128, 3, 2]]
- [-1, 3, C2f, [128, True]]
- [-1, 1, Conv, [256, 3, 2]]
- [-1, 6, C2f, [256, True]]
- [-1, 1, Conv, [512, 3, 2]]
- [-1, 6, C2f, [512, True]]
- [-1, 1, Conv, [1024, 3, 2]]
- [-1, 3, C2f, [1024, True]]
- [-1, 1, SPPF, [1024, 5]]
这部分是最重要的部分之一,定义了 YOLOv8 骨干网络,网络中每一层都以数组[from, repeats, module, args]
的形式存储。
from
规定该层输入数据由何处传递而来,-1
表示上一层;
repeat
表示该层的网络组件重复多少次,需要乘以scales
配置部分的depth
系数。以 YOLOv8s 为例,depth
为 0.33,第 5 层的repeat
为 6,因此 YOLOv8s 第 5 层C2f
模块重复次数为 2 次。
module
为类名,表示使用何种组件。
args
为初始化时的参数。对于Conv
组件,参数为[out_channels_number, kernel_size, stride]
;对于C2f
组件,参数为[out_channels_number, shortcut]
;对于SPPF
组件,参数为[out_channels_number, kernel_size]
。
2.4 head
head:
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 6], 1, Concat, [1]]
- [-1, 3, C2f, [512]]
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 4], 1, Concat, [1]]
- [-1, 3, C2f, [256]]
- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 12], 1, Concat, [1]]
- [-1, 3, C2f, [512]]
- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 9], 1, Concat, [1]]
- [-1, 3, C2f, [1024]]
- [[15, 18, 21], 1, Detect, [nc]]
这部分定义了 YOLOv8 的 Head 部分。同样是以数组[from, repeats, module, args]
的形式存储每一层的配置。
from
定义为数组时,表示该层的数据同时来源于两层。如[-1, 4]
代表该层数据来源于上一层和第 4 层。
repeat
相同。
module
中,写明nn
类名的模块来自于 PyTorch 实现而非 Ultralytics 实现。如nn.Upsample
是调用 PyTorch 的上采样模块。
args
为初始化参数。对于nn.Upsample
组件,[None, 2, "nearest"]
表示做 2 倍上采样、最近邻插值;对于Concat
组件,[1]
为拼接的维度,即[dim]
;对于Detect
组件,[nc]
表示输出的种类数量。