Phase 08 - Lesson 05
StyleGAN
A maioria dos geradores mistura
zem todas as camadas ao mesmo tempo. O StyleGAN separou isso: primeiro mapeiazpara umwintermediário, depois injetawem cada nível de resolução através de AdaIN. Essa única mudança desembaraçou o espaço latente e tornou rostos fotorrealistas um problema resolvido por sete anos consecutivos.
Tipo: Build Idiomas: Python Pré-requisitos: Phase 8 · 03 (GANs), Phase 4 · 08 (Normalization), Phase 3 · 07 (CNNs) Tempo: ~45 minutos
O Problema
Uma DCGAN mapeia z para uma imagem através de uma pilha de convoluções transpostas. O problema: z controla tudo — pose, iluminação, identidade, fundo — de forma emaranhada. Mova-se ao longo de um eixo de z, e todos os quatro mudam. Você não pode pedir ao modelo "a mesma pessoa, com pose diferente" porque a representação não se decompõe dessa forma.
Karras et al. (2019, NVIDIA) propuseram: parar de alimentar z diretamente nas camadas convolucionais. Alimentar um tensor constante de 4×4×512 como entrada da rede. Treinar um MLP de 8 camadas que mapeia z ∈ Z → w ∈ W. Injetar w em cada resolução via normalização de instância adaptativa (AdaIN): normalizar cada mapa de características convolucionais, depois redimensionar e deslocar por projeções afins de w. Adicionar ruído por camada para detalhes estocásticos (poros da pele, fios de cabelo).
O resultado: W possui eixos aproximadamente ortogonais para "estilo de alto nível" (pose, identidade) versus "estilo fino" (iluminação, cor). Você pode trocar estilos entre dois imagens usando o w da imagem A para os níveis de baixa resolução e o w da imagem B para os de alta resolução. Isso viabilizou a edição, a estilização entre domínios e toda a linha de pesquisa de "inversão do StyleGAN" (StyleGAN-inversion).
O Concept
Rede de mapeamento. f: Z → W, um MLP de 8 camadas. Z = N(0, I)^512. W não é forçado a ser gaussiano — ele aprende uma forma adaptada aos dados.
Rede de síntese. Começa a partir de uma constante aprendida de 4×4×512. Cada bloco de resolução: upsample → conv → AdaIN(w_i) → noise → conv → AdaIN(w_i) → noise. As resoluções dobram: 4, 8, 16, 32, 64, 128, 256, 512, 1024.
AdaIN.
AdaIN(x, y) = y_scale · (x - mean(x)) / std(x) + y_bias
onde y_scale e y_bias vêm de projeções afins de w. Normalize por mapa de características e, depois, estilize novamente. "Estilo" aqui refere-se às estatísticas de primeira e segunda ordem do mapa de características.
Ruído por camada. Ruído gaussiano de canal único adicionado a cada mapa de características, dimensionado por um fator aprendido por canal. Controla detalhes estocásticos sem afetar a estrutura global.
Truque de truncamento. Na inferência, amostre z, calcule w = mapping(z), depois w' = ŵ + ψ·(w - ŵ), onde ŵ é a média de w ao longo de muitas amostras. ψ < 1 troca diversidade por qualidade. Quase todas as demonstrações do StyleGAN usam ψ ≈ 0.7.
StyleGAN 1 → 2 → 3
| Versão | Ano | Inovação |
|---|---|---|
| StyleGAN | 2019 | Rede de mapeamento + AdaIN + ruído + crescimento progressivo (progressive growing). |
| StyleGAN2 | 2020 | Desmodulação de peso (weight demodulation) substitui AdaIN (corrige artefatos de gotículas); arquitetura skip/residual; regularização de comprimento de caminho (path-length regularization). |
| StyleGAN3 | 2021 | Convolução livre de aliasing (alias-free) + kernels equivariantes; elimina a textura presa à grade de pixels. |
| StyleGAN-XL | 2022 | Condicionado por classe (class-conditional), 1024², ImageNet. |
| R3GAN | 2024 | Rebranding com regularização mais forte; reduz a diferença em relação à difusão no FFHQ-1024 com 20x menos parâmetros. |
Em 2026, o StyleGAN3 continua sendo o padrão para (a) fotorrealismo de domínio estreito em altos FPS, (b) adaptação de domínio few-shot (treinar em um novo conjunto de dados com 100 imagens, congelando o mapeamento), (c) edição baseada em inversão (encontrar o w que reconstrói uma foto real e, em seguida, editar esse w). Para geração de texto para imagem de domínio aberto, ele não é a ferramenta ideal — a difusão é.
Build It
O arquivo code/main.py implementa um "style-GAN lite" de brinquedo em 1-D: um MLP de mapeamento, uma função de síntese que recebe um vetor constante aprendido e o modula com escala/viés derivados de w, e ruído por camada. Ele mostra que injetar w via modulação afim se equipara ou supera a concatenação de z na entrada do gerador.
Passo 1: rede de mapeamento
def mapping(z, M):
h = z
for i in range(num_layers):
h = leaky_relu(add(matmul(M[f"W{i}"], h), M[f"b{i}"]))
return h
Passo 2: normalização de instância adaptativa
def adain(x, w_scale, w_bias):
mu = mean(x)
sd = std(x)
x_norm = [(xi - mu) / (sd + 1e-8) for xi in x]
return [w_scale * xi + w_bias for xi in x_norm]
A escala e o viés por mapa de características vêm de w via projeção linear.
Passo 3: ruído por camada
def add_noise(x, sigma, rng):
return [xi + sigma * rng.gauss(0, 1) for xi in x]
O sigma por canal é passível de aprendizado.
Pitfalls
- Artefatos de gotículas (droplet artifacts). O StyleGAN 1 produzia uma gotícula amorfa nos mapas de características porque o AdaIN zerava a média. A desmodulação de peso (weight demodulation) do StyleGAN 2 corrige isso escalando os pesos da convolução em vez das ativações.
- Textura colada (texture sticking). As texturas do StyleGAN 1 e 2 seguiam as coordenadas dos pixels, não as coordenadas do objeto (visível ao interpolar). As convoluções livres de aliasing (alias-free) do StyleGAN 3 corrigem isso com filtros sinc janelados (windowed sinc filters).
- Cobertura de modo (mode coverage). O truncamento
ψ < 0.7parece limpo, mas amostra a partir de um cone estreito; useψ = 1.0se precisar de diversidade. - A inversão tem perdas (lossy). A inversão de uma foto real para
Wcostuma ser feita por meio de otimização ou de um codificador (e4e, ReStyle, HyperStyle). Os resultados divergem após muitas iterações.
Use It
| Caso de uso | Abordagem |
|---|---|
| Rostos humanos fotorrealistas (anime, produto, domínio estreito) | StyleGAN3 FFHQ / ajuste fino (fine-tune) personalizado |
| Edição de rosto a partir de uma foto | inversão e4e + direções StyleSpace / InterFaceGAN |
| Troca de rosto (face swap) / encenação | StyleGAN + codificador + mesclagem (blending) |
| Pipelines de avatar | StyleGAN3 com ADA para ajuste fino com poucos dados |
| Adaptação de domínio a partir de poucas imagens | Congelar a rede de mapeamento, fazer ajuste fino da síntese |
| Geração multimodal ou condicionada por texto | Não use — prefira difusão |
Para demonstrações de nível de produção em que a resposta é "foto do rosto de uma pessoa", o StyleGAN supera a difusão no custo de inferência (única passagem direta, <10ms em uma 4090) e na nitidez para o mesmo patamar de qualidade.
Ship It
Salve outputs/skill-stylegan-inversion.md. A Skill recebe uma foto real e produz: método de inversão (e4e / ReStyle / HyperStyle), perda latente esperada, margem de edição (o quão longe você pode se mover em W antes de surgirem artefatos) e uma lista de direções de edição conhecidas como boas (idade, expressão, pose).
Exercises
- Fácil. Execute
code/main.pycomadain_on=Trueeadain_on=False. Compare a dispersão das saídas para uma latente fixa versus uma latente perturbada. - Médio. Implemente a regularização de mistura (mixing regularization): para um lote de treinamento, calcule
w_a,w_be apliquew_ana primeira metade da síntese ew_bna segunda metade. O decodificador aprende estilos desembaraçados? - Difícil. Use um modelo StyleGAN3 FFHQ pré-treinado (ffhq-1024.pkl). Encontre a direção de
wque controla o "sorriso" treinando um SVM em amostras rotuladas; relate o quão longe você pode ir antes que a identidade comece a desviar.
Key Terms
| Termo | O que dizem | O que realmente significa |
|---|---|---|
| Rede de mapeamento | "O MLP" | f: Z → W, 8 camadas, desacopla a geometria latente das estatísticas dos dados. |
| Espaço W | "O espaço de estilo" | Saída da rede de mapeamento; aproximadamente desembaraçada. |
| AdaIN | "Normalização de instância adaptativa" | Normaliza o mapa de características, depois o redimensiona + desloca pela projeção de w. |
| Truque de truncamento | "Psi" | w = mean + ψ·(w - mean), ψ<1 troca diversidade por qualidade. |
| Regularização de comprimento de caminho | "Reg PL" | Penalizes grandes mudanças na imagem por unidade de mudança em w; torna W mais suave. |
| Desmodulação de peso | "A correção do StyleGAN2" | Normaliza os pesos da convolução em vez das ativações; elimina artefatos de gotículas. |
| Livre de aliasing (Alias-free) | "O truque do StyleGAN3" | Filtros sinc janelados; elimina a textura presa à grade de pixels. |
| Inversão | "Encontrar w para uma imagem real" | Otimiza ou codifica x → w de modo que G(w) ≈ x. |
Nota de produção: por que o StyleGAN ainda é implantado em 2026
O StyleGAN3 em uma 4090 gera um rosto FFHQ de 1024² em menos de 10 ms — num_steps = 1, sem decodificação de VAE, sem passagem de atenção cruzada (cross-attention). Em termos de produção, esta é a latência mínima para qualquer gerador de imagens. Um pipeline de SDXL de 50 etapas + decodificação de VAE na mesma resolução leva cerca de 3 segundos. Essa é uma diferença de 300×, e para produtos de domínio estreito (serviços de avatar, pipelines de documentos de identidade, geração de rostos para banco de imagens) ele vence no custo total de propriedade (TCO).
Duas consequências operacionais:
- Sem scheduler, sem batcher. O lote estático (static batch) na ocupação ideal é o melhor caminho. O loteamento contínuo (continuous batching, essencial para LLMs e difusão) oferece benefício zero, pois cada solicitação consome a mesma quantidade de FLOPs.
- O truncamento
ψé o botão de segurança.ψ < 0.7amostra de um cone estreito do intervalo da rede de mapeamento. Essa é a única alavanca que a camada de serviço possui sobre a variância da amostra. Reduzaψsob carga máxima, aumente-o para usuários premium.
Leitura Adicional
- Karras et al. (2019). A Style-Based Generator Architecture for GANs — StyleGAN.
- Karras et al. (2020). Analyzing and Improving the Image Quality of StyleGAN — StyleGAN2.
- Karras et al. (2021). Alias-Free Generative Adversarial Networks — StyleGAN3.
- Tov et al. (2021). Designing an Encoder for StyleGAN Image Manipulation — inversão e4e.
- Sauer et al. (2022). StyleGAN-XL: Scaling StyleGAN to Large Diverse Datasets — StyleGAN-XL.
- Huang et al. (2024). R3GAN: The GAN is dead; long live the GAN! — receita moderna de GAN minimalista.