PhysGen: генеративная модель, учитывающая физику
- Введение
- Pipeline
- Анализ изображения
- Сегментация
- Извлечение физических свойств
- Извлечение геометрических свойств
- Intrinsic decomposition
- Background inpainting
- Собираем всё воедино!
- Физическая симуляция
- Внешние силы
- Столкновения
- Рендеринг
- Создание видео из симуляции
- Relighting
- Refinement
- Эксперименты
- Сравнение с бейзлайнами
- PhysGen
- Метрики
- Генерация в зависимости от начальной силы
- Сравнение с другими моделями
- Сравнение с реальными видео
- Заключение
Введение
🗂️ Project page
📄 GitHub
📎 Paper
Видео-диффузионные модели всё больше набирают популярность, достигая хорошего качества:
Отдельный тип задачи генерации видео — image-to-video, или анимация входного изображения.
Большая часть этих моделей учится на видеорядах и изображениях — она улавливает законы физики из того, что видит, но не получает их непосредственно.
А что если попытаться дополнительно дать модели знания о физических законах при генерации? Именно такую задачу поставили перед собой авторы работы PhysGen. Основная идея здесь — интеграция физической симуляции процесса в генерацию видео для получения результатов, соответствующих реальным законам нашего мира 🙂
Например, ниже представлены видео, сгенерированные обычной видео-диффузионной моделью и моделью, предложенной авторами.
В этой статье мы не будем подробно останавливаться на работе различных диффузионных видеогенераторов. Напомним, что они принимают на вход изображение (обычно) и текстовый промпт (иногда), чтобы описать, как перевести изображение в видео. Есть много работ о тренировке такого видеогенератора, которые мы обсудим в следующих статьях. Stay tuned! 😊
Pipeline
Давайте посмотрим, как же всё-таки сделать генерацию видео с учётом законов физики. Для начала ещё раз чётко сформулируем основную задачу:
Хотим получить реалистичный видеогенератор, который качественно воспроизводит динамику и взаимодействие твёрдых тел.
В качестве входа подаётся изображение, а также дополнительно указывается изначальная сила или момент силы.
Пайплайн состоит из нескольких частей:
- Анализ изображения, где выделяются основные объекты, а также их физические свойства, включая геометрию и материал.
- Симуляция динамики процесса на основе полученных параметров.
- Рендеринг кадров и refinement module.
Давайте рассмотрим на примере изображения с доминошками, что делают авторы:
Анализ изображения
Сегментация
На первом этапе получим сегментационную маску для основных объектов изображения. Для этого мы сначала попросим GPT-4V модель распознать все категории на изображении, а затем с помощью сегментатора Grounded-SAM получим основную маску для каждого из объектов.
Промпт для запроса в GPT-4V
User: Describe all unique object categories in the given image, ensuring all pixels are included and assigned to one of the categories, do not miss any movable or static object appeared in the image, each category name is a single word and in singular noun format, do not include ’-’ in the name. Different categories should not be repeated or overlapped with each other in the image.
For each category, judge if the instances in the image is movable, the answer is True or False. If there are multiple instances of the same category in the image, the judgement is True only if the object category satisfies the following requirements:
1. The object category is things (objects with a well-defined shape, e.g. car, person) and not stuff (amorphous background regions, e.g. grass, sky, largest segmentation component).
2. All instances in the image of this category are movable with complete shape and fully-visible.
Format Requirement: You must provide your answer in the following JSON format, as it will be parsed by a code script later.
Your answer must look like:
«category-1»: False, «category-2»: True
Do not include any other text in your answer. Do not include unnecessary words besides the category name and True/False values.
Затем снова через GPT-4V разделим объекты на две категории:
- background;
- foreground (дальнейшая физическая симуляция).
Затем дополнительно извлечём основные границы объектов, в частности, границы пола, стен и др. Для этого сначала получим карты глубины и нормалей:
Далее упорядочим объекты background по соответствующей глубине и оставим только те из них, диапазон глубины которых находится в пределах диапазона глубины объектов переднего плана. Затем извлечём их сегментационные границы (но только в диапазоне глубины объектов переднего плана) и проверим, является ли этот объект плоскостью с помощью карты нормалей.
Извлечение физических свойств
Для запуска качественной физической симуляции нужно сначала получить физические свойства объектов, включая их массу, эластичность и коэффициент трения. Для этого запускаем запрос в GPT-4v модель на основе изображения и полученной маски.
Промпт для запроса в GPT-4V
User: You will be given an image and a binary mask specifying an object on the image, analyze and provide your final answer of the object physical property. The query object will be enclosed in white mask. The physical property includes the mass, the friction and elasticity. The mass is in grams. The friction uses the Coulomb friction model, a value of 0.0 is frictionless. The elasticity value of 0.0 gives no bounce, while a value of 1.0 will give a perfect bounce.
Format Requirement: You must provide your answer in the following JSON format, as it will be parsed by a code script later.
Your answer must look like:
«mass»: number, «friction»: number, «elasticity»: number
The answer should be one exact number for each property, do not include any other text in your answer, as it will be parsed by a code script later.
Извлечение геометрических свойств
Обычные маски не подходят для запуска физической симуляции. Поэтому каждый объект нужно представить в векторном виде. Авторы используют два вида: круг и многоугольник.
Также на основе физических свойств и вида объекта извлекается момент инерции:
Он характеризует инертность тела при вращательном движении вокруг оси и необходим для корректного написания уравнений движения, о которых мы поговорим дальше.
Код для тех, кому будет интересно его посмотреть
if class_name == "polygon":
mask = self.mask_img == seg_id
polygons = Mask(mask).polygons()
if len(polygons.points) > 1: # find the largest polygon
areas = []
for points in polygons.points:
points = points.reshape((-1, 1, 2)).astype(np.int32)
img = np.zeros((self.mask_img.shape[0], self.mask_img.shape[1], 3), dtype=np.uint8)
img = cv2.fillPoly(img, [points], color=[0, 255, 0])
mask = img[:, :, 1] > 0
area = np.count_nonzero(mask)
areas.append(area)
areas = np.array(areas)
largest_idx = np.argmax(areas)
points = polygons.points[largest_idx]
else:
points = polygons.points[0]
points = tuple(map(tuple, points))
poly = self._create_poly(density, points, elasticity, friction)
self.objs[seg_id] = poly
elif class_name == "circle":
mask = self.mask_img == int(seg_id)
mask = (mask * 255).astype(np.uint8)
center, radius = fit_circle_from_mask(mask)
ball = self._create_ball(mass, radius, center, elasticity, friction)
self.objs[seg_id] = ball
Где:
def _create_ball(self, mass, radius, position, elasticity=0.5, friction=0.4):
"""
Create a ball defined by mass, radius and position
"""
inertia = pymunk.moment_for_circle(mass, 0, radius, (0, 0))
body = pymunk.Body(mass, inertia)
body.position = position
shape = pymunk.Circle(body, radius, (0, 0))
shape.elasticity = elasticity
shape.friction = friction
self._space.add(body, shape)
return shape
def _create_poly(self, density, points, elasticity=0.5, friction=0.4, collision_type=0):
"""
Create a poly defined by density, points
"""
body = pymunk.Body()
shape = pymunk.Poly(body, points)
shape.density = density
shape.elasticity = elasticity
shape.friction = friction
shape.collision_type = collision_type
self._space.add(body, shape)
return shape
Для описания объектов авторы используют библиотеку pymunk (выглядит миленько 🙂):
Intrinsic decomposition
Движение объекта также сказывается на его освещении. Чтобы его правильно смоделировать, используется оценка альбедо, а также карты нормалей:
Также оцениваем освещение \( \mathbf{L} \). В качестве модели освещения предлагается использовать модель точечного источника света, а для оценки применяется следующая модель.
Background inpainting
Поскольку основные объекты находятся в движении, в бэкграунде остаются «дыры».
Для их устранения используется предобученная для Inpainitng модель, с помощью которой мы получаем полное изображение background:
Однако у таких моделей есть недостаток — они часто генерируют не совсем корректные тени.
Собираем всё воедино!
Так мы собираем основную информацию об объектах сцены, включая их маски, глубину, нормали и физические свойства.
Json-файл со всеми данными b
# general setting
cat: domino
# simulation setting
animation_frames: 16
size: [512, 512]
num_steps: 160
# enable for simulation visualization
display: false
save_snapshot: false
gravity: 980
init_velocity:
6: [-80, 0]
init_acc:
# perception setting
edge_list: [[[0, 457], [512, 457]]]
obj_info:
1:
label: white cuboid
mass:
density: 2.5
friction: 0.5
elasticity: 0.01
primitive: polygon
2:
label: white cuboid
mass:
density: 2.5
friction: 0.5
elasticity: 0.01
primitive: polygon
3:
label: white cuboid
mass:
density: 2.5
friction: 0.5
elasticity: 0.01
primitive: polygon
4:
label: white cuboid
mass:
density: 2.5
friction: 0.5
elasticity: 0.01
primitive: polygon
5:
label: white cuboid
mass:
density: 2.5
friction: 0.5
elasticity: 0.01
primitive: polygon
6:
label: white cuboid
mass:
density: 2.5
friction: 0.5
elasticity: 0.01
primitive: polygon
# diffusion setting (optional)
denoise_strength: 0.45
Физическая симуляция
Симуляция проходит в пространстве 2D-изображений по нескольким причинам:
- для 3D-симуляции нам нужно полное понимание сцены, включая её реконструкцию (а это нетривиальная задача при одном изображении);
- существует много хороших работ для симуляции динамики в пространстве изображений.
Итак, перейдём к симуляции. В момент времени \( t \) каждый объект (твёрдое тело) \( i \) будет характеризоваться его 2D-положением \( \mathbf{t}^i(t) \in \mathbb{R}^2 \) , поворотом \( \mathbf{R}^i(t) \in \mathcal{SO}(2) \)) и скоростью центра масс (включая линейную \( \mathbf{v}^i(t) \in \mathbb{R}^2 \) и угловую \( \mathbf{w}^i(t) \in \mathbb{R}^2 \) составляющие).
Тогда в каждый момент времени \( \mathbf{q}^i(t) = \Big[\mathbf{t}^i(t), \mathbf{R}^i(t), \mathbf{v}^i(t). \mathbf{w}^i(t)\Big] \).
Теперь мы можем записать уравнение динамики (вспоминаем школьную физику 🙂):
\( \frac{d}{dt} \mathbf{q}(t) = \frac{d}{dt} \begin{bmatrix} \mathbf{t}(t) \\ \mathbf{R}(t) \\ \mathbf{v}(t) \\ \mathbf{w}(t) \end{bmatrix} = \begin{bmatrix} \mathbf{v}(t) \\ \mathbf{w}(t) \times \mathbf{R}(t) \\ \frac{\mathbf{F}(t)}{M} \\ \mathbf{I}(t)^{-1}(\tau — \mathbf{w}(t) \times \mathbf{I}(t)\mathbf{w}(t)) \end{bmatrix} \)
где \( M \) — масса объекта, \( \tau \) — момент силы, \( I(t) = R(t)IR(t)^T \), \( I \) — момент инерции объекта.
Тогда для получения \( q \) в момент времени \( t \) нужно проинтегрировать:
\( \mathbf{q}(t) = \mathbf{q}(0) + \int_{0}^{t} \frac{d}{dt} \mathbf{q}(t) dt = \mathbf{q}(0) + \sum_{i=1}^{T} \frac{d}{dt} \mathbf{q}(t) \Big|_{t = t_i} \Delta t \)
Внешние силы
На каждый объект также действуют силы:
- гравитации;
- трения качения и скольжения;
- изначальная внешняя сила / момент силы.
Столкновения
При движении наши объекты могут сталкиваться друг с другом. Поэтому в каждый момент времени нам необходимо делать проверку. Столкновение может повлиять на скорость движения тела, а также добавить вращение.
Для всех физических симуляций авторы используют библиотеку pymunk. Здесь можно посмотреть интересные туториалы 🙂
Результаты симуляции выглядят следующим образом:
Рендеринг
Итак, у нас есть симуляция и background. Теперь нужно получить видео. Этот этап состоит из трёх частей:
- создание видео из симуляции;
- Relighting;
- Refinement.
Создание видео из симуляции
Для получения основных объектов авторы используют forward-warping входной картинки на следующие фреймы с помощью аффинной трансформации \( T(t) \). Для этого они применяют библиотеку kornia и функцию warp_affine
(ниже в формуле отражено как warp
).
Далее проводится альфа-блендинг с фоном:
\( \hat{X}(t) = \text{composite}(B, warp(X^0, T^0(t)), …, warp(X^i, T^i(t))) \)
Ещё они применяют ту же трансформацию ко входному альбедо и картам нормалей, получая альбедо и карту нормалей для каждого момента времени для дальнейшего использования при улучшении освещения.
Relighting
Дополнительно авторы проводят Relightning. Для этого они используют систему с точечным источником света и ламбертовой моделью освещения. А ещё есть Альбедо в каждом кадре \( \mathbf{A}(t) \) и карта нормалей \( \mathbf{N}(t) \):
\( \mathbf{X}(t) = f(\mathbf{X}(t), \mathbf{A}(t), \mathbf{N}(t), \mathbf{L}) \)
Refinement
Чтобы улучшить качество, в частности, модели освещения, а также добавить реалистичности, авторы проводят дополнительный Refinement. Для этого они применяют предобученную видео-диффузию.
Для начала видео с помощью специального энкодера кодируется в латентное пространство \( z \). Далее проводится небольшое зашумление, а затем расшумление с помощью предобученной модели. Авторы вводят величину \( s \in [0, 1] \), показывающую силу зашумления. Также они проверяют, что объекты переднего плана остаются на своих местах на каждом шаге расшумления (копируются из соответствующего зашумленного латента), в то время как тени и бэкграунд правятся диффузионной моделью.
Для контроля фьюзинга основных объектов из начального и сгенерированного латентов вводится параметр \( w = \frac{T — t}{T} \), а итоговый латент вычисляется по формуле:
\( z_{t-1} \leftarrow (1 — m)z_{t-1} + m\Big[wz_{t-1} + (1-w)\hat{z}_{t-1}\Big] \)
Полный алгоритм Refinement представлен на рисунке ниже:
Авторы приводят пример, доказывающий важность данного этапа:
Как видно на изображении выше, этот этап помогает сгладить неровности на границах, а также улучшает освещение.
Эксперименты
Сравнение с бейзлайнами
В качестве бейзлайнов для сравнения были выбраны модели:
Все указанные методы берут на вход изображение и текстовый промпт для генерации. Для получения текстового промпта использовалась GPT-4V модель.
PhysGen
Модель работает в разрешении \( 512 \times 512 \). Для симуляции используются 120 шагов, и затем равномерно сэмплируются 16 кадров для видео.
Для модуля Refinement зашумление проводится наполовину. Всего количество шагов денойзинга — 50 (то есть при зашумлении наполовину будет 25).
Метрики
Для валидации человеком использовались два вопроса и пятибальная шкала оценки:
- video is physical-realistic;
- video is photo-realistic.
Также авторы посчитали метрику Motion-FID. Для этого они извлекли оптический поток, а затем посчитали FID из этих зарендеренных результатов.
Авторы также сравнились с моделью Motion Guidance, которая принимает на вход изображение и оптический поток для генерации видео. Для получения оптического потока используется модель физической симуляции, предложенная авторами.
Ниже можно посмотреть на визуальное сравнение с бейзлайнами:
Таким образом, предложенная авторами методика лучше всех позволяет моделировать поведение объектов. На втором месте находится MotionGuidance.
Генерация в зависимости от начальной силы
Сравнение с другими моделями
Сравнение с реальными видео
Заключение
Таким образом, сегодня мы познакомились с работой PhysGen, авторы которой смогли добавить некоторую физическую модель мира в процесс генерации. Выглядит довольно красиво, особенно в сравнении с другими моделями 🙂
Однако предложенная модель может генерировать очень ограниченный набор видео. Во-первых, симуляция работает исключительно с твёрдотельными объектами. Во-вторых, всё моделирование происходит в 2D-плоскости. Остаётся открытым вопрос, будут ли авторы создавать более сложные симуляции для более сложных систем и смогут ли они в будущем включить симуляцию в 3D?