YOLOv11骨干轻量化改进shufflenetv2

(1)核心代码(nn.modules.shufflenetv2.py)

import torch
import torch.nn as nn


class Conv_maxpool(nn.Module):
    def __init__(self, c1, c2):  # ch_in, ch_out
        super().__init__()
        self.conv= nn.Sequential(
            nn.Conv2d(c1, c2, kernel_size=3, stride=2, padding=1, bias=False),
            nn.BatchNorm2d(c2),
            nn.ReLU(inplace=True),
        )
        self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)

    def forward(self, x):
        return self.maxpool(self.conv(x))

class ShuffleNetV2(nn.Module):
    def __init__(self, inp, oup, stride):  # ch_in, ch_out, stride
        super().__init__()

        self.stride = stride

        branch_features = oup // 2
        assert (self.stride != 1) or (inp == branch_features << 1)

        if self.stride == 2:
            # copy input
            self.branch1 = nn.Sequential(
                nn.Conv2d(inp, inp, kernel_size=3, stride=self.stride, padding=1, groups=inp),
                nn.BatchNorm2d(inp),
                nn.Conv2d(inp, branch_features, kernel_size=1, stride=1, padding=0, bias=False),
                nn.BatchNorm2d(branch_features),
                nn.ReLU(inplace=True))
        else:
            self.branch1 = nn.Sequential()

        self.branch2 = nn.Sequential(
            nn.Conv2d(inp if (self.stride == 2) else branch_features, branch_features, kernel_size=1, stride=1, padding=0, bias=False),
            nn.BatchNorm2d(branch_features),
            nn.ReLU(inplace=True),

            nn.Conv2d(branch_features, branch_features, kernel_size=3, stride=self.stride, padding=1, groups=branch_features),
            nn.BatchNorm2d(branch_features),

            nn.Conv2d(branch_features, branch_features, kernel_size=1, stride=1, padding=0, bias=False),
            nn.BatchNorm2d(branch_features),
            nn.ReLU(inplace=True),
        )

    def forward(self, x):
        if self.stride == 1:
            x1, x2 = x.chunk(2, dim=1)
            out = torch.cat((x1, self.branch2(x2)), dim=1)
        else:
            out = torch.cat((self.branch1(x), self.branch2(x)), dim=1)

        out = self.channel_shuffle(out, 2)

        return out

    def channel_shuffle(self, x, groups):
        N, C, H, W = x.size()
        out = x.view(N, groups, C // groups, H, W).permute(0, 2, 1, 3, 4).contiguous().view(N, C, H, W)

        return out

(2)task.py引用

from ultralytics.nn.modules.shufflenetv2 import *

 执行规则

elif m in [ShuffleNetV2, Conv_maxpool]:
            c1, c2 = ch[f], args[0]
            if c2 != nc:  # if c2 not equal to number of classes (i.e. for Classify() output)
                c2 = make_divisible(c2 * width, 8)
            args = [c1, c2, *args[1:]]    

(3)yaml文件

backbone:    #3*640*640
  # [from, repeats, module, args]
  - [-1, 1, Conv_maxpool, [24]]    # 0-P2/4       #24*160*160
  - [-1, 1, ShuffleNetV2, [116, 2]] # 1-P3/8       #channel,步距
  - [-1, 3, ShuffleNetV2, [116, 1]] # 2
  - [-1, 1, ShuffleNetV2, [232, 2]] # 3-P4/16
  - [-1, 7, ShuffleNetV2, [232, 1]] # 4
  - [-1, 1, ShuffleNetV2, [464, 2]] # 5-P5/32
  - [-1, 3, ShuffleNetV2, [464, 1]] # 6
  - [-1, 1, SPPF, [1024, 5]]  # 7
  - [-1, 2, C2PSA, [1024]] # 8

# YOLOv8.0n head
head:
  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]  #9
  - [[-1, 4], 1, Concat, [1]]  # cat backbone P4   10
  - [-1, 2, C3k2, [512, False]] # 11

  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [[-1, 2], 1, Concat, [1]]  # cat backbone P3
  - [-1, 2, C3k2, [256, False]]  # 14 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 11], 1, Concat, [1]]  # cat head P4
  - [-1, 2, C3k2, [512, False]] # 17 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 8], 1, Concat, [1]]  # cat head P5
  - [-1, 2, C3k2, [1024, True]] # 20 (P5/32-large)

  - [[14, 17, 20], 1, Detect, [nc]]  # Detect(P3, P4, P5)

### 回答1: YoloV5和ShuffleNetV2都是目前深度学习领域中非常重要的技术。YoloV5是一个目标检测算法,属于基于单阶段检测的模型。与其他目标检测算法相比,YoloV5具有训练速度快、检测速度快、准确率高等优点。它还采用了一些新的技巧,比如使用PANet连接不同的特征图来提高检测精度,使用Swish激活函数来提高性能等。总体来说,YoloV5是一种非常强大的目标检测算法,能够帮助我们更好地理解和处理图像数据。 而ShuffleNetV2则是一种轻量级神经网络模型,适合在计算资源有限的情况下使用。相比于传统的神经网络模型,ShuffleNetV2具有计算效率高、模型大小小、速度快等优点,在实际应用中具有广泛的应用前景。它采用了一些创新的技术,比如使用分组卷积来减少网络中的参数数量,使用通道重排技术来改进信息流等,从而提高了网络的性能和效率。 综上所述,YoloV5和ShuffleNetV2都是非常先进的深度学习技术,具有优异的性能和效率。无论是在图像分类、目标检测还是其他领域,它们都能够发挥重要的作用,推动人工智能技术的不断发展。 ### 回答2Yolov5和Shufflenetv2都是计算机视觉领域中的重要算法,它们在不同的方面都展现了很高的优越性。 Yolov5是一种基于深度学习的目标检测算法,其最大的优点在于速度非常快,能够在高级别的识别准确率和实时性之间取得平衡。相比于YOLOv4,它的速度提升了很多,达到了他的两倍之多,同时还提升的准确率,使其具备了更好的应用价值。此外,Yolov5采用了轻量化网络架构,可以适应各种硬件设备,从而极大地拓展了其可用范围,受到了广泛关注。 Shufflenetv2是另一种轻量级的深度神经网络模型,其主要优点在于运算速度快,占用空间少,同时依然能够保证较高的精度。Shufflenetv2它的主要思路是采用分组卷积实现参数共享,从而进一步降低计算量,达到轻量化的效果。相比于其他模型,Shufflenetv2的速度更快、参数更少,在移动端应用当中具备更高的实用性。 总的来说,Yolov5和Shufflenetv2都是非常优秀的计算机视觉算法,它们在不同的领域拥有高度的优越性,能够更好地满足不同应用场景的需求。但是,它们在实际应用上还需要根据具体需求进行选择,找到最适合自己的算法,进而实现更高效、更精准的目标识别。 ### 回答3: YOLOv5和ShuffleNetv2是目前比较热门的深度学习模型。 YOLOv5是目标检测领域经典的模型之一,它是由Joseph Redmon和Ali Farhadi等人提出的。它借鉴了其前身——YOLOv4的效果,采用更高效的设计,整个模型的速度比旧版本提高了两倍,同时在精度上也有所提升。 ShuffleNetv2则是一个能够在深度神经网络下实现更快速和更高效性能的模型,它是由苏州大学的Xiangyu Zhang等人提出的。相比于之前的ShuffleNet,ShuffleNetv2采用了更高效的单元并进一步优化了通道重排与全局平均池化,从而使得ShuffleNetv2在速度和精度方面都有着更加出色的表现。 YOLOv5和ShuffleNetv2都是对其之前版本做出了极大的优化,它们在速度和精度方面都有着非常出色的表现,因此在目标检测和图像分类等应用场景下得到了广泛的应用。同时,它们也为我们展示了深度学习模型不断演进的过程,无疑是值得深入研究和探究的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值