【论文简述】GMFlow: Learning Optical Flow via Global Matching(CVPR 2022)
一、论文简述
1. 第一作者:Haofei Xu
2. 发表年份:2022
3. 发表期刊:CVPR oral
4. 关键词:光流、代价体、Transformers、全局匹配、注意力机制
5. 探索动机:过去几年中具有代表性的光流学习框架的核心估计方式没有太大本质区别,即利用卷积从局部相关性中回归光流。这种方式由于其内在的局部性,难以处理光流领域中长期存在的一个挑战:大运动的估计。为了缓解这一问题,当前的代表性框架 RAFT 利用大量的迭代改价来逐步提升光流的预测效果,但这种序列化的处理方式带来了线性的推理时间增长。
6. 工作目标:本文主要要验证这样一个假设:无需大量迭代,同样可以取得很好的光流估计效果,同时速度更快。
7. 核心思想:在本文中,将光流重新定义为一个全局匹配问题,即通过直接比较所有特征之间的相似度来得到稠密对应关系。这种问题定义依赖于较强的特征,为此利用了Transformer来实现。
重新审视了已有的光流估计方法。尽管很多不同的网络结构被提出,但它们没有太大本质区别,即利用卷积从局部相关性中回归光流,并指出了这种方式的局限性;
将光流重新定义为一个全局匹配的问题,彻底改造了主流光流回归管道,能够更好的处理大运动这一挑战。整体框架简洁有效,易于实现;
提出了一个GMFlow框架来实现全局匹配公式,该框架由三个主要部分组成:用于特征增强的Transformer层、用于全局特征匹配的correlation和softmax层以及用于光流传播的self attention层;
进一步提出了一个改进步骤来利用更高分辨率的特性,通过重用相同的GMFlow框架来处残差光流估计;
代码及模型已全部开源,方便复现及做进一步的拓展。
8. 实验结果:一般
GMFlow outperforms 31-refinements RAFT on the challenging Sintel benchmark, while using only one refinement and running faster, suggesting a new paradigm for accurate and efficient flow estimation.
9.论文&代码下载:
https://github.com/haofeixu/gmflow
https://openaccess.thecvf.com/content/CVPR2022/papers/Xu_GMFlow_Learning_Optical_Flow_via_Global_Matching_CVPR_2022_paper.pdf
二、实现过程
1. 背景
近年来,深度学习在许多领域展现出了巨大的潜力,它的快速发展也使得直接从数据中学习光流成为可能。基于深度学习估计光流的开创性工作 FlowNet,设计了一个卷积神经网络架构可以直接将两张视频帧作为输入,并输出稠密的光流。基于学习方法的进一步发展使得光流估计的效果在稳固提升,同时很多不同的光流网络结构被提出。然而,如果我们仔细考量下各种不同的光流网络,可以发现,基本的光流估计方式与最早的 FlowNet 无太大本质区别,即利用卷积从局部相关性中回归光流。
这种方式由于其内在的局部性,难以处理光流领域中长期存在的一个挑战:大运动的估计。为了缓解这一问题,当前的代表性框架 RAFT 利用大量的迭代精细化来逐步提升光流的预测效果。可以用下图来抽象地表达 RAFT 框架:
相较之前的算法,RAFT 取得了巨大的性能提升,也由此获得了 ECCV 2020 的最佳论文奖。RAFT 也产生了广泛的影响力,在最近一两年中各种 RAFT 变体层出不穷。然而,尽管这种迭代框架的取得了出色的性能,但由于本质上是一种序列化的处理方式,它也带来了线性的推理时间增长,使其难以做速度上的优化。在本文研究一个问题:RAFT框架是否不可替代?是否有可能高效高精度地估计光流但不依赖于这种大量的迭代精细化?
首先参考下我们人类是如何完成找对应点这一任务的。如下图所示:
假设我们要在第二张图中找第一张图蓝色点的对应点,一般地,我们通常会浏览第二张图中的所有像素点,并比较这些点与蓝色点的相似度,最终将相似度最高的点作为对应点,即黄色点。这一观察启发我们重新审视光流这一任务的本质:光流究竟是一个回归问题还是匹配问题?
光流直观上是一个匹配问题,目的是寻找对应的像素。为了实现这一点,可以比较每个像素的特征相似性,并确定具有最高相似性的对应像素。这样的过程要求特征具有足够的辨别性。将图像本身的空间上下文和来自另一张图像的信息聚合在一起,可以直观地缓解歧义,提高其辨别性。这样的设计理念使得稀疏特征匹配框架取得了巨大的成就。我们还从另外一个相关任务中得到一些启发,即两张图像 (未必是视频帧) 之间的稀疏对应关系,往往用于运动恢复结构和相机位姿估计等应用。这个任务的特点是通常两张图片之间的视角差异较大。我们注意到在主流的稀疏框架中,对应点往往是通过匹配得到的。基于这些观察,我们提出将光流重新定义为一个全局匹配问题,以期能更好地解决大运动这一难题。
2. 方法
给定两个连续的视频帧I1和I2,首先采用权重共享卷积网络提取稠密特征F1,F2∈H×W×D。然后通过全局相关性计算所有点与点之间的相关性,通过矩阵乘法现:
其中相关矩阵C中的每个元素表示F1中p1 = (i,j)和F2中p2=(k,l)的相关值,1/D为归一化因子,避免点积运算后值较大。
要确定对应关系,一种可行的方法是直接取相关性最高的位置。然而,这个操作是不可微的,阻碍了端到端训练。为了解决这个问题,我们使用了一个可微匹配层。具体来说,我们用softmax操作归一化C的最后两个维度,这给了我们一个匹配的概率分布:
F1中的每个位置相对于F2中的所有位置。然后,将像素网格G的二维坐标加权平均,得到对应的G∈H×W×2与匹配的分布M:
最后,通过计算对应像素坐标的差值就可以得到光流V:
这种基于softmax的方法不仅可以实现端到端训练,而且还可以提供亚像素精度。
3. 特征增强
公式的关键在于获得高质量的判别特征进行匹配。特征F1和F2是从权重共享卷积网络中独立提取的。为了进一步考虑它们的相互依赖性,一个自然的选择是Transformer,特别适合用注意力机制对两个集合之间的相互关系进行建模,如稀疏匹配方法。由于F1和F2只是两组特征,它们没有空间位置的概念,首先将固定的二维正弦和余弦位置编码添加到特征中。加入位置信息后,匹配过程不仅考虑特征的相似性,还考虑特征之间的空间距离,有助于消除模糊,提高性能。
在添加位置信息后,进行了六种叠加的自网络、交叉注意力网络和前馈网络(FFN)来提高初始特征的质量。具体来说,对于自注意力,注意力机制中的查询、键和值是相同的特征。对于交叉注意力,键和值相同但与查询不同,以引入它们的相互依赖关系。这个过程对F1和F2都是对称的,即:
其中T是Transformer,P是位置编码,T的第一个输入是查询,第二个输入是键和值。标准Transformer结构中的一个问题是由于成对注意力操作造成的二次计算复杂度。为了提高效率,采用了Swin Transformer的局部窗口注意力转移策略。然而,与Swin使用固定窗口大小不同的是,将特征分割为固定数量的局部窗口,以使窗口大小与特征大小相适应。具体来说,将大小为H × W的输入特征分割为K × K个窗口(每个窗口大小为H/K×K/W),并在每个局部窗口内分别进行自注意力和交叉注意力。对于每两个连续的局部窗口,我们将窗口分区移动(H/2K,W/2K)来引入跨窗口连接。在框架中,分成2×2个窗口(每个窗口的大小为H/2×W/2),实现了速度和精度权衡。
4. 光流传播
我们所提出的光流估计方式隐式地假设了对应点在两张图片中都可见,因此它们可以通过比较相似性进行匹配。但是,这个假设对于遮挡的和边界外的像素点是无效的。为缓解这一问题,观察到光流和图像本身有一定的结构相似性,进而提出通过特征的自相似性将匹配区域的高质量光流估计结果传播到未匹配区域。这个操作可以通过一个简单的自注意力层实现:
其中
为softmax层的光流预测,是将增强的特征代入softmax匹配层得到的。下图为GMFlow概述。
首先用权重共享卷积网络从两个输入视频帧中提取8×下采样的密集特征。然后将特征输入到Transformer中进行特征增强。接下来,我们通过计算所有对的特征来比较特征相似性,并使用softmax匹配层获得光流。考虑特征自相似性,引入一个额外的自注意力层,将匹配像素的高质量光流预测传播到未匹配像素。
5. 改进
到目前为止提出的框架(基于1/8特征)已经可以实现具有竞争力的性能。通过引入额外的更高分辨率(1/4)特征可以进一步改进。具体来说,首先将之前的1/8光流预测上采样到1/4分辨率,并用当前光流预测形变第二个特征。然后,改进任务被简化为残差光流学习,可以使用上图所示的相同GMFlow框架,但在局部范围内。具体来说,我们在Transformer中分割为8×8个局部窗口(每个窗口的分辨率为原始图像的1/32),并为每个像素执行9×9个局部窗口匹配。在获得softmax层的光流预测后,我们进行3×3局部窗口自注意力操作用于光流传播。
在改进步骤中与全局匹配阶段共享Transformer和自注意力权重,这不仅减少了参数,而且提高了泛化性。生成1/4和1/8的特征,也共享主干特征。具体来说,采用与TridentNet类似的方法,但分别使用步长为1和步长为2的权重共享卷积。这种权重共享设计也比特征金字塔网络具有更好的性能。
6. 训练损失
使用L1损失监督所有光流预测:
其中N是光流预测的数量,包括中间和最终的预测,γ(设置为0.9)是指数级增加的权重。
7. 训练损失
7.1. 数据集
FlyingThings、Sintel、KITTI-2015、HD1K
7.2. 实现
通过PyTorch实现。训练策略延续RAFT。对于GMA,选择通道尺寸Din = Dc = Dm = 128。
7.3. 方法论比较
本文首先将所提出的基于 Transformer 和全局匹配的光流估计方法与之前的基于局部相关性和卷积的方法进行比较。我们堆叠不同数量的卷积残差块或者 Transformer 块来观察性能的变化,结果如下表:
相较之前的方法,本文所提出的框架取得了明显的性能提升,尤其是在大运动 (s40+),验证了方法的有效性。此外,该方法还简化了反向光流的计算:通过直接转置全局相关性矩阵即可,而无需过两次网络。双向光流可以通过前后一致性检验用来检测遮挡。
7.4. 消融实验
为了探究方法有效的原因,对框架中的不同模块进行了对比实验。首先是 Transformer 的各个组件,可以看出,cross-attention 帮助最大,这是因为从 CNN 提取的初始特征中缺乏特征间相互依赖关系的建模,cross-attention 机制可以很好地弥补这一点。Transformer 的其他组件对性能也有帮助。
进一步比较了全局匹配与局部匹配的差异。对大运动 (s40+) 而言,全局匹配比局部匹配具有相当明显的优势,同时可以利用一个简单的矩阵乘法快速计算得到。
7.5. 和RAFT比较
RAFT 进行一个系统级别的比较。GMFlow框架只需一次改进,即可超过RAFT 31次精细化的结果,同时速度更快。
具体数值结果如下表:
还比较了在V100和A100(括号中的数字)上的推理时间。在高端A100 GPU上,由于不需要大量的迭代改进,GMFlow 有更多的速度增益 (2.29x vs.1.87x RAFT),这也说明了GMFlow更加受益于硬件性能的提升,同时未来具有进一步速度优化的潜力。
在Sintel测试集上和之前工作也做了比较,GMFlow同样展现出优异的性能:
参考
https://zhuanlan.zhihu.com/p/532681825https://zhuanlan.zhihu.com/p/532681825
相关文章:

【论文简述】GMFlow: Learning Optical Flow via Global Matching(CVPR 2022)
一、论文简述 1. 第一作者:Haofei Xu 2. 发表年份:2022 3. 发表期刊:CVPR oral 4. 关键词:光流、代价体、Transformers、全局匹配、注意力机制 5. 探索动机:过去几年中具有代表性的光流学习框架的核心估计方式没有…...

【Spark分布式内存计算框架——离线综合实战】5. 业务报表分析
第三章 业务报表分析 一般的系统需要使用报表来展示公司的运营情况、 数据情况等,本章节对数据进行一些常见报表的开发,广告数据业务报表数据流向图如下所示: 具体报表的需求如下: 相关报表开发说明如下: 第一、数据…...

力扣-删除重复的电子邮箱
大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目:196. 删除重复的电子邮箱二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其…...
git基础
git-note Github Manual | GitHub Cheat Sheet | Visual Git Cheat Sheet 安装配置工具分支创建仓库.gitignore文件同步更改进行更改重做提交术语表 安装 desktop.github.com | git-scm.com 配置工具 对所有本地仓库的用户信息进行配置 对你的commit操作设置关联的用户名…...

postgres 源码解析50 LWLock轻量锁--1
简介 postgres LWLock(轻量级锁)是由SpinLock实现,主要提供对共享存储器的数据结构的互斥访问。LWLock有两种锁模式,一种为排他模式,另一种是共享模式,如果想要读取共享内存中的内容,需要在读取…...
JVM优化常用命令
jps列出正在运行的虚拟机进程jpstop列出线程CPU或内存占用top top -Hp pid //列出pid全部线程jstat监视虚拟机运行状态信息jstat -gc pid 5000 //每隔5s打印gc情况jmapjmap -heap pid //输出jvm内存情况 jmap -histo:live pid | more //查看堆内存中的对象数量和大小 jma…...
按键中断实验
gpio.c#include"gpio.h"//给gpio使能和设置为输入模式void hal_gpio_init(){//使能GPIOF控制器RCC->MP_AHB4ENSETR|(0x1<<5);//通过GPIOF_将pf9/pf7/pf8设置为输入模式 GPIOF->MODER&(~(0x3<<18));GPIOF->MODER&(~(0x3<<14));GPI…...

kubernetes入门介绍,从0到1搭建并使用
Kubernetes是一个容器编排系统,用于自动化应用程序部署、扩展和管理。本指南将介绍Kubernetes的基础知识,包括基本概念、安装部署和基础用法。 基础介绍 Kubernetes是Google开发的开源项目,是一个容器编排系统,可以自动化部署、…...

【C语言进阶】字符串函数与内存函数的学习与模拟实现
📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:C语言进阶 🎯长路漫漫浩浩,万事皆有期待 文章目录1.字符串处理函数介…...

【JavaEE初阶】第一节.多线程(进阶篇 ) 常见的锁策略、CAS及它的ABA问题
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、常见的锁策略 1.1 乐观锁 vs 悲观锁 1.2 普通的互斥锁 vs 读写锁 1.3 重量级锁 vs 轻量级锁 1.4 自旋锁 vs 挂起等待锁 1.5 公平…...

Linux基础命令-pstree树状显示进程信息
Linux基础命令-uname显示系统内核信息 Linux基础命令-lsof查看进程打开的文件 Linux基础命令-uptime查看系统负载 文章目录 前言 一 命令介绍 二 语法及参数 2.1 使用man查看命令语法 2.2 常用参数 三 参考实例 3.1 以树状图的形式显示所有进程 3.2 以树状图显示进程号…...

keepalived+LVS配置详解
keepalivedLVS配置详解keepalived简介keepalived的应用场景keepalived工作原理VRRP协议核心组件分层工作工作状态LVS简介LVS三种模式NAT模式(网络地址映射)IPTUN模式(IP隧道)DR模式(直接路由)三种模式对比keepalivedLVS配置1.master配置2. keepalived配置文件3 修改keepalived配…...
Unity之C#端使用protobuf
什么是protobuf protobuf全称Protocol Buffers,由Google推出的一种平台、语言无关的数据交互格式,目前使用最广泛的一种数据格式,尤其在网络传输过程中,有很强的安全性,而且数据量比json和xml要小很多。 最主要的是pr…...

C++设计模式(18)——模板方法模式
亦称: Template Method 意图 模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 问题 假如你正在开发一款分析公司文档的数据挖掘程序。 用户需要向程序输入各种格式…...
SQLserver 索引碎片
Oracle 不需要整理碎片,原因? 1. rowid 默认的索引是B-树索引。索引建立在表中的一个或多个列或者是表的表达式上,将列值和行编号一起存储。行编号是唯一标记表中行的伪列。 行编号是物理表中的行数据的内部地址&am…...

【Storm】【二】安装
1 准备 1.1 准备linux服务器 本文搭建的是3节点的集群,需要3台linux服务器,我这里使用的是centos7版本的linux虚拟机,虚拟机网络配置如下: 主节点: master 192.168.92.90 从节点: slave1 192.168.92.…...
Android ConditionVariable
Android ConditionVariable 线程操作经常用到wait和notify,用起来稍显繁琐,而Android给我们封装好了一个ConditionVariable类,用于线程同步。提供了三个方法block()、open()、close()。 void block() //阻塞当前线程,直到条件为…...

Action Segmentation数据集介绍——Breakfast
文章目录简介细节Cooking actibitiesillustration of the actions论文讲解Breakfast(The Breakfast Action Dataset)简介 早餐动作数据集包括与早餐准备相关的10个动作,由18个不同厨房的52个不同的人执行。该数据集是最大的完全带注释的数据…...

横道图时间标尺在P6软件中的设置
卷首语 由于其直观简洁且易于管理的特性,使其成为展示项目活动顺序及时间安排的最常用的进度管理工具。 甘特图 甘特图(Gantt Chart),又称为横道图或棒条图,是最早的项目进度管理工具之一。由于其直观简洁且易于管理…...

空间复杂度(超详解+例题)
全文目录引言空间复杂度例题test1test2(冒泡排序)test3(求阶乘)test4(斐波那契数列)总结引言 在上一篇文章中,我们提到判断一个算法的好坏的标准是时间复杂度与空间复杂度。 时间复杂度的作用…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...
简单介绍C++中 string与wstring
在C中,string和wstring是两种用于处理不同字符编码的字符串类型,分别基于char和wchar_t字符类型。以下是它们的详细说明和对比: 1. 基础定义 string 类型:std::string 字符类型:char(通常为8位)…...