Deepfake com IA: como criar rostos fotorrealistas com SDXL

Deepfake com IA: como criar rostos fotorrealistas com SDXL

Vi as imagens que o designer turco Alper Yesiltas publicou mostrando celebridades que morreram ou enfrentaram doenças graves como elas estariam hoje. Segundo o Ig.com.br, a pergunta por trás do projeto é direta: como essas pessoas seriam fotorrealistas se certos eventos não tivessem acontecido? O resultado é perturbador — e tecnicamente muito mais interessante do que parece à primeira vista. Vou te mostrar o que tem por trás dessas imagens, como reproduzir parte disso na sua própria máquina e por que isso importa mais do que parece para quem trabalha com IA generativa.

A pilha tecnológica por trás de uma “ressurreição” digital

Não existe mágica. Existe um pipeline. Quando olho para o trabalho do Yesiltas, eu enxergo a sobreposição de pelo menos três camadas de modelo que rodaram em sequência:

1. Um gerador base de imagem, quase certamente Stable Diffusion XL ou um modelo proprietário tipo Midjourney v6.
2. Um LoRA (Low-Rank Adaptation) treinado em fotos reais da celebridade, para ensinar o modelo a “lembrar” daquela pessoa específica.
3. Um modelo de face restoration — GFPGAN, CodeFormer ou RestoreFormer — para limpar artefatos e devolver coerência ao rosto.

Esse último passo é o que vende a ilusão. Sem ele, mesmo um bom LoRA entrega rostos com aquela textura “plastificada” que denuncia IA em dois segundos. Eu já testei os dois principais — CodeFormer entrega olhos mais nítidos, GFPGAN tende a ser mais conservador em idade aparente. Para esse tipo de projeto, onde o “antes e depois” emocional é o produto, CodeFormer ganha.

Na Prática — montando um pipeline mínimo em Python

Se você quiser reproduzir a lógica (não com fotos de celebridades específicas, obviamente, mas com o seu próprio dataset de rostos antigos), esse é o esqueleto funcional. Eu rodo isso numa RTX 3060 12GB com quantização fp16:

# pip install diffusers transformers accelerate torch torchvision
# pip install gfpgan basicsr realesrgan

import torch
from diffusers import StableDiffusionXLPipeline, DPMSolverMultistepScheduler
from gfpgan import GFPGANer
import cv2

# 1. Pipeline base
pipe = StableDiffusionXLPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16,
    variant="fp16"
).to("cuda")

pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)
pipe.enable_xformers_memory_efficient_attention()

# 2. (Opcional) carregar LoRA treinado no rosto-alvo
pipe.load_lora_weights("./lora_pessoa_alvo", weight_name="pessoa.safetensors")

# 3. Gerar a imagem
prompt = "photo of ohwx person, 65 years old, silver hair, soft daylight, 85mm lens, f/1.8"
negative = "blurry, deformed face, extra fingers, plastic skin"

image = pipe(
    prompt=prompt,
    negative_prompt=negative,
    num_inference_steps=30,
    guidance_scale=6.5,
    width=1024,
    height=1024
).images[0]

image.save("./saida_raw.png")

# 4. Restaurar o rosto
restorer = GFPGANer(
    model_path="https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pth",
    upscale=1,
    arch="clean",
    channel_multiplier=2
)

img = cv2.imread("./saida_raw.png")
_, _, restored = restorer.enhance(
    img,
    has_aligned=False,
    only_center_face=True,
    paste_back=True,
    weight=0.7  # quanto menor, mais "natural"; quanto maior, mais nítido
)

cv2.imwrite("./saida_final.png", restored)
print("OK")

Repare no parâmetro weight=0.7 no GFPGANer. Esse é o knob que mais muda o resultado. Em 1.0 o rosto vira uma máscara de porcelana. Em 0.5 você perde um pouco de nitidez mas ganha naturalidade. Eu aprendi isso na marra, rodando centenas de imagens — confiança cega em 1.0 é o erro número um de quem está começando.

Erros comuns que devs cometem nesse tipo de projeto

Na minha experiência, vi gente queimando horas (e dinheiro de GPU) com os mesmos deslizes. Anota esses:

1. LoRA com dataset pequeno demais. Menos de 15 imagens de boa qualidade e o modelo overfitta — você começa a gerar sempre a mesma pose, mesma iluminação, mesma roupa. O ideal é 30 a 50 fotos com variação real de ângulo e fundo.

2. Prompt sobrecarregado. Muita gente enfia 200 palavras no prompt achando que vai ajudar. Não vai. Stable Diffusion responde melhor a prompts curtos, descritivos, com termos de fotografia (lente, abertura, tipo de luz). Aprendi isso depois de ler o paper do SDXL — a prior de texto tem limite útil.

3. Ignorar a etapa de face detection. Rodar o GFPGAN em uma imagem onde o rosto não está bem enquadrado gera distorções bizarras. Use sempre um detector antes (a função only_center_face=True ajuda, mas não resolve tudo).

4. Confundir “fotorrealismo” com “resolução alta”. Uma imagem 4K pode parecer falsa; uma 1024×1024 bem feita parece real. Realismo é coerência de detalhe, não quantidade de pixels.

5. Esquecer o viés demográfico. Modelos base foram treinados majoritariamente em rostos ocidentais, jovens, bem iluminados. Tentar gerar uma pessoa idosa de pele escura gera degradação visível de qualidade. Isso é limitação real, não frescura de “ética”.

6. Não versionar os modelos. Parece óbvio, mas eu já perdi um projeto porque sobrescrevi um LoRA bom com um ruim. Hash de commit, nomeação por data e pasta dedicada para cada experimento. Disciplina básica que salva horas.

Por que isso vai muito além do “filtro de Instagram”

O trabalho do Yesiltas toca num ponto que a discussão pública ainda não entendeu direito: deepfakes gerativos com intenção artística são indistinguíveis, do ponto de vista técnico, de deepfakes com intenção maliciosa. O mesmo pipeline que “ressuscita” Michael Jackson para uma campanha emocional pode ser usado para colocar a cara de alguém num vídeo que a pessoa nunca gravou.

Para quem programa, isso muda três coisas práticas:

  • Detecção virou feature de produto. Se você trabalha em plataformas de conteúdo, vai precisar implementar (ou comprar) detecção de imagem sintética. Modelos como o Universal Fake Detect ou o próprio detector do Hugging Face já estão maduros o suficiente para produção.
  • Watermarking deixa de ser opcional. Google e OpenAI já embutem metadados invisíveis (SynthID, C2PA) nas saídas dos modelos deles. Se você está construindo um produto gerativo, implemente isso desde o dia um. É defesa jurídica, não firula.
  • Consentimento precisa virar requisito de arquitetura. Não dá para tratar biometria facial como “dado qualquer” depois do GDPR e da LGPD. Log de consentimento, versionamento de dataset e direito de remoção são coisas que têm que estar no schema do banco, não num documento esquecido no Drive.

Em outras palavras: o trabalho do Yesiltas é arte. Mas o mesmo código que ele usa está a um git clone de distância de qualquer pessoa no mundo. Quem constrói a próxima camada dessa tecnologia carrega uma responsabilidade que vai além do loss function.

FAQ

Qual hardware mínimo para rodar esse pipeline?
Para Stable Diffusion XL com fp16, 10GB de VRAM já funciona, mas 12GB é o confortável. Para treinar LoRA do zero, suba para 24GB (RTX 3090/4090) ou use LoRA na nuvem (RunPod, Vast.ai). CPU é inviável para iteração.

É legal treinar um LoRA com fotos de uma celebridade?
Depende da jurisdição e do uso. Para uso artístico pessoal, na maioria dos países há tolerância. Para uso comercial, você precisa de autorização dos detentores de direitos de imagem — geralmente herdeiros ou espólio. Caso Michael Jackson, por exemplo, o espólio controla os direitos e licencia ativamente.

Qual a diferença prática entre GFPGAN e CodeFormer?
GFPGAN é mais antigo, entrega resultados mais “limpos” mas com tendência a suavizar pele. CodeFormer (Tencent) usa um transformer com codebook discreto, consegue preservar melhor textura de pele e detalhes como rugas — o que é exatamente o que você quer em projetos de “envelhecimento” como o do Yesiltas.

Como evitar o efeito uncanny valley?
Três coisas: iluminação realista (nada de “studio lighting” genérico), imperfeição controlada (uma pinta, uma olheira leve aumenta a credibilidade), e pós-processamento comedido no face restoration. Satura muito no pós e o cérebro detecta a farsa instantaneamente.

Esse tipo de imagem pode ser detectada automaticamente?
Sim, com taxa de acerto cada vez maior. Modelos baseados em frequências (análise de FFT) pegam a granulação típica da difusão. Modelos treinados em datasets de imagens reais vs. sintéticas chegam a 95%+ de acurácia em benchmarks públicos. O lado bom da corrida armamentista: a detecção evolui junto com a geração.

Gostou? Me segue no GitHub e deixa um comentário se tiver dúvida ou quiser aprofundar algum ponto — seja o pipeline de LoRA, a parte de detecção ou as implicações jurídicas. Esse assunto vai dominar os próximos dois anos de produto em tech, e quem entende o stack por baixo sai na frente.

Y

Yuri Sousa

Front-End Developer / Designer

Desenvolvedor apaixonado por criar experiências digitais acessíveis e visualmente perfeitas. Escrevo sobre desenvolvimento web, design e tecnologia.