当前位置: 首页 > news >正文

目标检测算法——YOLOv5结合ConvNeXt结构

关注”PandaCVer“公众号

深度学习Tricks,第一时间送达

论文题目:A ConvNet for the 2020s

论文地址:https://arxiv.org/abs/2201.03545

源代码:https://github.com/facebookresearch/ConvNeXt

纯卷积主干网络!可与大火的分层视觉Transformer竞争!多个任务性能超越Swin!

MetaAI在论文A ConvNet for the 2020s中, 从ResNet出发并借鉴Swin Transformer提出了一种新的 CNN 模型:ConvNeXt,其效果无论在图像分类还是检测分割任务上均能超过Swin Transformer,而且ConvNeXt和vision transformer一样具有类似的scalability(随着数据量和模型大小增加,性能同比提升)。

ConvNeXt 从原始的 ResNet 出发,逐步加入swin transform 的 trick,来改进模型。论文中适用 ResNet模型:ResNet50和ResNet200。其中ResNet50和Swin-T有类似的FLOPs(4G vs 4.5G),而ResNet200和Swin-B有类似的FLOPs(15G)。首先做的改进是调整训练策略,然后是模型设计方面的递进优化:宏观设计->ResNeXt化->改用Inverted bottleneck->采用large kernel size->微观设计。由于模型性能和FLOPs强相关,所以在优化过程中尽量保持FLOPs的稳定。

相关代码:

class ConvNeXt(nn.Module):
    r""" ConvNeXt
        A PyTorch impl of : `A ConvNet for the 2020s`  -
          https://arxiv.org/pdf/2201.03545.pdf

    Args:
        in_chans (int): Number of input image channels. Default: 3
        num_classes (int): Number of classes for classification head. Default: 1000
        depths (tuple(int)): Number of blocks at each stage. Default: [3, 3, 9, 3]
        dims (int): Feature dimension at each stage. Default: [96, 192, 384, 768]
        drop_path_rate (float): Stochastic depth rate. Default: 0.
        layer_scale_init_value (float): Init value for Layer Scale. Default: 1e-6.
        head_init_scale (float): Init scaling value for classifier weights and biases. Default: 1.
    """
    def __init__(self, in_chans=3, num_classes=1000,
                 depths=[3, 3, 9, 3], dims: list = [96, 192, 384, 768], drop_path_rate=0.,
                 layer_scale_init_value=1e-6, head_init_scale=1.,
                 ):
        super().__init__()

        self.downsample_layers = nn.ModuleList() # stem and 3 intermediate downsampling conv layers
        stem = nn.Sequential(
            nn.Conv2d(in_chans, dims[0], kernel_size=4, stride=4),
            LayerNorm(dims[0], eps=1e-6, data_format="channels_first")
        )
        self.downsample_layers.append(stem)
        for i in range(3):
            downsample_layer = nn.Sequential(
                    LayerNorm(dims[i], eps=1e-6, data_format="channels_first"),
                    # 下采样
                    nn.Conv2d(dims[i], dims[i+1], kernel_size=2, stride=2),
            )
            self.downsample_layers.append(downsample_layer)
        # 4 feature resolution stages, each consisting of multiple residual blocks
        self.stages = nn.ModuleList()
        dp_rates = [x.item() for x in torch.linspace(0, drop_path_rate, sum(depths))]
        cur = 0
        for i in range(4):
            stage = nn.Sequential(
                *[Block(dim=dims[i], drop_path=dp_rates[cur + j],
                        layer_scale_init_value=layer_scale_init_value)
                  for j in range(depths[i])]
            )
            self.stages.append(stage)
            cur += depths[i]

        self.norm = nn.LayerNorm(dims[-1], eps=1e-6) # final norm layer
        self.head = nn.Linear(dims[-1], num_classes)

        self.apply(self._init_weights)
        self.head.weight.data.mul_(head_init_scale)
        self.head.bias.data.mul_(head_init_scale)

    def _init_weights(self, m):
        if isinstance(m, (nn.Conv2d, nn.Linear)):
            trunc_normal_(m.weight, std=.02)
            nn.init.constant_(m.bias, 0)

    def forward_features(self, x):
        for i in range(4):
            x = self.downsample_layers[i](x)
            x = self.stages[i](x)
        return self.norm(x.mean([-2, -1])) # global average pooling, (N, C, H, W) -> (N, C)

    def forward(self, x):
        x = self.forward_features(x)
        x = self.head(x)
        return x

通过借鉴Swin Transformer的设计来逐步地改进模型。论文共选择了两个不同大小的ResNet模型:ResNet50和ResNet200,其中ResNet50和Swin-T有类似的FLOPs(4G vs 4.5G),而ResNet200和Swin-B有类似的FLOPs(15G)。首先做的改进是调整训练策略,然后是模型设计方面的递进优化:宏观设计>ResNeXt化>改用Inverted bottleneck>采用large kernel size>微观设计。由于模型性能和FLOPs强相关,所以在优化过程中尽量保持FLOPs的稳定。 ​ConVNeXt 这篇文章,通过借鉴 Swin TransForm 精心构建的 tricks,卷积在图像领域反超 Transformerer。

如何结合YOLOv5,有需要且感兴趣的小伙伴关注互粉一下,一起学习!共同进步!

关于YOLOv5的其他改进方法可关注并留言博主的CSDN

相关文章:

  • 机器学习——多元梯度下降法
  • Win10自带超级截屏利器
  • 【如何拍出一条好的vlog】素材篇
  • axios--》axios初步操作
  • javaScript 防抖/节流,探索学习,对新手友好的内容
  • 【docker】dockerfile优化镜像大小
  • m基于RFID和DBSCAN聚类的InSAR室内三维定位算法的matlab仿真
  • 【面试题】 对象、原型、原型链与继承?这次我懂了!
  • python-sklearn模型通用方法的介绍
  • 入坑 Hack The Box
  • Pr 视频效果:模糊与锐化
  • 智慧城市建设及发展资料合集
  • JMeter笔记16 | 性能参数配置及测试监听
  • 三个“清洁代码”技巧将使您的开发团队效率提高 50%
  • create® 3入门教程-使用多个机器人
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 【译】理解JavaScript:new 关键字
  • Go 语言编译器的 //go: 详解
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Python十分钟制作属于你自己的个性logo
  • Python中eval与exec的使用及区别
  • 对象引论
  • 构造函数(constructor)与原型链(prototype)关系
  • 前嗅ForeSpider采集配置界面介绍
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 微信开源mars源码分析1—上层samples分析
  • 小程序测试方案初探
  • 正则表达式小结
  • 白色的风信子
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # Kafka_深入探秘者(2):kafka 生产者
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #define,static,const,三种常量的区别
  • #include<初见C语言之指针(5)>
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (1)Hilt的基本概念和使用
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (待修改)PyG安装步骤
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (回溯) LeetCode 77. 组合
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (四)软件性能测试