光流:读取帧与帧之间的运动

光流动作追踪是每个 AutoScript Sync 脚本都依赖的那个信号。在每对采样帧之间,DIS 稠密光流测量运动区域中像素的位移。这给出的是速度,引擎把它积分成位置轨迹,并约束到锚点上以限制漂移。光流在所有机器上都运行于 CPU。

已于 2026 年 9 月 21 日对照应用代码核实。

在运动区域上运行 DIS 光流

默认的自适应 AI 引擎使用 OpenCV 的 DIS(Dense Inverse Search)光流及其 FAST 预设。它在引擎找到的运动区域上运行,或在你用 Set Motion Region… 或 Live Track 画出的框内运行,所用帧已缩小到 320 px 宽。同时还会运行第二道半分辨率、ultrafast 预设的 DIS,用来检查光流是否可信。

Fast
每 4 帧计算一次光流:30 fps 视频上每秒 7.5 次采样。
Balanced
每 3 帧一次:30 fps 视频上每秒 10 次采样。默认设置。
High
每 2 帧一次:30 fps 视频上每秒 15 次采样。对于宽度至少 640 px 的平面(非 VR)画面,追踪区域的光流还会以 640 px 测量。开发者的记录显示这带来小幅提升(两部影片上行程 F1 分别 +0.007 和 +0.003),分析时间约为 1.4 倍。

间隔是固定的帧数,因此在 60 fps 视频上,每个采样率都会翻倍。

你可能在别处读到 AutoScript Sync 使用 Farneback 光流。主引擎并不使用。Farneback 只出现在基础引擎中(为主 Generate 按钮取消勾选 Use adaptive AI engine 即可使用),以及 AI Bulk Learn 背后的采样器中。

从速度到位置

光流告诉你某物移动得多快,而不是它在哪里。把速度累加起来可以得到位置,但每个小误差也会随之累积,轨迹就会漂移。因此引擎把积分后的光流约束到一个锚点上:这是一个较慢但绝对的位置度量,按视频从运动区域中心、姿态关键点相对深度中选出。默认情况下,如果所有可读通道的逐样本混合得分不低于单一胜出者,锚点就会采用该混合。

带 RTS 平滑器的 Kalman 滤波器(对整个视频先正向、再反向各处理一遍)把两者融合成一条位置轨迹。Depth priority 设置范围为 30 到 90,默认 85,它决定轨迹中有多少来自速度:数值越高,锚点的权重越低。该设置自带的提示说明了其中的取舍:速度承载行程幅度,而锚点能阻止漂移,但会压平深度,也无法跟上快速行程。更改它需要重新生成,而不仅仅是重新发送。

追踪中断的地方,会用延续两侧行程的节律性动作补齐,以这种方式补齐的时间轴比例会记录在脚本的元数据中。

整理节奏

默认情况下,完成的轨迹会经过两道整理。谐波折叠去除以真实行程频率两倍出现的锯齿。节奏规整把低置信度的峰值往局部节拍移动。然后在每次反转处放置脚本点,详见 AI funscript 生成的原理

编解码器运动矢量与音频包络

主处理进行时,一个后台线程会用 PyAV 读取另外两个信号。两者都是可选的:没有 PyAV 或没有音轨时,仅视频的路径照常运行。

  • 编解码器运动矢量。压缩视频本身就为每一帧存储了画面各区块的移动方式。应用会读取每一帧(而不仅是采样帧)的这些矢量,时间预算为 25 到 150 秒,随影片长度而定。只有当它们覆盖影片的至少 90% 时,其速度才会被用作信号。
  • 50 Hz 的音频响度包络,时间预算为 20 到 120 秒。音频让补齐的动作与配乐的节拍保持同相。

由于时间预算的限制,长影片可能只有部分被覆盖。它们的主要作用是作为频率佐证:帮助决定哪些区间需要以完整帧率重新读取的第二遍处理。这一遍针对的是运动看起来快于采样率、或追踪质量较低的窗口。这一遍最多处理 4 个区间,最多占视频的 35%。在开发者的测量中,它实际只覆盖了每部测试影片的 0.2% 到 0.6%,而且全部在前 40 秒内,因为区间是按时间顺序保留的。它并不是对整部影片的完整帧率处理。对于你选定的区间,时间轴编辑器的 Re-analyze 可以按需完成这一点。

镜头切换检测

跨越镜头切换去积分光流,会把机位的变化当成一次巨大的动作。因此引擎会检查每对采样帧:平均像素差大于 28 即标记为候选切换,只有当两帧灰度图像的亮度直方图相关性也低于 0.80 时,才算作切换。直方图检查能把真正的切换与快速运动区分开:快速运动会改变很多像素,但只是移动同一画面,而不是替换它。切换是这样检测出来的,而不是依据编解码器运动矢量。

光流的开销

光流并不是开销大的部分。在开发者的光流实验中,CPU 光流步骤在 Balanced 设置下每个样本的中位耗时为 4.8 到 5.1 ms,在 High 加倍区域分辨率下为 7.6 到 9.1 ms。这些数据来自三部影片各 200 到 400 个样本,只测量光流步骤本身,而不是完整的生成过程,因此请把它们看作量级参考,而不是基准测试。自从深度计算移到 GPU 之后,在开发者的测量中,姿态推理一直是耗时最大的阶段。

局限

  • 快速行程与采样率。在 30 fps 视频上使用 Balanced 时,引擎每秒看到 10 帧。对照开发者手工编写脚本的测试片段,两部最快影片上的行程比人工的小得多,目前的解释是这一采样率把快速运动平滑掉了。High 采样更密;Re-analyze 以完整帧率读取选中的区间。
  • 光流测量的是移动,而不是含义。追踪区域内的任何移动都会被记录,无论它是否是你关心的那个行程。在人工标记为无动作的区间里,引擎每分钟仍会产生约 85 次方向变化。
  • 仅限 CPU。在所有电脑上,光流都通过 OpenCV 的 CPU 实现运行。更快的 GPU 能加快姿态和深度,但不能加快光流。

常见问题

为什么应用使用 DIS 而不是 Farneback?

默认的自适应 AI 引擎使用带 FAST 预设的 DIS,外加一道半分辨率的可靠性检查。Farneback 只保留在基础引擎和 AI Bulk Learn 采样器中。两者是 OpenCV 中不同的稠密光流方法;本页描述的是代码实际运行的内容,而不是我们发布过的正面对比。

视频需要有声音吗?

不需要。有配乐时,音频包络有助于让补齐的空缺卡在节拍上。没有配乐时,仅视频的路径照常运行。

我能让光流跟随画面的特定部分吗?

可以。Set Motion Region… 为整个视频设定一个框,Live Track 则让你在视频播放时移动这个框;追踪结果以 .roitrack.json 文件保存在视频旁边。

延伸阅读

用你自己的视频试试

试用期为一天,在你自己的电脑上运行;你的视频在本地分析,从不上传。