YOLO基础知识
YOLO11模型结构:
# 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)
下面是解释:
一、基础知识铺垫
1. 什么是YOLO?
YOLO(You Only Look Once)是一种实时目标检测算法,它的核心思想是:通过一次前向传播(只看一次图像)就能预测图像中所有物体的位置和类别。
2. 模型配置文件的作用
这个YAML文件定义了YOLO模型的网络结构,就像一张"建筑图纸",告诉计算机:
- 每一层用什么样的砖块(卷积、池化等)
- 砖块之间如何连接(数据流动路径)
二、核心参数解释
1. 基础参数
nc: 80
:模型需要检测80种物体(比如COCO数据集中的"人、车、狗...")scales
:定义不同大小的模型(n/s/m/l/x),就像"衣服尺码",小模型(n)速度快但精度低,大模型(x)速度慢但精度高
2. 缩放系数的意义
每个模型尺寸有三个参数 [深度, 宽度, 最大通道数]
:
- 深度:控制网络的层数(比如n模型的深度是0.5,表示总层数是大模型的一半)
- 宽度:控制每层的通道数(比如n模型的宽度是0.25,表示每层的通道数是基准数的25%)
- 最大通道数:防止某些层的通道数过大(比如n模型最大通道数不超过1024)
三、Backbone(主干网络)详解
1. Backbone的作用
想象Backbone是"特征提取器",它像榨汁机一样把原始图像(比如640x640像素)一步步压榨,提取出不同层次的特征:
- 浅层特征:边缘、纹理(适合检测小物体)
- 深层特征:语义信息(适合检测大物体)
2. 逐层拆解(以YOLO11n为例)
我们用输入图像640x640为例,解释每一层:
层编号 | 模块 | 参数 | 输出尺寸变化 | 通俗解释 |
---|---|---|---|---|
0 | Conv | [64, 3, 2] | 640x640 → 320x320 | 用64个3x3的过滤器,步长2(下采样) |
1 | Conv | [128, 3, 2] | 320x320 → 160x160 | 通道数翻倍,继续下采样 |
2 | C3k2 | [256, False, 0.25] | 保持160x160 | 用多个小卷积组合提取特征 |
3 | Conv | [256, 3, 2] | 160x160 → 80x80 | 继续下采样 |
4 | C3k2 | [512, False, 0.25] | 保持80x80 | 更深的特征提取 |
7 | Conv | [1024, 3, 2] | 40x40 → 20x20 | 最终下采样到20x20分辨率 |
9 | SPPF | [1024, 5] | 保持20x20 | 空间金字塔池化,融合多尺度特征 |
10 | C2PSA | [1024] | 保持20x20 | 注意力机制,让模型关注重要区域 |
3. 关键模块说明
-
C3k2
:由多个卷积组成的模块,类似"乐高积木块",通过堆叠提取复杂特征 -
SPPF
:快速空间金字塔池化,把不同大小的池化结果拼接,帮助模型理解不同尺度的物体 -
C2PSA
:结合通道注意力和空间注意力,让网络自动学习"看哪里更重要"
四、Head(检测头)详解
1. Head的作用
如果说Backbone是"眼睛",Head就是"大脑",它的任务是:
- 融合多尺度特征(把不同分辨率的特征图拼接)
- 预测物体位置和类别(输出边界框和类别概率)
2. 核心操作解释
- 上采样(Upsample):把小特征图放大(比如20x20→40x40),用最近邻插值法
- 拼接(Concat):把深层特征和浅层特征拼接,结合细节和语义信息
- C3k2处理:对拼接后的特征再次提取
- 下采样(Conv步长2):降低分辨率,准备多尺度预测
3. 多尺度预测示意图
[80x80] ← 上采样 + 拼接 ← [40x40] ← 上采样 + 拼接 ← [20x20]
(检测小物体) (检测中物体) (检测大物体)
五、Detect层(最终输出)
1. 输入来源
- P3: 80x80的高分辨率特征(检测小物体)
- P4: 40x40的中等分辨率特征(检测中物体)
- P5: 20x20的低分辨率特征(检测大物体)
2. 输出内容
每个尺度的每个网格会预测:
- 边界框坐标(x, y, w, h)
- 置信度(是否有物体)
- 80个类别的概率
3. 最终检测流程
- 输入图像经过Backbone提取特征
- Head融合不同尺度的特征
- Detect层在每个尺度上生成预测框
- 非极大值抑制(NMS)去除冗余框
六、举个实际例子
假设输入一张640x640的图片:
-
Backbone处理:
- 经过5次下采样,最后得到20x20的特征图
- 中间过程保留了不同尺度的特征(160x160、80x80、40x40等)
-
Head处理:
- 把20x20的特征图上采样到40x40,与之前的40x40特征拼接
- 再次上采样到80x80,与更早的80x80特征拼接
- 同时也会下采样融合其他尺度的特征
-
输出结果:
- 最终在80x80、40x40、20x20三个尺度上分别预测物体
- 小物体(如远处的行人)主要在80x80被检测到
- 大物体(如近处的汽车)主要在20x20被检测到