Neural Rendering
A renderização neural substitui partes do pipeline gráfico por redes neurais para criar imagens e cenas 3D aprendidas a partir de fotos. Conheça os métodos e veja o código.
A renderização neural é a geração de imagens e vídeos com redes neurais que substituem ou complementam partes do pipeline tradicional de computação gráfica, mantendo o controlo sobre propriedades da cena, como o ponto de vista da câmara, a iluminação, a geometria e a aparência. A renderização convencional calcula uma imagem a partir de modelos 3D, materiais e fontes de luz criados manualmente, recorrendo à física do transporte da luz. A renderização neural, por sua vez, aprende alguns destes elementos a partir de fotografias e vídeos, ou aprende a produzir diretamente os píxeis finais. Enquanto área, a renderização neural combina aprendizagem automática generativa com conhecimento físico da computação gráfica, muitas vezes integrando a renderização diferenciável no treino da rede. A renderização neural permite obter capturas 3D fotorrealistas de locais reais, super-resolução com IA e geração de fotogramas em videojogos, bem como simulação para robótica e carros autónomos.
Como funciona a renderização neural#
O ramo mais influente aprende uma cena 3D a partir de fotografias comuns. Uma representação da cena, como uma rede neural, uma grelha de características aprendidas ou um conjunto de primitivas 3D, é renderizada numa imagem a partir da posição da câmara numa fotografia de treino por um renderizador diferenciável. Como é possível calcular o gradiente em cada etapa do renderizador, a diferença entre a imagem renderizada e a fotografia real pode ser propagada para trás, através da retropropagação, até cada parâmetro da cena. A repetição deste processo a partir de muitos pontos de vista reconstrói a cena com detalhe suficiente para renderizar pontos de vista que nenhuma câmara captou:
As poses das câmaras para as fotografias costumam ser obtidas com software de estrutura a partir do movimento, como o COLMAP, que corresponde características entre fotografias sobrepostas para determinar onde cada uma foi tirada.
Representações neurais de cenas#
Os campos de radiância neural (NeRF), introduzidos em 2020, armazenam uma cena nos pesos de um perceptrão multicamada que mapeia uma posição 3D e uma direção de observação para uma densidade e uma cor. Para renderizar um píxel, o NeRF amostra pontos ao longo do raio da câmara que o atravessa e combina as respetivas cores por renderização volumétrica: cada amostra contribui de acordo com a sua opacidade e com a quantidade de luz que sobrevive às amostras à sua frente. Este código em PyTorch treina um campo pequeno para reproduzir um píxel observado ao longo de um raio:
import torch
from torch import nn
# A tiny neural field that maps a 3D point to a density and an RGB color
torch.manual_seed(0)
field = nn.Sequential(nn.Linear(3, 64), nn.ReLU(), nn.Linear(64, 4))
optimizer = torch.optim.Adam(field.parameters(), lr=0.01)
# 64 points along one camera ray, and the color a training photo shows for that pixel
depths = torch.linspace(2.0, 6.0, 64)
points = torch.stack([torch.zeros(64), torch.zeros(64), depths], dim=1)
observed = torch.tensor([0.9, 0.4, 0.1])
for step in range(200):
density, color = field(points).split([1, 3], dim=1)
# Volume rendering: each sample's opacity times the light that reaches it through the samples in front
alpha = 1 - torch.exp(-nn.functional.softplus(density.squeeze(1)) * (depths[1] - depths[0]))
transmittance = torch.cumprod(torch.cat([torch.ones(1), 1 - alpha[:-1]]), dim=0)
pixel = (transmittance * alpha) @ torch.sigmoid(color)
loss = ((pixel - observed) ** 2).sum()
optimizer.zero_grad()
loss.backward()
optimizer.step()
if step in (0, 199):
print(f"step {step}: rendered {pixel.detach().numpy().round(2)}, loss {loss.item():.4f}")Imprime step 0: rendered [0.71 0.37 0.56], loss 0.2496 e step 199: rendered [0.9 0.4 0.1], loss 0.0000. A rede não treinada renderiza uma cor arbitrária, e os gradientes que se propagam para trás através da equação de renderização ajustam os pesos até que o píxel renderizado corresponda à fotografia. Um NeRF real faz o mesmo para milhões de raios provenientes de dezenas a centenas de fotografias.
O NeRF original precisava de um a dois dias de treino por cena numa GPU NVIDIA V100, e cada imagem renderizada exigia entre 150 e 200 milhões de consultas à rede, cerca de 30 segundos por fotograma. O Instant NGP da NVIDIA substituiu a maior parte da rede por uma tabela hash multirresolução de características aprendidas, reduzindo o treino a segundos ou minutos e a renderização a dezenas de milissegundos a 1920×1080. Em 2023, o Gaussian splatting foi ainda mais longe: representou cenas com milhões de gaussianas 3D explícitas, rasterizadas em tempo real sem avaliar nenhuma rede durante a renderização; costuma ser incluído na renderização neural porque é otimizado da mesma forma.
Renderização neural no espaço da imagem#
Um segundo ramo mantém um renderizador convencional e usa redes para concluir ou ampliar os resultados. O DLSS da NVIDIA renderiza jogos com resolução reduzida, aumenta a resolução com modelos Transformer e, nas GPUs GeForce RTX Série 50, gera até cinco fotogramas por cada fotograma renderizado pelo jogo. Os renderizados com traçado de caminhos usam eliminadores de ruído aprendidos para produzir imagens nítidas a partir de poucas amostras de luz por píxel. Outros modelos sintetizam imagens a partir de layouts de cenas: o GauGAN da NVIDIA transformava um mapa semântico de céu, água e árvores numa paisagem fotorrealista, e os sistemas de avatares neurais renderizam o rosto de uma pessoa a partir de novos ângulos ou com nova iluminação.
Renderização neural e conceitos relacionados#
- Renderização diferenciável: um renderizador cuja saída permite calcular gradientes em relação às entradas. É o mecanismo que permite à renderização neural aprender a partir de imagens e também é usado sem redes neurais, por exemplo, para ajustar uma malha a fotografias.
- Renderização inversa: recuperação da geometria, dos materiais e da iluminação a partir de imagens, muitas vezes com renderização diferenciável, para que os resultados possam ser editados e renderizados novamente.
- Síntese de novas vistas: tarefa de produzir imagens a partir de pontos de vista não observados, abordada por NeRF e Gaussian splatting; a renderização neural engloba um conjunto mais amplo de técnicas.
- IA generativa: os modelos de texto para imagem e de geração de vídeo criam conteúdo a partir de prompts, geralmente sem uma cena explícita que possa ser observada de uma posição de câmara escolhida.
Aplicações no mundo real#
- Produção cinematográfica e virtual: os locais captados são reconstruídos como campos de radiância ou splats e renderizados a partir de novos percursos de câmara para efeitos visuais e pré-visualização.
- Gémeos digitais e comércio eletrónico: as capturas de divisões, edifícios e produtos feitas com telemóveis transformam-se em vistas 3D que clientes e planeadores podem explorar num navegador ou num visor de realidade aumentada.
- Robótica e veículos autónomos: as viagens registadas são reconstruídas e renderizadas novamente a partir de pontos de vista deslocados, gerando dados sintéticos para testar sistemas de perceção. As pessoas e os carros que se movem durante uma captura deixam artefactos semitransparentes; por isso, os pipelines mascaram-nos nas fotografias de treino, e os modelos de segmentação de instâncias YOLO26 geram automaticamente essas máscaras para cada fotograma. O Block-NeRF da Waymo reconstruiu um bairro inteiro de São Francisco a partir de 2,8 milhões de imagens, unindo uma grelha de NeRFs treinados separadamente.










