一、本文介绍本文记录的是利用ShuffleNetV2作为Backbone改进YOLOv10的特征提取部分。ShuffleNetV2通过通道混洗和分组卷积实现高效的特征提取。二、ShuffleNetV2模块介绍2.1 设计出发点分组卷积会导致通道间信息隔离通道混洗通过打乱通道顺序解决这个问题。2.2 模块结构ShuffleNetV2块通道分割将输入通道分为两组深度可分离卷积对其中一组进行处理通道混洗打乱通道顺序三、ShuffleNetV2的实现代码importtorchimporttorch.nnasnnclassShuffleNetV2Block(nn.Module):def__init__(self,c1,c2,s1):super().__init__()ifs1:c_c1//2self.conv1nn.Conv2d(c_,c_,1,1,biasFalse)self.bn1nn.BatchNorm2d(c_)self.conv2nn.Conv2d(c_,c_,3,s,1,groupsc_,biasFalse)self.bn2nn.BatchNorm2d(c_)self.conv3nn.Conv2d(c_,c_,1,1,biasFalse)self.bn3nn.BatchNorm2d(c_)self.actnn.SiLU()self.shortcutTrueelse:self.conv1nn.Conv2d(c1,c1,3,s,1,groupsc1,biasFalse)self.bn1nn.BatchNorm2d(c1)self.conv2nn.Conv2d(c1,c2,1,1,biasFalse)self.bn2nn.BatchNorm2d(c2)self.conv3nn.Conv2d(c2,c2,3,1,1,groupsc2,biasFalse)self.bn3nn.BatchNorm2d(c2)self.conv4nn.Conv2d(c2,c2,1,1,biasFalse)self.bn4nn.BatchNorm2d(c2)self.actnn.SiLU()self.shortcutFalsedefforward(self,x):ifself.shortcut:x1,x2x.chunk(2,dim1)outself.act(self.bn1(self.conv1(x1)))outself.act(self.bn2(self.conv2(out)))outself.bn3(self.conv3(out))outtorch.cat([out,x2],dim1)else:outself.act(self.bn1(self.conv1(x)))outself.bn2(self.conv2(out))xself.act(self.bn3(self.conv3(out)))xself.bn4(self.conv4(x))outtorch.cat([out,x],dim1)returnself.channel_shuffle(out)defchannel_shuffle(self,x):b,c,h,wx.size()c_c//2xx.view(b,2,c_,h,w)xx.permute(0,2,1,3,4).contiguous()xx.view(b,c,h,w)returnxclassShuffleNetV2(nn.Module):def__init__(self,c13,c21024,stages_repeats[4,8,4],stages_out_channels[24,116,232,464]):super().__init__()self.stemnn.Sequential(nn.Conv2d(c1,stages_out_channels[0],3,2,1,biasFalse),nn.BatchNorm2d(stages_out_channels[0]),nn.SiLU())self.maxpoolnn.MaxPool2d(3,2,1)self.stagesnn.ModuleList()cstages_out_channels[0]foriinrange(len(stages_repeats)):stagenn.Sequential()forjinrange(stages_repeats[i]):ifj0:stage.add_module(fblock{j},ShuffleNetV2Block(c,stages_out_channels[i1],2))cstages_out_channels[i1]else:stage.add_module(fblock{j},ShuffleNetV2Block(c,c,1))self.stages.append(stage)self.final_convnn.Conv2d(c,c2,1,biasFalse)defforward(self,x):xself.stem(x)xself.maxpool(x)forstageinself.stages:xstage(x)xself.final_conv(x)returnx四、创新模块将ShuffleNetV2作为Backbone集成到YOLOv10中# yolov10n_shufflenetv2.yamlbackbone:-[-1,1,ShuffleNetV2,[3,1024]]-[-1,1,SPPF,[1024,5]]五、预期结果模型mAP0.5mAP0.5:0.95参数量YOLOv10n52.3%27.9%2.7MYOLOv10n-ShuffleNetV251.2%26.8%1.2M项目环境配置Python3.8.10PyTorch2.0.0CUDA11.8Ultralytics8.3.13
YOLOv10模型改进-Backbone改进-第59篇:YOLOv10改进策略【Backbone】| ShuffleNetV2 Backbone替换
发布时间:2026/7/2 11:35:18
一、本文介绍本文记录的是利用ShuffleNetV2作为Backbone改进YOLOv10的特征提取部分。ShuffleNetV2通过通道混洗和分组卷积实现高效的特征提取。二、ShuffleNetV2模块介绍2.1 设计出发点分组卷积会导致通道间信息隔离通道混洗通过打乱通道顺序解决这个问题。2.2 模块结构ShuffleNetV2块通道分割将输入通道分为两组深度可分离卷积对其中一组进行处理通道混洗打乱通道顺序三、ShuffleNetV2的实现代码importtorchimporttorch.nnasnnclassShuffleNetV2Block(nn.Module):def__init__(self,c1,c2,s1):super().__init__()ifs1:c_c1//2self.conv1nn.Conv2d(c_,c_,1,1,biasFalse)self.bn1nn.BatchNorm2d(c_)self.conv2nn.Conv2d(c_,c_,3,s,1,groupsc_,biasFalse)self.bn2nn.BatchNorm2d(c_)self.conv3nn.Conv2d(c_,c_,1,1,biasFalse)self.bn3nn.BatchNorm2d(c_)self.actnn.SiLU()self.shortcutTrueelse:self.conv1nn.Conv2d(c1,c1,3,s,1,groupsc1,biasFalse)self.bn1nn.BatchNorm2d(c1)self.conv2nn.Conv2d(c1,c2,1,1,biasFalse)self.bn2nn.BatchNorm2d(c2)self.conv3nn.Conv2d(c2,c2,3,1,1,groupsc2,biasFalse)self.bn3nn.BatchNorm2d(c2)self.conv4nn.Conv2d(c2,c2,1,1,biasFalse)self.bn4nn.BatchNorm2d(c2)self.actnn.SiLU()self.shortcutFalsedefforward(self,x):ifself.shortcut:x1,x2x.chunk(2,dim1)outself.act(self.bn1(self.conv1(x1)))outself.act(self.bn2(self.conv2(out)))outself.bn3(self.conv3(out))outtorch.cat([out,x2],dim1)else:outself.act(self.bn1(self.conv1(x)))outself.bn2(self.conv2(out))xself.act(self.bn3(self.conv3(out)))xself.bn4(self.conv4(x))outtorch.cat([out,x],dim1)returnself.channel_shuffle(out)defchannel_shuffle(self,x):b,c,h,wx.size()c_c//2xx.view(b,2,c_,h,w)xx.permute(0,2,1,3,4).contiguous()xx.view(b,c,h,w)returnxclassShuffleNetV2(nn.Module):def__init__(self,c13,c21024,stages_repeats[4,8,4],stages_out_channels[24,116,232,464]):super().__init__()self.stemnn.Sequential(nn.Conv2d(c1,stages_out_channels[0],3,2,1,biasFalse),nn.BatchNorm2d(stages_out_channels[0]),nn.SiLU())self.maxpoolnn.MaxPool2d(3,2,1)self.stagesnn.ModuleList()cstages_out_channels[0]foriinrange(len(stages_repeats)):stagenn.Sequential()forjinrange(stages_repeats[i]):ifj0:stage.add_module(fblock{j},ShuffleNetV2Block(c,stages_out_channels[i1],2))cstages_out_channels[i1]else:stage.add_module(fblock{j},ShuffleNetV2Block(c,c,1))self.stages.append(stage)self.final_convnn.Conv2d(c,c2,1,biasFalse)defforward(self,x):xself.stem(x)xself.maxpool(x)forstageinself.stages:xstage(x)xself.final_conv(x)returnx四、创新模块将ShuffleNetV2作为Backbone集成到YOLOv10中# yolov10n_shufflenetv2.yamlbackbone:-[-1,1,ShuffleNetV2,[3,1024]]-[-1,1,SPPF,[1024,5]]五、预期结果模型mAP0.5mAP0.5:0.95参数量YOLOv10n52.3%27.9%2.7MYOLOv10n-ShuffleNetV251.2%26.8%1.2M项目环境配置Python3.8.10PyTorch2.0.0CUDA11.8Ultralytics8.3.13