光流模型 (Optical Flow) 完全指南:让机器看懂“运动”的魔法
📚专为深度学习与计算机视觉初学者打造
🎯目标:用最通俗的语言,拆解“光流”(Optical Flow)这个听起来很高大上,但实际上无处不在的概念。
🎧核心问题:光流到底是什么?为什么它是视频压缩(NVC)和自动驾驶的基石?现在的深度学习模型(如 RAFT, PWC-Net)是怎么算出光流的?
📋 目录
- 1. 为什么要学习光流?
- 2. 光流是什么?(核心直觉)
- 3. 光流长什么样?(可视化)
- 4. 光流模型的发展史:从数学公式到深度学习
- 5. 深度学习光流模型的王者:RAFT 与 PWC-Net
- 6. 光流在 NVC(神经视频编码)中的关键角色
- 7. 代码视角的“计算光流”
- 8. 常见误区与问答
1. 为什么要学习光流?
你可能觉得:“我只要能识别出图里有一辆车就行了,为什么要关心它怎么动?”
但对于视频处理来说,“动”比“是什么”更重要:
| 领域 | 光流的作用 |
|---|---|
| 视频压缩 (NVC) | 90% 的视频数据是冗余的,算出光流,就能复用上一帧的像素 。 |
| 自动驾驶 | 仅仅识别出前方有车不够,必须通过光流判断它是在靠近还是远离。 |
| 动作识别 | 区分“挥手”和“举手”,靠的是手臂运动的轨迹(光流)。 |
| 视频插帧 | 想要 30fps 变 60fps?需要用光流算出中间那一帧该长什么样。 |
2. 光流是什么?(核心直觉)
一句话定义:
📌光流就是描述图像中每一个像素点,在时间 到 之间移动了多少距离的向量场。
通俗类比:
想象你在看一场大规模的团体操表演(每个演员代表一个像素)。
- 时刻 1:所有人站成一个方阵。
- 时刻 2:方阵整体向右移动了两步。
光流就是给每个演员发一张纸条,上面写着:(dx=+2, dy=0)。
- dx: 水平移动距离
- dy: 垂直移动距离
如果所有人的纸条都拼起来,就是一张光流图。
3. 光流长什么样?(可视化)
光流本身是一堆数字 ,人类看不懂。所以我们通常用颜色来画出它。
标准配色方案(Color Wheel):
颜色(色相):代表方向。
红色 🔴 = 向右动
蓝色 🔵 = 向左动
黄色 🟡 = 向下动
深浅(饱和度):代表速度。
颜色越鲜艳 = 动得越快
颜色越淡(接近白色) = 动得越慢
举个例子:
如果图中有辆车从左往右飞驰,那么在光流图里,这辆车的区域就是鲜艳的红色。
4. 光流模型的发展史:从数学公式到深度学习
1. 传统派 (Lucas-Kanade, 1981)
- 核心假设:亮度恒定假设。即假设物体怎么动,它的颜色是不会变的。
- 方法:解微分方程。
- 缺点:一遇到光照变化、阴影、大动作,马上歇菜。
2. 深度学习派 (FlowNet, PWC-Net, RAFT)
- 核心思想:不再解方程,而是喂给神经网络两张图,让它直接“猜”出光流。
- 优势:
- 即使物体被遮挡、光照变化,AI 也能根据上下文猜出大概率的运动。
精度极高,是目前 NVC 中“显式运动建模”的首选 。
5. 深度学习光流模型的王者:RAFT 与 PWC-Net
虽然这篇论文主要讲 DCVC-RT,但它提到了目前最强的光流评估工具SEA-RAFT。理解这些模型有助于你理解 NVC 里的“运动估计”模块。
🌊 RAFT (Recurrent All-Pairs Field Transforms)
这是目前的霸主架构。
- 原理:它像一个画师修图一样,先画一个粗糙的光流,然后通过一个循环神经网络 (GRU) 不断微调(Iterative Refinement)。
- 特点:精度极高,能处理非常细微的运动。
在 NVC 中的角色:虽然很强,但计算量大。DCVC-RT 论文中用它来评估运动幅度(作为 Ground Truth 工具) 。
🕸️ PWC-Net (Pyramid Warping)
这是 NVC 中最常用的结构原型。
- 原理:金字塔结构。先在缩略图上算个大概(大运动),再在高清图上算细节(小运动)。
- 特点:速度和精度的平衡。
6. 光流在 NVC(神经视频编码)中的关键角色
这部分直接联系到你正在阅读的论文。
🎯 传统 NVC 的“显式运动建模” (Explicit Motion Modeling)
在传统的 NVC(如 DCVC-FM)中,光流模型是核心组件 。
流程如下:
输入:F r a m e t − 1 Frame_{t-1}Framet−1和F r a m e t Frame_tFramet。。
运动估计 (Motion Estimation):跑一遍光流模型,算出像素位移 。
运动补偿 (Motion Compensation):根据光流,把 的像素“搬运”过来,生成预测帧 。
⚠️ 为什么 DCVC-RT 要“砍掉”光流?
尽管光流很有用,但在实时任务中它是累赘:
层数太多:光流网络通常很深(例如 123 层),虽然计算量 (FLOPs) 可能不大,但函数调用开销极大 。
操作复杂度高:导致了所谓的Operational Complexity瓶颈 。
所以,DCVC-RT 提出了“隐式时域建模”,不再显式计算光流,而是让网络自己去领悟运动 。
7. 代码视角的“计算光流”
如果你想在 PyTorch 中调用一个光流模型(比如 RAFT),流程非常简单:
importtorchimporttorchvision.transforms.functionalasFfromtorchvision.models.optical_flowimportraft_large# 1. 加载预训练的光流模型 (RAFT)model=raft_large(pretrained=True).cuda().eval()# 2. 准备两张相邻的图片 (Batch, 3, H, W)img1=load_image("frame_0.jpg").cuda()img2=load_image("frame_1.jpg").cuda()# 3. 前向传播:计算光流withtorch.no_grad():# output 是 list,最后一个元素是最终光流list_of_flows=model(img1,img2)predicted_flow=list_of_flows[-1]# predicted_flow 的形状是 (Batch, 2, H, W)# Channel 0 是 dx (水平位移)# Channel 1 是 dy (垂直位移)🎉祝你天天开心,我将更新更多有意思的内容,欢迎关注!
最后更新:2026年1月
作者:Echo