第Y8周:yolov8.yaml文件解读

一、参数配置

python 复制代码
# 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 GFLOPs
  s: [0.33, 0.50, 1024] # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPs
  m: [0.67, 0.75, 768] # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPs
  l: [1.00, 1.00, 512] # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPs
  x: [1.00, 1.25, 512] # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs

Parameters:

  • nc: 80 是类别数量,也就是模型可以识别的物体类别数。
  • scales: 包含了不同模型配置的尺度参数,用于调整模型的规模,通过尺度参数就可以实现不同复杂度的模型设计。YOLOv8n、YOLOv8s、YOLOv8m、YOLOv8l、YOLOv8x 五种模型的区别仅在于 depthwidthmax_channels 这三个参数的不同。
    • depth: 深度,控制子模块数量,= int(number*depth)

    • width: 宽度,控制卷积核的数量,= int(number*width)

    • max_channels: 最大通道数。

二、模型基本结构


1.backbone模块

python 复制代码
# 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的backbone,可以看到每一个模块算一行,每行都由四个参数构成。分别是:

  • from:表示当前模块的输入来自那一层的输出;-1表示来自上一层的输出,层编号由0开始计数。
  • repeats:表示当前模块的理论重复次数,实际的重复次数还要由上面的参数depth_multiple共同决定,该参数影响整体网络模型的深度。
  • module:模块类名,通过这个类名在common.py中寻找相应的类,进行模块化的搭建网络。
  • args:是一个list,模块构建所需参数,channel,kernel_size,stride,padding,bias等。

在YOLO(You Only Look Once)目标检测框架中,backbone模块扮演着至关重要的角色,其主要作用如下:

特征提取:Backbone是网络中用于提取图像特征的部分。它通常由一系列卷积层组成,这些层能够从输入图像中提取出层次化的特征表示。这些特征包含了图像中的关键信息,如边缘、纹理、形状和颜色等,对于后续的目标检测至关重要。

特征金字塔:在YOLO中,backbone通常与特征金字塔网络(Feature Pyramid Network, FPN)结合使用,以在不同尺度上检测目标。Backbone会生成不同分辨率的特征图,这些特征图在FPN中被进一步处理和融合,以便网络能够在不同的尺度上检测不同大小的对象。

降维和抽象:Backbone通过连续的卷积层逐步减少特征图的尺寸(即空间维度),同时增加特征图的深度(即通道数),从而实现对输入图像的降维和抽象。这种处理有助于减少计算量,同时保留图像的关键信息。

鲁棒性:Backbone的设计通常包含多种卷积层和池化层,这些层可以提高网络对图像变换(如缩放、旋转和平移)的鲁棒性,使得模型能够在不同的环境和条件下稳定地工作。

共享计算:在YOLO中,backbone对于输入图像只计算一次,生成的特征图被多个检测头(head)共享,这些检测头负责最终的边界框预测、类别预测和置信度预测。这种设计减少了重复计算,提高了检测效率。

可迁移性:许多YOLO版本的backbone都是基于在ImageNet数据集上预训练的模型,如Darknet、CSPDarknet、ResNet等。这些预训练的backbone可以迁移到YOLO中,使得模型在目标检测任务上能够快速收敛并获得较好的性能。

2.head模块

python 复制代码
# 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)

3.模型结构输出

(1)yolov8n.yaml模型:

python 复制代码
                   from  n    params  module                                       arguments
  0                  -1  1       464  ultralytics.nn.modules.conv.Conv             [3, 16, 3, 2]
  1                  -1  1      4672  ultralytics.nn.modules.conv.Conv             [16, 32, 3, 2]
  2                  -1  1      7360  ultralytics.nn.modules.block.C2f             [32, 32, 1, True]
  3                  -1  1     18560  ultralytics.nn.modules.conv.Conv             [32, 64, 3, 2]
  4                  -1  2     49664  ultralytics.nn.modules.block.C2f             [64, 64, 2, True]
  5                  -1  1     73984  ultralytics.nn.modules.conv.Conv             [64, 128, 3, 2]
  6                  -1  2    197632  ultralytics.nn.modules.block.C2f             [128, 128, 2, True]
  7                  -1  1    295424  ultralytics.nn.modules.conv.Conv             [128, 256, 3, 2]
  8                  -1  1    460288  ultralytics.nn.modules.block.C2f             [256, 256, 1, True]
  9                  -1  1    164608  ultralytics.nn.modules.block.SPPF            [256, 256, 5]
 10                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']
 11             [-1, 6]  1         0  ultralytics.nn.modules.conv.Concat           [1]
 12                  -1  1    148224  ultralytics.nn.modules.block.C2f             [384, 128, 1]
 13                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']
 14             [-1, 4]  1         0  ultralytics.nn.modules.conv.Concat           [1]
 15                  -1  1     37248  ultralytics.nn.modules.block.C2f             [192, 64, 1]
 16                  -1  1     36992  ultralytics.nn.modules.conv.Conv             [64, 64, 3, 2]
 17            [-1, 12]  1         0  ultralytics.nn.modules.conv.Concat           [1]
 18                  -1  1    123648  ultralytics.nn.modules.block.C2f             [192, 128, 1]
 19                  -1  1    147712  ultralytics.nn.modules.conv.Conv             [128, 128, 3, 2]
 20             [-1, 9]  1         0  ultralytics.nn.modules.conv.Concat           [1]
 21                  -1  1    493056  ultralytics.nn.modules.block.C2f             [384, 256, 1]
 22        [15, 18, 21]  1    752092  ultralytics.nn.modules.head.Detect           [4, [64, 128, 256]]
YOLOv8n summary: 225 layers, 3,011,628 parameters, 3,011,612 gradients, 8.2 GFLOPs

(2)yolov8s.yaml模型:

python 复制代码
                   from  n    params  module                                       arguments
  0                  -1  1       928  ultralytics.nn.modules.conv.Conv             [3, 32, 3, 2]
  1                  -1  1     18560  ultralytics.nn.modules.conv.Conv             [32, 64, 3, 2]
  2                  -1  1     29056  ultralytics.nn.modules.block.C2f             [64, 64, 1, True]
  3                  -1  1     73984  ultralytics.nn.modules.conv.Conv             [64, 128, 3, 2]
  4                  -1  2    197632  ultralytics.nn.modules.block.C2f             [128, 128, 2, True]
  5                  -1  1    295424  ultralytics.nn.modules.conv.Conv             [128, 256, 3, 2]
  6                  -1  2    788480  ultralytics.nn.modules.block.C2f             [256, 256, 2, True]
  7                  -1  1   1180672  ultralytics.nn.modules.conv.Conv             [256, 512, 3, 2]
  8                  -1  1   1838080  ultralytics.nn.modules.block.C2f             [512, 512, 1, True]
  9                  -1  1    656896  ultralytics.nn.modules.block.SPPF            [512, 512, 5]
 10                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']
 11             [-1, 6]  1         0  ultralytics.nn.modules.conv.Concat           [1]
 12                  -1  1    591360  ultralytics.nn.modules.block.C2f             [768, 256, 1]
 13                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']
 14             [-1, 4]  1         0  ultralytics.nn.modules.conv.Concat           [1]
 15                  -1  1    148224  ultralytics.nn.modules.block.C2f             [384, 128, 1]
 16                  -1  1    147712  ultralytics.nn.modules.conv.Conv             [128, 128, 3, 2]
 17            [-1, 12]  1         0  ultralytics.nn.modules.conv.Concat           [1]
 18                  -1  1    493056  ultralytics.nn.modules.block.C2f             [384, 256, 1]
 19                  -1  1    590336  ultralytics.nn.modules.conv.Conv             [256, 256, 3, 2]
 20             [-1, 9]  1         0  ultralytics.nn.modules.conv.Concat           [1]
 21                  -1  1   1969152  ultralytics.nn.modules.block.C2f             [768, 512, 1]
 22        [15, 18, 21]  1   2117596  ultralytics.nn.modules.head.Detect           [4, [128, 256, 512]]
YOLOv8s summary: 225 layers, 11,137,148 parameters, 11,137,132 gradients, 28.7 GFLOPs

(3)yolov8l.yaml模型:

python 复制代码
                   from  n    params  module                                       arguments
  0                  -1  1      1856  ultralytics.nn.modules.conv.Conv             [3, 64, 3, 2]
  1                  -1  1     73984  ultralytics.nn.modules.conv.Conv             [64, 128, 3, 2]
  2                  -1  3    279808  ultralytics.nn.modules.block.C2f             [128, 128, 3, True]
  3                  -1  1    295424  ultralytics.nn.modules.conv.Conv             [128, 256, 3, 2]
  4                  -1  6   2101248  ultralytics.nn.modules.block.C2f             [256, 256, 6, True]
  5                  -1  1   1180672  ultralytics.nn.modules.conv.Conv             [256, 512, 3, 2]
  6                  -1  6   8396800  ultralytics.nn.modules.block.C2f             [512, 512, 6, True]
  7                  -1  1   2360320  ultralytics.nn.modules.conv.Conv             [512, 512, 3, 2]
  8                  -1  3   4461568  ultralytics.nn.modules.block.C2f             [512, 512, 3, True]
  9                  -1  1    656896  ultralytics.nn.modules.block.SPPF            [512, 512, 5]
 10                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']
 11             [-1, 6]  1         0  ultralytics.nn.modules.conv.Concat           [1]
 12                  -1  3   4723712  ultralytics.nn.modules.block.C2f             [1024, 512, 3]
 13                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']
 14             [-1, 4]  1         0  ultralytics.nn.modules.conv.Concat           [1]
 15                  -1  3   1247744  ultralytics.nn.modules.block.C2f             [768, 256, 3]
 16                  -1  1    590336  ultralytics.nn.modules.conv.Conv             [256, 256, 3, 2]
 17            [-1, 12]  1         0  ultralytics.nn.modules.conv.Concat           [1]
 18                  -1  3   4592640  ultralytics.nn.modules.block.C2f             [768, 512, 3]
 19                  -1  1   2360320  ultralytics.nn.modules.conv.Conv             [512, 512, 3, 2]
 20             [-1, 9]  1         0  ultralytics.nn.modules.conv.Concat           [1]
 21                  -1  3   4723712  ultralytics.nn.modules.block.C2f             [1024, 512, 3]
 22        [15, 18, 21]  1   5585884  ultralytics.nn.modules.head.Detect           [4, [256, 512, 512]]
YOLOv8l summary: 365 layers, 43,632,924 parameters, 43,632,908 gradients, 165.4 GFLOPs

4.对比

  1. depth : 这个参数控制了模型的深度,即每个阶段中模块的重复次数。在模型配置文件中,这通常体现在repeats参数上。
  2. width : 这个参数控制了模型的宽度,即每个卷积层中卷积核的数量。在模型配置文件中,这体现在[in_channels, out_channels, kernel_size, stride]中的out_channels上。
  3. max_channels : 这个参数控制了模型中最大的通道数。在模型配置文件中,这通常体现在模型较深层的out_channels上。
    以下是对YOLOv8n、YOLOv8s和YOLOv8l模型结构的比较:

YOLOv8n.yaml模型:

  • depth : 较浅,每个模块的repeats通常为1或2。
  • width : 较窄,初始卷积层的out_channels为16,后续层逐渐增加,但最大值不超过256。
  • max_channels: 256,体现在模型的深层卷积层。

YOLOv8s.yaml模型:

  • depth : 较深,某些模块的repeats为2或3。
  • width : 较宽,初始卷积层的out_channels为32,后续层逐渐增加,最大值达到512。
  • max_channels: 512,体现在模型的深层卷积层。

YOLOv8l.yaml模型:

  • depth : 更深,模块的repeats可以高达6。
  • width : 更宽,初始卷积层的out_channels为64,后续层逐渐增加,最大值达到512,并且在某些层中保持这个宽度。
  • max_channels: 512,体现在模型的深层卷积层,并且这个宽度在多个层中保持一致。

对比分析:

  • depth: YOLOv8l的模型最深,有更多的模块重复,这通常意味着模型能够捕捉更复杂的特征,但也增加了计算量和参数数量。
  • width: 随着模型从n到l,宽度逐渐增加,这意味着模型在每个层次上能够处理更多的特征映射,增强了模型的表示能力。
  • max_channels : 在n和s模型中,最大通道数分别为256和512,而在l模型中,最大通道数保持在512,这表明l模型在保持较高通道数的同时,也在更深的层次上操作。
    总结来说,随着模型从n到l,模型的深度、宽度和最大通道数都在增加,这导致了模型的参数数量和计算复杂度的显著增加,同时也可能提高了模型的性能。
相关推荐
zhangxueyi5 分钟前
MySQL之企业面试题:InnoDB存储引擎组成部分、作用
java·数据库·mysql·面试·innodb
代码代码快快显灵6 分钟前
Redis 优化秒杀(异步秒杀)
数据库·redis·缓存
极客先躯11 分钟前
Redis 安装与配置指南
数据库·redis·数据验证·安装说明·编译和安装·redis 集群配置·查看集群
YaenLi1 小时前
MySQL 安装部署
linux·数据库·mysql
乄北城以北乀1 小时前
一.MySQL程序简介
数据库·mysql
炭烤毛蛋1 小时前
Ubuntu 磁盘修复
linux·数据库·ubuntu
代码代码快快显灵1 小时前
Redis之秒杀活动
数据库·redis·缓存·秒杀活动
一水鉴天3 小时前
为AI聊天工具添加一个知识系统 之27 支持边缘计算设备的资源存储库及管理器
数据库·人工智能·前端框架
拾忆,想起4 小时前
Spring拦截链揭秘:如何在复杂应用中保持控制力
java·数据库·spring
Bytebase5 小时前
AWS re:Invent 2024 现场实录 - It‘s all about Scale
运维·数据库·dba·开发者·数据库管理·devops