0. 简介

对于视觉SLAM而言,除了使用特征点法来完成VIO以外,还可以使用光流法来完成VIO的估计。而传统的光流法受环境,光照变化严重,所以有时候会出现光流偏差等问题。所以现在有越来越多的工作朝着深度学习的方向扩展,比如说这一篇文章《FlowFormer: A Transformer Architecture for Optical Flow》,目前已经被ECCV 2022收录。这里作者也在Github上开源了该项目的代码:https://github.com/drinkingcoder/FlowFormer-Official。FlowFormer的整个流程如下:首先由图像对构建4D cost volume成本编码,将成本编码到一个新的潜在空间中具有交替组转换器(AGT)层的成本内存中,并通过一个带有动态位置成本查询的循环Transform解码器对位置 cost queries进行解码。

[video(video-isPOEHN3-1665884935091)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=644430425)(image-https://img-blog.csdnimg.cn/img_convert/e995c0936c7ef281c3bfdd3e7e4645ac.jpeg)(title-ECCV2022 | FlowFormer: 一种基于transformer架构的光流!性能SOTA)]

1. 文章贡献

作为一种基于Transformer的神经网络架构,主要目的是通过深度学习直接输出光流的图像。文中指出贡献可以概括为四个方面:

1) 我们提出了一种新的基于Transform的神经网络结构FlowFormer,用于光流量估计,它实现了最先进的流量估计性能。

2) 设计了一种新颖的cost volume编码器,有效地将成本信息聚合为紧凑的潜在cost tokens。

3) 我们提出了一种循环成本解码器,该解码器通过动态位置成本查询循环解码成本特征,迭代细化估计光流。

4) 据我们所知,我们第一次验证imagenet预先训练的传输

2. 详细内容

下面我们将对原文的第三部分进行解析,并分析这篇文章的重点部分。首先我们需要明白光流的估计任务需要输出每像素位移场\mathbf{f}:\mathbb{R}^2 \rightarrow \mathbb{R}^2。这样的目的是为了充分将源图像x \in \mathbb{R}^2的二维空间中的位置\mathbf{I}_s,映射到目标图像的\mathbf{I}_t位置。具体的转换关系如下\mathbf{p}=x+\mathbf{f}(x)。同时为了充分使用现有的视觉Transformer的方法以及之前基于CNN架构的光流估计方法中广泛使用的4D成本量(cost volume)。所以作者团队使用Transformer来对4D成本量进行编码和解码以实现精确的光流估计。下图就是整个FlowFormer的总体架构。它通过两个主要部分处理来自siamese特征的4D成本量。1)成本体积(cost volume)编码器,将4D成本量编码到一个潜在的空间,形成成本记忆(cost memory);2)成本记忆解码器,根据编码的成本记忆和上下文特征预测每像素的位移场。

我们下面来详细的看一看这三个部分

2.1 构建4D成本量

骨干网用于从输入H_I × W_I × 3的RGB图像中提取出H ×W ×D_f特征图,通常我们设置(H, W) = (H_I /8, W_I /8)。在提取出源图像和目标图像的特征图后,通过计算源图像和目标图像之间所有像素对的点积相似度,构造H × W × H × W的4D成本量。

2.2 4D成本量解码

为了估计光流,文中需要根据4D成本量中编码的源视觉和目标视觉相似性来识别源像素在目标图像中的相应位置。构建的4D成本量可以看作是一系列大小为H×W的2D成本图,每个成本图测量单个源像素和所有目标像素之间的视觉相似性。我们将源像素x的成本图表示为\mathbf{M}_x∈\mathbb{R}^{H×W}。在此类成本图中找到相应位置通常是一项挑战,因为在两幅图像中可能存在重复模式和非区分区域。当仅考虑地图局部窗口的成本时,这项任务变得更具挑战性,就像以前基于CNN的光流估计方法所做的那样。即使在估计单个源像素的精确位移时,考虑其上下文源像素的成本图也是有益的。

为了解决这一难题,我们提出了一种基于Transformer的成本体积编码器,该编码器将整个成本体积编码到成本内存中。我们的成本卷编码器包括三个步骤:1)成本映射补丁化,2)成本补丁嵌入,3)成本内存编码。我们详细阐述这三个步骤如下。

  1. 成本映射补丁化:根据现有的视觉变换器,我们修补了成本图\mathbf{M}_x∈\mathbb{R}^{H×W}对于每个源像素x的跨步卷积,从而获得成本补丁嵌入序列。具体来说,给定一个H×W成本图,我们首先在其右侧和底部填充零,使其宽度和高度乘数为8。然后,填充的成本图通过三个步长为2卷积的堆栈和ReLU转换为特征映射\mathbf{F}_x∈\mathbb{R}^{[H/8]×[W/8]×D_p}。特征图中的每个特征代表输入成本图中的一个8×8的补丁。三种卷积的输出通道均为D_p / 4, D_p / 2 以及 D_p

  2. 基于潜在汇总(latent summarizations)的补丁特征标记:尽管拼接会为每个源像素生成一系列代价高昂的补丁特征向量,但此类补丁特征的数量仍然很大,阻碍了不同源像素之间的信息传播效率。实际上,成本图是高度冗余的,因为只有少数高代价成本才是最有用的。为了获得更紧凑的成本特征,我们通过K个潜在编码(latent codewords query)\mathbf{C}∈\mathbb{R}^{K×D},来进一步总结了每个源像素x的补丁特征\mathbf{F}_x。具体来说,通过潜在编码来查询每个源像素的代价补丁特征,并通过点积注意机制将每个代价映射,进一步总结为一个D维度的K个潜在向量。潜在编码\mathbf{C}∈\mathbb{R}^{K×D}是随机初始化的,并通过反向传播进行更新,且在所有源像素之间共享。归纳F_x的潜在表征T_x(4D cost volume)得到为:

    在投影成本-补丁特征F_x以获取密钥K_x和值V_x之前,将补丁特征与位置嵌入序列\mathbf{PE}∈\mathbb{R}^{[H/8]×[W/8]×D_p}进行拼接。给定一个2D位置\mathbf{p},我们将其编码为一个长度为D_p的位置嵌入,并使用COTR方法。最后,通过对查询、键和值进行多头点积注意,可以将源像素x的代价图汇总为K个潜在表示\mathbf{T}_x∈\mathbb{R}^{K×D}一般来说K×D≪ H×W的大小,并且潜在汇总T_x为每个源像素x提供了比每个H×W成本图更紧凑的表示。对于图像中的所有源像素,总共有(H×W)2D成本图。因此,它们的汇总表示可以转换为潜在的4D成本量\mathbf{T}∈\mathbb{R}^{H×W×K×D}

  3. 关注潜在cost空间:上述两个阶段将原始的4D成本体积转化为潜在的、紧凑的4D成本体积t。但是,直接对4D体积中的所有向量应用自注意仍然过于昂贵,因为计算成本随tokens数量的增加呈二次增长。如图2所示,我们提出了一种交替分组转换层(AGT),该层以两种相互正交的方式对标记进行分组,并在两组中交替应用注意,减少了注意成本,同时仍然能够在所有标记之间传播信息。

    对每个源像素进行第一次分组,即每个\mathbf{T}_x∈\mathbb{R}^{K×D}组成一个组,在每个组内进行自我注意力机制

    其中,T_x(i)表示编码源像素x的成本图的第i个潜在表示。在对每个源像素x的所有K个潜在标记进行自我注意力机制后,更新T_x并通过前馈网络(FFN)进一步变换,然后重新组织,形成更新的4D成本量T。自我注意力机制和FFN子层都采用Transformer残差连接和层归一化的共同设计。这种自我注意力机制可以在每个成本图中传播信息,我们将其命名为内部代价图的自我注意力。

    第二种方法将所有潜在成本标记\mathbf{T}∈\mathbb{R}^{H×W×K×D}根据K个不同潜在表征分为K组。因此,每组都有D维的(H×W)标记,用于通过Twins文章中提出的空间可分离的自我注意(SS-SelfAttention)在空间域中传播信息。

    上述自我注意操作的参数在不同组之间共享,并按顺序进行操作,形成提出的交替组注意层。通过多次叠加交替组Transformer层,潜在成本令牌可以有效地跨源像素和跨潜在表示交换信息,以更好地编码4D成本体积。通过这种方式,我们的成本体积编码器将H × W × H × W 4D成本体积转换为H × W × K且长度为D的潜在标记。我们将最终的H × W × K标记称为成本存储器,用于光流的解码模块。

2.3 用于光流估计的成本记忆解码器

考虑到由成本量编码器编码的成本存储器,我们提出了一种成本存储器的解码器来预测光流。由于输入图像的原始分辨率为H_I×W_I,因此我们以H×W分辨率估计光流,然后使用可学习的凸上采样器将预测的光流上采样到原始分辨率。然而,与以往寻求抽象语义特征的视觉变换器不同,光流估计需要从成本记忆中恢复密集的对应关系。受RAFT方法的启发,我们建议使用成本查询从成本内存中检索成本特征,并使用循环注意解码器层迭代优化流量预测。

成本存储器聚合(Cost memory aggregation)。为了预测H×W的源像素光流,我们生成一系列(H×W)成本查询队列,其中每个查询都负责通过对成本存储器的共同关注,来负责估计单个源像素的光流。为了生成源像素x的成本查询\mathbf{Q}_x,我们首先计算其在目标图像中的相应位置,给出其当前估计流\mathbf{f}(x),即\mathbf{p)=x+\mathbf{f}(x)。然后,我们通过在代价图\mathbf{M}_x上以p为中心进行9×9局部窗口内裁剪代价图,得到q_x = Crop_{9×9}(\mathbf{M}x, \mathbf{p})。 然后根据局部成本\mathbf{Q}_x编码的特征FFN(\mathbf{q}_x)\mathbf{p}的位置嵌入PE(\mathbf{p})构造成本查询\mathbf{Q}_x,通过交叉注意聚合源像素x的成本记忆\mathbf{T}_x信息。

3. 参考链接

https://mp.weixin.qq.com/s/euoOJVD_eSc3KJ93z3jhUA

https://drinkingcoder.github.io/publication/flowformer/