(论文解读)RAFT: Recurrent All-Pairs Field Transforms for Optical Flow

article/2025/11/7 18:46:03

目录

  • 论文解读之:
  • RAFT: Recurrent All-Pairs Field Transforms for Optical Flow
    • 写在前面
    • 回顾光流领域
    • RAFT
      • Feature Encoder与Context Encoder
      • Update
    • 总结

论文解读之:

RAFT: Recurrent All-Pairs Field Transforms for Optical Flow

由于前段时间太忙了,这篇博客拖了很久才发布出来,一直只写了一半扔在草稿箱里。
今天我来试着分析一下近期光流最强论文:RAFT: Recurrent All-Pairs Field Transforms for Optical Flow,该论文发表于ECCV2020并获得了best paper。在阅读过后就能发现它当之无愧。下面我们就来一起看叭。
该文章地址:https://arxiv.org/pdf/2003.12039.pdf
作者公开了代码:https://github.com/princeton-vl/RAFT
在这里插入图片描述

写在前面

光流估计领域从FlowNet开始就认定了类似于UNet的结构,即下采样加上采样的结构。但这样的结构是不是真的合适?答案并不一定。我们设计一个网络需要能够解释为什么这样设计,可是使用这种UNet的结构,我们只能把它看做一个变换器,将数据从空间像素域变换到光流值域。恰好UNet这样的结构可以以图片为输入,以图片为输出,同时下采样的过程可以注意到局部的信息,所以很快成为光流估计界的主流网络风格。

在我看来,光流估计需要注意以下一些点:

  • 网络输入为图片,输出为图片。
  • 同时注意局部与全局的特征(由于光流是一个比较稠密的估计任务,如果不对整个图片内局部的光流估计值进行约束或监督,可能就会导致网络沿着其他方向去拟合总的损失函数,最终损失虽然降低,但效果并不理想)
  • 虽然光流的信息来自于前后帧间的信息,而光流估计也需要一定的纹理信息和上下文信息(由于光流图与原图轮廓基本一致)。
  • 在前向传播过程中不能丢失太多信息,因为光流估计需要的信息量较大。这也限制了下采样层数不能太深,而且跳层连接能够提升性能。
  • 迭代优化

而这篇论文所提出的方法,注意到了所有的点。

回顾光流领域

光流估计领域先后有几种主流网络。一开始是FlowNet以及FlowNet2,后来被PWCNet所替代,后来又有了IRR这样的迭代式网络,最后到我们今天所说的RAFT。其实光流估计方法的发展过程就是从UNet的结构逐渐跳出的过程。
而且,由于光流所描述的是两帧图像间的关系,通过已估计出的光流可以把后一帧向前一帧映射,映射之后的两帧可以继续估计光流的残差,如此循环,可以将残差不断叠加,所以,加入迭代优化的结构是很好的思路。
PWCNet试图加入迭代优化,熟悉PWCNet的朋友都知道,PWCNet中间的那个从下到上的过程便是在迭代优化。但由于其思路仍然被UNet限制,没能走出上下采样的结构,限制了迭代的次数,即下采样几层,迭代上采样也只能设计几层。
PWC网络结构
后来,IRR这样的网络想进一步推动迭代优化的过程,将整个PWCNet网络迭代很多次,不断地计算光流的残差,再求和,达到了更好的效果。
本篇论文巧妙地将下采样与迭代优化结合,完美地跳出来UNet对思想的限制。我认为将成为接下来一段时间的光流估计方法的主要思想,即使用某些信息(局部与全局都要考虑到),输入到循环网络里将光流的估计值迭代优化。

RAFT

文章所提出的网络结构如下图所示:
在这里插入图片描述
网络整体分为三个部分:Feature Encoder、Context Encoder、Update。
在前端,网络分为两支,即Feature Encoder以及Context Encoder,分别将图片特征以及上下文进行编码,在后面,通过将前面两支的编码融合,并使用GRU进行迭代,最终得到光流的估计值。下面,我们分块对这些网络进行解说。

Feature Encoder与Context Encoder

这两个编码层采用如UNet的编码层相同的结构,即使用几层卷积层将原图缩小为原来的八分之一,减小后续网络的计算量,同时相当于进行编码操作。不同的是,两个编码器输入图片不同,Feature Encoder需要输入前后两帧的照片,而Context Encoder只输入前一帧的照片。这样的想法很显而易见:Feature Encoder用于提取光流的特征,所以从前后两帧图片中提取特征,用于后续的光流估计,而Context Encoder顾名思义提取上下文信息,保证估计出的光流图保持与原图相同的上下文信息以及位置对应。这样的思想简洁而又强大,乍一看很简单,但不得不承认这样非常实用。

Update

在这个部分,作者将上述的两个编码器输出的结果进行融合,同时进行GRU迭代。我们知道光流在迭代时相当于逐渐优化,不断逼近真实光流。而且这样的结构有利于适应不同环境,如果硬件条件限制,可以减少迭代次数,舍弃估计准确率,增快速度,而当硬件环境富余时,可以增加迭代次数,提高准确率。
迭代时,作者先把Feature Encoder对两张图片编码的结果进行相似度的提取。由于光流即使找到前两帧之间相似度最大的像素并进行对应,该相似度并不仅仅是像素值的相似,是描述子的相似,所以可以看做两张图提取出的特征相似,即Feature Encoder输出的编码结果中寻找相似的位置进行对应。所以作者使用了最简单的点积相似度衡量。对两张图两两像素之间进行点积相似度的计算,得到一个大小为HWH*W的相似度块,如下图所示:
在这里插入图片描述
写成公式如下所示:
在这里插入图片描述
其中C为相似度块, g θ g_\theta gθ为Feature Encoder。
同时,作者使用了相似度金字塔,用于关注到不同尺度的相似度,这样的操作可以同时保证微小运动和剧烈运动同时被观测到。在论文中,作者使用了四层金字塔,即通过Pool的方式将上述得到的相似度块分别缩小。若将四层金字塔表示为 C 1 , C 2 , C 3 , C 4 {C^1,C^2,C^3,C^4} C1,C2,C3,C4,则其大小分别为 H × W × H / 2 k × W / 2 k H×W×H/2^k×W/2^k H×W×H/2k×W/2k
接着,这篇文章最灵魂的地方到了:查表。
对于已经估计到的光流 ( f 1 , f 2 ) (f^1,f^2) (f1,f2),可以将每个像素点 ( u , v ) (u,v) (u,v)按照已经估计到的光流移动到其在下一帧对应位置 ( u + f 1 ( u ) , v + f 2 ( v ) ) (u+f^1(u),v+f^2(v)) (u+f1(u),v+f2(v))。如果光流估计准确, 这个位置上的相似度应该较大。而在迭代过程中,我们将进一步准确这个位置,所以我们将相似度块中在这个位置周围的数全部取出来按顺序排好。这个周围是多大呢?这个可以定义,即如下公式:
在这里插入图片描述
将这些值取出来后拉成一个向量,作为这一个点的特征,每个点的特征都按这样查表进行填充。这样查表的操作只需要计算一次相似度块(由于相似度块太大,计算其实比较耗时),节省了计算时间。而且在原理上合情合理,这样得到的新特征图可以作为这一层的GRU输入对上一层的光流进行进一步修正。而上面Context Encoder得到的特征图将与这个特征图拼接,作为GRU的输入。GRU的hidden state作为光流残差的估计值,加到上一层估计出的光流中。这样一层一层加下去得到最后迭代出的光流。光流初始化为0。

总结

这篇文章理解起来非常容易,思路也非常清晰,简单。但是每一步都是可以解释为什么这样设计的,不像UNet那样茫然。所以这也是这个网络能获得成功的原因。反观我上文中提到的光流网络需要具备一些点,RAFT巧妙地将它们都融合在了一起。同时,这个网络也成功跳出了UNet这样结构的思想限制,真正的产生了新的光流网络,应该会成为今后光流网络研究的热点方式:即特征匹配与迭代的方式。


http://chatgpt.dhexx.cn/article/0ELkfxpb.shtml

相关文章

matlab脑电图绘画:2D头皮电位拓扑图和3D皮质层拓扑图

今天刚好又再等实验数据,那我就来分享一下最近写论文所涉及到画图的知识好啦! 1. 本文涉及的背景: a. 针对脑电正问题模型,设置电偶极子强度计算了头皮电位,为了直观显示绘制了2D的头皮电位拓扑图; b. 分别…

Flink-APl

目录 自定义Source Tranform map flatMap Fliter KeyBy 滚动聚合算子(Rolling Aggregation) Reduce Split 和 Select Connect 和 CoMap Union Connect 与 Union 区别 自定义Source flink自定义source接收数据 除了以上的 source 数据来源&a…

代码分享 | EEG数据的等效偶极子源定位

文章来源于微信公众号(茗创科技),欢迎有兴趣的朋友搜索关注。 关于偶极子源定位:是指在 64~128 多导头皮脑电图记录的基础上,运用计算机数学模型推算自发或诱发脑电活动的起源,可用于癫痫外科术前辅助棘波…

fieldset在form中的用法(表单简单实例)

fieldset&#xff1a;对表单进行分组&#xff0c;一个表单可以有多个fieldset。 fieldset标签会在包含的文本和input等表单元素外面形成一个方框&#xff0c;legend元素作为标题。 ​ <html> <head> <meta charset"utf-8"> <title>表单&…

leaflet+turf计算离点距离最近线上的点坐标(leaflet篇.35)

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>

超详细TMS-EEG数据处理教程(下)

文章来源于微信公众号&#xff08;茗创科技&#xff09;&#xff0c;欢迎有兴趣的朋友搜索关注。 上一期的文章TMS-EEG数据处理教程&#xff08;上&#xff09;中详细地介绍了TMS伪影类型和预处理步骤。这期主要讲了完成数据预处理后&#xff0c;再进行一些&#xff08;后&…

使用freesurfer和3Dslicer进行脑区分割和电极定点(详细版)

一、前期准备 Linux系统安装Freesurfer、MATLAB插件spm12、fieldtrip&#xff0c;Windows下载mricron、Slicer3D&#xff08;需要插件SlicerFreeSurfer&#xff09;软件 文件准备 ct 和mri t1 文件&#xff0c;格式为dicom&#xff0c;需要转换为 nii 格式&#xff08;可在s…

EEGLAB及其插件下载安装

EEGLAB是脑电图&#xff08;EEG&#xff09;信号处理的一个基于Matlab工具箱&#xff0c;有GUI界面可快速实现对EEG信号的时域、频域、时频域处理&#xff0c;其安装包及插件下载方法如下&#xff1a; 零、版本对照 对于旧版的matlab&#xff0c;需要使用对应版本的EEGLAB&am…

FieldTrip toolbox教程系列(0)-安装、配置与测试

FieldTrip是MEG, EEG, iEEG和NIRS分析的MATLAB软件工具箱。它提供预处理和先进的分析方法&#xff0c;如时频分析&#xff0c;使用偶极子的源重建&#xff0c;分布源和波束形成器和非参数统计测试。 下载 首先下载相应的软件工具&#xff0c;网址如下(需要填写相关信息)&#x…

Brainstorm + Fieldtrip IEEG定位及分区教程

本文是我进入实验室后&#xff0c;针对原本的配准工具fieldtrip在MNI空间映射上不准确的问题&#xff0c;改用的新工具Brainstorm的教程&#xff0c;但因为该工具基本没有可编程部分&#xff0c;因此依然保留了使用Fieldtrip进行前期acpc定位和批处理导出电极触点所在分区的功能…

FieldTrip toolbox教程系列(1)-预处理-读取连续的EEG和MEG数据

FieldTrip是MEG, EEG, iEEG和NIRS分析的MATLAB软件工具箱。它提供预处理和先进的分析方法&#xff0c;如时频分析&#xff0c;使用偶极子的源重建&#xff0c;分布源和波束形成器和非参数统计测试。 介绍 ft_preprocessing的一种常见用法是完全读取内存中的连续数据。如果数据集…

MNE溯源fieldtrip官网教程

MNE溯源fieldtrip官网教程 Introduction 在本教程中&#xff0c;您可以找到有关如何使用最小范数估计进行源重构的信息&#xff0c;以重构单个主题的事件相关字段(MEG)。我们将使用预处理教程中描述的数据集(基于触发的试验选择、事件相关平均和平面梯度)&#xff0c;我们还将…

FieldTrip toolbox教程系列(2)-伪影处理简介

简介:处理伪影 关于FieldTrip之前介绍过: 《FieldTrip toolbox教程系列(0)-安装、配置与测试》 《FieldTrip toolbox教程系列(1)-预处理-读取连续的EEG和MEG数据》 本教程介绍了如何在FieldTrip中处理伪影的一般方法 由于FieldTrip支持许多不同采集系统的数据&#xff0c;因此数…

fieldtrip学习——1.坐标系介绍(ctf坐标系和acpc坐标系简介)

-------------------------------------滴&#xff0c;菜鸟要从这里开始学习飞行啦&#xff01;-------------------------------------------- 今天刚好在跑程序就把我之前学习fieldtrip老碰到并且栽了好几次跟头的东西跟大家简单介绍一下啦。 我目前主要需要做的是头模型和…

【源码】FieldTrip:MEG和EEG分析的MATLAB工具箱

FieldTrip是用于MEG和EEG分析的MATLAB软件工具箱&#xff0c;由荷兰奈梅根Donders大脑、认知和行为研究所的一组研究人员与合作机构密切合作开发。 FieldTrip提供MEG、EEG和侵入性电生理数据的高级分析方法&#xff0c;如时频分析、使用偶极子的源重建、分布式源和波束形成器以…

一个可以把Google Docs变成GDrive的工具

如何把Google Docs转换成一个在线存储工具&#xff0c;如传闻中的GDrive? 我们刚刚开发了个Google Docs的客户端软件&#xff1a;GoogleDrive, 网站:http://www.gdocsdrive.com. 欢迎大家试用&#xff0c;多提意见。 对于云存储类的应用&#xff0c;目前有很多著名的厂商的解决…

谷歌colab运行自己的项目的一些细节

1.连接谷歌colab from google.colab import drive drive.mount(/content/gdrive) 2.安装相关的包&#xff0c;版本要对应好&#xff0c;注意卸载掉之前的tf&#xff0c;可能存在版本不对应问题 !pip install keras2.1.0 !pip uninstall -y tensorflow !pip install tenso…

linux挂在谷歌硬盘,【Colab系列】挂载谷歌硬盘详解

讲解对象&#xff1a;【Colab系列】 作者&#xff1a;融水公子 rsgz 文章出处&#xff1a;360doc个人图书馆[其他平台均为盗版] 提醒&#xff1a;建议大家电脑浏览我的网页&#xff0c;因为手机浏览网页 代码会自动缩成一行&#xff0c;很不方便 1 首先&#xff0c;要知道谷歌硬…

linux上使用drive从google drive 下载文件和文件夹

linux上使用drive从google drive 下载文件和文件夹 由于之前要下载Darpa的大型数据集&#xff0c;这个数据集仅仅在google drive上可以获取。但是如果手动下载的话&#xff0c;要么一个个文件自己点击要么就是整个打包。 这样子有几个问题&#xff1a; 速度很慢中间不能关闭…

YOLOv5-4.0-google_utils.py 源代码导读

YOLOv5介绍 YOLOv5为兼顾速度与性能的目标检测算法。笔者将在近期更新一系列YOLOv5的代码导读博客。YOLOv5为2021.1.5日发布的4.0版本。 YOLOv5开源项目github网址 本博客导读的代码为utils文件夹下的google_utils.py文件&#xff0c;更新日期为2021.1.14. google_utils.py …