Paper: Liu S, Ren Z, Gupta S, et al. Physgen: Rigid-body physics-grounded image-to-video generation[C]//European Conference on Computer Vision. Springer, Cham, 2025: 360-378.
Introduction: https://stevenlsw.github.io/physgen/
Code: https://github.com/stevenlsw/physgen

PhysGen 是一种 image-to-video 方法,完成的任务是根据输入图像和用户给定的受力或扭矩生成满足刚体物理学的运动视频。
在这里插入图片描述

PhysGen 的生成过程使用了多个现有的大模型,主要分为以下三个步骤:

  1. 图像感知:获取图像的几何、语义和物理属性参数;
  2. 运动模拟:根据刚体物理学和图中物体的物理属性参数模拟运动;
  3. 精细化渲染:进一步生成精细化视频;

在这里插入图片描述

一. Perception

为了获取图像的几何、语义和物理属性参数,需要先对图像按实例进行分割,再利用视觉模型直接预测物理属性,并填补背景的空洞。

1. Segmentation

先使用 GPT-4V 识别输入图像中包含的物体类别,再将类别信息传入 Grounded-SAM 获取每个实例级 mask。同时,GPT-4V 还可以根据类别的移动性将实例分为 前景背景。前景对象将被用于物理运动模拟,背景则用于提取碰撞或支撑边界。

2. Physical properties reasoning

将上一步得到的实例 mask 传入 GPT-4V 询问其所需的物理属性值。本文查询了质量、弹性和摩擦系数,并计算其转动惯量。

3. Geometry primitives

mask 不适合物理仿真,因此需要将每个物体转换为几何原语 —— 圆形或多边形。圆形可以更真实地模拟物体的滚动运动,调整圆心和半径以便尽可能覆盖物体的 mask。多边形用来模拟平动,提取 mask 的轮廓得到多边形的顶点。

4. Intrinsic decomposition

物体运动还会导致表面光照的变化,因此还需要根据输入图像预测反射率、法线和背景光照。这里预测反射率使用的是 Intrinsic image decomposition via ordinal shading 方法,预测法线使用的是 Geowizard,预测背景光照使用的是 Intrinsic Harmonization for Illumination-Aware Compositing。

5. Background inpainting

物体移动后背景会出现空洞,使用 Inpaint anything 模型填补空洞。

二. Image space dynamics simulation

将刚体物理学运动建模如下:在给定的时间 t t t 下,每个刚体由二维位置变换矩阵和质心速度进行建模。位置信息由平移矩阵 t \mathbf{t} t 和旋转矩阵 R \mathbf{R} R 获得,速度包括线速度 ν \boldsymbol{\nu} ν 和角速度 ω \boldsymbol{\omega} ω。每一时刻物体的状态 q ( t ) = [ t ( t ) R ( t ) ν ( t ) ω ( t ) ] \mathbf{q}(t)=\left[\begin{array}{c} \mathbf{t}(t) \\ \mathbf{R}(t) \\ \boldsymbol{\nu}(t) \\ \boldsymbol{\omega}(t) \end{array}\right] q(t)= t(t)R(t)ν(t)ω(t) 可以表示为:
q ( t ) = q ( 0 ) + ∫ 0 t d d t q ( t ) d t = q ( 0 ) + ∑ i = 1 T d d t q ( t ) ∣ t = t i Δ t where  d d t q ( t ) = d d t [ t ( t ) R ( t ) ν ( t ) ω ( t ) ] = [ v ( t ) ω ( t ) × R ( t ) F ( t ) M I ( t ) − 1 ( τ − ω ( t ) × I ( t ) ω ( t ) ) ] \begin{gathered} \mathbf{q}(t)=\mathbf{q}(0)+\int_0^t \frac{d}{d t} \mathbf{q}(t) d t=\mathbf{q}(0)+\left.\sum_{i=1}^T \frac{d}{d t} \mathbf{q}(t)\right|_{t=t_i} \Delta_t \\ \text{where } \frac{d}{d t} \mathbf{q}(t)=\frac{d}{d t}\left[\begin{array}{c} \mathbf{t}(t) \\ \mathbf{R}(t) \\ \boldsymbol{\nu}(t) \\ \boldsymbol{\omega}(t) \end{array}\right]=\left[\begin{array}{c} \mathbf{v}(t) \\ \boldsymbol{\omega}(t) \times \mathbf{R}(t) \\ \frac{\mathbf{F}(t)}{M} \\ \mathbf{I}(t)^{-1}(\boldsymbol{\tau}-\boldsymbol{\omega}(t) \times \mathbf{I}(t) \boldsymbol{\omega}(t)) \end{array}\right] \end{gathered} q(t)=q(0)+0tdtdq(t)dt=q(0)+i=1Tdtdq(t) t=tiΔtwhere dtdq(t)=dtd t(t)R(t)ν(t)ω(t) = v(t)ω(t)×R(t)MF(t)I(t)1(τω(t)×I(t)ω(t))

其中 F \mathbf{F} F 是外力, τ \boldsymbol{\tau} τ 是扭矩, M M M 是质量M, I \mathbf{I} I 是转动惯量。

为了模拟碰撞,还在每个时间点检测边界。

三. Rendering

1. Composited video

将视频的前景和背景分解,背景直接使用 Inpainting 处理过的结果,前景使用仿射矩阵对输入图像进行变换得到,再使用 α-blending 技术将前景和背景进行合成。为了同步光照和法线,对其进行相同的仿射操作。

2. Relighting

输入当前时刻的 RGB 图像、光照和法线,以及之前估计的背景光照,对 RGB 图像进行重光照。

3. Generative refinement

为了提高视频质量,使用 video diffusion(本文使用的是 SEINE)进一步细化视频内容。具体来说,对视频进行编码后,使用 SDEdit 方法向隐变量添加噪声并逐步去噪。与传统的去噪方法不同,不从头开始去噪,而是定义了一个初始噪声强度,并控制噪声添加的量。在去噪过程中,确保前景内容与指导视频一致,同时在背景中生成新的内容。为此,使用了一个动态变化的融合权重随着去噪的进行逐渐增加,从而在保持前景一致性的同时加强背景生成。

四. 实验

五. 总结

六. 复现

  • 平台:AutoDL
  • 显卡:RTX 4090 24G
  • 镜像:PyTorch 2.0.0、Python 3.8(ubuntu20.04)、Cuda 11.8
  • 源码:https://github.com/stevenlsw/physgen

实验记录

  1. 克隆仓库后,按照 README 创建虚拟环境 physgen 并安装依赖;

  2. 感知阶段需要引入诸多大模型,此处直接使用 data 文件夹下处理好的结果;

  3. 模拟阶段直接进行模拟即可,前景、背景、物体运动等信息以及模拟视频都被存储在 outputs/${name} 文件夹下:
    在这里插入图片描述

  4. 然后进行重光照,生成重光照的信息和视频被存储在 outputs/${name} 文件夹下:
    在这里插入图片描述

  5. 精细化视频时,遇到 TypeError: an integer is required 报错:
    在这里插入图片描述
    miniconda3/envs/physgen/lib/python3.9/site-packages/torchvision/io/video.py 中的 frame.pict_type = "NONE" 修改为 frame.pict_type = 0 即可 1 2。修改后即可正常进行,生成最终的视频:
    在这里插入图片描述

实验结果


  1. pyav 14.0.0 breaks write_video #8779 ↩︎

  2. TypeError: an integer is required #1666 ↩︎

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐