Editing Motion Graphics Video via Motion Vectorization and Transformation
Stanford University; Brown University
一句话总结
本文提出一条”运动矢量化”流水线,把已经渲染成像素的 motion graphics 视频还原成带有对象、逐帧仿射运动与遮挡关系的 SVG 运动程序,并配套一套”查询—操作”式的程序变换 API,让用户能够程序化地生成重定时、运动纹理、保碰撞换装等各种变体。
研究背景
- 领域现状:Motion graphics(动态图形,即形状与文字按编排运动构成的动画)广泛用于网页设计、数字广告、动态 logo 与片头。它们在网上最常见的分发格式是视频,也就是一堆像素和帧。
- 核心痛点:视频只提供底层的像素/帧序列,缺少”对象 + 各自的运动 + 遮挡关系”这类高层结构。因此一旦渲染成视频,就极难再编辑——换个对象、改文字、把某个对象的运动重定时到音乐节拍,几乎无从下手。已有的自然视频分层方法要么只支持外观编辑不支持运动编辑,要么假设固定的深度排序、在对象相对深度变化时产生瑕疵。
- 本文 idea:先把视频还原成结构化的 SVG 运动程序(对象 = SVG group,运动 = 逐帧仿射变换序列,遮挡 = 逐帧 z-index),使其能被任意 SVG 渲染器渲染、任意 SVG 编辑器编辑;再提供一套程序变换 API,把 SVG 运动程序当作场景图来查询和修改,从而程序化地批量生成变体。
方法
整体分两大块:一条把视频转成 SVG 运动程序的运动矢量化流水线,以及一套在此程序上做编辑的程序变换 API。矢量化流水线的核心是把 Reddy 等人的可微图像合成(differentiable compositing)从”静态图案分层”改造成”逐帧对象跟踪”,并扩展为支持完整仿射变换。
flowchart LR
A["输入视频"] --> B["Stage1 区域分割"]
B --> C["Stage2 生成候选映射(前向/后向二部图)"]
C --> D["Stage3 可见性损失打分 + 贪心选无冲突映射"]
D --> E["Stage4 重构规范图像与逐帧仿射,写出SVG"]
E --> F["SVG运动程序"]
F --> G["程序变换API:查询选对象 -> 算子改运动/外观"]
G --> H["生成变体"]
关键设计:
-
可微合成作为跟踪引擎:可微合成原本输入一张目标图案 \(T\) 和一组源元素 \(\{S_1,\dots,S_N\}\),为每个源元素优化一个变换 \(\Theta_{S_i}\) 和深度层序 \(\Lambda_{S_i}\),使按后到前合成的结果匹配 \(T\)。本文把它用到帧间跟踪:以上一帧的对象集合为源、当前帧为目标做优化;并把原本的相似变换扩展成仿射变换,额外把 scaleX、scaleY、skewX、skewY 作为独立参数,以刻画非均匀缩放与错切。
-
八类映射 + 双向覆盖权重:对象从 \(F_{t-1}\) 到区域 \(F_t\) 的对应被归纳成八类(一对一、一对多分裂/不分裂、多对一合并/不合并、多对多、消失、出现)。作者分别构建前向图 \(B_{\text{fwd}}\)(对象→区域)与后向图 \(B_{\text{bwd}}\)(区域→对象),用两种覆盖权重衡量变换后对象与区域的可见重叠:源覆盖 \(W^{\text{cov}}_{\text{src}}\) 以变换后对象可见面积为分母,目标覆盖 \(W^{\text{cov}}_{\text{tgt}}\) 以区域可见面积为分母。每行只保留最高非零权重边。由于可微合成对源的初始摆放敏感,先用 shape context、光流和 RANSAC 估计初始位置。多对多这类”同时分裂又合并”的歧义映射被强制拆解为一对一/一对多/多对一的组合。
-
基于可见性的映射选择:对每个候选映射用可见性损失打分,即变换合成图 \(C(O^*)\) 与当前帧在掩码区域上的 \(L_2\) 颜色差:\(L_{\text{vis}} = \lVert (C(O^*) - F_t) \otimes M_{\text{all}} \rVert^2\),其中 \(M_{\text{all}}\) 是所有相关对象与区域可见像素的并集。随后贪心地反复选取分数最低、且与已选不冲突(不共享同一对象或区域)的候选,直到候选耗尽或最低分超过阈值 \(\epsilon = 0.1\)。据此在帧间传播对象 ID,并维护每个对象的”规范图像”(对象无遮挡且覆盖更大像素时更新,保持高分辨率外观)。
-
重构与写出 SVG:最后把逐帧变换重构成”规范图像 → 每帧”的仿射变换(可通过以规范图像为源、每帧标注像素为目标再跑一次可微合成来提升精度),并写出含静态背景 + 一组前景对象(规范图像 + 逐帧仿射序列 + 逐帧 z-index)的 SVG 运动程序。
-
查询—操作式变换 API:把 SVG 运动程序当场景图,提供状态查询(
propQuery查颜色/位置/大小/速度等,eventQuery查保持帧、碰撞帧、运动周期帧等)与算子(retime重定时、adjLocalMotion/adjGlobalMotion在局部或全局坐标系调整运动、changeAppearance换外观,以及增删对象、复制运动等)。典型模式是先用选择器按属性/事件挑对象,再用变换器组合算子,从而实现重定时到音乐节拍、加抖动/脉动运动纹理、保碰撞换装等高层效果。
实验结果
作者在从网上收集的 38 个 motion graphics 视频(含遮挡、快速运动,少数含纹理/照片/渐变)上评估。主实验是重建误差对比:以帧间 \(L_2\) RGB 误差衡量 SVG 程序渲染结果对原视频的还原度,并与 sprite-from-sprite 分解方法比较(后者仅在 30 个视频上成功,其余爆内存)。
| 方法 | 测试集 | 平均 \(L_2\) RGB 重建误差 ↓ |
|---|---|---|
| 本文 | 全部 38 个 | 0.0086 |
| 本文 | sprite 可跑的 30 个子集 | 0.0079 |
| Sprite-from-sprite | 同一 30 个子集 | 0.018 |
跟踪误差方面:38 个视频里 24 个完全无跟踪错误,其余 14 个也都在 15 个错误以内;全部错误中约 75% 出现在一对一映射(多因快速运动与对象进出画面),约 21% 是一对多(不分裂)被误判为一对多(分裂)。多数错误可通过重指派对象 ID 快速修正,只有两个视频需要手动指定像素级区域边界。此外,10 名有 Python 经验的参与者在 30 分钟教程 + 15 分钟实操内全部成功写出含两个及以上查询与变换的程序,并在 5 分制上一致把该”查询—操作”范式评为容易或很容易理解。
亮点与局限
- 亮点:
- 把”渲染后就锁死”的 motion graphics 视频重新变回可编辑的结构化程序,且输出是标准 SVG,能用任意浏览器渲染、任意 SVG 编辑器(含 After Effects、Blender 导入器)编辑。
- 巧妙复用可微合成做逐帧跟踪,不依赖重量级神经网络;八类映射 + 双向覆盖权重 + 可见性损失的组合能显式处理分裂/合并/遮挡带来的动态深度变化。
- 变换 API 采用成熟的”查询场景图再修改”设计模式,可组合、易上手,天然适合批量生产”看起来定制化”的动画变体。
- 局限:
- 假设静态背景 + 实色/轻纹理/渐变对象 + 仿射运动;对移动背景、强纹理照片前景、非刚性形变视频不适用。
- 对象外观仍以规范”图像”表示,未真正矢量化成路径/形状/渐变,缺一层更高的外观抽象。
- 未构建运动编辑的图形界面,也未按格式塔原则把共同运动的对象(如字母组成单词)聚合成更高层复合对象。
延伸思考
- 这条路线本质是”逆向渲染 + 程序综合”在 2D 动画域的落地:先恢复结构化程序,再在程序层做编辑,比在像素/隐空间里编辑更可控、更可复用。它与神经图集、sprite 分解等分层表示形成对照——后者偏外观编辑,本文强调运动可编辑与动态遮挡。
- 把规范图像进一步矢量化(结合可微矢量化 / 图像转路径工作),以及用扩散模型驱动的换装/风格化替换
changeAppearance的目标外观,都是自然的下一步;将 API 接到双向 SVG 编辑(如 Sketch-n-Sketch)之上,则可能让直接操控与底层程序实时互映。 - “查询—操作”式 API 的可用性结果提示,面向程序员的编辑接口在批量个性化场景(贺卡、广告物料)中有实际价值,值得思考如何为非程序员提供等价的可视化封装。