文章目录
- 核心思想
- 主要步骤
- 优势
- yolov8.yaml文件增加CBAM
- yolov8.yaml
- yolov8.yaml将Conv卷积替换成GhostConv
幽灵卷积(Ghost Conv)是一种新颖的卷积操作方法,旨在解决传统卷积神经网络中参数量和计算量过大的问题,尤其适用于资源受限的设备。以下是对幽灵卷积的详细介绍:
核心思想
常规的卷积操作会产生大量的特征图,其中存在一定的冗余信息。幽灵卷积的核心思想是先通过少量的卷积核进行常规卷积操作获得一部分 “固有特征图”,然后对这些固有特征图进行更廉价的线性变换操作,生成更多的 “幽灵特征图”。最后将固有特征图和幽灵特征图进行拼接,得到最终的特征图。
主要步骤
常规卷积:使用少量的卷积核对输入特征图进行卷积操作,这一步的目的是提取输入特征图中的关键信息,生成固有特征图。这部分的计算量相对较小,但能够捕捉到特征图的主要特征。
幽灵生成:对第一步得到的固有特征图进行线性变换操作,生成幽灵特征图。线性变换操作通常使用深度可分离卷积(Depthwise Convolution)等较为简单的操作方式,这些操作的计算成本较低,可以在不增加过多计算量的情况下生成大量的特征图。深度可分离卷积是将卷积操作分为深度卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)两个步骤,深度卷积负责对每个通道进行单独的卷积操作,逐点卷积则负责对深度卷积的结果进行通道间的组合,从而得到最终的输出特征图。
特征图拼接:将固有特征图和生成的幽灵特征图进行拼接,得到最终的输出特征图。这样既保留了原始特征图的关键信息,又通过幽灵特征图增加了特征的多样性。
优势
降低计算负载:通过使用线性变换从现有特征图生成更多特征图,相较于依赖大量卷积核的传统卷积方式,大大减少了所需的计算量。这对于在计算资源有限的设备上运行深度学习模型非常重要,例如嵌入式设备、移动设备等。
高效利用资源:能够在不牺牲模型性能的前提下,最大限度地利用可用的计算和内存资源,提高模型的效率和运行速度。
易于适应:由于其模块化设计,幽灵卷积模块可以无缝集成到现有的卷积神经网络架构中,作为即插即用组件来升级网络,提高网络的性能。
应用场景:幽灵卷积在计算机视觉领域的各种任务中都有广泛的应用,例如图像分类、目标检测、语义分割等。特别是在对模型的计算效率和内存占用有较高要求的场景下,幽灵卷积能够发挥出重要的作用。
总之,幽灵卷积是一种创新的卷积操作方法,通过巧妙地利用线性变换生成幽灵特征图,在减少计算量和参数量的同时,保持了模型的性能,为深度学习模型在资源受限设备上的应用提供了一种有效的解决方案。
yolov8.yaml文件增加CBAM
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.yaml将Conv卷积替换成GhostConv
# 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, GhostConv, [64, 3, 2]] # 0-P1/2- [-1, 1, GhostConv, [128, 3, 2]] # 1-P2/4- [-1, 3, C2f, [128, True]]- [-1, 1, GhostConv, [256, 3, 2]] # 3-P3/8- [-1, 6, C2f, [256, True]]- [-1, 1, GhostConv, [512, 3, 2]] # 5-P4/16- [-1, 6, C2f, [512, True]]- [-1, 1, GhostConv, [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, GhostConv, [256, 3, 2]]- [[-1, 12], 1, Concat, [1]] # cat head P4- [-1, 3, C2f, [512]] # 18 (P4/16-medium)- [-1, 1, GhostConv, [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)