Модели и платформы ИИ

Как работает генерация 3D с помощью ИИ: Meta 3D Gen, OpenAI Shap-E и многое другое

mm
Добавьте Unite.AI в избранные источники в Google

Способность генерировать 3D цифровые активы из текстовых подсказок представляет собой один из самых интересных недавних разработок в области ИИ и компьютерной графики. Поскольку рынок 3D цифровых активов, как ожидается, вырастет с $28,3 млрд в 2024 году до $51,8 млрд к 2029 году, модели ИИ для генерации 3D из текста готовы сыграть значительную роль в революционизации создания контента в таких отраслях, как игры, кино, электронная коммерция и многое другое. Но как именно работают эти системы ИИ? В этой статье мы подробно рассмотрим технические детали, лежащие в основе генерации 3D из текста.

Проблема генерации 3D

Генерация 3D активов из текста является значительно более сложной задачей, чем генерация 2D изображений. В то время как 2D изображения представляют собой по сути сетки пикселей, 3D активы требуют представления геометрии, текстур, материалов и часто анимаций в трехмерном пространстве. Эта добавленная размерность и сложность делают задачу генерации намного более сложной.

Некоторые ключевые проблемы в генерации 3D из текста включают:

  • Представление 3D геометрии и структуры
  • Генерация последовательных текстур и материалов на всей 3D поверхности
  • Обеспечение физической правдоподобности и согласованности с разных точек зрения
  • Поймание тонких деталей и глобальной структуры одновременно
  • Генерация активов, которые можно легко отрендерить или напечатать на 3D принтере

Чтобы решить эти проблемы, модели генерации 3D из текста используют несколько ключевых технологий и методов.

Ключевые компоненты систем генерации 3D из текста

Большинство современных систем генерации 3D из текста имеют несколько общих ключевых компонентов:

  1. Кодирование текста: Преобразование входной текстовой подсказки в числовое представление
  2. Представление 3D: Метод представления 3D геометрии и внешнего вида
  3. Генеративная модель: Основная модель ИИ для генерации 3D актива
  4. Рендеринг: Преобразование 3D представления в 2D изображения для визуализации

Давайте рассмотрим каждый из этих компонентов более подробно.

Кодирование текста

Первым шагом является преобразование входной текстовой подсказки в числовое представление, с которым может работать модель ИИ. Это обычно делается с помощью больших языковых моделей, таких как BERT или GPT.

Представление 3D

Существует несколько общих способов представления 3D геометрии в моделях ИИ:

  1. Воксельные сетки: 3D массивы значений, представляющих занятость или особенности
  2. Облака точек: Наборы 3D точек
  3. Сетки: Вершины и грани, определяющие поверхность
  4. Неявные функции: Непрерывные функции, определяющие поверхность (например, функции подписанного расстояния)
  5. Нейронные радиационные поля (NeRFs): Нейронные сети, представляющие плотность и цвет в 3D пространстве

Каждый из них имеет компромиссы в плане разрешения, использования памяти и легкости генерации. Многие недавние модели используют неявные функции или NeRFs, поскольку они позволяют получать высококачественные результаты с разумными вычислительными требованиями.

Например, мы можем представить простую сферу как функцию подписанного расстояния:

import numpy as np

<p>def sphere_sdf(x, y, z, radius=1.0):</p>
<p>return np.sqrt(x**2 + y**2 + z**2) - radius</p>

<p># Оценка SDF в 3D точке</p>
<p>point = [0.5, 0.5, 0.5]</p>
<p>distance = sphere_sdf(*point)</p>
<p>print(f"Расстояние до поверхности сферы: {distance}")</p>

Генеративная модель

Ядром системы генерации 3D из текста является генеративная модель, которая производит 3D представление из текстовой подсказки. Большинство современных моделей используют некоторую вариацию диффузионной модели, аналогичной тем, которые используются в генерации 2D изображений.

Диффузионные модели работают путем постепенного добавления шума к данным, а затем обучения для обратного процесса. Для генерации 3D это происходит в пространстве выбранного 3D представления.

Упрощенный псевдокод для шага обучения диффузионной модели может выглядеть следующим образом:

def diffusion_training_step(model, x_0, text_embedding):</p>
<p># Выбор случайного временного шага</p>
<p>t = torch.randint(0, num_timesteps, (1,))</p>

<p># Добавление шума к входным данным</p>
<p>noise = torch.randn_like(x_0)</p>
<p>x_t = add_noise(x_0, noise, t)</p>

<p># Предсказание шума</p>
<p>predicted_noise = model(x_t, t, text_embedding)</p>

<p># Расчет ошибки</p>
<p>loss = F.mse_loss(noise, predicted_noise)</p>

<p>return loss</p>

<p># Цикл обучения</p>
<p>for batch in dataloader:</p>
<p>x_0, text = batch</p>
<p>text_embedding = encode_text(text)</p>
<p>loss = diffusion_training_step(model, x_0, text_embedding)</p>
<p>loss.backward()</p>
<p>optimizer.step()</p>

Во время генерации мы начинаем с чистого шума и итеративно удаляем шум, учитывая текстовую подсказку.

Рендеринг

Чтобы визуализировать результаты и вычислить ошибки во время обучения, нам нужно отрендерить наше 3D представление в 2D изображения. Это обычно делается с помощью дифференцируемых методов рендеринга, которые позволяют передавать градиенты через процесс рендеринга.

Для сеточных представлений мы можем использовать рендерер на основе растеризации:

import torch
import torch.nn.functional as F
import pytorch3d.renderer as pr

<p>def render_mesh(vertices, faces, image_size=256):</p>
<p># Создание рендерера</p>
<p>renderer = pr.MeshRenderer(</p>
<p>rasterizer=pr.MeshRasterizer(),</p>
<p>shader=pr.SoftPhongShader()</p>
<p>)</p>

<p># Настройка камеры</p>
<p>cameras = pr.FoVPerspectiveCameras()</p>

<p># Рендеринг</p>
<p>images = renderer(vertices, faces, cameras=cameras)</p>

<p>return images</p>

<p># Пример использования</p>
<p>vertices = torch.rand(1, 100, 3) # Случайные вершины</p>
<p>faces = torch.randint(0, 100, (1, 200, 3)) # Случайные грани</p>
<p>rendered_images = render_mesh(vertices, faces)</p>

Для неявных представлений, таких как NeRFs, мы обычно используем методы рей-марчинга для рендеринга видов.

Объединение всего: конвейер генерации 3D из текста

Теперь, когда мы рассмотрели ключевые компоненты, давайте пройдемся по тому, как они объединяются в типичном конвейере генерации 3D из текста:

  1. Кодирование текста: Входная подсказка кодируется в плотное векторное представление с помощью языковой модели.
  2. Первоначальная генерация: Диффузионная модель, учитывающая текстовую подсказку, генерирует первоначальное 3D представление (например, NeRF или неявную функцию).
  3. Согласованность с нескольких точек зрения: Модель рендерит несколько видов сгенерированного 3D актива и обеспечивает согласованность с разных точек зрения.
  4. Уточнение: Дополнительные сети могут уточнить геометрию, добавить текстуры или улучшить детали.
  5. Окончательный вывод: 3D представление преобразуется в желаемый формат (например, текстурированная сетка) для использования в последующих приложениях.

Вот упрощенный пример того, как это может выглядеть в коде:

class TextTo3D(nn.Module):</p>
<p>def __init__(self):</p>
<p>super().__init__()</p>
<p>self.text_encoder = BertModel.from_pretrained('bert-base-uncased')</p>
<p>self.diffusion_model = DiffusionModel()</p>
<p>self.refiner = RefinerNetwork()</p>
<p>self.renderer = DifferentiableRenderer()</p>

<p>def forward(self, text_prompt):</p>
<p># Кодирование текста</p>
<p>text_embedding = self.text_encoder(text_prompt).last_hidden_state.mean(dim=1)</p>

<p># Генерация первоначального 3D представления</p>
<p>initial_3d = self.diffusion_model(text_embedding)</p>

<p># Рендеринг нескольких видов</p>
<p>views = self.renderer(initial_3d, num_views=4)</p>

<p># Уточнение на основе согласованности с нескольких точек зрения</p>
<p>refined_3d = self.refiner(initial_3d, views)</p>

<p>return refined_3d</p>

<p># Использование</p>
<p>model = TextTo3D()</p>
<p>text_prompt = "Красный спортивный автомобиль"</p>
<p>generated_3d = model(text_prompt)</p>

Лучшие модели генерации 3D из текста

3DGen – Meta

3DGen предназначен для решения проблемы генерации 3D контента, такого как персонажи, реквизит и сцены, из текстовых описаний.

Большие языковые и текстовые модели 3D - 3d-gen

Большие языковые и текстовые модели 3D – 3d-gen

3DGen поддерживает физически основанное рендеринг (PBR), который необходим для реалистичного рендеринга 3D активов в реальных приложениях. Он также позволяет генерировать ретекстурирование ранее сгенерированных или созданных художником 3D форм с помощью новых текстовых входных данных. Конвейер объединяет два основных компонента: Meta 3D AssetGen и Meta 3D TextureGen, которые обрабатывают генерацию 3D из текста и текстур соответственно.

Meta 3D AssetGen

Meta 3D AssetGen (Siddiqui et al., 2024) отвечает за первоначальную генерацию 3D активов из текстовых подсказок. Этот компонент производит 3D сетку с текстурами и картами материалов PBR примерно за 30 секунд.

Meta 3D TextureGen

Meta 3D TextureGen (Bensadoun et al., 2024) уточняет текстуры, сгенерированные AssetGen. Он также может использоваться для генерации новых текстур для существующих 3D форм на основе дополнительных текстовых описаний. Этот этап занимает примерно 20 секунд.

Point-E (OpenAI)

Point-E, разработанный OpenAI, является еще одной заметной моделью генерации 3D из текста. В отличие от DreamFusion, которая производит представления NeRF, Point-E генерирует 3D облака точек.

Ключевые особенности Point-E:

а) Двухэтапный конвейер: Point-E сначала генерирует синтетический 2D вид с помощью модели диффузии текст-изображение, а затем использует это изображение для условного генерирования 3D облака точек.

б) Эффективность: Point-E предназначен для вычислительной эффективности, способен генерировать 3D облака точек в течение секунд на одном GPU.

в) Цветовая информация: Модель может генерировать цветные облака точек, сохраняя как геометрическую, так и цветовую информацию.

Ограничения:

  • Низкое качество по сравнению с сеточными или NeRF-основанными подходами
  • Облака точек требуют дополнительной обработки для многих последующих приложений

Shap-E (OpenAI):

Развивая Point-E, OpenAI представил Shap-E, который генерирует 3D сетки вместо облаков точек. Это устраняет некоторые ограничения Point-E, сохраняя при этом вычислительную эффективность.

Ключевые особенности Shap-E:

а) Неявное представление: Shap-E учит генерировать неявные представления (функции подписанного расстояния) 3D объектов.

б) Извлечение сетки: Модель использует дифференцируемую реализацию алгоритма марчинга кубов для преобразования неявного представления в полигональную сетку.

в) Генерация текстур: Shap-E также может генерировать текстуры для 3D сеток, в результате чего получаются более визуально привлекательные выходные данные.

Преимущества:

  • Быстрое время генерации (секунды до минут)
  • Прямой выход сетки, подходящий для рендеринга и последующих приложений
  • Способность генерировать как геометрию, так и текстуру

GET3D (NVIDIA):

GET3D, разработанный исследователями NVIDIA (NVDA ), является еще одной мощной моделью генерации 3D из текста, которая фокусируется на производстве высококачественных текстурированных 3D сеток.

Ключевые особенности GET3D:

а) Явное представление поверхности: В отличие от DreamFusion или Shap-E, GET3D напрямую генерирует явные представления поверхностей (сетки) без промежуточных неявных представлений.

б) Генерация текстур: Модель включает дифференцируемый метод рендеринга для обучения и генерации высококачественных текстур для 3D сеток.

в) Архитектура GAN: GET3D использует подход генеративно-состязательной сети (GAN), который позволяет быстро генерировать 3D активы после обучения.

Преимущества:

  • Высокое качество геометрии и текстур
  • Быстрое время вывода
  • Прямая интеграция с 3D движками рендеринга

Ограничения:

  • Требует 3D обучающих данных, которые могут быть редкими для некоторых категорий объектов

Заключение

Генерация 3D из текста с помощью ИИ представляет собой фундаментальный сдвиг в том, как мы создаем и взаимодействуем с 3D контентом. Используя передовые методы глубокого обучения, эти модели могут производить сложные, высококачественные 3D активы из простых текстовых описаний. По мере продолжения развития технологии мы можем ожидать появления все более совершенных и способных систем генерации 3D из текста, которые революционизируют отрасли от игр и кино до дизайна продукта и архитектуры.

Я провел последние пять лет, погружаясь в увлекательный мир машинного обучения и глубокого обучения. Моя страсть и экспертиза привели меня к участию в более чем 50 различных проектах программной инженерии, с особым акцентом на ИИ/МО. Мое непрекращающееся любопытство также привело меня к обработке естественного языка, области, которую я с нетерпением жду возможности изучить дальше.