【论文简述】FlowFormer:A Transformer Architecture for Optical Flow(ECCV 2022)

news2024/11/27 13:39:21

一、论文简述

1. 第一作者:Zhaoyang Huang、Xiaoyu Shi

2. 发表年份:2022

3. 发表期刊:ECCV

4. 关键词:光流、代价体、Transformer、GRU

5. 探索动机:现有的方法对代价体的信息利用有限。

6. 工作目标:是否可以结合transFormer和代价体的优势? 

We therefore raise a question: can we enjoy both advantages of transformers and the cost volume from the previous milestones? Such a question calls for designing novel transformer architectures for optical flow estimation that can effectively aggregate information from the cost volume.

7. 核心思想:提出了FlowFormer。

  1. 提出了一种新颖的基于Transformer 的神经网络架构 FlowFormer,用于光流估计,它实现了最先进的流估计性能;
  2. 设计了一种新颖的代价体编码器,有效地将代价信息聚合成紧凑的潜在代价tokens;
  3. 提出了一种循环代价解码器,它通过动态位置代价查询反复解码代价特征,以迭代地改进估计的光流;
  4. 本文第一次验证了imagenet预训练的transformer有利于光流的估计。

8. 实验结果:SOTA

On the Sintel benchmark, FlowFormer achieves 1.159 and 2.088 average end-point-error (AEPE) on the clean and final pass, a 16.5% and 15.5% error reduction from the best published result (1.388 and 2.47). Besides, FlowFormer also achieves strong generalization performance. Without being trained on Sintel, FlowFormer achieves 1.01 AEPE on the clean and pass of Sintel training set, outperforming the best published result (1.29) by 21.7%.

 9.论文&代码下载:

https://arxiv.org/pdf/2203.16194.pdf

https://github.com/drinkingcoder/FlowFormer-Official

二、实现过程

1. 概述

光流估计的任务是输出像素位移场f,将源图像Is的每个二维位置映射到目标图像It的对应二维位置p=x+f(x)FlowFormer是基于transFormer的结构,对4D代价体进行编码和解码,以实现精确的光流估计。结构分为三个步骤,如下图:

  1. 通过siamese结构,得到图像特征,构建4D代价体;
  2. 代价体编码器4D代价体编码到潜在空间中以形成代价记忆;
  3. 循环transformer解码器,用基于编码的代价记忆和上下文特征预测像素位移场。

2. 构建4D代价体

主干网络从输入的HI×WI×3 RGB图像中提取H×W×Df特征图,其中通常设置(H, W) = (HI/8,WI/8)。提取源图像和目标图像的特征图后,计算源图像和目标图像所有像素对的点积相似性,构建4D代价体(H×W×H×W)。

3. 代价体编码器

为了估计光流,需要根据4D代价体中编码的源-目标视觉相似性来识别源像素在目标图像中的对应位置。构建的4D代价体可以被视为一系列大小为H×W2D代价图,每个代价图都测量单个源像素和所有目标像素之间的视觉相似性。我们将源像素x的代价图表示为MxH×W。在这样的代价图中找到相应的位置通常是具有挑战性的,因为两幅图像中可能存在重复模样和不可分辨的区域。当只考虑图的局部窗口的代价时,任务变得更具挑战性,就像之前基于CNN的光流估计方法一样。即使是估计单个源像素的精确位移,考虑其上下文的源像素的代价图也是有益的。

基于transFormer的代价体编码器,将整个代价体编码成代价记忆。代价体编码器由三个步骤组成:1)代价图分块,2)代价图像块Token嵌入,3)代价记忆编码。这三个步骤详述如下。

代价图分块。延续现有的视觉transformer,对每个源像素x的代价图MxH×W进行跨步幅卷积,得到一系列的代价块嵌入。具体来说,给定一个H×W代价图,首先在其右侧和底部填充零,使其宽和高都是8的倍数。然后,通过三个步幅为2的卷积(加上ReLU),将填充的代价图转换为特征图FxH/8×W/8×Dp。特征图中的每个特征表示输入代价图中的一个8×8的图像块。三个卷积的输出通道分别为Dp/4Dp/2Dp。

通过潜在归纳将图像块特征变为Token尽管对每个源像素进行图像块化处理,得到了一系列代价块特征向量,但这种块特征的数量仍然很大,影响了信息在不同源像素之间的传播效率。实际上,代价图是非常冗余的,因为只有少数高代价是最具信息量的。为了获得更紧凑的代价特征,我们进一步通过K个潜在的编码字C∈K×D归纳了每个源像素x的图像块特征Fx。确切地说,潜码字通过点积注意力机制,查询每个源像素的代价块特征,进一步将每个代价图归纳为K个D维的潜在向量。潜码字C∈RK×D是随机初始化的,通过反向传播进行更新,并在所有源像素之间共享。归纳Fx的潜在表示Tx为

在投影代价块特征Fx以获得键Kx和值Vx之前,将块特征与位置嵌入序列连接PEH/8×W/8×Dp。给定一个2D位置p,将其编码为长度为Dp的位置嵌入。最后,通过有查询、键和值进行多头点积注意力,可以将源像素x的代价图归纳为K个潜在表示TxK×D。一般来说,K×DH× W,因此,对于每个源像素x,潜在的总结图Tx比每个H×W代价图提供更紧凑的表示。对于图像中的所有源像素,总共有(H×W)个2D代价图,因此,转换为潜在的4D代价体T∈H×W×K×D。

潜在代价空间注意力。上述两个阶段将原始的4D代价体转化为潜在且紧凑的4D代价体T。但是,直接对4D体中的所有向量应用自注意力成本仍然过于高,因为计算代价会随着token数量的增加而成倍增加。如图2所示,提出了一个交替分组transformer层(AGT),以两种相互正交的方式对token进行分组并在两组中交替应用注意力,这降低了注意力的代价,同时仍然能够在所有token之间传播信息。

对每个源像素进行第一次分组,即每个Tx=K×D组成一个组,在组内进行自注意力。

其中Tx(i)表示用于编码源像素x的代价图的第i个潜在表示。在每个源像素xK个潜在token之间进行自注意力后,更新后的Tx通过前馈网络(FFN)进一步转换,然后重新组织,形成更新后的4D代价体T自注意力和FFN子层均采用transFormer残差连接和层归一化的通用设计。这种自注意力操作在每个代价图中传播信息,将其命名为代价图内自注意力。

第二种方法根据K个不同的潜在表示,将所有的潜在代价tokenTH×W ×K×D分成K组。因此,每个组都有D维的(H×W)token,用于通过Twins中提出的空间可分离的自注意力(SS-SelfAttention)在空间域中传播信息。

这里稍微滥用了符号,将Ti(H×W)×D表示为第i组。然后将更新后的Ti重新组织,得到更新后的4D潜在代价体T此外,视觉上相似的源像素应该具有一致的光流。因此,在生成查询和键时,通过连接源图像的上下文特征t与代价token,将不同源像素之间的外观相似性集成到SS-SelfAttention中。此层称为代价映射间自注意力层,因为它在不同的源像素之间传播代价体信息。

上述自注意力操作的参数在不同的组间共享,并按顺序进行,形成交替组注意力层。通过多次堆叠交替组transFormer层,潜在代价token可以有效地跨源像素和跨潜在表示交换信息,以更好地编码4D代价体。代价体编码器将H×W×H×W 4D代价体转换为H×W×K个长度为D的潜在token。将最终得到的H×W×K个token作为代价记忆,对其进行解码,用于光流估计。

4. 光流估计的代价记忆解码器

与以往寻找抽象语义特征的视觉transFormer不同,光流估计需要从代价记忆中恢复稠密的对应关系。受RAFT的启发,提出使用代价查询从代价记忆中检索代价特征,并使用循环注意力解码器层改进光流预测。

代价记忆聚合。为了预测H×W源像素的光流,生成了一个(H×W)代价查询序列,每个代价查询都负责通过代价记忆的共同注意力来估计单个源像素的光流。为了生成源像素x的代价查询Qx,首先计算其在目标图像中的对应位置,给定其当前估计流f(x),即p= x+f(x)。然后,通过在代价图Mx上以p为中心的9×9局部窗口内裁剪代价,检索一个局部9×9代价图块qx=Crop9×9(Mx, p)。然后根据局部代价Qx编码的特征FFN(Qx)p的位置嵌入PE(p)来制定代价查询Qx, 通过交叉注意力可以聚合源像素x的代价记忆Tx的信息,

交叉注意力从代价记忆中归纳每个源像素的信息,以预测其光流。由于Qx在每次迭代中都是动态更新的,因此称之为动态位置代价查询。键和值可以在开始时生成,并在后续迭代中重复使用,这是循环解码器的一个好处,可以节省计算。

循环光流预测。代价解码器迭代回归光流残差∆f(x),将每个源像素x的光流改进为f(x)←f(x) +∆f(x)采用了ConvGRU模块,并采用了与GMA-RAFT相似的设计进行光流改进。但是,循环模块的关键区别在于使用代价查询自适应地聚合来自代价记忆的信息,更准确的光流估计。具体而言,在每次迭代中,ConvGRU单元将检索到的代价特征和代价图的块的连接Concat(cx, qx)、上下文网络的源图像上下文特征tx和当前估计光流f的连接作为输入,并输出预测的光流残差如下:

每次迭代生成的光流通过凸上采样器上采样到源图像的大小,并在循环迭代中伴随增加权重由真实光流监督。

5. 实验

5.1. 数据集

Sintel,the KITTI-2015,FlyingChairs,FlyingThings and HD1K

5.2. 实现

FlowFormer的图像特征编码器是imagenet预训练的Twins-SVT的前两个阶段,将图像编码为源图像大小1/8的通道Df为256的特征图。代价体编码器将每个代价图分块为Dp=64通道的特征图,并进一步将特征图归纳为K=128维的N=8个代价token。然后,代价体编码器用3层AGT编码代token。

5.3. 基准结果:SOTA

5.4. 参数量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/166883.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMQ 部署及配置详解(集群部署)

RabbitMQ 集群是一个或 多个节点,每个节点共享用户、虚拟主机、 队列、交换、绑定、运行时参数和其他分布式状态。一、RabbitMQ 集群可以通过多种方式形成:通过在配置文件中列出群集节点以声明方式以声明方式使用基于 DNS 的发现以声明方式使用 AWS &…

Java中的LinkedList

文章目录前言一、LinkedList的使用1.1 什么是LinkedList1.2 LinkedList的使用1.2.1 LinkedList的构造1.2.2 LinkedList的其他常用方法介绍1.2.3 LinkedList的遍历二、LinkedList的模拟实现三、ArrayList和LinkedList的区别总结前言 上一节中我们讲解了Java中的链表&#xff0c…

vue3.0中echarts实现中图地图的省份切换,并解决多次切换后地图卡死的情况

一、echarts安装及地图的准备 1、安装echarts npm install echarts2、下载china.js等json文件到项目中的文件夹 map的下载地址&#xff1a; 等审核 二、代码说明 <template><div class"center-body"><div class"map" id"map"…

fork函数详解

文章目录fork函数例子详解工作原理GDB 多进程调试fork函数 fork系统调用用于创建一个新进程&#xff0c;称为子进程&#xff0c;它与进程&#xff08;称为系统调用fork的进程&#xff09;同时运行&#xff0c;此进程称为父进程。创建新的子进程后&#xff0c;两个进程将执行fo…

jvm系列(2)--类加载子系统

目录第2章-类加载子系统内存结构概述简图详细图类加载器子系统类加载器ClassLoader角色类加载过程概述加载阶段链接阶段验证(Verify)准备(Prepare)解析(Resolve)初始化阶段类的初始化时机clinit()1&#xff0c;2&#xff0c;3说明4说明5说明6说明类加载器的分类概述虚拟机自带的…

【web安全】——文件上传的绕过方式

作者名&#xff1a;白昼安全主页面链接&#xff1a; 主页传送门创作初心&#xff1a; 舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座右铭…

价值创造链路及经营计划

“价值创造过程最主要的环节是建立链接&#xff0c;北京万柳书院在网上热议&#xff0c;其背后是人与人的大量链接&#xff0c;近期热议的湖南卫视春晚亦如是&#xff0c;这种链接为价值的设计、沟通、传递创造条件&#xff1b;企业以客户为中心设计产品&#xff0c;往大了说是…

C++ string类的初步了解

目录 一. 为什么学习string类&#xff1f; 1.C语言中的字符串 2.string类 二. string类的常用接口说明 1.构造 2.容量 size和length capacity clear empty reserve resize 3.元素访问 operator[] at front、back 4.迭代器 ​编辑begin、end rbegin、rend …

数据结构初阶:排序

本期博客我们来到了初阶数据结构最后一个知识点&#xff1a;排序 排序&#xff0c;我们从小到大就一直在接触&#xff0c;按身高、成绩、学号等等不同的排序我们已经历许多&#xff0c;那么各位是按怎样的方法进行排序的呢&#xff1f; 废话不多说这期博客我们对各种排序方法…

测试开发 | 测试平台开发-前端开发之数据展示与分析

本文节选自霍格沃兹测试学院内部教材测试平台的数据展示与分析&#xff0c;我们主要使用开源工具ECharts来进行数据的展示与分析。ECharts简介与安装ECharts是一款基于JavaScript的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化…

Unity 使用OpenXR和XR Interaction Toolkit 开发 HTCVive(Vive Cosmos)

Unity 使用OpenXR和XR Interaction Toolkit 开发 HTCVive&#xff08;Vive Cosmos&#xff09; 提示&#xff1a;作者是 Unity 2020.3 以上版本做的开发。开发VR程序需要安装 Steam&#xff0c;SteamVR, (Vive Cosmos,需要再安装VIVEPORT,VIVEConsole) OpenXR 控制设备 &#x…

OpenCV(12)-OpenCV的机器学习

OpenCV的机器学习 基本概念 计算机视觉是机器学习的一种应用&#xff0c;而且是最有价的应用 人脸识别 哈尔(Haar)级联方法深度学习方法(DNN) Haar人脸识别方法 哈尔(Haar)级联方法是专门为解决人脸识别而推出的&#xff0c;在深度学习还不流行时&#xff0c;哈尔已可以商…

Android 深入系统完全讲解(21)

关键性 EGLSurface 代码位置 继续再看看&#xff0c;代码跑到 C 里面去了。 然后关键点&#xff1a; 获取本地窗口&#xff0c;创建 Surface&#xff0c;然后 toEGLHandle 进行包裹&#xff0c;变成 EGL 上下文。 EGLSurface 。 绘制的设计本质逻辑 在这里就回归一点&#xff…

Unity学习笔记--File.ReadAllLines和File.ReadAllText的使用以及注意事项(一定要看到最后!!!)

目录前言一、File.ReadAllLines参数返回例子二、File.ReadAllText参数返回例子注意事项可能出现的问题总结前言 最近在做文件存储以及读取的时候&#xff0c;需要用到C#给我们提供的类&#xff1a;File 具体使用方法可以看官方文档&#xff1a;C# File 类 这篇文章只会说File.…

深度学习基础理念(一)

文章目录1. 机器学习 Machine Learing机器学习类别2. 机器如何找函数深度学习输入类型和输出类型机器如何找函数的1. 机器学习 Machine Learing 什么是机器学习&#xff0c;顾名思义 机器 拥有会学习的能力&#xff0c;机器学习就是让机器具备能够找函数的能力 机器学习就是找…

【C语言课程设计】通讯录(1.0版本)

前言 相信各位对于通讯录都不是很陌生吧。通讯录我们在学校的大作业&#xff0c;课程设计经常会去使用它。那么今天我们将使用C语言来实现一个简单的通讯录。 目录 前言 一、通讯录的需求 二、工程文件的创建 三、通讯录的声明和定义 四、通讯录各函数的声明和定义 五、通…

Mysql入门技能树-数据查询-练习篇

SELECT 下列 SQL 语句&#xff0c;哪一项不合法&#xff1f; 答案是&#xff1a;C select now(),3.14 now() |3.14| ----------------------- 2023-01-16 16:47:04|3.14|MySQL查询表中所有的数据可以通过“SELECT * 通配符”或者“SELECT 所有字段”实现。 SE…

hadoop3.x源码编译及cmake的问题解决:CMake failed with error code 1

一、准备工作 基础环境&#xff1a;centos7 &#xff08;1&#xff09;官方源码中编译之前对基础环境及版本的要求&#xff08;重点是红色部分&#xff09; Requirements: * Unix System* JDK 1.8 * Maven 3.3 or later * ProtocolBuffer 2.5.0 * CMake 3.1 or newer (if com…

OSCP-Vulnhub靶机记录-Hacker_Kid-v1.0.1

Vulnhub靶机记录-Hacker_Kid-v1.0.1介绍&安装信息收集页面源代码DIG信息收集xxe漏洞探测9999端口SSTI模板注入发现具有Capabilities特殊操作权限的程序原理介绍&安装 靶机名称&#xff1a;Hacker_Kid-v1.0.1 靶机难度&#xff1a;中等 虚拟机环境&#xff1a;此靶机推…

【Linux】线程互斥

目录&#x1f308;前言&#x1f338;1、Linux线程互斥&#x1f367;1.1、线程间互斥相关背景概念&#x1f368;1.2、互斥量(锁)相关背景&#x1f36f;1.3、互斥量(锁)相关API&#x1f36f;1.3.1、初始化和销毁互斥锁&#x1f370;1.3.2、互斥量加锁和解锁&#x1f372;1.3.3、互…