ARTICLE · 1299559
RAFT 源码精读:光流估计的循环迭代范式,ECCV 2020 最佳论文怎么把误差砍到 5%
RAFT 源码精读:光流估计的循环迭代范式,ECCV 2020 最佳论文怎么把误差砍到 5%ECCV 2020 的最佳论文给了 RAFT(Recurrent All-Pairs Field Transforms)——普林斯顿 Zachary Teed 和 Jia Deng 的光流估计工作。它在两个标准数据集上同时刷新纪录:Sintel 上把 EPE(端点误差)从 4.09 降到 1.96,KITTI 上把 F1-all 误差从 11.8% 砍到 5.10%。官方仓库 princeton-vl/RAFT,今天仍有 4119 星。 
光流(optical flow)是两张连续帧之间每个像素的运动矢量场——哪个像素往哪个方向移动了多少。它是视频理解、视频插帧、自动驾驶时序感知的基础信号。 光流的老大难是「大位移」:一个物体从画面左边飞到右边,算法要为每个像素在另一帧里找到对应点。搜索空间随位移增大而爆炸,传统方法的分层搜索、学习方法的粗到细设计,都在跟这个复杂度搏斗。另一个难点是遮挡——移出画面的像素在下一帧不存在对应点,强行匹配只会引入噪声。 RAFT 的思路不是修补旧范式,是换一个:不用粗到细的多分辨率金字塔,在单一高分辨率上直接算。 第一个设计,全对变换(All-Pairs Field)。一次性计算两张图所有像素对之间的视觉相关性,形成一个 4D 相关体——不管位移多大,对应关系都在这个体里,不需要分层搜索。代价是显存:H×W×H×W 的相关体按需下采样,这个工程处理在代码里可以看到。 第二个设计,循环更新算子。用一个 GRU(门控循环单元)迭代地精化光流:每次迭代从相关体里查询当前光流位置附近的关联,结合上下文特征,输出光流的增量。迭代 12 次或 24 次——迭代次数是个可调参数,精度和速度在此交换。这个设计是「循环」名字的来源,也是精度的来源:误差不是一次预测出来的,是一步步修出来的。 第三个设计,无监督预训练加有监督微调。RAFT 证明在合成数据上预训练、在目标域微调的两段式训练,能同时拿下合成(Sintel)和真实(KITTI)两个基准——数据策略与架构同样重要。 官方仓库的代码结构是教科书级的干净:core/ 里是相关体计算和 GRU 更新算子,demo 用的模型权重直接下载可用。推理单卡可跑,训练 Sintel/KITTI 的完整流程在 README 里逐步给出。 复现的坑主要在数据:Sintel 和 KITTI 的下载脚本需要挂在后台慢慢拉,KITTI 2015 约 40GB。想快速上手,先跑 demo.py 对两张样例图出光流可视化,十分钟就能看到彩色的运动场图——那个视觉冲击是理解「光流」最直接的方式。 值得改的实验:把 GRU 的迭代次数从 32 改到 8,看精度掉多少、速度快多少——这个曲线是工程部署时选点的依据。RAFT-slim(轻量版)的代码也在仓库里,做实时应用可以对照读。 RAFT 之后,光流估计的迭代精化范式成了标配:后续的 RAFT-3D(场景流)、GMA(全局运动聚合)、以及视频帧插值领域的 RIFE 系,都在这个框架上做增量。自动驾驶的时序感知里,基于 RAFT 变体的光流仍是无几何先验时的默认选项。 对视觉方向的入门者,RAFT 是「循环结构用对地方」的最佳案例之一:不是所有模块都要 transformer,GRU 这种老组件在合适的问题结构里依然能打。读它的代码,重点读 update 算子的输入怎么组装——相关体查询、上下文、当前光流三路信息的融合方式,是这篇文章真正的思想内核。 RAFT 的故事还有一条少有人提的延伸线。迭代精化的范式后来被视频生成领域借用:帧间运动的估计与生成的逐步去噪,在数学结构上同源——都是「从粗到细的循环修正」。今天视频生成模型里的 motion module 设计,多少能找到光流迭代思想的影子。一条从「两帧之间像素怎么动」到「AI 怎么生成视频」的技术暗线,起点就在这类经典工作里。 复现 RAFT 的另一个收获是学怎么读 4D 相关体。H×W×H×W 的张量怎么索引、怎么下采样、GRU 怎么从中查询邻域——这些张量操作模式在 transformer 之前的视觉文献里是独一份的工程教材。读懂它,再去看任何需要「跨帧对应关系」的工作(跟踪、视频分割、立体匹配),张量维度就不再是障碍。 最后给一个判断:RAFT 是那种「解决了本领域核心矛盾,然后被后来者站在肩上」的工作。它没有终结光流研究——后续的 FlowFormer、UniMatch 用 transformer 改造了相关体处理——但它们都活在 RAFT 定下的「全对相关+迭代精化」框架里。范式确立者的地位,比刷榜领先者更长久。 对要把 RAFT 用到产品里的工程师,补充部署视角。完整版 RAFT 的推理在 GPU 上实时性尚可,但边缘设备(车端、移动端)跑不动全分辨率——工程上的常见处理是降输入分辨率加减少迭代次数(12 次甚至 6 次),精度换速度;或者直接用 RAFT-slim。另一个选项是换成蒸馏过的小模型——社区有把 RAFT 蒸到移动端可跑的先例。 还有一个容易被忽略的部署细节:光流输出的时序平滑。逐对帧独立估计的光流在视频里会抖动(相邻帧的估计不一致),视频类应用需要加时序滤波。这个后处理不在 RAFT 论文里,却是所有落地光流的产品都要自己补的作业——又一条「论文到产品」之间没人替你铺的路。 仓库 princeton-vl/RAFT,权重在 Google Drive 和 GitHub release 双备份。入门者从 demo.py 开始,研究者从 core/raft.py 的 update 算子开始——两条路径都通向同一个地方:这个领域过去六年的地基。 ECCV 2020 的最佳论文给了它,时间又用六年的引用和复用给了它第二次授奖。经典的认证方式有两种,这是更硬的那种。 把 RAFT 读透,再回头看视频生成和时序感知的论文,很多「新想法」会露出它们的族谱——这也是读经典最实用的回报。 地基读好了,往上盖楼才稳。共勉。我们下一篇精读见。下期见。好。下一篇,我们继续读经典。欢迎催更。读完这篇的读者,已经是同行了。
















































































