YOLOv10模型改进-Backbone改进-第59篇:YOLOv10改进策略【Backbone】| ShuffleNetV2 Backbone替换
📅 2026/7/2 11:43:28
👁️ 阅读次数
📝 编程学习
一、本文介绍
本文记录的是利用ShuffleNetV2作为Backbone改进YOLOv10的特征提取部分。ShuffleNetV2通过通道混洗和分组卷积,实现高效的特征提取。
二、ShuffleNetV2模块介绍
2.1 设计出发点
分组卷积会导致通道间信息隔离,通道混洗通过打乱通道顺序解决这个问题。
2.2 模块结构
ShuffleNetV2块:
- 通道分割:将输入通道分为两组
- 深度可分离卷积:对其中一组进行处理
- 通道混洗:打乱通道顺序
三、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.5 | mAP@0.5:0.95 | 参数量 |
|---|---|---|---|
| YOLOv10n | 52.3% | 27.9% | 2.7M |
| YOLOv10n-ShuffleNetV2 | 51.2% | 26.8% | 1.2M |
📌项目环境配置:
- Python:3.8.10+
- PyTorch:2.0.0+
- CUDA:11.8+
- Ultralytics:8.3.13+
编程学习
技术分享
实战经验