点击上方“视学算法”,选择加"星标"或“置顶

重磅干货,第一时间送达

作者丨Happy

审稿|邓富城

编辑丨极市平台

本文是伯克利与谷歌的研究在Convolution+Transformer组合方面一个探索,它采用混合方式同时利用了CNN的特征提取能力、transformer的内容自注意力与位置自注意力机制,取得了优于纯CNN(如ResNet、EfficientNet)或者自注意力(如ViT、DeiT)的性能。所提方案在ImageNet上取得了84.7%的top1精度;在COCO数据集上,基于MaskR-CNN取得了44.4%的MaskAP与49.7%的BoxAP指标。本文值得对Transformer感兴趣的同学深入研究一番,文中各种实验分析相当的详细。

Abstract

本文提出了一种概念简单但强有力的骨干网络BoTNet,它集成了自注意力机制并用于多个计算机视觉任务(包含图像分类、目标检测、实例分割)。通过简单的采用全局自注意力模块替换ResNet的最后三个Bottleneck模块中的卷积,而无需其他改动即可得到BoTNet,相比baseline,所提方法可以在目标检测与实例分割任务上取得显著的性能提升,同时还可以降低参数量,代价为少量的推理延迟。

通过BoTNet的设计,本文同时指出:带自注意力模块的Bottleneck模块可以视作Transformer模块。无需任何技巧,基于Mask R-CNNN框架,BoTNet在COCO实例分割任务上取得了44.4%的Mask AP与49.7%的Box AP指标,超越了之前由ResNeSt的最佳指标。最后,本文还针对图像分类任务进行了BoTNet的自适应设计,在ImageNet数据集上取得了84.7%的top1精度,同时比EfficientNe快2.33倍(硬件平台为TPU-v3)。

Method

本文的的思路非常简单:采用多头注意力(Multi-Head Self Attention, MHSA)模块替换Bottleneck中的卷积。而MHSA的结构示意图见下图。

一般来说,ResNet包含4个阶段,即[c2, c3, c4, c5],它们分别对应stride=[4,8,16,32]尺寸的特征。[c2,c3,c4,c5]分别由多个Bottleneck模块构成,比如ResNet50中的数量分别为[3,4,6,3]。ResNet50与BoTNet50的结构信息对比见下表。

本文与现有自注意力机制方法的一个区别在于:以Vit、SAN等为代表的自注意力机制参与到ResNet的各个阶段的Bottleneck中取了;而BoTNet则只是参与到c5阶段的Bottleneck。为什么会这种设计呢?原因分析如下:

本文的目的是采用注意力提升实例分割模型的性能,而实例分割模块的输入通常比较大(比如)。考虑到自注意力机制的计算量与内存占用问题,本文采用了上述最简单的配置方式:即旨在最小分辨率特征c5阶段添加自注意力模块。而c5部分只包含3个Bottleneck,每个Bottleneck包含一个卷积,采用MHSA替换该卷积即可得到本文所涉及的BoTNet。而c5的第一个Bottleneck中的卷积stride=2,而MHSA模块并不支持stride操作,故而本文词用均值池化进行下采样。而Stride=2版本的BoT模块则如下图所示。

为更好的使得注意力机制存在位置相关性,基于Transformer的架构引入了Position Encoding。而之前赵恒爽、贾佳亚等人提出的SAN方案已经证实了位置编码在视觉任务中的有效性,故而本文所设计的BoT模块中同样引入了与位置相关的自注意力机制

最后,我们附上不同配置的网络架构示意图,见下图。

Experiments

为更好的说明所提方案的有效性,我们在实例分割、目标检测等任务上对其进行了论证。

我们先来看一下COCO实例分割上的效果,结果见上表。从上表可以看到:在12epoch训练周期下,相比ResNet50,BoTNet50取得了有效的性能提升;而更长周期的训练可以得到更为显著的性能改善

与此同时,为说明位置编码的重要性,本文对其进行了消融实验分析,结果见上表。可以看到:内容注意力机制可以取得0.6AP性能提升,而位置注意力机制可以取得1.0AP性能提升;而两者的组合则可以取得1.5AP性能提升。这说明内容与位置注意力具有互补性

此外,本文还针对“为什么要替换c5中所有Bottleneck的卷积?”的问题进行消融实验分析,结果见上表。很明显,全部替换带来的性能提升更大,且推理延迟代价很小。通过对比BoT50与BoT101还得出:自注意力机制的替换比堆叠卷积更有效

在上述基础上,作者还引入了多尺度jitter配置,可以看到BoT50还可以进一步的加剧性能提升。

另外,作者还将所提方法与非局部注意力机制进行了对比,结果见上表。可以看到:BoT模块带来的性能提升要比NL模块的提升更大;此外还可以看到:同时替换c4与c5还可以取得进一步的性能提升

最后,我们再来看一下在图像分类任务上所提方法与其他方案(包含SENet、EfficientNet、ViT、DeiT)的性能对比,结果见上表与下表。可以看到:BoTNet取得了比DeiT-384更好的结果,这说明:混合模型可以同时利用卷积与自注意力的特性,取得优于纯注意力模型的效果

全文到此结束,更多消融实验分析建议查看原文,强烈建议感兴趣的同学去研读一下原文。

Code

另外吐槽一点:本文尚未提供预训练模型,不过提供了Tensorflow和Pytorch实现(Pytorch为第三方)。这里提供一下核心的code,实现如下。

def MHSA(featuremap, pos_enc_type='relative', use_pos=True):    q = group_pointwise(      featuremap, proj_factor=1, name='q_proj', heads=heads,      target_dimension=bottleneck_dimension)  k = group_pointwise(      featuremap, proj_factor=1, name='k_proj', heads=heads,      target_dimension=bottleneck_dimension)  v = group_pointwise(      featuremap, proj_factor=1, name='v_proj', heads=heads,      target_dimension=bottleneck_dimension)  assert pos_enc_type in ['relative', 'absolute']  o = relpos_self_attention(        q=q, k=k, v=v, relative=use_pos, fold_heads=True)  return o
def group_pointwise(  featuremap, proj_factor=1, name='grouppoint',  heads=4, target_dimension=None):  """1x1 conv with heads."""  with tf.variable_scope(name, reuse=tf.AUTO_REUSE):    in_channels = featuremap.shape[-1]    if target_dimension is not None:      proj_channels = target_dimension // proj_factor    else:      proj_channels = in_channels // proj_factor    w = tf.get_variable(        'w',        [in_channels, heads, proj_channels // heads],        dtype=featuremap.dtype,        initializer=tf.random_normal_initializer(stddev=0.01))    out = tf.einsum('bHWD,Dhd->bhHWd', featuremap, w)    return out
def relative_logits(q):  """Compute relative position enc logits."""  with tf.variable_scope('relative', reuse=tf.AUTO_REUSE):    bs, heads, h, w, dim = q.shape    int_dim = dim.value    # Note: below, we passed stddev arg as mean for the initializer.    # Providing code as is, with this small error.    # right way: normal_initializer(stddev=int_dim**-0.5)# Relative logits in width dimension.    rel_emb_w = tf.get_variable(        'r_width', shape=(2*w - 1, dim),        dtype=q.dtype,        initializer=tf.random_normal_initializer(int_dim**-0.5))    rel_logits_w = relative_logits_1d(      q=q, rel_k=rel_emb_w,      transpose_mask=[0, 1, 2, 4, 3, 5])# Relative logits in height dimension.    rel_emb_h = tf.get_variable(        'r_height', shape=(2*h - 1, dim),        dtype=q.dtype,        initializer=tf.random_normal_initializer(int_dim**-0.5))    rel_logits_h = relative_logits_1d(        q=tf.transpose(q, [0, 1, 3, 2, 4]),        rel_k=rel_emb_h,        transpose_mask=[0, 1, 4, 2, 5, 3])    return rel_logits_h + rel_logits_wdef relpos_self_attention(  *, q, k, v, relative=True, fold_heads=False):  """2D self-attention with rel-pos. Add option to fold heads."""  bs, heads, h, w, dim = q.shape  int_dim = dim.value  q = q * (dim ** -0.5) # scaled dot-product  logits = tf.einsum('bhHWd,bhPQd->bhHWPQ', q, k)  if relative:    logits += relative_logits(q)  weights = tf.reshape(logits, [-1, heads, h, w, h * w])  weights = tf.nn.softmax(weights)  weights = tf.reshape(weights, [-1, heads, h, w, h, w])  attn_out = tf.einsum('bhHWPQ,bhPQd->bHWhd', weights, v)  if fold_heads:    attn_out = tf.reshape(attn_out, [-1, h, w, heads * dim])  return attn_out

点个在看 paper不断!

【干货】CNN与Transformer的强强联合!谷歌最新开源BoTNet,ImageNet达84.7%准确率相关推荐

  1. CNN 与 Transformer 的强强联合!谷歌最新开源 BoTNet,ImageNet 达 84.7%准确率

    Conv+Transformer=BotNet,这是伯克利.谷歌最新提出的工作BotNet,它充分利用了CNN与自注意力的优势,在ImageNet上取得了84.7%的top1精度,同时文中各种实验分析 ...

  2. 谷歌最新开源前端框架了解一下?前端小白都能看懂的8本书

    导读:跨平台.免费.开源,谷歌又搞"大新闻"?谷歌最新前端开发框架Flutter1.0版本已发布,可以极速构建漂亮的原生应用.各位前端大神都在用什么开发?下面八本书会帮助你快速入门 ...

  3. 谷歌最新开源BundleTrack: 无需任何CAD模型的6D物体姿态跟踪算法

    视频地址:在公众号「3D视觉工坊」,后台回复「谷歌X实习生」,即可直接下载. 最近,谷歌X的实习生Bowen Wen新开源了用于6D物体姿态跟踪的代码BundleTrack,该工作已经被今年的IEEE ...

  4. 谷歌最新开源的工具可以自动化查找并修复 bug!

    作者 | h4cd 本文经授权转自开源中国 近日,谷歌开源了一个模糊测试基础设施--ClusterFuzz,可以非常简单地自动化查找并修复程序中的 bug. 模糊测试是一种用于自动化检测软件中存在的问 ...

  5. YOLOv7改进Transformer主干系列:最新结合BoTNet Transformer结构,一种简单却功能强大的backbone,自注意力提高模型性能

  6. 谷歌重磅开源新技术:5行代码打造无限宽神经网络模型,帮助“打开ML黑匣子”...

    鱼羊 假装发自 凹非寺 量子位 报道 | 公众号 QbitAI 只要网络足够宽,深度学习动态就能大大简化,并且更易于理解. 最近的许多研究结果表明,无限宽度的DNN会收敛成一类更为简单的模型,称为高斯 ...

  7. AI圈真魔幻!谷歌最新研究表明卷积在NLP预训练上竟优于Transformer?LeCun暧昧表态...

    作者 | 陈大鑫.琰琰 转自:AI科技评论 AI 圈太是太魔幻了! 众所周知,近一年来Transformer火的很,把Transformer用在视觉领域真是屡试不爽,先是分类后是检测,等等等等,每次都 ...

  8. CVPR 2021 比CNN和Transformer更好的Backbone?伯克利谷歌提出BoTNet,精度达84.7%

    本篇分享论文『Bottleneck Transformers for Visual Recognition』,由 UC Berkeley & Google Research(Transform ...

  9. 正面刚CNN,Transformer居然连犯错都像人类

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 梦晨 水木番 发自 凹非寺 量子位 报道 | 公众号 QbitAI ...

最新文章

  1. udp_socket聊天器demo
  2. 解决Eclipse、Android Studio ADT AVD不能检测到手机
  3. gearman mysql编译_gearman初探(一、编译和安装)
  4. 管理多个Java安装
  5. 远控免杀专题(24)-CACTUSTORCH免杀
  6. 何恺明“终结”ImageNet预训练时代:从0开始训练神经网络,效果比肩COCO冠军
  7. 从零基础入门Tensorflow2.0 ----一、3.3 实战深度神经网络(激活函数)
  8. QCC3005 实现iphone手机banner显示电量图标
  9. 卫星地面站空间分集的必要性及解决方案
  10. 八月实施:电动自行车3c认证,电动自行车CCC认证费用周期,办理电动自行车ccc认证机构
  11. 高中数学立体几何知识点总结(八大定理)
  12. c语言及格率函数,求及格率的代码为什么不行。
  13. mac 电脑 java wifi密码尝试器
  14. 在WORD中批量修改图片大小
  15. 数据处理--图片像素点聚类
  16. 2020-09-10 MYSQL按时间段分组查询当天,每小时,15分钟数据分组
  17. S7Net 读写西门子1500
  18. linux+gunzip解压命令,Linux中的Gunzip命令详解
  19. python自动调整格式_pycharm使用技巧——自动调整代码格式汇总
  20. 等差数列和等比数列的公式、法则、定理

热门文章

  1. 【组队学习】【32期】深入理解计算机系统
  2. 【青少年编程】【答疑】控制Scratch异步代码的执行顺序
  3. 【蓝桥杯】【入门题】【算法提高VIP】1480:模拟计算器
  4. 刻意练习:Python基础 -- Task12. 模块
  5. Strategy_Level2
  6. Roberts 边缘检测
  7. 【ACM】连续出现的字符
  8. 区分 欧几里得距离 曼哈坦距离 明考斯基距离
  9. 程序员会懂的冷笑话:各大编程语言的内心独白
  10. 小白也能看懂:一文学会入门推荐算法库 surprise