yolov8n
yolov8网络详解
yolov8的yaml文件:
1 | # Parameters |
训练文件:datasets robot_data.yaml train.py yolov8n-2head.yaml
网络结构:yolov8n-2head.yaml
训练文件:train.py
配置文件:robot_data.yaml
train.py:
1 | from ultralytics import YOLO |
robot_data.yaml:
1 | # 1. 数据集根目录 (建议写绝对路径,或者相对于运行目录的路径) |
yolov8n-2head.yaml:
1 |
|
指标:
YOLOv8的整体架构:
Backbone:特征提取网络,负责从图片中提取特征,把图片从清晰的像素点变成抽象的特征图。
Neck:特征融合网络 ,负责把深层的语义信息(是什么)和浅层的位置信息(在哪里)结合起来。
Head:检测头 。最后预测出框的位置和类别。
每一行参数 [depth, width, max_channels] 分别控制模型的三个维度:
depth(深度系数):控制网络的层数。- 作用:决定了网络里的
C2f模块重复堆叠多少次。 - 举例:如果
depth=0.33,原本设计要堆 3 次的层,现在只堆 $3 \times 0.33 \approx 1$ 次。 - 影响:深度越小,模型越浅,推理速度越快,但学习复杂特征的能力越弱。
- 作用:决定了网络里的
width(宽度系数):控制通道数 (Channel)。- 作用:决定了每一层卷积核的数量(也就是特征图的厚度)。
- 举例:如果
width=0.25,原本标准是 128 个通道,现在只用 $128 \times 0.25 = 32$ 个通道。 - 影响:宽度越小,显存占用越少,参数量越少,适合嵌入式设备(如 RK3566)。
max_channels(最大通道数):上限限制。- 作用:不管怎么缩放,通道数都不能超过这个值。这通常是为了防止大模型在最后几层通道数爆炸,导致显存溢出。
语法结构:[from, repeats, module, args]
每一行都代表网络的一层,由 4 个参数组成:
from: 输入来自哪里?-1代表上一层(最常见)。- 如果写
-2代表上上一层。
repeats: 这个模块重复堆叠几次?- 注意:这个数字会被顶部的
depth系数(如 0.33)相乘。如果这里写3,实际可能只堆1次。
- 注意:这个数字会被顶部的
module: 用什么算子?Conv: 卷积层(负责下采样/提取特征)。C2f: 核心特征提取模块(残差结构)。SPPF: 空间金字塔池化(扩大视野)。
args: 传给模块的参数。- 对于
Conv,通常是[输出通道数, 卷积核大小, 步长]。
- 对于
nn.Upsample, [None, 2, "nearest"](上采样)
这是要把图片“放大”。
nn.Upsample: 算子名称。作用是把小尺寸的特征图变大。None: 代表不指定输出的具体像素大小(比如不写死成 40x40)。2: 缩放倍数。意思是把长和宽都乘以 2。"nearest": 最近邻插值。这是最简单的放大算法,速度最快,适合 RK3566。
大白话:把上一层(P5)那个 20x20 的极小缩略图,放大成 40x40,这样它就能跟 P4 层对齐了。
Concat, [1](特征拼接)
这是要把两张图“叠在一起”。
[-1, 6]: 代表这一层有两个输入。-1: 上一层(刚放大的 P5)。6: Backbone 的第 6 层(原始的 P4)。
Concat: 拼接算子。[1]: 在 维度 1(通道维) 进行拼接。
大白话:左手拿着刚放大的“语义图”,右手拿着 Backbone 里的“细节图”,把它们侧着粘在一起。
- 注意:这时候图片的“厚度”(通道数)会相加。比如 256 通道加 256 通道,变成了 512 通道。
C2f, [512](特征融合)
这是要把拼接后的两股力量“拧成一股绳”。
512: 输出通道数。- 由于刚才 Concat 之后变厚了,我们需要用一个 C2f 模块来重新提取特征,把两者的信息深度融合,并把厚度固定在 512。
Conv, [256, 3, 2](下采样/缩小)
在后面“自底向上”的部分,你会看到这个:
YAML
1 | - [15, 1, Conv, [256, 3, 2]] |
256: 输出通道数。3: 卷积核是 3x3。2: 步长 (Stride)。意思是每隔 2 个像素跳着走。- 结果:长宽会除以 2。
大白话:这是把 80x80 的精细图缩小回 40x40,准备去跟深层的信息进行“二次融合”。
YOLOEDetect, [nc, 512, True](预测头)
这是最后那个“判官”。
nc: 你定义的类别数(3 类:dock, shoes, person)。512: 中间层的通道宽度。True: 是否使用多尺度预测优化。
C2f模块
1 | class C2f(nn.Module): |
SPPF模块
1 | def forward(self, x: torch.Tensor) -> torch.Tensor: |