Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >RT-DETR优化改进:Backbone改进 | VanillaNet一种新视觉Backbone,极简且强大!华为诺亚2023

RT-DETR优化改进:Backbone改进 | VanillaNet一种新视觉Backbone,极简且强大!华为诺亚2023

原创
作者头像
AI小怪兽
发布于 2023-11-20 08:09:25
发布于 2023-11-20 08:09:25
78900
代码可运行
举报
文章被收录于专栏:YOLO大作战YOLO大作战
运行总次数:0
代码可运行

本文独家改进: VanillaNet助力RT-DETR ,替换backbone,简到极致、浅到极致!深度为6的网络即可取得76.36%@ImageNet的精度,深度为13的VanillaNet甚至取得了83.1%的惊人性能。

推荐指数:五星

1.VanillaNet

论文:https://arxiv.org/pdf/2305.12972.pdf

来自华为诺亚、悉尼大学的研究者们提出了一种极简的神经网络模型 VanillaNet,以极简主义的设计为理念,网络中仅仅包含最简单的卷积计算,去掉了残差和注意力模块,在计算机视觉中的各种任务上都取得了不俗的效果。

VanillaNet,这是一种设计优雅的神经网络架构。 通过避免高深度、shortcuts和自注意力等复杂操作,VanillaNet 简洁明了但功能强大。

  • 对于Stem部分,采用4×4卷积进行特征变换;
  • 对于body部分的每个stage,首先采用MaxPool进行特征下采样,然后采用一个1×1进行特征处理;
  • 对于head部分,采用两个非线性层进行分类处理

深度为6的网络即可取得76.36%@ImageNet的精度,深度为13的VanillaNet甚至取得了83.1%的惊人性能。

2. VanillaNet引入到RT-DETR

2.1 加入加入ultralytics/nn/backbone/VanillaNet.py

核心代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class VanillaNet(nn.Module):
    def __init__(self, in_chans=3, num_classes=1000, dims=[96, 192, 384, 768],
                 drop_rate=0, act_num=3, strides=[2, 2, 2, 1], deploy=False, ada_pool=None, **kwargs):
        super().__init__()
        self.deploy = deploy
        if self.deploy:
            self.stem = nn.Sequential(
                nn.Conv2d(in_chans, dims[0], kernel_size=4, stride=4),
                activation(dims[0], act_num)
            )
        else:
            self.stem1 = nn.Sequential(
                nn.Conv2d(in_chans, dims[0], kernel_size=4, stride=4),
                nn.BatchNorm2d(dims[0], eps=1e-6),
            )
            self.stem2 = nn.Sequential(
                nn.Conv2d(dims[0], dims[0], kernel_size=1, stride=1),
                nn.BatchNorm2d(dims[0], eps=1e-6),
                activation(dims[0], act_num)
            )

        self.act_learn = 1

        self.stages = nn.ModuleList()
        for i in range(len(strides)):
            if not ada_pool:
                stage = Block(dim=dims[i], dim_out=dims[i + 1], act_num=act_num, stride=strides[i], deploy=deploy)
            else:
                stage = Block(dim=dims[i], dim_out=dims[i + 1], act_num=act_num, stride=strides[i], deploy=deploy,
                              ada_pool=ada_pool[i])
            self.stages.append(stage)
        self.depth = len(strides)

        self.apply(self._init_weights)
        self.channel = [i.size(1) for i in self.forward(torch.randn(1, 3, 640, 640))]

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

    def change_act(self, m):
        for i in range(self.depth):
            self.stages[i].act_learn = m
        self.act_learn = m

    def forward(self, x):
        input_size = x.size(2)
        scale = [4, 8, 16, 32]
        features = [None, None, None, None]
        if self.deploy:
            x = self.stem(x)
        else:
            x = self.stem1(x)
            x = torch.nn.functional.leaky_relu(x, self.act_learn)
            x = self.stem2(x)
        if input_size // x.size(2) in scale:
            features[scale.index(input_size // x.size(2))] = x
        for i in range(self.depth):
            x = self.stages[i](x)
            if input_size // x.size(2) in scale:
                features[scale.index(input_size // x.size(2))] = x
        return features

    def _fuse_bn_tensor(self, conv, bn):
        kernel = conv.weight
        bias = conv.bias
        running_mean = bn.running_mean
        running_var = bn.running_var
        gamma = bn.weight
        beta = bn.bias
        eps = bn.eps
        std = (running_var + eps).sqrt()
        t = (gamma / std).reshape(-1, 1, 1, 1)
        return kernel * t, beta + (bias - running_mean) * gamma / std

    def switch_to_deploy(self):
        if not self.deploy:
            self.stem2[2].switch_to_deploy()
            kernel, bias = self._fuse_bn_tensor(self.stem1[0], self.stem1[1])
            self.stem1[0].weight.data = kernel
            self.stem1[0].bias.data = bias
            kernel, bias = self._fuse_bn_tensor(self.stem2[0], self.stem2[1])
            self.stem1[0].weight.data = torch.einsum('oi,icjk->ocjk', kernel.squeeze(3).squeeze(2),
                                                     self.stem1[0].weight.data)
            self.stem1[0].bias.data = bias + (self.stem1[0].bias.data.view(1, -1, 1, 1) * kernel).sum(3).sum(2).sum(1)
            self.stem = torch.nn.Sequential(*[self.stem1[0], self.stem2[2]])
            self.__delattr__('stem1')
            self.__delattr__('stem2')

            for i in range(self.depth):
                self.stages[i].switch_to_deploy()

            self.deploy = True

详见:

https://blog.csdn.net/m0_63774211/article/details/134407373

​我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【YOLOv8】YOLOv8改进系列(6)----替换主干网络之VanillaNet
VanillaNet,是一种强调简洁性和优雅设计的新型神经网络架构。VanillaNet 通过避免深度结构、跳过连接和复杂的操作(如自注意力机制),实现了在计算机视觉任务中与深度复杂网络相当的性能,同时具有更高的效率和可部署性。
HABuo
2025/03/13
1850
【YOLOv8】YOLOv8改进系列(6)----替换主干网络之VanillaNet
YOLOv8改进:华为诺亚2023极简的神经网络模型 VanillaNet---VanillaBlock助力检测,实现涨点
深度为6的网络即可取得76.36%@ImageNet的精度,深度为13的VanillaNet甚至取得了83.1%的惊人性能。
AI小怪兽
2023/10/18
1.1K0
RT-DETR优化改进:Backbone改进|RIFormer:无需TokenMixer也能达成SOTA性能的极简ViT架构 | CVPR2023
本文独家改进:RIFormer助力RT-DETR ,替换backbone, RIFormer-M36的吞吐量可达1185,同时精度高达82.6%;而PoolFormer-M36的吞吐量为109,精度为82.1%。
AI小怪兽
2023/11/20
1.2K0
RT-DETR改进:Backbone改进 | EMO,结合 CNN 和 Transformer 的现代倒残差移动模块设计 | ICCV2023
本文独家改进:EMO助力RT-DETR ,替换backbone,面向移动端的轻量化网络模型——EMO:反向残差移动块(iRMB),通过堆叠不同层级的 iRMB。
AI小怪兽
2023/11/15
9940
【YOLOv8】YOLOv8改进系列(10)----替换主干网络之UniRepLKNet
论文介绍了一种名为 UniRepLKNet 的新型大核卷积神经网络(ConvNet),它在图像识别、音频、视频、点云、时间序列等多种模态的任务上表现出色,展示了卷积神经网络在多模态领域的巨大潜力。
HABuo
2025/03/28
1170
【YOLOv8】YOLOv8改进系列(10)----替换主干网络之UniRepLKNet
金字塔ViT | 华为提出使用金字塔结构改进Transformer,涨点明显(Pytorch逐行解读)
新的“PyramidTNT”通过建立层次表示,显著地改进了原来的TNT。PyramidTNT相较于之前最先进的Vision Transformer具有更好的性能,如Swin-Transformer。
集智书童公众号
2022/02/10
1K0
金字塔ViT | 华为提出使用金字塔结构改进Transformer,涨点明显(Pytorch逐行解读)
超强Trick | 如何设计一个比Transformer更强的CNN Backbone
将这些组件结合在一起,作者能够构建纯粹的CNN架构,而无需任何像Transformer一样鲁棒甚至比Transformer更鲁棒的类似注意力的操作。作者希望这项工作能够帮助社区更好地理解鲁棒神经架构的设计。 代码:https://github.com/UCSC-VLAA/RobustCNN
集智书童公众号
2023/09/04
6210
超强Trick | 如何设计一个比Transformer更强的CNN Backbone
【YOLOv8】YOLOv8改进系列(5)----替换主干网络之EfficientFormerV2
这篇论文介绍了一种名为 EfficientFormerV2 的新型高效视觉模型,旨在解决如何在移动设备上实现与 MobileNet 相当的模型大小和推理速度的同时,达到与 Vision Transformers (ViTs) 相似的高性能。
HABuo
2025/03/11
3150
【YOLOv8】YOLOv8改进系列(5)----替换主干网络之EfficientFormerV2
【YOLOv8】YOLOv8改进系列(3)----替换主干网络之ConvNeXt V2
论文提出了一个全卷积掩码自编码器框架和一个新的全局响应归一化(Global Response Normalization, GRN)层,用于增强 ConvNeXt 架构中通道间的特征竞争。这种自监督学习技术和架构改进的结合,形成了新的模型家族 ConvNeXt V2。
HABuo
2025/02/26
2260
【YOLOv8】YOLOv8改进系列(3)----替换主干网络之ConvNeXt V2
YOLOv5改进: RT-DETR引入YOLOv5,neck和检测头助力检测
本文独家改进: 1) RT-DETR neck代替YOLOv5 neck部分; 2)引入RTDETRDecoder
AI小怪兽
2023/12/17
1.7K1
RT-DETR优化改进: EfficientViT,基于级联分组注意力模块的全新实时网络架构
本文独家改进:EfficientViT助力RT-DETR ,替换backbone,包括多头自注意力(MHSA)导致的大量访存时间,注意力头之间的计算冗余,以及低效的模型参数分配,进而提出了一个高效ViT模型EfficientViT
AI小怪兽
2023/11/20
1.1K0
【YOLOv8】YOLOv8改进系列(2)----替换主干网络之FasterNet(CVPR 2023)
神经网络在计算机视觉任务(如图像分类、目标检测和分割)中取得了显著的性能提升,但随着应用的普及,对低延迟和高吞吐量的需求也日益增加。为了实现更快的神经网络,研究者们通常通过减少浮点运算次数(FLOPs)来降低计算复杂度。然而,论文指出,单纯减少FLOPs并不一定能显著降低延迟,因为许多网络在运行时受到内存访问效率的限制,导致实际的浮点运算速度(FLOPS)较低。
HABuo
2025/02/24
6040
【YOLOv8】YOLOv8改进系列(2)----替换主干网络之FasterNet(CVPR 2023)
【YOLOv8】YOLOv8改进系列(1)----替换主干网络之EfficientViT(CVPR2023)
EfficientViT:作者是来自香港中文大学和微软研究院的研究团队。论文的主要内容是提出了一种新型的高效视觉变换器(Vision Transformer,简称ViT)模型,这种模型旨在解决传统ViT在计算成本高、不适合实时应用的问题。
HABuo
2025/02/20
4390
【YOLOv8】YOLOv8改进系列(1)----替换主干网络之EfficientViT(CVPR2023)
【YOLOv8】YOLOv8改进系列(7)----替换主干网络之LSKNet
文章提出了一种名为 Large Selective Kernel Network(LSKNet)的新型网络架构,专门用于遥感图像中的目标检测任务。LSKNet 通过动态调整其大空间感受野,能够更好地模拟遥感场景中不同目标所需的长程上下文信息,从而显著提高了遥感目标检测的性能。
HABuo
2025/03/17
2580
【YOLOv8】YOLOv8改进系列(7)----替换主干网络之LSKNet
YOLOv8轻量化:RepGhost,通过重参数化实现硬件高效的Ghost模块
💡💡💡本文独家改进:RepGhost,通过重参数化实现硬件高效的Ghost模块,性能优于GhostNet、MobileNetV3等,在移动设备上具有更少的参数和可比的延迟。
AI小怪兽
2023/11/09
2.6K0
【卷积神经网络结构专题】ResNet及其变体的结构梳理、有效性分析
【导读】2020年,在各大CV顶会上又出现了许多基于ResNet改进的工作,比如:Res2Net,ResNeSt,IResNet,SCNet等等。为了更好的了解ResNet整个体系脉络的发展,我们特此对ResNet系列重新梳理,并制作了一个ResNet专题,希望能帮助大家对ResNet体系有一个更深的理解。本篇文章我们将主要讲解ResNet、preResNet、ResNext以及它们的代码实现。
深度学习技术前沿公众号博主
2020/08/11
5.8K0
【YOLOv8】YOLOv8改进系列(8)----替换主干网络之Swin Transformer
论文介绍了一种新的视觉Transformer模型——Swin Transformer,它旨在成为计算机视觉领域的通用骨干网络。Swin Transformer通过其独特的层次化结构和移位窗口(Shifted Windows)机制,解决了传统Transformer在视觉任务中的计算复杂度问题,并在图像分类、目标检测和语义分割等多个任务中取得了优异的性能。
HABuo
2025/03/19
3070
【YOLOv8】YOLOv8改进系列(8)----替换主干网络之Swin Transformer
PP-YoLoE | PP-YoLov2全面升级Anchor-Free,速度精度完美超越YoLoX和YoLov5
PP-YOLOE的Backbone主要是使用RepVGG模块以及CSP的模型思想对ResNet及逆行的改进,同时也使用了SiLU激活函数、Effitive SE Attention等模块,下面我们一一道来。
集智书童公众号
2022/04/07
1.4K0
PP-YoLoE | PP-YoLov2全面升级Anchor-Free,速度精度完美超越YoLoX和YoLov5
使用PyTorch复现ConvNext:从Resnet到ConvNext的完整步骤详解
ConvNext论文提出了一种新的基于卷积的架构,不仅超越了基于 Transformer 的模型(如 Swin),而且可以随着数据量的增加而扩展!今天我们使用Pytorch来对其进行复现。下图显示了针对不同数据集/模型大小的 ConvNext 准确度。
deephub
2022/06/04
1.5K0
使用PyTorch复现ConvNext:从Resnet到ConvNext的完整步骤详解
CNN、Transformer、MLP架构的经验性分析
ViT的兴起挑战了CNN的地位,随之而来的是MLP系列方法。三种架构各有特点,为了公平地比较几种架构,本文提出了统一化的框架SPACH来对比,得到了具有一定insight的结论。论文来自微软的A Battle of Network Structures: An Empirical Study of CNN, Transformer, and MLP
BBuf
2021/12/27
1.1K0
CNN、Transformer、MLP架构的经验性分析
推荐阅读
【YOLOv8】YOLOv8改进系列(6)----替换主干网络之VanillaNet
1850
YOLOv8改进:华为诺亚2023极简的神经网络模型 VanillaNet---VanillaBlock助力检测,实现涨点
1.1K0
RT-DETR优化改进:Backbone改进|RIFormer:无需TokenMixer也能达成SOTA性能的极简ViT架构 | CVPR2023
1.2K0
RT-DETR改进:Backbone改进 | EMO,结合 CNN 和 Transformer 的现代倒残差移动模块设计 | ICCV2023
9940
【YOLOv8】YOLOv8改进系列(10)----替换主干网络之UniRepLKNet
1170
金字塔ViT | 华为提出使用金字塔结构改进Transformer,涨点明显(Pytorch逐行解读)
1K0
超强Trick | 如何设计一个比Transformer更强的CNN Backbone
6210
【YOLOv8】YOLOv8改进系列(5)----替换主干网络之EfficientFormerV2
3150
【YOLOv8】YOLOv8改进系列(3)----替换主干网络之ConvNeXt V2
2260
YOLOv5改进: RT-DETR引入YOLOv5,neck和检测头助力检测
1.7K1
RT-DETR优化改进: EfficientViT,基于级联分组注意力模块的全新实时网络架构
1.1K0
【YOLOv8】YOLOv8改进系列(2)----替换主干网络之FasterNet(CVPR 2023)
6040
【YOLOv8】YOLOv8改进系列(1)----替换主干网络之EfficientViT(CVPR2023)
4390
【YOLOv8】YOLOv8改进系列(7)----替换主干网络之LSKNet
2580
YOLOv8轻量化:RepGhost,通过重参数化实现硬件高效的Ghost模块
2.6K0
【卷积神经网络结构专题】ResNet及其变体的结构梳理、有效性分析
5.8K0
【YOLOv8】YOLOv8改进系列(8)----替换主干网络之Swin Transformer
3070
PP-YoLoE | PP-YoLov2全面升级Anchor-Free,速度精度完美超越YoLoX和YoLov5
1.4K0
使用PyTorch复现ConvNext:从Resnet到ConvNext的完整步骤详解
1.5K0
CNN、Transformer、MLP架构的经验性分析
1.1K0
相关推荐
【YOLOv8】YOLOv8改进系列(6)----替换主干网络之VanillaNet
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验