AI 生成任务

光流与 AI 视频的时序一致性

又称 光流场, 运动估计, 时序一致性, optical flow

光流(optical flow)是一张逐像素的运动图:对每个像素,它给出这块内容从这一帧移动到下一帧的二维位移向量。插帧、视频转视频、防抖、视频放大都靠这份测量来判断「哪些东西跨帧应该保持不变」,所以它是时序一致性背后的机器。

光流场是什么

对第 N 帧的每个像素,它给出这个像素在第 N+1 帧里所处位置的水平和垂直偏移量。可视化出来通常是一张彩色图:色相代表方向,饱和度代表速度。

有三个性质值得记住,因为几乎所有瑕疵都能追溯到其中之一。

  • 它假设存在对应关系。 一个像素必须在两帧里都存在。凡是新出现、消失、或者躲到别的东西背后的内容,都没有合法向量。
  • 它是有方向的。 前向(N 到 N+1)和后向是分别算的,而且一定会有分歧。比较这两份结果正是检测遮挡的标准做法:有分歧说明其中一份在猜。
  • 它只做测量,不做理解。 它不知道一条胳膊是胳膊。两块看起来一样的区域,对它来说可以随意互换。

光流在生成里出现在哪

  • 插帧。 慢动作和帧率转换的做法是把前后两帧各沿向量走一半,再做混合。
  • 视频转视频与风格化。 把上一帧的风格化结果按光流形变到当前帧的几何上,当作起点,风格就得以延续,而不是每帧重新发明一次。这是它最重要的用途。
  • 逐帧编辑。 在一帧上做的遮罩、补光、局部重绘,沿着这份运动图往后传,而不是每帧重算。
  • 放大与降噪。 把相邻帧的细节对齐后合并,这也是视频放大能还原出单帧放大器凭空造不出来的细节的原因。

它会怎么失效,屏幕上长什么样

  • 位移过大。 快摇和甩镜超出了搜索范围。结果是向量塌向零,画面不是在动而是在顿。
  • 遮挡边界。 运动物体的边缘外侧没有可匹配的内容。结果是鬼影和半透明拖尾,在手、头发、细长物体上最明显。
  • 重复纹理。 草地、水面、砖墙、栅栏到处长得一样,匹配是多解的。结果是光流游走,那块区域一直在闪。
  • 运动模糊和暗光。 模糊把匹配所需的特征毁了,噪点又造出不存在的特征。
  • 镜头切换。 两帧毫无关系时算出来的是垃圾。任何基于光流的处理之前都必须先按剪辑点切开,因为一个坏边界能污染它后面的全部结果。

有人说「不一致」时该改哪一步

「这段视频不稳」是个笼统的说法,但具体症状能直接指出该动管线的哪一段。

  • 纹理在沸腾、边缘像有虫在爬:说明各帧是独立生成的,完全没有光流引导。
  • 运动边缘后面拖着鬼影:是遮挡处的估计误差,减小传播步长,或者从更近的帧插值。
  • 一种越到后面越明显的果冻式变形:说明沿链传播在漂,每隔几秒用一张新的关键帧重新锚定。
  • 主体的脸或衣服换了个人:这跟光流一点关系都没有。这份运动图里没有任何东西控制外观,该改的是条件输入,通常是加一张参考帧。

这个效果的提示词

一条能稳定出效果的起点。主体和场景可以换,技术性的那几句留着。

Restyle this clip as hand-painted gouache, hold the style stable across frames, no flicker on the moving foliage

试一下:光流(Optical Flow)

打开生成器,参数已经预填好。

常见问题

光流在 AI 视频里具体用来做什么?
主要四件事:为插帧和慢动作合成中间帧;把风格或某次编辑从一帧传播到下一帧,让它不闪;给手持镜头做防抖;在放大和降噪时跨帧共享细节。
它和编码器里的运动矢量有什么区别?
编码器的运动矢量是按块算的,目标是压缩省码率,不是物理正确;光流是逐像素的,目标是描述真实运动。编码矢量几乎是免费读到的,有时够用来当粗线索。
帧率高一点会让运动估计更可靠吗?
会,而且这是单条最有效的改善手段。估计精度随帧间位移增大而下降,用更高帧率拍或生成,把位移砍一半,原本算不出的运动就变得可解。
为什么插帧在手和快速肢体上会出鬼影?
因为那些像素被遮挡了:它只在其中一帧存在,另一帧里没有,根本不存在可以插值的对应关系。估计器只能补一个看起来合理的东西,而遮挡边界上的「合理」通常长得像半透明的拖影。
光流能彻底消除闪烁吗?
不能。基于它的传播能压掉很大一部分,但误差会沿链累积,长镜头会漂,需要重新锚定。剩下那部分闪烁通常不是光流的问题,而是条件控制的问题。

相关术语