
极市导读
近期,Transformer一改人们对其不适合计算机视觉视觉领域的印象,在几个工作所展现出来性能达CNN的SOTA。本文对Transformer在计算机视觉领域的应用进行了回顾与思考。>>加入极市CV技术交流群,走在计算机视觉的最前沿
自从Transformer出来以后,Transformer便开始在NLP领域一统江湖。而Transformer在CV领域反响平平,一度认为不适合CV领域,直到最近计算机视觉领域出来几篇Transformer文章,性能直逼CNN的SOTA,给予了计算机视觉领域新的想象空间。
本文不拘泥于Transformer原理和细节实现(知乎有很多优质的Transformer解析文章,感兴趣的可以看看),着重于Transformer对计算机视觉领域的革新。
首先简略回顾一下Transformer,然后介绍最近几篇计算机视觉领域的Transformer文章,其中ViT用于图像分类,DETR和Deformable DETR用于目标检测。从这几篇可以看出,Transformer在计算机视觉领域的范式已经初具雏形,可以大致概括为:Embedding -> Transformer -> Head
一些有趣的点写在最后~~
Transformer
Transformer详解
The Illustrated Transformer
https://jalammar.github.io/illustrated-transformer/
打不开的可以关注一下Smarter公众号,回复"Transformer详解"获取文章
下面以机器翻译为例子,简略介绍Transformer结构。
1. Encoder-Decoder
Transformer结构可以表示为Encoder和Decoder两个部分
Encoder和Decoder主要由Self-Attention和Feed-Forward Network两个组件构成,Self-Attention由Scaled Dot-Product Attention和Multi-Head Attention两个组件构成。
Scaled Dot-Product Attention公式:
Multi-Head Attention公式:
Feed-Forward Network公式:
2. Positional Encoding
如图所示,由于机器翻译任务跟输入单词的顺序有关,Transformer在编码输入单词的嵌入向量时引入了positional encoding,这样Transformer就能够区分出输入单词的位置了。
引入positional encoding的公式为:
是位置, 是维数, 是输入单词的嵌入向量维度。
3. Self-Attention
3.1 Scaled Dot-Product Attention
在Scaled Dot-Product Attention中,每个输入单词的嵌入向量分别通过3个矩阵 , 和 来分别得到Query向量( ),Key向量( )和Value向量( )。
如图所示,Scaled Dot-Product Attention的计算过程可以分成7个步骤:
-
每个输入单词转化成嵌入向量。 -
根据嵌入向量得到 , , 三个向量。 -
通过向量计算 : 。 -
对 , 进行归一化,即除以 。 -
通过 激活函数计算 。 -
点乘Value值 ,得到每个输入向量的评分 。 -
所有输入向量的评分 之和为 : 。
上述步骤的矩阵形式可以表示成:
与Scaled Dot-Product Attention公式一致。
3.2 Multi-Head Attention
如图所示,Multi-Head Attention相当于h个不同Scaled Dot-Product Attention的集成,以h=8为例子,Multi-Head Attention步骤如下:
-
将数据 分别输入到8个不同的Scaled Dot-Product Attention中,得到8个加权后的特征矩阵 。 -
将8个 按列拼成一个大的特征矩阵。 -
特征矩阵经过一层全连接得到输出 。
Scaled Dot-Product Attention和Multi-Head Attention都加入了short-cut机制。
ViT
ViT将Transformer巧妙的应用于图像分类任务,更少计算量下性能跟SOTA相当。
Vision Transformer(ViT)将输入图片拆分成16x16个patches,每个patch做一次线性变换降维同时嵌入位置信息,然后送入Transformer,避免了像素级attention的运算。类似BERT[class]标记位的设置,ViT在Transformer输入序列前增加了一个额外可学习的[class]标记位,并且该位置的Transformer Encoder输出作为图像特征。
其中 为原图像分辨率, 为每个图像patch的分辨率。 为Transformer输入序列的长度。
ViT舍弃了CNN的归纳偏好问题,更加有利于在超大规模数据上学习知识,即大规模训练优归纳偏好,在众多图像分类任务上直逼SOTA。
DETR
DETR使用set loss function作为监督信号来进行端到端训练,然后同时预测所有目标,其中set loss function使用bipartite matching算法将pred目标和gt目标匹配起来。直接将目标检测任务看成set prediction问题,使训练过程变的简洁,并且避免了anchor、NMS等复杂处理。
DETR主要有两个部分:architecture和set prediction loss。
1. Architecture
DETR先用CNN将输入图像embedding成一个二维表征,然后将二维表征转换成一维表征并结合positional encoding一起送入encoder,decoder将少量固定数量的已学习的object queries(可以理解为positional embeddings)和encoder的输出作为输入。最后将decoder得到的每个output embdding传递到一个共享的前馈网络(FFN),该网络可以预测一个检测结果(包括类和边框)或着“没有目标”的类。
1.1 Transformer
1.1.1 Encoder
将Backbone输出的feature map转换成一维表征,得到 特征图,然后结合positional encoding作为Encoder的输入。每个Encoder都由Multi-Head Self-Attention和FFN组成。
和Transformer Encoder不同的是,因为Encoder具有位置不变性,DETR将positional encoding添加到每一个Multi-Head Self-Attention中,来保证目标检测的位置敏感性。
1.1.2 Decoder
因为Decoder也具有位置不变性,Decoder的 个object query(可以理解为学习不同object的positional embedding)必须是不同,以便产生不同的结果,并且同时把它们添加到每一个Multi-Head Attention中。 个object queries通过Decoder转换成一个output embedding,然后output embedding通过FFN独立解码出 个预测结果,包含box和class。对输入embedding同时使用Self-Attention和Encoder-Decoder Attention,模型可以利用目标的相互关系来进行全局推理。
和Transformer Decoder不同的是,DETR的每个Decoder并行输出 个对象,Transformer Decoder使用的是自回归模型,串行输出 个对象,每次只能预测一个输出序列的一个元素。
1.1.3 FFN
FFN由3层perceptron和一层linear projection组成。FFN预测出box的归一化中心坐标、长、宽和class。
DETR预测的是固定数量的 个box的集合,并且 通常比实际目标数要大的多,所以使用一个额外的空类来表示预测得到的box不存在目标。
2. Set prediction loss
DETR模型训练的主要困难是如何根据gt衡量预测结果(类别、位置、数量)。DETR提出的loss函数可以产生pred和gt的最优双边匹配(确定pred和gt的一对一关系),然后优化loss。
将 表示为gt的集合, 表示为 个预测结果的集合。假设 大于图片目标数, 可以认为是用空类(无目标)填充的大小为 的集合。搜索两个集合 个元素 的不同排列顺序,使得loss尽可能的小的排列顺序即为二分图最大匹配(Bipartite Matching),公式如下:
其中 表示pred和gt关于 元素 的匹配loss。其中二分图匹配通过匈牙利算法(Hungarian algorithm)得到。
匹配loss同时考虑了pred class和pred box的准确性。每个gt的元素 可以看成 , 表示class label(可能是空类) 表示gt box,将元素 二分图匹配指定的pred class表示为 ,pred box表示为 。
第一步先找到一对一匹配的pred和gt,第二步再计算hungarian loss。
hungarian loss公式如下:
其中 结合了L1 loss和generalized IoU loss,公式如下:
ViT和DETR两篇文章的实验和可视化分析很有启发性,感兴趣的可以仔细看看~~
Deformable DETR
从DETR看,还不足以赶上CNN,因为训练时间太久了,Deformable DETR的出现,让我对Transformer有了新的期待。
Deformable DETR将DETR中的attention替换成Deformable Attention,使DETR范式的检测器更加高效,收敛速度加快10倍。
Deformable DETR提出的Deformable Attention可以可以缓解DETR的收敛速度慢和复杂度高的问题。同时结合了deformable convolution的稀疏空间采样能力和transformer的关系建模能力。Deformable Attention可以考虑小的采样位置集作为一个pre-filter突出所有feature map的关键特征,并且可以自然地扩展到融合多尺度特征,并且Multi-scale Deformable Attention本身就可以在多尺度特征图之间进行交换信息,不需要FPN操作。
1. Deformable Attention Module
给定一个query元素(如输出句子中的目标词)和一组key元素(如输入句子的源词),Multi-Head Attention能够根据query-key pairs的相关性自适应的聚合key的信息。为了让模型关注来自不同表示子空间和不同位置的信息,对multi-head的信息进行加权聚合。其中 表示query元素(特征表示为 ), 表示key元素(特征表示为 ), 是特征维度, 和 分别为 和 的集合。
那么Transformer 的 Multi-Head Attention公式表示为:
其中 指定attention head, 和 是可学习参数,注意力权重 并且归一化 ,其中 是可学习参数。为了能够分辨不同空间位置, 和 通常会引入positional embedding。
对于DETR中的Transformer Encoder,query和key元素都是feature map中的像素。
DETR 的 Multi-Head Attention 公式表示为:
其中 。
DETR主要有两个问题:需要更多的训练时间来收敛,对小目标的检测性能相对较差。本质上是因为Transfomer的Multi-Head Attention会对输入图片的所有空间位置进行计算。而Deformable DETR的Deformable Attention只关注参考点周围的一小部分关键采样点,为每个query分配少量固定数量的key,可以缓解收敛性和输入分辨率受限制的问题。
给定一个输入feature map , 表示为query元素(特征表示为),二维参考点表示为 ,Deformable DETR 的 Deformable Attention公式表示为:
其中 指定attention head, 指定采样的key, 表示采样key的总数( )。 , 分别表示第 个采样点在第 个attention head的采样偏移量和注意力权重。注意力权重 在[0,1]的范围内,归一化

