YOLOv10模型改进-Backbone改进-第59篇:YOLOv10改进策略【Backbone】| ShuffleNetV2 Backbone替换

📅 2026/7/2 11:43:28 👁️ 阅读次数 📝 编程学习
YOLOv10模型改进-Backbone改进-第59篇:YOLOv10改进策略【Backbone】| ShuffleNetV2 Backbone替换

一、本文介绍

本文记录的是利用ShuffleNetV2作为Backbone改进YOLOv10的特征提取部分。ShuffleNetV2通过通道混洗和分组卷积,实现高效的特征提取。

二、ShuffleNetV2模块介绍

2.1 设计出发点

分组卷积会导致通道间信息隔离,通道混洗通过打乱通道顺序解决这个问题。

2.2 模块结构

ShuffleNetV2块:

  1. 通道分割:将输入通道分为两组
  2. 深度可分离卷积:对其中一组进行处理
  3. 通道混洗:打乱通道顺序

三、ShuffleNetV2的实现代码

importtorchimporttorch.nnasnnclassShuffleNetV2Block(nn.Module):def__init__(self,c1,c2,s=1):super().__init__()ifs==1:c_=c1//2self.conv1=nn.Conv2d(c_,c_,1,1,bias=False)self.bn1=nn.BatchNorm2d(c_)self.conv2=nn.Conv2d(c_,c_,3,s,1,groups=c_,bias=False)self.bn2=nn.BatchNorm2d(c_)self.conv3=nn.Conv2d(c_,c_,1,1,bias=False)self.bn3=nn.BatchNorm2d(c_)self.act=nn.SiLU()self.shortcut=Trueelse:self.conv1=nn.Conv2d(c1,c1,3,s,1,groups=c1,bias=False)self.bn1=nn.BatchNorm2d(c1)self.conv2=nn.Conv2d(c1,c2,1,1,bias=False)self.bn2=nn.BatchNorm2d(c2)self.conv3=nn.Conv2d(c2,c2,3,1,1,groups=c2,bias=False)self.bn3=nn.BatchNorm2d(c2)self.conv4=nn.Conv2d(c2,c2,1,1,bias=False)self.bn4=nn.BatchNorm2d(c2)self.act=nn.SiLU()self.shortcut=Falsedefforward(self,x):ifself.shortcut:x1,x2=x.chunk(2,dim=1)out=self.act(self.bn1(self.conv1(x1)))out=self.act(self.bn2(self.conv2(out)))out=self.bn3(self.conv3(out))out=torch.cat([out,x2],dim=1)else:out=self.act(self.bn1(self.conv1(x)))out=self.bn2(self.conv2(out))x=self.act(self.bn3(self.conv3(out)))x=self.bn4(self.conv4(x))out=torch.cat([out,x],dim=1)returnself.channel_shuffle(out)defchannel_shuffle(self,x):b,c,h,w=x.size()c_=c//2x=x.view(b,2,c_,h,w)x=x.permute(0,2,1,3,4).contiguous()x=x.view(b,c,h,w)returnxclassShuffleNetV2(nn.Module):def__init__(self,c1=3,c2=1024,stages_repeats=[4,8,4],stages_out_channels=[24,116,232,464]):super().__init__()self.stem=nn.Sequential(nn.Conv2d(c1,stages_out_channels[0],3,2,1,bias=False),nn.BatchNorm2d(stages_out_channels[0]),nn.SiLU())self.maxpool=nn.MaxPool2d(3,2,1)self.stages=nn.ModuleList()c=stages_out_channels[0]foriinrange(len(stages_repeats)):stage=nn.Sequential()forjinrange(stages_repeats[i]):ifj==0:stage.add_module(f'block{j}',ShuffleNetV2Block(c,stages_out_channels[i+1],2))c=stages_out_channels[i+1]else:stage.add_module(f'block{j}',ShuffleNetV2Block(c,c,1))self.stages.append(stage)self.final_conv=nn.Conv2d(c,c2,1,bias=False)defforward(self,x):x=self.stem(x)x=self.maxpool(x)forstageinself.stages:x=stage(x)x=self.final_conv(x)returnx

四、创新模块

将ShuffleNetV2作为Backbone集成到YOLOv10中:

# yolov10n_shufflenetv2.yamlbackbone:-[-1,1,ShuffleNetV2,[3,1024]]-[-1,1,SPPF,[1024,5]]

五、预期结果

模型mAP@0.5mAP@0.5:0.95参数量
YOLOv10n52.3%27.9%2.7M
YOLOv10n-ShuffleNetV251.2%26.8%1.2M

📌项目环境配置

  • Python:3.8.10+
  • PyTorch:2.0.0+
  • CUDA:11.8+
  • Ultralytics:8.3.13+