码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Yolov5更换主干网络之《旷视轻量化卷积神经网络ShuffleNetv2》


    《ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design》

    这篇是2018年发表在ECCV上的论文,同时本篇论文还获得了VALSE年度杰出论文奖
    原文地址
    官方代码


    ShuffleNet V2属于比较经典的轻量化网络,通过大量实验提出四条轻量化网络设计准则,对输入输出通道、分组卷积组数、网络碎片化程度、逐元素操作对不同硬件上的速度和内存访问量MAC的影响进行了详细分析。

    提出ShuffleNet V2模型,通过Channel Split替代分组卷积,满足四条设计准则,达到了速度和精度的最优权衡。
    在这里插入图片描述

    Channel Shuffle原理

    请添加图片描述

    (a)(b)为ShuffleNet V1原理图,(c)(d)为ShuffleNet V2原理图(d为降采样层)

    YOLOv5更换方法,三步搞定
    第一步;添加如下代码到common.py

    # 通道重排,跨group信息交流
    def channel_shuffle(x, groups):
        batchsize, num_channels, height, width = x.data.size()
        channels_per_group = num_channels // groups
    
        # reshape
        x = x.view(batchsize, groups,
                   channels_per_group, height, width)
    
        x = torch.transpose(x, 1, 2).contiguous()
    
        # flatten
        x = x.view(batchsize, -1, height, width)
    
        return x
    
    
    class CBRM(nn.Module):           #conv BN ReLU Maxpool2d
        def __init__(self, c1, c2):  # ch_in, ch_out
            super(CBRM, self).__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 Shuffle_Block(nn.Module):
        def __init__(self, ch_in, ch_out, stride):
            super(Shuffle_Block, self).__init__()
    
            if not (1 <= stride <= 2):
                raise ValueError('illegal stride value')
            self.stride = stride
    
            branch_features = ch_out // 2
            assert (self.stride != 1) or (ch_in == branch_features << 1)
    
            if self.stride > 1:
                self.branch1 = nn.Sequential(
                    self.depthwise_conv(ch_in, ch_in, kernel_size=3, stride=self.stride, padding=1),
                    nn.BatchNorm2d(ch_in),
    
                    nn.Conv2d(ch_in, branch_features, kernel_size=1, stride=1, padding=0, bias=False),
                    nn.BatchNorm2d(branch_features),
                    nn.ReLU(inplace=True),
                )
    
            self.branch2 = nn.Sequential(
                nn.Conv2d(ch_in if (self.stride > 1) else branch_features,
                          branch_features, kernel_size=1, stride=1, padding=0, bias=False),
                nn.BatchNorm2d(branch_features),
                nn.ReLU(inplace=True),
    
                self.depthwise_conv(branch_features, branch_features, kernel_size=3, stride=self.stride, padding=1),
                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),
            )
    
        @staticmethod
        def depthwise_conv(i, o, kernel_size, stride=1, padding=0, bias=False):
            return nn.Conv2d(i, o, kernel_size, stride, padding, bias=bias, groups=i)
    
        def forward(self, x):
            if self.stride == 1:
                x1, x2 = x.chunk(2, dim=1)  # 按照维度1进行split
                out = torch.cat((x1, self.branch2(x2)), dim=1)
            else:
                out = torch.cat((self.branch1(x), self.branch2(x)), dim=1)
    
            out = channel_shuffle(out, 2)
    
            return out
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82

    第二步;yolo.py里加上CBRM和Shuffle_Block

    请添加图片描述

    第三步;修改配置文件

    # YOLOv5 🚀 by Ultralytics, GPL-3.0 license
    
    # Parameters
    nc: 20  # number of classes
    depth_multiple: 1.0  # model depth multiple
    width_multiple: 1.0  # 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]
      # Shuffle_Block: [out, stride]
      [[ -1, 1, CBRM, [ 32 ] ], # 0-P2/4
       [ -1, 1, Shuffle_Block, [ 128, 2 ] ],  # 1-P3/8
       [ -1, 3, Shuffle_Block, [ 128, 1 ] ],  # 2
       [ -1, 1, Shuffle_Block, [ 256, 2 ] ],  # 3-P4/16
       [ -1, 7, Shuffle_Block, [ 256, 1 ] ],  # 4
       [ -1, 1, Shuffle_Block, [ 512, 2 ] ],  # 5-P5/32
       [ -1, 3, Shuffle_Block, [ 512, 1 ] ],  # 6
      ]
    
    # YOLOv5 v6.0 head
    head:
      [[-1, 1, Conv, [256, 1, 1]],
       [-1, 1, nn.Upsample, [None, 2, 'nearest']],
       [[-1, 4], 1, Concat, [1]],  # cat backbone P4
       [-1, 1, C3, [256, False]],  # 10
    
       [-1, 1, Conv, [128, 1, 1]],
       [-1, 1, nn.Upsample, [None, 2, 'nearest']],
       [[-1, 2], 1, Concat, [1]],  # cat backbone P3
       [-1, 1, C3, [128, False]],  # 14 (P3/8-small)
    
       [-1, 1, Conv, [128, 3, 2]],
       [[-1, 11], 1, Concat, [1]],  # cat head P4
       [-1, 1, C3, [256, False]],  # 17 (P4/16-medium)
    
       [-1, 1, Conv, [256, 3, 2]],
       [[-1, 7], 1, Concat, [1]],  # cat head P5
       [-1, 1, C3, [512, False]],  # 20 (P5/32-large)
    
       [[14, 17, 20], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
      ]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47


    更详细的网络结构复现请看ShuffleNet v2网络结构复现(Pytorch版)


    本人更多Yolov5(v6.1)实战内容导航🍀

    1.手把手带你调参Yolo v5 (v6.1)(一)🌟强烈推荐

    2.手把手带你调参Yolo v5 (v6.1)(二)🚀

    3.如何快速使用自己的数据集训练Yolov5模型

    4.手把手带你Yolov5 (v6.1)添加注意力机制(一)(并附上30多种顶会Attention原理图)🌟

    5.手把手带你Yolov5 (v6.1)添加注意力机制(二)(在C3模块中加入注意力机制)

    6.Yolov5如何更换激活函数?

    7.Yolov5 (v6.1)数据增强方式解析

    8.Yolov5更换上采样方式( 最近邻 / 双线性 / 双立方 / 三线性 / 转置卷积)🍀

    9.Yolov5如何更换EIOU / alpha IOU / SIoU?🍀

    10.持续更新中


    有问题欢迎大家指正,如果感觉有帮助的话请点赞支持下👍📖🌟

    !!转载请注明出处!!

  • 相关阅读:
    volatile 无法保证原子性 案例展示
    代码随想录32——贪心:122买卖股票的最佳时机II、55跳跃游戏、45跳跃游戏II
    Java多线程之Thread和Runnable关于共享资源的对比
    2022新版PMP考试有哪些变化?
    数据库的概念-数据库、数据库管理系统、数据库系统、数据库管理员、数据库设计人员、开发管理使用数据库系统的人员
    mybatis学习:二、 Mybatis的Dao开发、mybatis-config.xml文件的详情
    2024上半年热门巅峰AI工具大盘点,你绝对不能错过!
    大模型技术实践(三)|用LangChain和Llama 2打造心灵疗愈机器人
    2-30 基于matlab的神经网路下身份证号码识别算法
    动作捕捉用于验证芭蕾舞动作对脑瘫儿童的作用
  • 原文地址:https://blog.csdn.net/weixin_43694096/article/details/126109839
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号