Моделі та платформи ШІ

Як працює генерація 3D з допомогою тексту AI: 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 активи вимагають представлення геометрії, текстур, матеріалів та часто анімací у тривимірному просторі. Ця додана розмірність і складність робить завдання генерації ще більш складним.

Деякі ключові виклики у генерації 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 зображення. Це зазвичай робиться за допомогою диференційовних методів візуалізації, які дозволяють градієнтам проходити назад через процес візуалізації.

Для представлень на основі сіток ми можемо використовувати рasteryзаційний рендерер:

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 контенту, такого як персонажі, реквізит та сцени, з текстових описів.

Large Language and Text-to-3D Models - 3d-gen

Large Language and Text-to-3D Models – 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 з тексту AI представляє фундаментальну зміну у створенні та взаємодії з 3D контентом. Використовуючи передові техніки глибинного навчання, ці моделі можуть виробляти складні, високоякісні 3D активи з простих текстових описів. По мірі розвитку технології ми очікуємо побачити все більш досконалі та здатні системи генерації 3D з тексту, які революціонізують галузі від ігор та кіно до дизайну продуктів та архітектури.

Я провів останні п'ять років, занурючись у захопливий світ машинного навчання та глибокого навчання. Моя пристрасть та експертиза привели мене до внеску у понад 50 різних проектів програмної інженерії, з особливим акцентом на AI/ML. Моя тривала цікавість також привела мене до природної обробки мови, галузі, яку я бажаю дослідити далі.