大数跨境

CVPR2026 SOTA|FrameFlow视频插帧实战!任意帧率自适应补帧、运动模糊鲁棒、慢动作生成SOTA

CVPR2026 SOTA|FrameFlow视频插帧实战!任意帧率自适应补帧、运动模糊鲁棒、慢动作生成SOTA AI与计算机视觉
2026-10-15
2
导读:看老电影觉得动作卡、游戏录屏只有30帧想做60帧慢动作、监控视频需要补帧做流畅回放——视频插帧这个需求其实无处

看老电影觉得动作卡、游戏录屏只有30帧想做60帧慢动作、监控视频需要补帧做流畅回放——视频插帧这个需求其实无处不在,但真正好用的开源方案一直不多。

今天分享的这篇 CVPR2026 论文 FrameFlow,提出了一个自适应视频帧插值框架:不需要知道具体帧率,模型自己判断两帧之间该插几帧,而且在运动模糊、大位移、遮挡这些硬场景下依然稳。在 Vimeo-90K 和 X-TEST 基准上刷新了 SOTA,推理速度比 RIFE 快 25%。

一、视频插帧到底难在哪

很多人第一反应是"不就是两帧之间中间插一帧吗",真做了才知道,中间这一帧的生成远比想象中复杂。

1.1 大位移问题

两帧之间物体动得少,插值就简单;但如果物体快速移动,两帧之间位移很大,中间帧的位置就很难猜准。比如一个球从画面左边飞到右边,中间那一帧到底在哪儿?传统光流方法在大位移时容易出错,因为光流本身就估不准。

1.2 遮挡区域的"凭空脑补"

这是最头疼的问题。假设一个人从一棵树后面走过去,前一帧人在树左边,后一帧人在树右边——那中间帧里,人原本站的那个位置(被树挡住的部分)应该是什么?你需要根据周围环境"脑补"出被遮挡的内容。这不是简单的插值,是需要语义理解的生成任务。

1.3 运动模糊怎么办

真实视频里,快速运动的物体本身就是糊的。这时候你插的那一帧,到底应该是清晰的还是模糊的?插成清晰的会和前后帧的模糊感不搭,插成模糊的又不知道该多糊。大部分现有方法在这个问题上都处理得很粗糙。

1.4 帧率不固定

很多论文默认输入就是相邻两帧、输出中间一帧。但实际场景里,你可能需要从 24fps 插到 60fps(插 1.5 帧),或者从 30fps 插到 120fps(插 3 帧)。目标时间点不同,插出来的中间帧也完全不一样。固定插一帧的方法根本没法用。

二、FrameFlow 的三个核心设计

FrameFlow 的整体思路:把帧插值问题转化为"时间条件下的特征扭曲与融合",让模型自己学习该在什么时间位置生成什么内容,而不是固定插中间。

2.1 时间条件自适应插入

传统方法的输入是两帧 I0 和 I1,输出固定的中间帧 It=0.5。FrameFlow 把目标时间戳 t 作为额外输入喂给网络:

•时间嵌入向量:把 t∈[0,1] 编码成一个高维向量,和图像特征融合。

•任意时间插值:同一个模型,t=0.3 输出 30% 位置的帧,t=0.8 输出 80% 位置的帧。

•多帧连续插:要做慢动作?连续跑几次,每次 t 取不同值,就能生成任意多的中间帧。

这个设计看起来简单,但解决了大问题——你不再需要为不同帧率训练不同模型,一个模型通吃所有插帧需求。

2.2 双向光流 + 遮挡感知融合

FrameFlow 没有直接预测中间帧,而是先估计两个方向的光流:

•前向光流:从 I0 指向 It,告诉你 I0 的每个像素在中间帧应该移动到哪里。

•后向光流:从 I1 指向 It,告诉你 I1 的每个像素在中间帧应该移动到哪里。

然后把两帧都扭曲(warp)到中间时间位置,再做融合。关键在于融合的时候不是简单取平均——模型会预测一个遮挡掩码:

•如果这个位置 I0 能看到、I1 看不到(I1 里被挡住了),就主要用 I0 扭曲过来的结果。

•如果 I1 能看到、I0 看不到,就主要用 I1 扭曲过来的结果。

•两边都看不到的区域,模型自己生成。

这个遮挡感知融合机制,就是解决"凭空脑补"问题的核心。

2.3 运动模糊自适应建模

这是 FrameFlow 和其他方法拉开差距的地方。它在网络里加了一个模糊度估计分支:

•先判断输入的两帧里,每个像素区域的运动模糊程度。

•根据模糊程度,自适应决定中间帧的模糊量——物体动得快,中间帧就适当带点模糊;动得慢,就输出清晰帧。

消融实验显示,去掉这个分支后,在 X-TEST 的运动模糊子集上 PSNR 掉了 1.5dB,主观上能明显看到插出来的帧和前后帧"节奏不对"。

三、技术架构拆解

FrameFlow 的整体 pipeline 分四个模块:

模块

做什么

关键设计

特征编码器

提取两帧的多尺度特征

共享权重 CNN backbone,同时输入时间嵌入向量

双向光流估计

预测 I0→It 和 I1→It 的光流

递归粗到细估计,大位移场景也能收敛

遮挡感知融合

扭曲两帧特征并智能融合

预测遮挡掩码,可见区域用扭曲结果,不可见区域生成

帧解码器

从融合特征生成最终中间帧

带残差连接的上采样网络,保留细节

几个工程上的亮点:

•轻量 backbone:整个模型 8.7M 参数,比 EMA-VFI 小 40%,但 PSNR 还高 0.6dB。

•多尺度监督:在 1/4、1/2、全分辨率三个尺度都算损失,帮助网络同时学到全局运动和局部细节。

•推理速度:512×512 分辨率在 RTX 3090 上单帧约 12ms,30fps 视频插成 120fps 完全可以实时跑。

四、和主流方法的横向对比

论文在 Vimeo-90K(合成数据集)和 X-TEST(真实复杂场景)两个基准上做了对比:

方法

Vimeo-90K PSNR(dB)

X-TEST PSNR(dB)

参数量(M)

单帧耗时(ms)

SepConv

34.1

28.3

21

45

RIFE

35.6

30.1

10

16

EMA-VFI

36.2

31.4

14

22

FrameFlow

36.8

32.2

8.7

12

可以看到,FrameFlow 在两个数据集上都拿了最高分,而且参数量最小、速度最快。X-TEST 上的提升尤其明显——这个数据集包含大量真实的运动模糊和遮挡场景,说明 FrameFlow 的模糊自适应和遮挡感知设计在真实场景下确实管用。

五、快速上手:核心推理代码

下面是 FrameFlow 的推理框架,帮大家快速理解整体流程:

python
FrameFlow 视频插帧核心逻辑
import torch
import torch.nn as nn

class FrameFlow(nn.Module):
    def __init__(self):
        super().__init__()
        self.encoder = SharedEncoder()           # 共享特征编码
        self.flow_net = BidirectionalFlowNet()    # 双向光流估计
        self.occlusion_net = OcclusionNet()      # 遮挡掩码预测
        self.decoder = FrameDecoder()             # 帧生成解码器

    def forward(self, img0, img1, t=0.5):
        # img0, img1: [1,3,H,W], t: 目标时间位置 0~1

        # 1. 提取两帧特征 + 时间嵌入
        feat0 = self.encoder(img0)
        feat1 = self.encoder(img1)
        time_emb = self.encode_time(t)

        # 2. 估计双向光流:到目标时间t的位置
        flow_0t = self.flow_net(feat0, feat1, time_emb, direction="forward")
        flow_1t = self.flow_net(feat0, feat1, time_emb, direction="backward")

        # 3. 扭曲两帧特征到中间位置
        warped_0 = warp(feat0, flow_0t)
        warped_1 = warp(feat1, flow_1t)

        # 4. 预测遮挡掩码,融合特征
        occ_mask = self.occlusion_net(warped_0, warped_1)
        fused = warped_0 * occ_mask + warped_1 * (1 - occ_mask)

        # 5. 解码生成中间帧
        mid_frame = self.decoder(fused)
        return mid_frame

# 用例:把30fps视频插成120fps(每两帧之间插3帧)
model = FrameFlow().eval()
frames = load_video("input.mp4")  # 读取原视频帧

output = []
for i in range(len(frames) - 1):
    img0 = frames[i]
    img1 = frames[i + 1]
    output.append(img0)
    # 在0.25, 0.5, 0.75位置各插一帧
    for t in [0.25, 0.5, 0.75]:
        mid = model(img0, img1, t=t)
        output.append(mid)
output.append(frames[-1])

save_video(output, "output_120fps.mp4")

实际使用的时候,预训练权重和完整数据加载管线可以参考论文开源仓库。这里主要是把核心流程讲清楚——五步:编码、光流估计、扭曲、遮挡融合、解码。

六、毕设/竞赛拓展方向

视频插帧这个方向做毕设有个天然优势——Demo 效果非常直观。把一段 30fps 的视频插成 120fps 慢动作,现场放出来效果立竿见影。分享几个有潜力的拓展点:

6.1 针对游戏场景的插帧优化

游戏画面和自然视频很不一样——边缘锐利、运动快、有大量重复纹理。专门收集一组游戏视频数据集做微调,或者加入游戏特有的先验知识(比如像素对齐、硬边运动),做一个"游戏插帧专用模型",应用场景很明确。

6.2 老视频修复 + 插帧联合

老电影修复是一个完整的 pipeline:去噪 + 去划痕 + 插帧 + 上色。把 FrameFlow 作为其中的插帧模块,和其他修复模块串起来做一个端到端的老视频复原系统,工程完整性很强,答辩展示效果也好。

6.3 移动端实时插帧

8.7M 参数本身就不大,再做剪枝和量化,完全可以跑到手机端。做一个"手机端实时慢动作"App——拍完照直接生成高帧率慢动作视频,这个方向现在手机厂商都在做,工程价值很高。

6.4 长视频时序一致性保证

逐帧插帧虽然快,但长视频跑下来可能会出现累积误差——每插一帧偏一点,几十帧之后就明显不对了。加入光流一致性约束或者长程时序建模,解决长视频的累积漂移问题,这是一个很有深度的研究点。

七、写在最后

视频插帧这个方向有点尴尬——不算最热门的顶会宠儿,但落地需求一直很旺盛。从手机慢动作模式到游戏高帧率输出,从老视频修复到影视后期,处处都用得上。

FrameFlow 给我的启发是:很多时候你不需要发明全新的范式,把现有的光流 + 扭曲 + 融合框架里的每个环节做扎实——时间条件化、遮挡感知、模糊自适应——效果自然就上来了。工程上把速度压下来、把参数量做小,比堆大模型更有落地价值。

做毕设的同学如果选这个方向,我建议先拿 RIFE 跑通 baseline,再针对性解决一个具体问题——比如运动模糊场景下的精度提升,或者长视频的时序一致性。问题越具体,工作越扎实。

大家如果有复现上的问题或者想聊具体的拓展思路,欢迎评论区交流。

【声明】内容源于网络
0
0
AI与计算机视觉
专注分享于计算机视觉和人工智能方向相关内容,包括不限于图像分类、目标检测、语义分割、基础编程、面试面经、生活启示录等,欢迎大家关注与学习。
内容 128
粉丝 0
AI与计算机视觉 专注分享于计算机视觉和人工智能方向相关内容,包括不限于图像分类、目标检测、语义分割、基础编程、面试面经、生活启示录等,欢迎大家关注与学习。
总阅读2.1k
粉丝0
内容128