Conformer: Local Features Coupling Global Representationsfor Visual Recognition
论文链接:https://arxiv.org/abs/2105.03889
代码链接:https://github.com/pengzhiliang/Conformer
参考博文:Conformer论文以及代码解析(上)_conformer代码_从现在开始壹并超的博客-CSDN博客
摘要
在卷积神经网络(CNN)中,卷积运算擅长提取局部特征,但难以捕获全局表征。在visual transformer中,级联的自注意模块可以捕获远距离的特征依赖,但不幸的是会破坏局部特征细节。在本文中,我们提出了一种称为Conformer的混合网络结构,以利用卷积运算和自注意机制来增强表征学习。一致性源于特征耦合单元(Feature Coupling Unit, FCU),它以交互的方式融合了不同分辨率下的局部特征和全局表征。Conformer采用并行结构,最大限度地保留局部特征和全局表示。实验表明,在参数复杂度相当的情况下,Conformer在ImageNet上的性能比ViT(DeiT-B)高出2.3%。在MSCOCO上,它在目标检测和实例分割方面的性能分别比ResNet-101高出3.7%和3.6%,显示出作为通用骨干网的巨大潜力。
背景
考虑到CNN与变压器特征之间的特征偏差,设计了特征耦合单元(FCU)作为桥接。一方面,为了融合两种风格的特征,FCU利用11卷积来对齐通道尺寸,向下/向上采样策略来对齐特征分辨率,LayerNorm[2]和BatchNorm[24]来对齐特征值。另一方面,由于CNN和变压器分支倾向于捕获不同级别的特征(例如,局部与全局),因此在每个块中插入FCU,以交互方式连续消除它们之间的语义分歧。这种融合过程可以极大地增强局部特征的全局感知能力和全局表示的局部细节。
Conformer耦合局部特征和全局表示的能力如图1所示。传统的CNN (e:g:, ResNet-101)倾向于保留判别性的局部区域(如:g:,孔雀的头或尾巴),Conformer的CNN分支可以激活完整的对象范围,如图1(b)和(f)。当单独使用视觉变形器时,对于弱的局部特征(如:g:,模糊的对象边界),很难将对象与背景区分开来。图1(c)和(g).局部特征和全局表征的耦合显著增强了基于变压器的特征的可分辨性,图1(d)和(h)。
贡献
1)我们提出了一种称为Conformer的双重网络结构,它最大程度地保留了局部特征和全局表征。
2)我们提出了特征耦合单元(FCU),以交互方式融合卷积局部特征与基于变压器的全局表示。
3)在参数复杂度相当的情况下,Conformer的性能明显优于cnn和visual transformer。Conformer继承了cnn和visual transformer的结构和泛化优势,具有成为通用骨干网的巨大潜力。
相关工作
1)CNNs with Global Cues
2)Visual Transformers
方法
为了利用局部特征和全局表示,我们设计了一个并发网络结构,如图2(c)所示,称为Conformer
在Conformer中,我们连续地将Transformer分支的全局上下文馈送到特征图中,以增强CNN分支的全局感知能力。同样,CNN支路的局部特征被逐步反馈到patch embedding中,以丰富Transformer支路的局部细节。这样一个过程构成了相互作用。
具体来说,Conformer由主干模块(stem module)、双支路(dual branches)、桥接双支路的fcu、双支路的两个分类器(fc层)组成。
主干模块是一个7X7卷积与步幅2,然后是3X3最大池与步幅2,用于提取初始的局部特征(如:g:,边缘和纹理信息),然后被馈送到双分支。CNN支路和Transformer支路分别由N (eg, 12)个重复卷积和Transformer块组成,如表1所示。这种并行结构意味着CNN和变压器分支可以最大程度地分别保留局部特征和全局表征。FCU被提出作为桥接模块,将CNN支路中的局部特征与变压器支路中的全局表示融合在一起,如图2(b)。FCU从第二个块应用,因为两个分支的初始化特征是相同的。沿着分支,FCU以交互方式逐步融合特征图和patch embedding。
最后,对于CNN分支,所有的特征被汇集并馈送到一个分类器。对于Transformer分支,取出类令牌并馈送到另一个分类器。在训练过程中,我们使用两个交叉熵损失分别监督两个分类器。损失函数的重要性被经验地设定为相同。在推理过程中,两个分类器的输出简单地汇总为预测结果。
网络结构
CNN Branch
如图2(b)所示,CNN分支随着通道数的增加,特征图的分辨率随着网络深度的增加而降低。
我们将整个分支分为4个阶段,如表1(CNN分支)所示。每个阶段由多个卷积块组成,每个卷积块包含nc瓶颈。根据ResNet中的定义[18],瓶颈包含一个1X1向下投影卷积、一个3X3空间卷积、一个1X1向上投影卷积,以及瓶颈输入和输出之间的残差连接。在实验中,nc在第一个卷积块中设为1,在随后的N-1个卷积块中满足≥ 2。
视觉转换器[16,41]通过单步将图像块投影到矢量中,导致局部细节丢失。而在cnn中,卷积核在重叠的特征映射上滑动,这提供了保留精细的局部特征的可能性。因此,CNN分支能够连续地为变压器分支提供本地特征细节。
Transformer Branch
在ViT[16]之后,该支路包含N个重复Transformer块。如图2(b)所示,每个变压器块由一个多头自关注模块和一个MLP块(包含一个向上投影的fc层和一个向下投影的fc层)组成。layernorm[2]在每一层和自关注层和MLP块的剩余连接前应用。对于标记化,我们将词干模块生成的特征映射压缩为14X14个补丁嵌入没有重叠,通过一个线性投影层,这是一个4X4卷积,步幅为4。然后对补丁嵌入伪类标记进行分类。考虑到CNN分支(3X3卷积)既编码局部特征又编码空间位置信息[25],因此不再需要位置嵌入。这有助于提高下游视觉任务的图像分辨率。
Feature Coupling Unit (FCU)
考虑到CNN支路中的特征映射和变压器支路中的patch embedding,如何消除它们之间的不对齐是一个重要的问题。为了解决这个问题,我们提出FCU以交互的方式将局部特征与全局表示连续耦合。
1) 1x1 convolution用来调整channel的维度也就是C;
2) down/up sampling用来调整feature的分辨率也就是H和W;3) Batch Norm和Layer Norm用来调整feature values。
并且,FCU模块被嵌入到网络的每个block中,更好的消除两种机制提取到的feature的语义差异.
一方面,我们必须认识到CNN和变压器的特征维数是不一致的。CNN特征图的维数为C H W (C、H、W分别为通道、高度和宽度),patch embedding的形状为(K + 1) E,其中K、1、E分别表示图像patch的个数、类标记和嵌入维数。当馈送到Transformer支路时,特征映射首先需要经过11次卷积来对齐贴片嵌入的通道号。然后使用下采样模块(图2(A))完成空间维度对齐。最后,对特征映射进行补丁嵌入,如图2(b)所示。当从变压器支路反馈到CNN支路时,需要对贴片嵌入进行上采样(图2(a))以对齐空间尺度。
一方面,我们必须认识到CNN和变压器的特征维数是不一致的。CNN特征图的维数为CX H XW (C、H、W分别为通道、高度和宽度),patch embedding的形状为(K + 1)X E,其中K、1、E分别表示图像patch的个数、class token和嵌入维数。
当馈送到变压器支路时,特征映射首先需要经过1X1卷积来对齐贴片嵌入的通道号。
然后使用下采样模块(图2(A))完成空间维度对齐。
最后,对特征映射进行补丁嵌入,如图2(b)所示。当从变压器支路反馈到CNN支路时,需要对贴片嵌入进行上采样(图2(a))以对齐空间尺度。
然后通过1X1卷积将通道维度与CNN特征图的维度对齐,并添加到特征图中.
同时,使用LayerNorm和BatchNorm模块对特征进行正则化。
另一方面,特征映射和patch embedding之间存在明显的语义差距,即特征映射是从局部卷积算子中收集的,而补丁嵌入是通过全局自关注机制进行聚合的。因此,FCU应用于每个块(除了第一个块),以逐步填补语义空白。
讨论和分析
结构分析
将FCU作为一个短连接,我们可以将所提出的对偶结构抽象为特殊的串行残差结构,如图3(a)所示。在不同的剩余连接单元下,Conformer可以实现不同深度的bottleneck(如ResNet,图3(b))和变压器块(如ViT,图3(d))组合,这意味着Conformer继承了cnn和视觉变压器的结构优势。此外,它还实现了不同深度的bottleneck和变压器块的不同排列,包括但不限于图3(c)和(e),这大大增强了网络的表示能力。
特征分析
我们在图1中可视化特征图,在图4中可视化类激活图和注意图。与ResNet[18]相比,Conformer的CNN分支在耦合全局表示的情况下,更倾向于激活更大的区域,而不是局部区域,这表明长距离特征依赖性增强,这在图1(f)和4(a)中得到了显著的证明。由于CNN支路逐步提供了精细的局部特征,变压器支路在Conformer中的贴片嵌入保留了重要的详细的局部特征(图1(d)和(h)),这些特征被视觉变压器[16,41](图1(c)和(g))破坏了。此外,图4(b)中的注意区域更加完整,背景被明显抑制,这意味着Conformer学习到的特征表征具有更高的判别能力。
实验
模型变量
通过调整CNN和变压器支路的参数,我们得到了模型变体,分别称为- Ti, - s和- b。Conformer-S的详细情况见表1,Conformer-Ti/B的详细情况见附录。Conformer-S/32将特征映射分割为7X7个patch, i:e:,在变压器支路中patch的大小为32X32。
图像分类
实验设置
Conformer在具有1.3M张图像的ImageNet-1k[14]训练集上进行训练,并在验证集上进行测试。Top-1的精度如表2所示。为了使变压器收敛到合理的性能,我们采用了DeiT[41]中的数据增强和正则化技术。这些技术包括Mixup[52]、CutMix[51]、erase[54]、Rand- Augment[12]和Stochastic Depth[23])。模型使用AdamW优化器[32]训练300 epoch, batchsize 1024, weight decay 0.05。初始学习率设置为0.001,并在余弦调度中衰减。
表现
在相似的参数和计算预算下,表2中,Conformers的表现优于CNN和visual transformer。例如,Conformer-S(参数为3770万,mac为10.6G)分别比ResNet-152(参数为6020万,mac为11.6G)和DeiT-B(参数为860万,mac为17.6G)分别高出4.1%(83.4%比78.3%)和1.6%(83.4%比81.8%)。参数相似且MAC成本适中的Conformer-B优于DeiT-B 2.3%(84.1%对81.8%)。除了其优越的性能,Conformer收敛速度比视觉变压器快。、
目标检测和实例分割
为了验证Conformer的多功能性,我们在MSCOCO数据上对其在实例级任务(例如:g:,对象检测)和像素级任务(例如:g:,实例分割)上进行了测试[30]。共形器作为主干,无需额外设计进行迁移,相对精度及参数比较见表2。对于CNN分支,我们可以使用[c2;c3;c4;C5]作为侧输出,构建特征金字塔[29]。
实验设置
按照惯例,模型在MSCOCO训练集上进行训练,并在MSCOCO最小集上进行测试。在表3中,我们分别报告了APbbox (APsegm)、APbbox S (APsegm S)、APbbox M (APsegm M)和APbbox L (APsegm L)的平均超过IoU阈值、box (mask)的小、中、大对象。除非明确指定,否则我们使用批大小为32,学习率为0.0002,优化器AdamW[32],权重衰减为0.0001,最大epoch为12。学习率在第8和第11历元时衰减一个数量级。
表现
如表3所示,Conformer显著提高APbbox和APsegm。对于目标检测,Conformer-S/32的mAP (55.4 M & 288.4 GFLOPs)比FPN基线(ResNet-101, 60.5 M & 295.7 GFLOPs)高3.7%。以分割为例,Conformer-S/32的mAP (58.1M & 341.4 GFLOPs)比Mask R-CNN基线(ResNet-101, 63.2 M & 348.8 GFLOPs)高3.6%。这证明了全局表示对于高级任务和建议的重要性
实验结果
消融实验
相关文章:

Conformer: Local Features Coupling Global Representationsfor Visual Recognition
论文链接:https://arxiv.org/abs/2105.03889 代码链接:https://github.com/pengzhiliang/Conformer 参考博文:Conformer论文以及代码解析(上)_conformer代码_从现在开始壹并超的博客-CSDN博客 摘要 在卷积神经网络…...

java8-Stream流常用API
什么是 Stream Stream(流)是 Java 8 引入的一个新的抽象概念,它代表着一种处理数据的序列。简单来说,Stream 是一系列元素的集合,这些元素可以是集合、数组、I/O 资源或者其他数据源。 Stream API 提供了丰富的操作方…...

React 任务调度
React 任务池 不同的fiber任务有不同的优先级,为了用户体验,React需要先处理优先级高的任务。 为了存储这些任务,React中有两个任务池: // Tasks are stored on a min heap var taskQueue []; // 存储立即要执行的任务 var tim…...

小白开始学习C++
第一节:控制台输出hello word! #include<iostream> //引入库文件 int main() { //控制台输出 hello word! 之后回车 std::cout << "hello word!\n"; #include<iostream> //引入库文件int main() {//控制…...

SpringMVC入门的注解、参数传递、返回值和页面跳转---超详细教学
前言: 欢迎阅读Spring MVC入门必读!在这篇文章中,我们将探索这个令人兴奋的框架,它为您提供了一种高效、灵活且易于维护的方式来构建Web应用程序。通过使用Spring MVC,您将享受到以下好处:简洁的代码、强大…...

【复习socket】每天40min,我们一起用70天稳扎稳打学完《JavaEE初阶》——28/70 第二十八天
专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录) 文章字体风格: 红色文字表示:重难点★✔ 蓝色文字表示:思路以及想法★✔ 如果大家觉得有帮助的话,感谢大家帮忙 点…...
vue2踩坑之项目:生成二维码使用vue-print-nb打印二维码
1. vue2安装 npm install vue-print-nb --save vue3安装 npm install vue3-print-nb --save 2. //vue2 引入方式 全局 main.js import Print from vue-print-nb Vue.use(Print) ------------------------------------------------------------------------------------ //vue2 …...

【iVX】十五分钟制作一款小游戏,iVX真有怎么神?
个人主页:【😊个人主页】 新人博主,喜欢就关注一下呗~ 文章目录 前言iVX介绍初上手布置背景制作可移动物体总结(完善步骤) 前言 在上篇文章中,我向大家介绍了一种打破常规的编程方式——iVX,可…...

SpringMVC常用注解、参数传递、返回值
目录 前言 一、常用注解 二、参数传递 编辑 1. 基础类型String类型 2. 复杂类型 3. RequestParam 4. PathVariable 5.RequestBody 6. RequestHeader 三、方法返回值 一:void 二:String 三:Stringmodel 四:ModelAndVi…...

新公司第一次上架新APP需要提前准备哪些材料?
目录 前言一、需要上架的应用市场二、需要准备的资料总结 前言 前不久,使用一家新公司刚刚上架了一款新的APP项目。特此记录一下,现在第一次上架一款APP需要提前准备的各项材料。 一、需要上架的应用市场 现在,上架一款新的APP主流的应用市…...

『C语言进阶』指针进阶(一)
🔥博客主页: 小羊失眠啦 🔖系列专栏: C语言 🌥️每日语录:无论你怎么选,都难免会有遗憾。 ❤️感谢大家点赞👍收藏⭐评论✍️ 前言 在C语言初阶中,我们对指针有了一定的…...

2605. 从两个数字数组里生成最小数字(Java)
给你两个只包含 1 到 9 之间数字的数组 nums1 和 nums2 ,每个数组中的元素 互不相同 ,请你返回 最小 的数字,两个数组都 至少 包含这个数字的某个数位。 示例 1: 输入:nums1 [4,1,3], nums2 [5,7] 输出:1…...

深度解析 PostgreSQL Protocol v3.0(一)
引言 PostgreSQL 使用基于消息的协议在前端(也可以称为客户端)和后端(也可以称为服务器)之间进行通信。该协议通过 TCP/IP 和 Unix 域套接字支持。 《深度解析 PostgreSQL Protocol v3.0》系列技术贴,将带大家深度了…...

Mysql中having语句与where语句的用法与区别
分析&回答 我们在写sql语句的时候,经常会使用where语句,很少会用到having,其实在mysql中having子句也是设定条件的语句与where有相似之处但也有区别。having子句在查询过程中慢于聚合语句(sum,min,max,avg,count)。而where子句在查询过程中则快于聚合语句(sum,min,max,avg…...

基于qt软件的网上聊天室软件
1.服务器: 1).功能: 用于创建一个客户端,通过文本编辑器来获得端口号,根据获得的端口号创建服务器,等待客户端连接 创建成功会提示服务器创建成功 在收到客户端发送的信息时,把这条信息发送给其他所有客户端,实现群…...

本是同根生-双数据库集群keepalived virtual_route_id冲突导致连接故障
项目场景: 一企业近期陆续开始升级办公与大数据系统,新的承包商。原有的数据库是某国内大品牌A,现在新的功能准备陆续迁移到大品牌B上。系统部署后,A依旧承担比较轻松的财务、仓库管理,B承担实时的线上业务。项目验收…...

『力扣每日一题06』字符串中的第一个唯一字符
今天是学习新知识的一天,String 类中有太多细枝末节,需要我去学习跟掌握了。 话不多说,今天给大家带来一道字符串的题目~ 一、题目 给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在&…...

selenium鼠标操作方法
1.0 selenium新版本封装驱动 from selenium.webdriver import Chrome from selenium.webdriver.chrome.options import ChromiumOptions from selenium.webdriver.chrome.service import Servicedef get_chrome_driver(driver_path):chrome_options ChromiumOptions()chrome_…...

医者无疆 | AI赋能大医精诚,医疗制药的进阶与突破
在历史的长河中,医学一直是人类文明的重要组成部分。从古希腊的希波克拉底到现代医学研究,医学始终与时俱进,为人类的健康和福祉做出了巨大的贡献。在互联网、大数据、5G等信息技术的迭代下,人工智能(AI)的…...

使用 Hue 玩转 Amazon EMR(SparkSQL, Phoenix) 和 Amazon Redshift
现状 Apache Hue 是一个基于 Web 的交互式 SQL 助手,通过它可以帮助大数据从业人员(数仓工程师,数据分析师等)与数据仓库进行 SQL 交互。在 Amazon EMR 集群启动时,通过勾选 Hue 进行安装。在 Hue 启用以后࿰…...

Unity中神秘的Transform和transform(小写)的关系
1.为什么Transform类是保护的不能通过new 来实例化对象,也没有静态函数,而Rotate()这种方法却属于它,该如何访问? Transform 类还是被保护的不允许用户修改! protected Transform(); 是一个受保护的构造函数,不能直接实例化 Transform 类。 2.为甚么transform可以访问Tr…...

【LeetCode-中等题】78. 子集
文章目录 题目方法一:动态规划方法二:递归加回溯(关键----startIndex) 题目 注意:这里的nums数组里面的元素是各不相同的,所以不存在去重操作 方法一:动态规划 public List<List<Integer>> subsets(int[]…...

学习设计模式之代理模式,但是宝可梦
前言 作者在准备秋招中,学习设计模式,做点小笔记,用宝可梦为场景举例,有错误欢迎指出。 代码同步更新到 github ,要是点个Star您就是我的神 目录 前言代理模式1.情景模拟1.1静态代理优点局限 1.2 动态代理 2.应用3.局限4.解决方…...

自学Python01-创建文件写入内容
此处省去安装和前言,需要两个东西 一个去下载安装python官方库 Welcome to Python.org 一个是编译器pycharm PyCharm 安装教程(Windows) | 菜鸟教程 PyCharm: the Python IDE for Professional Developers by JetBrains 第一节 练习print…...

Qt —UDP通信QUdpSocket 简介 +案例
1. UDP通信概述 UDP是无连接、不可靠、面向数据报(datagram)的协议,可以应用于对可靠性要求不高的场合。与TCP通信不同,UDP通信无需预先建立持久的socket连接,UDP每次发送数据报都需要指定目标地址和端口。 QUdpSocket…...

五大类注解和方法注解详解
五大类注解为Controller,Service,Repository,Configuration,Component,方法注解为Bean。 需要注意的是:Bean注解必须要在类注解修饰的类内才能正常使用。 一、与配置文件的关系 在spring原生项目中 如果你使用的spri…...

机器人中的数值优化(十)——线性共轭梯度法
本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,…...

数据结构与算法之贪心动态规划
一:思考 1.某天早上公司领导找你解决一个问题,明天公司有N个同等级的会议需要使用同一个会议室,现在给你这个N个会议的开始和结束 时间,你怎么样安排才能使会议室最大利用?即安排最多场次的会议?电影的话 那…...

【网络编程】网络基础概念
(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮࿰…...

连接虚拟机报错 Could not connect to ‘192.168.xxx.xxx‘ (port 22): Connection failed.
使用xshell连接虚拟机报错 Connecting to 192.168.204.129:22… Could not connect to ‘192.168.204.129’ (port 22): Connection failed. Type help’ to learn how to use Xshell prompt. 按网上的方法 是否能ping通内外网 ping www.baidu.com防火墙是否关闭 firewal…...