CVPR 2022

2023-10-31

作者‖ cocoon
编辑‖ 3D视觉开发者社区

前言

FAIR又出新作了!一篇《2020年代的卷积网络》的横空出世,让国内外CV圈的眼光都聚焦于此,不少大牛都纷纷下场参与讨论。研究团队以Transformer的一些设计原则以及训练技巧为标,尽可能地探究纯卷积结构的效果与性能极限。该篇论文实验充分,结构清晰,非常值得一读。

在这里插入图片描述

论文名称: A ConvNet for the 2020s
论文链接: https://arxiv.org/pdf/2201.03545.pdf
开源代码链接: https://github.com/facebookresearch/ConvNeXt
作者单位: FAIR(Facebook AI Research)、 UC Berkeley

文章目录

概述

无疑,transformer的结构在视觉识别领域内获得了巨大的成功,然而,原生的transformer结构无法应用到某些普遍的视觉任务中,比如说在目标识别以及语义分割任务。针对这样的问题,Swin transformer应用了一些卷积结构的优势,使得Transformer能够实际地作为许多网络的backbone,进而在一系列的视觉任务中取得令人瞩目的成绩。尽管如此,类似于swin transformer的混合方法,之所以能够取得好成绩,主要的原因还是更偏重于其transformer的结构,并不是卷积结构的固有特性。

而FAIR团队在这篇文章中所介绍的工作则是,重新探究和评估ConvNet的设计空间以及性能上的极限。

文章逐渐地将ResNet”现代化“,或者说,对ResNet进行改进,使得其更接近transformer的版本,并从中提取能够对性能有较大贡献的几个关键组件。探究的结果是一个纯卷积结构所组成的网络,称之为ConvNeXt。尽管全部由卷积结构设计而得,ConvNeXt却能够在精度以及灵活性上均与transformer媲美,甚至更优。具体地,在ImageNet上获得了87.8%的top-1准确度,且超过了Swin transformer在COCO检测数据集以及ADE20K分割集上的效果。更难能可贵的是,ConvNeXt保持了纯卷积结构的简洁性与高效性。

从ResNet到ConvNeXt的roadmap

在本节中,提供了从ResNet到ConvNet的设计轨迹,该设计轨迹与Transformer有一定的相似性。

从FlOPs的角度出发,考虑了两种模型的size,一个是ResNet-50/Swin-T的模型大小,其FLOPs约为 4.5 ∗ 1 0 9 4.5 * 10^9 4.5109,另一个则是ResNet-200/ Swin-B的模型大小,其FLOPs大约为 15.0 ∗ 1 0 9 15.0 * 10^9 15.0109

出于简洁性的考虑,文章最终会给出相当于ResNet-50/Swin-T的模型结果。

首先使用Swin-Transformer的训练方式对ResNet-50进行训练,作为baseline。
然后研究了一系列的设计技巧对于网络性能的影响,这些性能包括了:
(1)宏观设计(macro design);
(2)ResNetXt化;
(3)倒置的瓶颈(inverted bottleneck);
(4)更大的核大小;
(5)不同的逐层微观设计。

在下图中,示意了将ResNet”现代化“的整个过程及结果:
在这里插入图片描述
在这里插入图片描述

训练技巧 (76.1% -> 78.8%)

除了网络结构的设计,训练策略也将对模型结果产生影响。
实际上,ViT的成果不仅仅给我们带来了在模型结构设计上的启发,其在训练策略上亦有值得我们学习的地方。

因此,探索的第一步就是,使用ViT的训练策略,训练出一个ResNet-50/200作为baseline。

具体地,使用了类似于DeiT以及Swin Transformer的训练策略,有:

  1. 将原训练ResNets的90轮提高至300轮;
  2. 使用AdamW优化器;
  3. 使用数据增强技巧,包括Mixup、Cutmix、RandAugment、Random Erasing;
  4. 正则化技巧,包括Stochastic Depth以及Label Smotthing。

通过这样的训练策略,可以使得ResNet-50的准确率从76.1% 提升至 78.8 %。

在之后的探索中,均采用了一致的训练策略与超参数。每一个结果都是三个随机种子训练得到的结果平均。

宏观设计

我们知道,Swin Transformer的设计是多级的,每一级都有着不同的特征图分辨率,文章提炼出了两个比较有意思的设计思想:

  1. stage compute ratio;
  2. stem cell。

改变stage compute ratio (78.8% -> 79.4%)

原始ResNet在每一个stage中的计算分布实质上是经验性的。
最为繁重的"res4"的设计意图是与某些下游任务,比方说目标减策实现兼容,具体的体现方式为探测头在 14 ∗ 14 14 *14 1414大小的特征平面上进行处理。

Swin-T的设计原则也是类似的,其stage compute ratio 为 1 : 1 : 3 : 1 1:1:3:1 1:131,而对于更大的Swin Transformer来说,其比例为 1 : 1 : 9 : 1 1:1:9:1 1191

考虑到这样的设计原则,我们调整ResNet-50中的stage compute ratio 从 ( 3 , 4 , 6 , 3 ) (3,4,6,3) (3,4,6,3) ( 3 , 3 , 9 , 3 ) (3,3,9,3) (3,3,9,3)。这样的调整,使得ResNet的FLOPs与Swin-T一致。且精度从78.8%进一步地增长到79.4%。

值得注意的是,在这方面或许仍然有增长空间。
在接下来的探究实验中,均采用了这样的比例分配。

将“stem”改为“patchify” (79.4% -> 79.5%)

显然,“stem”的设计更关注怎么在网络开始的时候处理输入图像。考虑到自然影像中存在的冗余信息,不管是ConvNet还是ViT,都会将自然影像下采样到一个合适的特征图尺寸。
在传统的ResNet中,“Stem”表现为stride=2的 7 ∗ 7 7*7 77卷积,且接一个最大池化,因此最终得到一个4倍降采样的size。

而在ViT中,其“Stem”则采用了更为激进的“patchify”策略,即,采用了一个更大的核(14或16),以及非重叠的卷积。

Swin-Transformer采用了一个类似的“patchify”层,不过采用了更小的patch size(4),目的是为了适应其多级的网络结构。

将ResNet中的“stem”换成了一个 4 ∗ 4 4*4 44大小, s t r i d e = 4 stride = 4 stride=4的所谓的patchify的卷积层,精度从 79.4 79.4% 79.4提升到了 79.5 79.5% 79.5

ResNeXt-ify (79.5% -> 80.5%)

相比起普通的ResNet来说,尝试采用ResNeXt中的思想策略。ResNeXt中的核心策略是分组卷积,在这里特指的含义是:将卷积划分为几个组内。
使用了depthwise卷积。
实际上,depthwise卷积与自注意力中的加权和操作非常相似,都是在每一个通道中进行操作。
结合depthwise卷积与1*1卷积,使得空间和通道的信息融合分离开来,这与ViT中的思想非常相似,即,要么融合空间信息,要么融合通道信息,并不会同时进行信息混合。
通过depthwise卷积的使用,大幅降低了网络的FLOPs

考虑到ResNeXt所提到的策略,将网络的通道提到与Swin-T一致,即从64到96。这使得网络的性能提升到80.5%,但同时,FLOPs也增加了5.3G。

Inverted Bottleneck(80.5% -> 80.6%)

在每一个Transformer block中都有一个非常重要的设计,即inverted Bottleneck,换言之,MLP block是输入维度的四倍宽。
在这里插入图片描述
在这里插入图片描述

在图三中,体现了配置的配置设计:
在这里插入图片描述
尽管depthwise卷积层的FLOPs提高了,但由于降采样残差块中shortcut的连接减少,整个网络的FLOPs减少到了4.6G。

这样的设计轻微地提高了精度,即从80.5% 到 80.6%。

而在ResNet-200/Swin-B的机制中,则带来了更大的收益,从81.9%涨到了82.6%。

更大的卷积核

将depthwise卷积层上调 (80.6% -> 79.9%,下降)

为了探索大型卷积核的作用,一个先决条件就是将depthwise的位置上调(见Figure 3(b)到(c))。这在Transformer中也是有迹可循的:MSA在MLP层之前。由于inverted bottleneck的存在,这就变成了一个很自然的选择:复杂的MSA模块有着更少的通道数,而更有效率的密集的1*1的卷积则将会承担更为繁重的工作。
这样的中间步骤将FLOPs减少到了4.1G,但是却暂时的使得精度降低到了79.9%。

提高卷积核的大小 (79.9% -> 80.6%)

在有了先决条件后,实验了 3 , 5 , 7 , 9 , 11 3,5,7,9,11 3,5,7,9,11这几个核的精度。
将核大小变化为 7 ∗ 7 7*7 77后,相对于 3 ∗ 3 3*3 33的卷积,精度从79.9%提升到了80.6%,而FLOPs几乎保持不变。
7 ∗ 7 7*7 77的核大小基本上精度已饱和,再增加核的大小都不会使得精度再有所增益。因此,在之后的实验中均采用 7 ∗ 7 7*7 77大小的核。

微观层面的设计

所谓的微观层面指,基本上在层的颗粒度上进行设计,主要聚焦在一些激活函数以及归一化层的选择上。

将ReLU换成GELU(精度没有变化)

GELU可以视作是ReLU的平滑体,在比较新的研究中有所使用,如BERT、OpenAI中的GPT-2以及ViT等。
然而,将ReLU替换成GELU后在精度上并没有提升。

更少的激活函数(80.6% -> 81.3%)

Transformer与ResNet的block之间还有一个小区别就是Transformer采用了更少的激活函数。
考虑Transformer block内有key/query/value的线性embedding层,投影层,在MLP block中的两个线性层,只有在MLP block中才存在一个激活函数。

作为对比,可以尝试在每一个卷积层后面都添加一个激活函数层。

在Figure 4中,可以看到,尝试从残差块中去除了GELU激活,只保留在两个 1 ∗ 1 1*1 11层之间的GELU,模拟了Transformer中的风格,这样的操作使得精度提升了0.7%,达到了81.3%的精度,此时的精度已经可以媲美Swin-T了。

因此,在接下来的网络评估中,都只采用一个GELU激活。

更少的归一化层(81.3% -> 81.4%)

同样,在Transformer的block中,往往有着更少的归一化层。
同样,这里也去除掉两个BN层,在 1 ∗ 1 1*1 11卷积之间只使用一个BN层,这使得网络的精度进一步提升至81.4%,这已经超过了Swin-Transformer的精度了。

注意到,此时在每一个block中的激活函数已经比Transformer还少了,因此,经验地再在block的最开始处额外地加一个BN层,并不会对精度有所提高。

将BN替换为LN (81.4% -> 81.5%)

之前,直接将ResNet中的BN层替换为LN,会导致网络的精度并非最优。然而,采用之前提到的网络结构以及训练技巧,发现用LN训练并没有什么困难,甚至最后还取得了81.5% 的精度。
因此,在接下来的实验中,在每一个残差块中都采用一个LN层。

分开的降采样层 (81.5% -> 82.0%)

在ResNet中,空间降采样是通过残差块进行实现的。
在Swin Transformer中,在两个stage之间加入了分开的降采样层。

进而,探索了一个类似的策略,即使用两个 2 ∗ 2 2 *2 22的卷积层( s t r i d e = 2 stride = 2 stride=2)进行空间上的降采样,这样的修改导致了不同的训练,在之后的研究中发现,在空间分辨率变化的位置加上归一化层将有助于训练的稳定性。
此外,在Swin-Transformer中,一个LN放在降采样之前,一个LN放在stem之后,还有一个放在最后的全局平均池化之后。
这样的操作使得网络的精度提升到82.0%,大幅高于Swin-Transformer所能达到的81.3%。

因此,使用分开的降采样层,这将形成最终的模型,即,命名为ConvNeXt。

ResNet、Swin以及ConvNeXt的block结构可以见Figure 4.
ResNet-50、Swin-T、ConvNeXt-T的细节结构则见Table 9,即:
在这里插入图片描述

在ImageNet上的评估

ConvNeXt变种的精度评估

构建了多个ConvNeXt的变种,有:
在这里插入图片描述
训练细则的介绍暂略,读者可见原文,各变种的结果为:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

同量级的ConvNeXt与ViT之间的对比

在这里插入图片描述

在下游任务上的评估

在COCO上的目标检测以及分割任务结果

在这里插入图片描述

在ADE20K上的语义分割结果

在这里插入图片描述

结论

文章以Transformer的一些设计原则以及训练技巧为标的,尽可能地探究纯卷积结构的效果与性能极限。尽管每一个小的技巧并非是创新的,但综合的进行试验时确切地得到了大幅的精度提升,个人认为这也将为广大研究者在模型设计与精度提点的工作中提供启发性的思路。

参考文献

  • convNet:
  1. Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun.
    Deep residual learning for image recognition. In CVPR, 2016.
  2. Karen Simonyan and Andrew Zisserman. Very deep convolutional networks for large-scale image recognition. In ICLR, 2015.
  • 计算分布:
  1. Ilija Radosavovic, Justin Johnson, Saining Xie, Wan-Yen Lo, and Piotr Dollár. On network design spaces for visual recognition. In ICCV, 2019.
  2. Ilija Radosavovic, Raj Prateek Kosaraju, Ross Girshick, Kaiming He, and Piotr Dollár. Designing network design spaces. In CVPR, 2020.
  • ResNeXt:
  1. Saining Xie, Ross Girshick, Piotr Dollár, Zhuowen Tu, and Kaiming He. Aggregated residual transformations for deep neural networks. In CVPR, 2017.

版权声明:本文为奥比中光3D视觉开发者社区特约作者授权原创发布,未经授权不得转载,本文仅做学术分享,版权归原作者所有,若涉及侵权内容请联系删文。

3D视觉开发者社区是由奥比中光给所有开发者打造的分享与交流平台,旨在将3D视觉技术开放给开发者。平台为开发者提供3D视觉领域免费课程、奥比中光独家资源与专业技术支持。点击加入3D视觉开发者社区,和开发者们一起讨论分享吧~

或可微信关注官方公众号 3D视觉开发者社区 ,获取更多干货知识哦。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CVPR 2022 的相关文章

  • 旅行售货员问题及其近似算法(NPC问题)

    旅行售货员问题 一 基本介绍 二 问题解法 2 1 枚举法 穷举法 2 2 回溯法 2 3 分支限界法 2 4 旅行售货员问题近似算法 三 总结 一 基本介绍 设有n个城镇 已知每两个城镇之间的距离 一个售货员从某一城镇出发巡回售货 问这个
  • STM32 定时器详解

    STM32 定时器详解 吃了一个猛亏 自己理解花了大半天时间 结果一看代码发现巨简单 算了 把自己理解的放上来吧 目录 STM32 定时器详解 前言 一 定时器种类和区分 二 时钟源 三 计数过程 3 1 计数器时钟CK CNT 3 2 计
  • 鸟哥的私房菜 笔记备份

    鸟哥的linux私房菜 http linux vbird org linux basic centos5 php 第1章 linux是什么 硬件 gt 内核 gt 系统调用 gt 应用程序 内核和系统调用两者组成操作系统 linux dis
  • c++中vector find使用

    c 中vector find使用 不同于map map有find方法 vector本身是没有find这一方法 其find是依靠algorithm来实现的 话不多说 上代码 include
  • 计算机硬件cpu指令执行过程,cpu执行指令的过程详解

    cpu执行指令的过程详解 计算机每执行一条指令都可分为三个阶段进行 即取指令 分析指令 执行指令 取指令的任务是 根据程序计数器PC中的值从程序存储器读出现行指令 送到指令寄存器 分析指令阶段的任务是 将指令寄存器中的指令操作码取出后进行译

随机推荐

  • You must give at least one requirement to install (see "pip help install")

    语言 python why install 后面没有参数 也就是说没有给想要安装的包 way pip install 后面要跟想要安装的包名 转载于 https www cnblogs com 2bjiujiu p 9029662 html
  • LVGL LABLE手动选择lv_label_set_text_sel_start如何取消选择

    很多都遇到了lable输入手动选择问题 上篇将lvgl有个bug 这篇讲一下如何取消选择 设置 lv label set text sel start edit lable 1 lv label set text sel end edit
  • python3读取yaml文件

    yaml文件 student name 王 age 18 subject yuwen english shuxue class 一班 二班 三班 system name dos port 8080 env dev name linux po
  • java中包的知识点、局部变量的生命周期、形参与实参

    类是以一个个文件的形式存在的 包是以文件夹的形式存在 包是用来放类的组织单位 包 文件夹 中含有很多的类 文件 命名规范大总结 类名 包名 方法名 变量名称 1 不能以数字开头 2 不能出现特殊符号 字母 数字 下划线 3 类名通常Hell
  • Linux 环境下安装 GitLab 与配置

    什么是 GitLab GitLab 是一个用于仓库管理系统的开源项目 使用 Git 作为代码管理工具 并在此基础上搭建起来的 web 服务 GitLab的功能特点 提供了管理 计划 创建 验证 打包 发布 配置 监视和保护应用程序的功能 是
  • Unity发布HTC头盔无法唤起

    1 问题描述 最近在开发一款HTC的项目时发现一个问题 我在编辑器里头盔可以被识别 但是发布后 打开程序头盔无法被唤起 版本为Unity2019 4 33 SteamVR从商店最新下载 导入SteamVR插件是选择LegacyVR模式 2
  • Duplicated 与unique

    gt DT lt data table A rep 1 3 each 4 B rep 1 4 each 3 C rep 1 2 6 key A B gt DT A B C 1 1 1 1 2 1 1 2 3 1 1 1 4 1 2 2 5
  • 【OpenCV学习笔记】【教程翻译】二(车牌识别算法框架)

    在介绍自动车牌识别的代码之前 我们需要定义自动车牌识别算法的主要步骤和任务 自动车牌识别主要分为两步 车牌检测和车牌识别 车牌检测的目的是检测出车牌在整副图像中的位置 当一副图片中的车牌被检测出来了 然后就是第二步 车牌识别 车牌识别使用O
  • 华为OD机试 - MELON的难题(Java)

    题目描述 MELON有一堆精美的雨花石 数量为n 重量各异 准备送给S和W MELON希望送给俩人的雨花石重量一致 请你设计一个程序 帮MELON确认是否能将雨花石平均分配 输入描述 第1行输入为雨花石个数 n 0 lt n lt 31 第
  • Web前端开发 移动端开发(快速入门)

    目录 一 理论知识 1 视口 2 物理像素和物理像素比 3 二倍图 4 移动端开发选择 二 移动端开发流程 1 技术选型 2 搭建文件结构 3 SEO优化3大标签 4 设置favicon ico logo图片 5 视口标签和初始化样式 6
  • 粉丝福利—这本热门机器学习书籍,你值得免费拥有

    粉丝福利 机器学习书籍免费大放送 1 粉丝福利 2 抽奖方式 各位小伙伴们 大家好 为了回馈粉丝们的支持 小编给大家送来一波福利 闲言少叙 咱们直接进入正题 1 粉丝福利 为答谢AI研习图书馆广大粉丝朋友们长久以来的支持 本号发起免费赠书活
  • vue项目怎么修改项目名称

    1 在package json文件中 修改name成你想要的新名字 2 删掉node modules文件夹 3 修改根目录下面的index html文件中的title 改完以后 vue文件中的title就改过来了 4 重新下载依赖 npm
  • 业务架构视图该怎么画?

    业务架构全景视图是快速理解业务运作形态的重要工具 该视图不应以IT视角绘制 业务元素及其结构应是绘制重点 商业模式画布中业对务元素进行了标准化 将其业务活动展开可得到一份精炼的业务全景视图 两者可互为补充 由于篇幅限制和认知曲线 应该控制全
  • 2020年 IEEE VIS 科学可视化与体渲染论文整理与分析

    因为最近工作的关系 需要研究一下IEEE VIS中2017年以后的与我之前主要方向 体渲染 医学可视化 有关的论文 我把这些年全部的论文进行了筛选和梳理 总共筛选出57篇论文 打算写一个文章来记录这些内容 这个栏目是2020年的5篇论文的介
  • 把Collection转化为XML

    IList
  • zlib库源码编译

    文章目录 zlib库源码编译 简介 源码编译 Windows vs2017 64位版本编译 zlib库源码编译 简介 该篇博客主要用于记录zlib库的源码编译方法 根据自己在源码编译过程中踩得坑进行记录 既便于后续自己学习 也希望能够帮助他
  • SDK 开发中见到的问题

    问题1 Could not build module MySDK 原因是 在pubulic的头文件中导入的头文件都需要导入到pubulic中 m文件中头文件不需要导入 问题2 Missing submodule subHeader 原因是
  • PyDev Eclipse使用技巧说明

    PyDev Package Explorer 创建项目 在开展工作之前 需要创建一个新的项目 在 Eclipse 菜单栏中 选择 File gt New gt Project gt Pydev gt Pydev Project 单击 Nex
  • 求函数【线段树】【2020牛客寒假算法基础集训营2】

    首先 这个区间很容易让人想到是区间操作 那么就是来推公式吧 我们从中不难发现 从两个值到四个值 可以是相当于 其中 两个 括号中的值是不是有点相似 我们是不是可以将它放在线段树上来进行维护了 include
  • CVPR 2022

    作者 cocoon 编辑 3D视觉开发者社区 前言 FAIR又出新作了 一篇 2020年代的卷积网络 的横空出世 让国内外CV圈的眼光都聚焦于此 不少大牛都纷纷下场参与讨论 研究团队以Transformer的一些设计原则以及训练技巧为标 尽