Frame Interpolation
帧插值会在现有帧之间合成新帧,以提高帧率或制作慢动作。涵盖基于光流、核函数和生成式的方法。
帧插值也称为视频帧插值(VFI),是计算机视觉中的一项任务,用于在视频已有的两帧之间合成新帧。在每对帧之间插入一帧可使帧率翻倍,将 30 FPS 素材变成 60 FPS;插入多帧则可将普通素材转为慢动作。它提升视频的时间分辨率,相当于时间维度上的超分辨率;它只填补已有帧之间的空隙,不同于视频预测,后者会外推最后一帧之后的画面。
帧插值的工作原理#
对两帧取平均会产生重影,也就是所有移动物体都会出现双影。基于光流的方法则会估计两帧之间每个像素的运动,即光流,沿该运动将每一帧移动到目标时刻对应的位置,再融合两帧的结果。遮挡是其中的难点:行人走过后露出的背景区域只存在于其中一帧,因此像 Super SloMo 这样的深度学习模型还会预测可见性图,以确定每个输出像素来自哪一帧。
OpenCV 的 Farneback 光流足以展示真实素材中的效果。下面的代码会留出三帧中的中间帧,用相邻帧重建它,并用峰值信噪比(PSNR)评估两种方法:
import cv2
import numpy as np
# Read three consecutive frames of people walking and hold out the middle one
cap = cv2.VideoCapture("https://github.com/ultralytics/assets/releases/download/v0.0.0/decelera_portrait_min.mov")
f0, f1, f2 = (cap.read()[1] for _ in range(3))
g0, g2 = (cv2.cvtColor(f, cv2.COLOR_BGR2GRAY) for f in (f0, f2))
# Estimate dense optical flow in both directions between the outer frames
flow02 = cv2.calcOpticalFlowFarneback(g0, g2, None, 0.5, 3, 15, 3, 5, 1.2, 0)
flow20 = cv2.calcOpticalFlowFarneback(g2, g0, None, 0.5, 3, 15, 3, 5, 1.2, 0)
# Warp each outer frame halfway along its flow, then average the two warps
h, w = g0.shape
grid = np.dstack(np.meshgrid(np.arange(w), np.arange(h))).astype(np.float32)
warp0 = cv2.remap(f0, grid - 0.5 * flow02, None, cv2.INTER_LINEAR)
warp2 = cv2.remap(f2, grid - 0.5 * flow20, None, cv2.INTER_LINEAR)
middle = cv2.addWeighted(warp0, 0.5, warp2, 0.5, 0)
# Score both against the real middle frame: flow interpolation vs. plain blending
blend = cv2.addWeighted(f0, 0.5, f2, 0.5, 0)
print(f"Blend: {cv2.PSNR(blend, f1):.1f} dB, flow interpolation: {cv2.PSNR(middle, f1):.1f} dB")它会输出 Blend: 22.3 dB, flow interpolation: 29.5 dB:沿各自运动方向将每帧移动一半,重建留出的帧时比取平均准确 7.2 dB。基准测试也用同样的方式评估模型:Vimeo-90K 三帧数据集包含 73,171 段三帧视频片段,模型必须预测中间帧,并以 PSNR 和 SSIM 进行评测。
学习式插值方法#
- 基于光流的网络: Super SloMo(2018)会预测两帧之间任意时刻的光流和可见性;RIFE(2022)则直接估计中间时刻的光流,速度比 Super SloMo 和 DAIN 快 4 到 27 倍。
- 基于卷积核的网络: SepConv(2017)会为每个输出像素预测可分离卷积核,并将其应用于两帧输入的图像块,以一步完成运动估计和融合。
- 大幅运动模型: Google 的 FILM(2022)在特征金字塔的各个尺度间共享权重,因此细尺度上的大幅运动可以像它在粗尺度学到的小幅运动一样处理;它仅用三帧组进行训练。
- 生成式模型: LDMVFI(2024)等基于扩散的插值模型会对由两帧输入条件化的潜在表示进行去噪,从而生成中间帧,而不是扭曲输入帧的像素。
- 基于事件的插值: Time Lens(2021)会加入事件相机在两帧之间记录的亮度变化,这些变化能揭示间隔期间的真实运动。
实际应用#
- 游戏帧生成: NVIDIA DLSS Multi Frame Generation 可在 GeForce RTX 50 Series GPU 上为每个渲染帧插入最多五个生成帧;每个生成帧都需要等待下一个渲染帧,因此会增加延迟。
- 视频编辑: 视频编辑器会将普通素材制作成慢动作,并将 24 或 30 FPS 视频转换为适用于 60 Hz 和 120 Hz 显示器的格式;这与电视采用的运动平滑是同一种运动插值。
- 动画: 插值模型会为手绘关键帧生成中间画面;视频生成器则可以生成以给定两帧为起点和终点的完整片段。
目标跟踪将同一思路用于位置而非像素。当物体隐藏数帧后重新出现时,Ultralytics 跟踪模式(tracker="ocsort.yaml")中的 OC-SORT 跟踪器会为漏检帧线性插入虚拟边界框,并将其重新输入卡尔曼滤波器,修正用于将该物体与下一次 YOLO26 检测结果匹配的速度估计。










