Modelos e plataformas de IA

Como Funciona a Geração de 3D por Texto: Meta 3D Gen, OpenAI Shap-E e mais

mm
Adicione Unite.AI às suas fontes preferidas no Google

A capacidade de gerar ativos digitais 3D a partir de prompts de texto representa um dos desenvolvimentos mais emocionais recentes em IA e gráficos computacionais. Como o mercado de ativos digitais 3D está projetado para crescer de US$ 28,3 bilhões em 2024 para US$ 51,8 bilhões em 2029, os modelos de IA de texto para 3D estão preparados para desempenhar um papel fundamental na revolução da criação de conteúdo em indústrias como jogos, filmes, comércio eletrônico e mais. Mas como exatamente esses sistemas de IA funcionam? Neste artigo, vamos mergulhar nos detalhes técnicos por trás da geração de 3D por texto.

O Desafio da Geração de 3D

Gerar ativos 3D a partir de texto é uma tarefa significativamente mais complexa do que a geração de imagens 2D. Enquanto as imagens 2D são essencialmente grades de pixels, os ativos 3D exigem a representação de geometria, texturas, materiais e, frequentemente, animações em espaço tridimensional. Essa dimensionalidade e complexidade adicionais tornam a tarefa de geração muito mais desafiadora.

Alguns dos principais desafios na geração de 3D por texto incluem:

  • Representar a geometria e a estrutura 3D
  • Gerar texturas e materiais consistentes em toda a superfície 3D
  • Garantir a plausibilidade física e a coerência de múltiplos pontos de vista
  • Capturar detalhes finos e estrutura global simultaneamente
  • Gerar ativos que possam ser facilmente renderizados ou impressos em 3D

Para lidar com esses desafios, os modelos de texto para 3D aproveitam várias tecnologias e técnicas-chave.

Componentes-Chave dos Sistemas de Texto para 3D

A maioria dos sistemas de geração de 3D por texto de ponta compartilha alguns componentes-chave:

  1. Codificação de texto: Converter o prompt de texto de entrada em uma representação numérica
  2. Representação 3D: Um método para representar a geometria e a aparência 3D
  3. Modelo gerativo: O modelo de IA central para gerar o ativo 3D
  4. Renderização: Converter a representação 3D em imagens 2D para visualização

Vamos explorar cada um deles em mais detalhes.

Codificação de Texto

O primeiro passo é converter o prompt de texto de entrada em uma representação numérica que o modelo de IA possa trabalhar. Isso é normalmente feito usando grandes modelos de linguagem, como BERT ou GPT.

Representação 3D

Existem várias maneiras comuns de representar a geometria 3D nos modelos de IA:

  1. Grade de voxels: Matrizes 3D de valores que representam ocupação ou recursos
  2. Nuvem de pontos: Conjuntos de pontos 3D
  3. Malha: Vértices e faces que definem uma superfície
  4. Funções implícitas: Funções contínuas que definem uma superfície (por exemplo, funções de distância assinada)
  5. Campos de radiação neural (NeRFs): Redes neurais que representam densidade e cor no espaço 3D

Cada uma tem trade-offs em termos de resolução, uso de memória e facilidade de geração. Muitos modelos recentes usam funções implícitas ou NeRFs, pois permitem resultados de alta qualidade com requisitos computacionais razoáveis.

Por exemplo, podemos representar uma esfera simples como uma função de distância assinada:

import numpy as np

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

<p># Avaliar SDF em um ponto 3D
point = [0.5, 0.5, 0.5]
distance = sphere_sdf(*point)
print(f&quot;Distância para a superfície da esfera: {distance}&quot;)

Modelo Gerativo

O núcleo de um sistema de texto para 3D é o modelo gerativo que produz a representação 3D a partir do embed de texto. A maioria dos modelos de ponta usa alguma variação de um modelo de difusão, semelhante àqueles usados na geração de imagens 2D.

Os modelos de difusão funcionam adicionando gradualmente ruído aos dados e, em seguida, aprendendo a reverter esse processo. Para a geração de 3D, esse processo ocorre no espaço da representação 3D escolhida.

Um pseudocódigo simplificado para um passo de treinamento de um modelo de difusão pode parecer com:

def diffusion_training_step(model, x_0, text_embedding):
# Amostrar um passo de tempo aleatório
t = torch.randint(0, num_timesteps, (1,))

<p># Adicionar ruído à entrada
noise = torch.randn_like(x_0)
x_t = add_noise(x_0, noise, t)</p>

<p># Prever o ruído
predicted_noise = model(x_t, t, text_embedding)</p>

<p># Computar perda
loss = F.mse_loss(noise, predicted_noise)</p>

return loss

<p># Loop de treinamento
for batch in dataloader:
x_0, text = batch
text_embedding = encode_text(text)
loss = diffusion_training_step(model, x_0, text_embedding)
loss.backward()
optimizer.step()

Durante a geração, começamos com ruído puro e iterativamente desfazemos, condicionados ao embed de texto.

Renderização

Para visualizar os resultados e computar perdas durante o treinamento, precisamos renderizar nossa representação 3D em imagens 2D. Isso é normalmente feito usando técnicas de renderização diferenciáveis que permitem que os gradientes fluam de volta pelo processo de renderização.

Para representações baseadas em malha, podemos usar um renderizador baseado em rasterização:

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

<p>def render_mesh(vertices, faces, image_size=256):
# Criar um renderizador
renderer = pr.MeshRenderer(
rasterizer=pr.MeshRasterizer(),
shader=pr.SoftPhongShader()
)</p>

<p># Configurar câmera
cameras = pr.FoVPerspectiveCameras()</p>

<p># Renderizar
images = renderer(vertices, faces, cameras=cameras)</p>

return images

<p># Exemplo de uso
vertices = torch.rand(1, 100, 3) # Vértices aleatórios
faces = torch.randint(0, 100, (1, 200, 3)) # Faces aleatórias
rendered_images = render_mesh(vertices, faces)

Para representações implícitas, como NeRFs, normalmente usamos técnicas de marcha de raios para renderizar vistas.

Colocando Tudo Juntos: O Pipeline de Texto para 3D

Agora que cobrimos os componentes-chave, vamos percorrer como eles se unem em um pipeline típico de geração de 3D por texto:

  1. Codificação de texto: O prompt de entrada é codificado em uma representação vetorial densa usando um modelo de linguagem.
  2. Geração inicial: Um modelo de difusão, condicionado ao embed de texto, gera uma representação 3D inicial (por exemplo, um NeRF ou uma função implícita).
  3. Consistência de múltiplas vistas: O modelo renderiza múltiplas vistas do ativo 3D gerado e garante a consistência entre os pontos de vista.
  4. Refinamento: Redes adicionais podem refinar a geometria, adicionar texturas ou melhorar detalhes.
  5. Saída final: A representação 3D é convertida em um formato desejado (por exemplo, malha texturizada) para uso em aplicações downstream.

Aqui está um exemplo simplificado de como isso pode parecer em código:

class TextTo3D(nn.Module):
def __init__(self):
super().__init__()
self.text_encoder = BertModel.from_pretrained(&#039;bert-base-uncased&#039;)
self.diffusion_model = DiffusionModel()
self.refiner = RefinerNetwork()
self.renderer = DifferentiableRenderer()

<p>def forward(self, text_prompt):
# Codificar texto
text_embedding = self.text_encoder(text_prompt).last_hidden_state.mean(dim=1)</p>

<p># Gerar representação 3D inicial
initial_3d = self.diffusion_model(text_embedding)</p>

<p># Renderizar múltiplas vistas
views = self.renderer(initial_3d, num_views=4)</p>

<p># Refinar com base na consistência de múltiplas vistas
refined_3d = self.refiner(initial_3d, views)</p>

return refined_3d

<p># Uso
model = TextTo3D()
text_prompt = &quot;Um carro esportivo vermelho&quot;
generated_3d = model(text_prompt)

Principais Modelos de Ativos 3D Disponíveis

3DGen – Meta

3DGen é projetado para lidar com o problema de gerar conteúdo 3D – como personagens, objetos e cenas – a partir de descrições textuais.

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

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

3DGen suporta renderização baseada em física (PBR), essencial para a realista iluminação de ativos 3D em aplicações do mundo real. Ele também permite a geração de texturas para formas 3D previamente geradas ou criadas por artistas usando novas entradas textuais. O pipeline integra dois componentes principais: Meta 3D AssetGen e Meta 3D TextureGen, que lidam com a geração de texto para 3D e texto para textura, respectivamente.

Meta 3D AssetGen

Meta 3D AssetGen (Siddiqui et al., 2024) é responsável pela geração inicial de ativos 3D a partir de prompts de texto. Esse componente produz uma malha 3D com texturas e mapas de material PBR em cerca de 30 segundos.

Meta 3D TextureGen

Meta 3D TextureGen (Bensadoun et al., 2024) refina as texturas geradas pelo AssetGen. Ele também pode ser usado para gerar novas texturas para malhas 3D existentes com base em descrições textuais adicionais. Esta etapa leva aproximadamente 20 segundos.

Point-E (OpenAI)

Point-E, desenvolvido pela OpenAI, é outro modelo notável de geração de 3D por texto. Ao contrário do DreamFusion, que produz representações NeRF, o Point-E gera nuvens de pontos 3D.

Recursos principais do Point-E:

a) Pipeline de dois estágios: O Point-E primeiro gera uma vista sintética 2D usando um modelo de difusão de texto para imagem, então usa essa imagem para condicionar um segundo modelo de difusão que produz a nuvem de pontos 3D.

b) Eficiência: O Point-E é projetado para ser computacionalmente eficiente, capaz de gerar nuvens de pontos 3D em segundos em uma única GPU.

c) Informação de cor: O modelo pode gerar nuvens de pontos coloridas, preservando tanto a geometria quanto a informação de aparência.

Limitações:

  • Fidelidade mais baixa em comparação com abordagens baseadas em malha ou NeRF
  • Nuvens de pontos requerem processamento adicional para muitas aplicações downstream

Shap-E (OpenAI):

Construído sobre o Point-E, a OpenAI introduziu o Shap-E, que gera malhas 3D em vez de nuvens de pontos. Isso aborda algumas das limitações do Point-E, mantendo a eficiência computacional.

Recursos principais do Shap-E:

a) Representação implícita: O Shap-E aprende a gerar representações implícitas (funções de distância assinada) de objetos 3D.

b) Extração de malha: O modelo usa uma implementação diferenciável do algoritmo de cubos marchantes para converter a representação implícita em uma malha poligonal.

c) Geração de textura: O Shap-E também pode gerar texturas para as malhas 3D, resultando em saídas visualmente mais atraentes.

Vantagens:

  • Tempos de geração rápidos (segundos a minutos)
  • Saída de malha direta adequada para renderização e aplicações downstream
  • Capacidade de gerar geometria e textura

GET3D (NVIDIA):

O GET3D, desenvolvido por pesquisadores da NVIDIA (NVDA ), é outro poderoso modelo de geração de 3D por texto que se concentra em produzir malhas 3D texturizadas de alta qualidade.

Recursos principais do GET3D:

a) Representação de superfície explícita: Ao contrário do DreamFusion ou do Shap-E, o GET3D gera representações de superfície explícitas (malhas) sem representações implícitas intermediárias.

b) Geração de textura: O modelo inclui uma técnica de renderização diferenciável para aprender e gerar texturas de alta qualidade para as malhas 3D.

c) Arquitetura baseada em GAN: O GET3D usa uma abordagem de rede adversária generativa (GAN), o que permite tempos de geração rápidos uma vez que o modelo é treinado.

Vantagens:

  • Geometria e texturas de alta qualidade
  • Tempos de inferência rápidos
  • Integração direta com motores de renderização 3D

Limitações:

  • Requer dados de treinamento 3D, que podem ser escassos para algumas categorias de objetos

Conclusão

A geração de 3D por texto representa uma mudança fundamental na forma como criamos e interagimos com conteúdo 3D. Ao aproveitar técnicas de aprendizado de máquina avançadas, esses modelos podem produzir ativos 3D complexos e de alta qualidade a partir de descrições textuais simples. À medida que a tecnologia continua a evoluir, podemos esperar ver sistemas de texto para 3D cada vez mais sofisticados e capazes que revolucionarão indústrias, desde jogos e filmes até design de produtos e arquitetura.

Eu passei os últimos cinco anos me imergindo no fascinante mundo de Aprendizado de Máquina e Aprendizado Profundo. Minha paixão e expertise me levaram a contribuir para mais de 50 projetos de engenharia de software diversificados, com um foco particular em IA/ML. Minha curiosidade contínua também me levou em direção ao Processamento de Linguagem Natural, um campo que estou ansioso para explorar mais.