yaml文件

故事先从YOLO11的yaml文件说起...

# YOLO11n backbone
backbone:
  # [from, repeats, module, args]

我们可以看到,在YOLO配置文件中最重要的四个参数(检测头的四个参数同理),分别是 [from, repeats, module, args],举例,

- [-1, 1, Conv, [64, 3, 2]] 
  • from:表示从前一个层的索引开始(-1表示来自前一层,-2表示来自前两层等)。
  • repeats:指定该模块的重复次数(例子中为1,表示卷积一次)。
  • module:指定使用的模块类型(例如Conv表示卷积层)。
  • args:模块的参数,不同的模块参数不同,例如Conv层三个参数意义如下
    • 第一个参数,输出通道数。
    • 第二个参数,卷积核的大小。
    • 第三个参数,一般表示步幅。

Concat的通道维度

  - [[-1, 6], 1, Concat, [1]] 
# cat backbone P4 将上一层和主干网络的第6层(从第0层开始计数)在通道维度拼接一次

在#YOLO11n的检测头head中,Concat右边的参数“1”代表通道维度

在神经网络中,我们常常让输入数据有多个维度。对于图像数据,通常采用的格式(这里我是Pytorch的格式)是 [batch_size, channels, height, width],各个维度的定义如下:

  1. Batch Size(批量大小):表示一次性处理的样本数量。
  2. Channels(通道数):对于彩色图像,通常是3(RGB),对于特征图,通道数表示不同类型的特征(如边缘、纹理等)。在YOLO中,一层的特征图可以有多个通道。
  3. Height(高度)和 Width(宽度):特征图的空间维度,表示图像的高度和宽度。

拼接Concat操作

在卷积神经网络中,拼接操作可以在多个维度上进行,但通常有两种主要拼接方式:

  • 通道维度拼接:将两个特征图的通道数相加(纵向堆叠),形成一个新的特征图。这可以将来自不同层的特征结合在一起,从而保留细节信息和上下文信息。例如,假设有一个特征图的通道数为64,经过拼接后,如果另一个特征图的通道数也为64,结果将会是128个通道。

  • 空间维度拼接:将特征图在空间维度上拼接,比如横向或纵向拼接,但YOLO通常不使用。

通道维度拼接

在YOLO模型中,在通道维度上拼接不同层的特征图有两个好处:

  1. 保留细节信息:低层特征图(如主干网络的P4层的下一个C3k2层)往往包含了更多的空间细节(只卷积了几次,图像尺寸更大),例如边缘、角点、纹理等。而高层特征图(如上采样的特征)通常避开了过多的空间信息,但保留了更抽象的特征(很小的特征图)。通过将它们拼接在一起,可以保留这些两方面的信息,也就可以让模型学习到不同类型的特征,增强特征表示。

  2. 多尺度信息融合:在目标检测中,物体在不同的尺度上可能出现,因此将来自多层的特征结合在一起有助于提高对各种大小物体的检测效果。

注意

在cancat的例子中,被连接的分别是,head部分第一次上采样之后的结果(空间尺寸是原图像的16分之一),与backbone部分P4层的下一个C3k2层(卷积了4次,空间尺寸也是原图像的16分之一)。两者尺寸相同才能连接。

最后

YOLOv11小白的进击之路系列持续更新中...欢迎一起交流探讨 ~ 砥砺奋进,共赴山海!

文章推荐YOLOv11小白的进击之路(二)从YOLO类-DetectionModel类出发看YOLO代码运行逻辑..._if isinstance(m, detect,afpn4head): # includes all-CSDN博客

YOLOv11小白的进击之路(六)创新YOLO的iou及损失函数时的源码分析-CSDN博客 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐