昨天端午节,朋友们有没有吃粽子吖~
这是一篇 2021 年的文章,也是看其它文章的参考文献摸过来的。但其实这篇文章去年 5 月份看过了,也做了笔记,奈何当时没写博文,遂今个赶出来,也梳理下,毕竟忘得差不多了哈。
本文提出基于 Transformer 的网络:TransVG,用于视觉定位——根据输入的语言找到图像中的对应目标区域。当前 SOTA 的一阶段和二阶段模型依赖于复杂的手工模块来执行 query 推理和多模态融合。然而,多融合机制中某些模块的设计,例如 query 解耦和图像场景图使得模型很容易拟合特定的场景,从而限制视觉-语言上下文的充分交互。于是本文提出基于 Transformer 的多模态关联。实验表明复杂的融合模块,例如模块化的注意力网络、动态图、多模态树能被堆叠的 Transformer 编码器层替代。此外,将视觉定位任务视为坐标回归问题,从而避免了一系列 mask 的预测。实验表明 TransVG 效果很好。
首先给出视觉定位的定义,然后对现有方法进行分类:双阶段,单阶段。如下图所示:
两阶段方法:首先产生一组区域 proposal,然后根据区域-表达式的匹配结果选择最合适的 proposal。单阶段方法:在目标检测器的中间层执行视觉语言融合,输出最高分数的 box。接下来是一些方法的举例。
然而多融合机制中某些手工设计的模块使得模型很容易拟合特定的场景,从而限制视觉-语言上下文的充分交互。此外,即使视觉定位的目的是去定位指代的目标,大多数方法以一种非直接的方式来实现。例如预先定义一系列 region proposals 或稠密的 anchors,因此这些方法很容易受到这些先验的影响。
本文引入基于 Transformer 的 TransVG 网络来避免上述问题。实验表明结构化的融合模块能够被堆叠的 Transformer 编码器层替代。此外,直接回归 box 的坐标进行定位而不是选择候选的 boxes。
TransVG 流程如图 1 c)所示:首先将 RGB 和语言表达式送入两个结构相同的分支:视觉分支、语言分支,由 Transformer 模块组成,来建模视觉和语言内的全局线索。之后,融合提取出的视觉和语言 tokens,送入视觉-语言 Transformer 块执行跨模态的关系推理。最后直接回归出指代目标的 box。数据集:ReferItGame、Flickr30K Entities、RefCOCO、RefCOCO+、RefCOCOg。实验表明效果很好。
本文贡献总结如下:
第一阶段生成区域 proposals,第二阶段利用语言表达式选择最匹配的 proposal。而 proposals 要么采用无监督的方法或者预训练的检测器得出。训练损失要么是二分类或最大化正样本目标-query 对的相似度得分。
单阶段方法剔除了 proposal 的生成及区域特征提取。取而代之的是语言上下文和视觉特征进行的深度融合。得到语言-视觉特征图之后,以滑动的方式执行 bounding box 的预测。方法举例:FAOA、RCCF、ReSC。
Transformer 首次提出用于解决神经机器翻译的问题,相比于 RNN,注意力机制能够更好地处理长序列问题。这一特性使得 Transformer 在 NLP 任务和语言识别任务中被广泛使用。
DETR、ViT、IPT。
主要是预训练模型,image-text matching (ITM)、word-region alignment (WRA)、masked language modeling (MLM)、masked region modeling (MRM)。
Visual-Linguistic Pre-training(VLP)旨在学习图像文本的共同表示,方便泛化到下游任务中。本文关注于开发一种基于 Transformer 的视觉定位框架,在小量的视觉定位数据下学习执行多模态异构推理。
如上图所示,给定输入的图像+语言表达式,将其送入到视觉和语言分支,分别得到它们的 embedding。之后聚合这些 embedding,并添加一个可学习的 token [REG] 来构建视觉-语言融合模块的输入。在自注意力机制的作用下,视觉-语言 Transformer 同时从不同的模态中 embed 输入的特征到公共的语义空间上。最后,[REG] token 在预测头中用于预测指代目标的 4D 坐标。
想必大家都很了解 Transformer的结构,这里只列一些公式加深巩固。qeury embedding、key embedding、value embedding 分别用 f q f^q fq、 f k f^k fk、 f v f^v fv 表示,单头注意力层计算如下:
Atn ( f q , f k , f v ) = softmax ( f q f k d k ) ⋅ f v \text{Atn}(f^q,f^k,f^v)=\text{softmax}(\frac{f^qf^k}{\sqrt{d^k}})\cdot f^v Atn(fq,fk,fv)=softmax(dkfqfk)⋅fv d k d^k dk 是 f k f^k fk 的通道维度。注意:本文仅使用 Transformer 编码器层。
接下来是多头自注意力层和前向传播模块 FFN,由 MLP + ReLU 激活层组成。当然,还有残差结构。用公式表示如下:
x n ′ = LN ( x n + F MSA ( x n ) ) x n + 1 = LN ( x n ′ + F FFN ( x n ′ ) ) \begin{aligned} x_{n}^{\prime}& =\operatorname{LN}(x_n+\mathcal{F}_{\text{MSA}}(x_n)) \\ x_{n+1}& =\operatorname{LN}(x'_n+\mathcal{F}_{\operatorname{FFN}}(x'_n)) \end{aligned} xn′xn+1=LN(xn+FMSA(xn))=LN(xn′+FFFN(xn′))其中输入为 x n x_n xn, L N ( ⋅ ) LN(\cdot) LN(⋅) 为归一化层, F M S A ( ⋅ ) \mathcal{F}_{MSA}(\cdot) FMSA(⋅) 为多头自注意力层, F FFN ( ⋅ ) \mathcal{F}_{\operatorname{FFN}}(\cdot) FFFN(⋅) 为前向传播网络。
四个主要结构:视觉分支、语言分支、视觉-语言融合分支、预测头。
视觉分支由一个卷积 backbone 网络 ResNet 组成,跟着一个堆叠 6 层 Transformer 编码器层的 Transformer 组成。每个 Transformer 包含一个多头自注意力层(8 头)、FFN(2 层 FC + ReLU)。FFN 中两层 FC 的输出维度分别是 2048 和 256。
给定单张图像 z 0 ∈ R 3 × H 0 × W 0 z_{0}\in\mathbb{R}^{3\times H_{0}\times W_{0}} z0∈R3×H0×W0 作为输入,利用 Backbone 网络生成 2D 特征图 z ∈ R C × H × W z\in\mathbb{R}^{C\times H\times W} z∈RC×H×W。通常来说, C = 2048 C=2048 C=2048,2D 特征图的宽度和高度是其原始图像尺寸的 1 32 \frac{1}{32} 321,即 H = H 0 32 H=\frac{H_0}{32} H=32H0、 W = W 0 32 W=\frac{W_0}{32} W=32W0。之后利用 1 × 1 1\times1 1×1 卷积层减少 z z z 的通道维度到 C v = 256 C_v=256 Cv=256,得到 z ′ = R C v × H × W z'=\mathbb{R}^{C_v\times H\times W} z′=RCv×H×W。接下来进一步展平 z ′ z' z′ 到 z v ∈ R C v × N v z_v\in\mathbb{R}^{C_v\times N_v} zv∈RCv×Nv,其中 N v = H × W N_v=H\times W Nv=H×W 为输入 tokens 的数量。
和一般的 Transformer 类似,在每层 Transformer 解码器层给 query 和 key 添加正弦位置编码。最后视觉分支的输出为 f v f_v fv,形状与 z v z_v zv 相同。
语言分支结构与视觉分支相同,包含一个 token embedding 层和一个语言 Transformer BERT。输出维度为 C l = 768 C_l=768 Cl=768。
给定语言表达式作为输入,首先将每个单词转化为 one-hot 向量。之后在 token embedding 层,通过查找 tokens 表将每个 one-hot 向量转化为语言 token。在开始和结尾的 token 处增加 [CLS] 和 [SEP] token。最后将语言 tokens 送入语言 Transformer,得到语言 embedding f l ∈ R C v × N l f_l\in\mathbb{R}^{C_v\times N_l} fl∈RCv×Nl,其中 N l N_l Nl 为语言 tokens 的数量。
视觉语言融合模块 visual-linguistic fusion module (简写为 V-L module) ,包含两个线性投影层(分别对应视觉和语言分支的输出)和一个堆叠 6 层 Transformer 编码器的视觉语言 Transformer 组成。
给定视觉分支的输出 token f v ∈ R 256 × N v f_v\in\mathbb{R}^{256\times N_v} fv∈R256×Nv 和语言分支的输出 token f l ∈ R 768 × N l f_l\in\mathbb{R}^{768\times N_l} fl∈R768×Nl。首先利用线性投影层将其映射到相同的维度上 p v ∈ R C p × N v p_v\in\mathbb{R}^{C_p\times N_v} pv∈RCp×Nv 和 p l ∈ R C p × N l p_l\in\mathbb{R}^{C_p\times N_l} pl∈RCp×Nl,其中 C p = 256 C_p=256 Cp=256。之后,添加一个可学习的 embedding [REG] 到 p v p_v pv 和 p l p_l pl 上。视觉语言 Transformer 的联合 tokens 输入构建如下:
x 0 = [ p v 1 , p v 2 , ⋯ , p v N v ⏟ visual tokens p v , p l 1 , p l 2 , ⋯ , p l N l ⏞ , p r ] x_0=[\underbrace{p_v^1,p_v^2,\cdots,p_v^{N_v}}_{\text{visual tokens} ~p_v},\overbrace{p_l^1,p_l^2,\cdots,p_l^{N_l}},p_r] x0=[visual tokens pv pv1,pv2,⋯,pvNv,pl1,pl2,⋯,plNl ,pr]其中 p r ∈ R C p × 1 p_r\in\mathbb{R}^{C_p\times 1} pr∈RCp×1 表示 [REG] token,在训练开始时随机初始化, x 0 ∈ R C p × ( N v + N l + 1 ) x_0\in\mathbb{R}^{C_p\times(N_v+N_l+1)} x0∈RCp×(Nv+Nl+1)。同样的,在每层 Transformer 编码器层为输入添加可学习的位置编码。
利用 V-L 模块的输入状态 [REG] token 作为预测头的输入。为执行 box 坐标回归,在 [REG] token 上添加一个回归块,由一个包含两个 ReLU 激活函数的 MLP 和一个线性输出层组成。预测头的输出为 4D box 坐标。
当尝试预测大的 box 时,smooth L1 损失值往往比较大,反之较小。于是本文通过缩放图像来归一化 GT 坐标,并利用 GIoU 作为损失函数,这并不会被尺寸缩放所影响。
设预测的 box 为 b = ( x , y , w , h ) b=(x,y,w,h) b=(x,y,w,h),归一化后的 GT box 为 b ^ = ( x ^ , y ^ , w ^ , h ^ ) \hat b =(\hat{x},\hat{y},\hat{w},\hat{h}) b^=(x^,y^,w^,h^),TransVG 的训练目标为:
L = L smooth-11 ( b , b ^ ) + λ ⋅ L giou ( b , b ^ ) \mathcal{L}=\mathcal{L}_{\text{smooth-11}}(b,\hat{b})+\lambda\cdot\mathcal{L}_{\text{giou}}(b,\hat{b}) L=Lsmooth-11(b,b^)+λ⋅Lgiou(b,b^)其中 L smooth-11 ( ⋅ ) \mathcal{L}_{\text{smooth-11}}(\cdot) Lsmooth-11(⋅) 和 L giou ( ⋅ ) \mathcal{L}_{\text{giou}}(\cdot) Lgiou(⋅) 分别为 smooth L1 损失和 GIoU 损失, λ \lambda λ 为平衡这两个损失的 GIoU 权重系数。
ReferItGame、Flickr30K Entities、RefCOCO/ RefCOCO+/ RefCOCOg。
输入图像尺寸: 640 × 640 640\times640 640×640,表达式的最大长度 40 40 40。保持图像原始比例不变,长边为 640 640 640,短边用 RGB 通道的平均值填充到 640 640 640。当输入语言 query 的长度大于 38 38 38 时,除去多余的,留下两个位置给 [CLS] 和 [SEP],否则在 [SEP] 后用空的 token 填充到 40 40 40。
TransVG 为端到端训练,AdamW 优化器。V-L 模块和预测头的初始学习率 1 0 − 4 10^{-4} 10−4,视觉和语言分支的初始学习率 1 0 − 5 10^{-5} 10−5,权重衰减为 1 0 − 4 10^{-4} 10−4。视觉分支的 backbone 和编码器采用 DETR 模型(好家伙,buff 叠满了是吧)初始化,语言分支采用 BERT 的基础模型进行初始化。其它结构的参数采用 Xavier init 随机初始化。在除了 Flickr30K Entities 的数据集上,训练 90 epochs,在 60 个 epochs 后,学习率下降 10 个百分点。而在 Flickr30K Entities 数据集上,训练 60 个 epochs,在 40 个 epochs 后,学习率下降。Batch_size 64。权重系数 λ = 1 \lambda=1 λ=1。Transformer 中的 dropout ratio 默认为 0.1。
由于 TransVG 直接输出 box 的坐标,因此推理过程无需额外操作。
评估指标:top-1 accuracy(%):当预测的 box 与 GT box 重叠超过 0.5 时,即认为正确预测(额,不计算 IoU 么?)。
同上表 1。
ResNet-50 作为视觉分支的 backbone,所有比较在训练 90 90 90 个 epochs 后进行。
(要在 [REG] 等类似提示词上进行随机初始化的原因找到啦:相比于其它初始化方法,随机初始化不会引入太多其它模态的相关 bias。)
本文提出基于 Transformer 的 TransVG 用于视觉定位。实验表明 TransVG 的能力很强。
写在后面
这篇文章在现在看来可能指标被刷了,但是在当时情况下,应该是最优秀的了,以至于凭一己之力还守了一下后续预训练大模型的大门