【魔改YOLOv5-6.x(下)】YOLOv5s+Ghostconv+BiFPN+CA

本文介绍了针对YOLOv5v6.1的优化实践,包括整合Shufflenetv2、Mobilenetv3和Ghostnet的轻量化网络结构,引入ACON激活函数、CBAM和CA注意力机制,以及采用加权双向特征金字塔BiFPN。训练设置是在2个GTX1080Ti上,用VOC2007数据集进行300个epoch的训练。测试阶段则进行了map和speed测试。模型配置文件详细列出了网络结构,包括Ghostconv和BiFPN的应用。作者欢迎读者分享更多优化技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

【魔改YOLOv5-6.x(上)】:结合轻量化网络Shufflenetv2、Mobilenetv3和Ghostnet

【魔改YOLOv5-6.x(中)】:加入ACON激活函数、CBAM和CA注意力机制、加权双向特征金字塔BiFPN

本文使用的YOLOv5版本为v6.1,对YOLOv5-6.x网络结构还不熟悉的同学,可以移步至:【YOLOv5-6.x】网络模型&源码解析
 

训练设置

$ python -m torch.distributed.launch --nproc_per_node 2 train.py --weights  --cfg yolov5s.yaml --data data/VOC2007.yaml -- hyp data/hyps/hyp.scratch-high.yaml --epochs 300 --device 0,1
  • 实验环境为2个GTX 1080 Ti
  • 数据集为VOC2007
  • 超参数为hyp.scratch-high.yaml
  • 训练300个epoch
  • 其他参数均为源码中默认设置的数值

 

测试设置

$ python val.py --weights yolov5s.pt --data VOC2007.yaml --img 832 --augment --half --iou 0.6
$ python val.py --weights yolov5s.pt --data VOC2007.yaml --img 640 --task speed --batch 1
  • 使用第一行代码进行map测试(TTA测试方法)
  • 使用第二行代码进行speed测试

 

模型文件(参考)

yolov5s-Ghostconv-BiFPN-CA.yaml

# Parameters
nc: 20  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

# YOLOv5 v6.0 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2
   [-1, 1, GhostConv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, C3, [128]],
   [-1, 1, GhostConv, [256, 3, 2]],  # 3-P3/8
   [-1, 6, C3, [256]],
   [-1, 1, GhostConv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, C3, [512]],
   [-1, 1, GhostConv, [1024, 3, 2]],  # 7-P5/32
   [-1, 3, C3, [1024]],
   [-1, 1, CABlock, [1024, 32]],  # 9 CA <-- Coordinate Attention [out_channel, reduction]
   [-1, 1, SPPF, [1024, 5]],  # 10
  ]

# YOLOv5 v6.0 head
head:
  [[-1, 1, GhostConv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 14

   [-1, 1, GhostConv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 18 (P3/8-small)

   [-1, 1, GhostConv, [256, 3, 2]],
   [[-1, 15, 6], 1, Concat, [1]],  # cat head P4 <--- BiFPN change
   [-1, 3, C3, [512, False]],  # 21 (P4/16-medium)

   [-1, 1, GhostConv, [512, 3, 2]],
   [[-1, 11], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 24 (P5/32-large)

   [[18, 21, 24], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

 
训练仍在进行中,之后会更新相应的测试结果,目前还没有尝试更多的改进方法,欢迎大家前来交流,分享改进YOLOv5的方法~

### Ghost 卷积简介 Ghost 卷积是一种高效的卷积操作方法,在深度学习框架中被广泛应用于模型优化和加速。其核心思想是通过线性变换生成更多的特征图,从而减少计算量并保持较高的精度[^1]。 Ghost 卷积的主要特点在于它分为两个阶段: 1. **标准卷积**:首先应用少量的标准卷积核来提取基础特征。 2. **Ghost 模块**:随后利用简单的线性运算扩展这些基础特征,生成更多复杂的特征图而无需额外的卷积操作。 这种方法显著降低了参数数量和计算复杂度,尤其适用于移动设备上的轻量化神经网络设计。 ```python import torch.nn as nn class GhostModule(nn.Module): def __init__(self, inp, oup, kernel_size=1, ratio=2, dw_size=3, stride=1, relu=True): super(GhostModule, self).__init__() self.oup = oup init_channels = int(oup / ratio) new_channels = init_channels * (ratio - 1) # 主卷积部分 self.primary_conv = nn.Sequential( nn.Conv2d(inp, init_channels, kernel_size, stride, kernel_size//2, bias=False), nn.BatchNorm2d(init_channels), nn.ReLU(inplace=True) if relu else nn.Identity(), ) # 扩展卷积部分 self.cheap_operation = nn.Sequential( nn.Conv2d(init_channels, new_channels, dw_size, 1, dw_size//2, groups=init_channels, bias=False), nn.BatchNorm2d(new_channels), nn.ReLU(inplace=True) if relu else nn.Identity(), ) def forward(self, x): x1 = self.primary_conv(x) x2 = self.cheap_operation(x1) out = torch.cat([x1, x2], dim=1) return out[:, :self.oup, :, :] ``` 上述代码展示了如何在 PyTorch 中实现 Ghost 卷积模块。该模块由两部分组成:`primary_conv` 和 `cheap_operation`。前者负责执行常规卷积以获取初始特征;后者则通过对初始特征进行廉价的操作(如逐通道卷积),进一步生成新的特征图[^2]。 ### 性能优势 相比传统卷积,Ghost 卷积具有以下优点: - 显著降低 FLOPs(浮点运算次数)。 - 减少内存占用的同时维持甚至提升模型性能。 - 更适合资源受限环境下的部署场景,例如移动端或嵌入式设备。 然而需要注意的是,尽管 Ghost 卷积能够有效节省计算成本,但在某些特定任务上可能无法完全替代传统的密集卷积结构[^3]。
评论 128
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嗜睡的篠龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值