本文将介绍yolov8的网络配置文件中代码的具体含义,和各个参数的含义。
文章目录
- 一、yolov8.yaml
- 二、参数解释
- 2.1 注释部分
- 2.2 目标类别数量
- 2.3 模型的规模设置
- 2.4 YOLOv8 主干网络(Backbone)
- 2.5 YOLOv8 头部网络(Head)
- 2.6 检测层(Detect Layer)
一、yolov8.yaml
yolov8.yaml 文件的代码如下所示。
# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 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=yolov8n.yaml' will call yolov8.yaml with scale 'n'# [depth, width, max_channels]n: [0.33, 0.25, 1024] # YOLOv8n summary: 225 layers, 3157200 parameters, 3157184 gradients, 8.9 GFLOPss: [0.33, 0.50, 1024] # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients, 28.8 GFLOPsm: [0.67, 0.75, 768] # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients, 79.3 GFLOPsl: [1.00, 1.00, 512] # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPsx: [1.00, 1.25, 512] # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs# YOLOv8.0n 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, 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# YOLOv8.0n head
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)
这段代码定义了 YOLOv8 用于目标检测的深度学习模型的配置文件。它通过配置模型的结构,包括其主干(backbone)和头部(head),来完成对图像中的目标进行识别和定位。
二、参数解释
下面详细解释代码的各个部分:
2.1 注释部分
- Ultralytics YOLO 🚀, AGPL-3.0 license:表示这个代码是由 Ultralytics 发布,并且遵循 AGPL-3.0 开源协议。
- YOLOv8 object detection model:YOLOv8 是 YOLO 系列中最新的目标检测模型(翻译的,现在不是最新),它使用 P3-P5 作为输出层。
2.2 目标类别数量
- nc: 80:定义了模型支持的目标类别数量,默认为 80(与 COCO 数据集兼容)。
2.3 模型的规模设置
- scales:定义了不同规模的模型。YOLOv8 有不同的版本(如n、s、m、l、x),它们根据深度、宽度和最大通道数进行不同的配置。
- n, s, m, l, x:表示不同大小的模型:
n
是 YOLOv8n,即 “nano” 版本,较小但快速。s
是 YOLOv8s,即 “small” 版本。m
是 YOLOv8m,即 “medium” 版本。l
是 YOLOv8l,即 “large” 版本。x
是 YOLOv8x,即 “extra-large” 版本。
每个版本都有三个参数:
- depth:表示网络的深度,值越大网络越深。
- width:表示网络的宽度,值越大表示更多的卷积核数。
- max_channels:表示网络最大支持的通道数。
2.4 YOLOv8 主干网络(Backbone)
主干网络用于提取图像的特征,代码定义了 YOLOv8 的主干部分。
# [from, repeats, module, args]
- [-1, 1, Conv, [64, 3, 2]]
- [-1, 1, Conv, [64, 3, 2]]:表示从上一层(
-1
表示前一层)输入,只执行1次(重复1次),执行卷积操作,卷积层为 64 个通道、卷积核大小 3x3,步长为 2。
- [-1, 3, C2f, [128, True]]
- c2f:是一种改进的卷积块,用来提高计算效率和模型的表达能力。这里表示从上一层输入,重复执行3次,执行 c2f 模块,输入参数 [128, true] 表示输出通道数为128。True 用于控制 c2f 模块的具体行为,具体取决于 c2f 的实现。
YOLOv8 的主干分为多个阶段,从低级特征(P1、P2)到高级特征(P3、P4、P5),每一级负责提取不同层次的特征。P3/8
、P4/16
和 P5/32
分别表示三个不同的特征层,步长分别为 8、16 和 32。
2.5 YOLOv8 头部网络(Head)
头部网络负责将主干提取的特征进行处理,并生成最终的检测结果。
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- -1:输入来源,-1 表示这层的输入来自上一层的输出。
- 1:重复次数,表示这次上采样操作只执行 1 次。在这行代码中,nn.Upsample 操作不需要重复多次,所以是 1。
- nn.Upsample:这是一个 上采样层,来自 PyTorch 的神经网络模块 torch.nn.Upsample。上采样层用于将输入的特征图在空间维度上进行放大(增大高度和宽度),帮助网络在检测过程中融合更高分辨率的信息。例如,通过放大低分辨率的特征图,模型可以更好地捕捉目标的细节信息。
- [None, 2, “nearest”]:这是 Upsample 操作的参数,定义了上采样的方式。None:通常表示目标大小未被明确指定,因此这次上采样的输出尺寸将由后面的参数来确定;2:表示上采样的 尺度因子。这里的 2 意味着将特征图的高度和宽度扩大 2 倍;“nearest”:表示使用 最近邻插值法(nearest-neighbor interpolation)进行上采样。最近邻插值是一种简单且高效的插值方法,它将每个像素值复制到新的位置,适合保留较为粗糙的特征图信息。
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [[-1, 6], 1, Concat, [1]]:表示的是一次 特征图拼接操(Concat)。
- [-1, 12]:这是 输入来源,表示当前层的输入来自两个地方:-1 表示来自 上一层 的输出(即最近的一层输出)。12 表示来自 第 12 层 的输出。意味着我们将把上一层和第 12 层的输出特征图进行拼接。
- 1:Concat 操作只执行一次。
- Concat:表示将多个输入的特征图进行拼接,通常在通道维度上进行。Concat(拼接)操作可以将来自不同来源的特征图合并在一起,用于增强模型的特征表达能力。
- [1]:这是 Concat 操作的参数,表示在 通道维度(维度 1)上进行拼接。通常,特征图的维度是 [batch_size, channels, height, width],所以 1 表示在 通道维度 上进行拼接。
2.6 检测层(Detect Layer)
- Detect:YOLOv8 的检测层,负责对输入图像中的对象进行分类和定位,生成对应的目标边框。该层使用来自 P3、P4、P5 的特征图,分别对应检测小、中、大目标。
- [[15, 18, 21], 1, Detect, [nc]] # Detect(P3, P4, P5)
分别输入 15 层、18 层、21 层的特征图进行目标检测,执行 1 次,输出 nc 个类别。