Stable Diffusion - Criando Arte com IA

📚 Aula 06 de 15
⏱️ 35 min
🔢 Módulo 2
📅 2025-08-26
Progresso do Curso 35.7% completo

🎨 Bem-vindo ao Mundo da Arte com IA

Imagine poder criar qualquer imagem que você visualizar!

Stable Diffusion é uma revolução na criação artística - transforme palavras em obras de arte profissionais em segundos.

Nesta aula, você vai dominar a ferramenta que está transformando o mundo da arte digital e descobrir como criar imagens que impressionam!

🤔 O que é Stable Diffusion?

Stable Diffusion é um modelo de IA que gera imagens de alta qualidade a partir de descrições em texto. É como ter um artista digital que entende exatamente o que você quer criar!

🏛️ Arte Tradicional

  • Anos de treinamento
  • Materiais caros
  • Tempo de criação longo
  • Limitado por habilidades
  • Difícil fazer variações

🤖 Stable Diffusion

  • Aprendizado rápido
  • Totalmente gratuito
  • Criação em segundos
  • Ilimitado pela imaginação
  • Variações infinitas

💡 Por que é Revolucionário?

Pela primeira vez na história, qualquer pessoa pode criar arte profissional sem saber desenhar. Designers, artistas e empresas estão usando para acelerar suas criações!

⚙️ Como o Stable Diffusion Funciona?

📝

1. Você Escreve

Descreva a imagem que você quer: "Um gato astronauta no espaço"

🧠

2. IA Entende

O modelo analisa seu texto e "entende" o que você quer

🔄

3. Processo Iterativo

Começa com ruído e vai "desenhando" a imagem gradualmente

🎨

4. Resultado Final

Uma imagem única e detalhada exatamente como você imaginou!

🔬 Explicação Técnica Simples

O Stable Diffusion usa um processo chamado "difusão reversa". Imagine que você tem uma foto e vai adicionando ruído até ela virar só barulho. O modelo aprendeu a fazer o contrário: pegar ruído e transformar em imagem baseada no seu texto!

⚙️ Instalação do Stable Diffusion

🐍 Método 1: Python (Recomendado)

1

Instalar Dependências

pip install diffusers transformers accelerate torch torchvision
2

Teste Básico

from diffusers import StableDiffusionPipeline
import torch

# Carregar o modelo
pipe = StableDiffusionPipeline.from_pretrained(
    "runwayml/stable-diffusion-v1-5",
    torch_dtype=torch.float16,
    use_safetensors=True
)

# Mover para GPU se disponível
if torch.cuda.is_available():
    pipe = pipe.to("cuda")

# Gerar uma imagem
prompt = "A beautiful sunset over a mountain lake"
image = pipe(prompt).images[0]
image.save("minha_primeira_imagem.png")
print("✅ Imagem criada com sucesso!")

🖥️ Método 2: AUTOMATIC1111 (Interface Gráfica)

Para quem prefere uma interface visual completa:

  1. Baixe o AUTOMATIC1111 WebUI do GitHub
  2. Execute o arquivo de instalação
  3. Acesse via navegador em localhost:7860
  4. Interface completa com todas as funcionalidades

🎯 A Arte do Prompt Perfeito

🏆

O segredo está no prompt!

A qualidade da sua imagem depende 80% de como você descreve o que quer. Vamos dominar essa arte!

📋 Anatomia de um Prompt Poderoso

Sujeito Principal: "Uma mulher jovem"
Descrição Detalhada: "cabelos longos ondulados, olhos azuis"
Cenário/Ambiente: "em um jardim florido"
Estilo Artístico: "estilo impressionista"
Qualidade: "alta resolução, obra-prima"

❌ Prompt Ruim

"Um carro"

Resultado: Imagem genérica e sem personalidade

✅ Prompt Excelente

"Um carro esportivo vermelho Ferrari, brilhando sob a luz do sol, em uma estrada de montanha, fotografia profissional, alta resolução, bokeh no fundo"

Resultado: Imagem cinematográfica e impactante!

🚀 Técnicas Avançadas de Prompting

🎭 Referências de Estilo

Use artistas famosos como referência:

"estilo Van Gogh", "por Picasso", "arte de Studio Ghibli"

📸 Termos Fotográficos

Para imagens mais profissionais:

"shot with Canon EOS R5", "85mm lens", "shallow depth of field", "golden hour lighting"

⚖️ Pesos de Palavras

Enfatize elementos importantes:

"(olhos azuis:1.3)", "(muito detalhado:1.2)"

Números maiores = mais ênfase

🚫 Prompts Negativos

Exclua elementos indesejados:

Negative: "blurry, low quality, distorted, ugly, duplicate"

🎨 Projeto: Criador de Arte Personalizado

Vamos criar um sistema completo para gerar arte personalizada com diferentes estilos e configurações!

import torch
from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler
from PIL import Image
import os
from datetime import datetime
import json

class ArtisticImageGenerator:
    def __init__(self):
        print("🎨 Inicializando Gerador de Arte...")
        
        # Configurar device
        self.device = "cuda" if torch.cuda.is_available() else "cpu"
        print(f"📱 Usando: {self.device}")
        
        # Carregar modelo
        model_id = "runwayml/stable-diffusion-v1-5"
        self.pipe = StableDiffusionPipeline.from_pretrained(
            model_id,
            torch_dtype=torch.float16 if self.device == "cuda" else torch.float32,
            use_safetensors=True
        )
        
        # Otimizar scheduler
        self.pipe.scheduler = DPMSolverMultistepScheduler.from_config(
            self.pipe.scheduler.config
        )
        
        # Mover para device
        self.pipe = self.pipe.to(self.device)
        
        # Otimizações de memória
        if self.device == "cuda":
            self.pipe.enable_model_cpu_offload()
            self.pipe.enable_xformers_memory_efficient_attention()
        
        print("✅ Gerador pronto!")
        
        # Estilos predefinidos
        self.art_styles = {
            "realism": "photorealistic, highly detailed, professional photography",
            "anime": "anime style, manga, vibrant colors, detailed anime art",
            "oil_painting": "oil painting, classical art, brush strokes, artistic masterpiece",
            "watercolor": "watercolor painting, soft colors, artistic, painted texture",
            "cyberpunk": "cyberpunk style, neon lights, futuristic, digital art",
            "fantasy": "fantasy art, magical, ethereal, mystical atmosphere",
            "vintage": "vintage photography, retro, nostalgic, film grain",
            "minimalist": "minimalist art, clean, simple, modern design"
        }
        
        # Prompts negativos padrão
        self.negative_base = "blurry, low quality, distorted, ugly, duplicate, mutation, deformed"
    
    def enhance_prompt(self, base_prompt, style="realism", quality_boost=True):
        """Melhora o prompt com estilo e qualidade"""
        
        # Adicionar estilo
        if style in self.art_styles:
            enhanced = f"{base_prompt}, {self.art_styles[style]}"
        else:
            enhanced = base_prompt
        
        # Adicionar qualidade
        if quality_boost:
            quality_terms = "masterpiece, best quality, highly detailed, sharp focus, professional"
            enhanced = f"{enhanced}, {quality_terms}"
        
        return enhanced
    
    def generate_art(self, prompt, style="realism", width=512, height=512, 
                    num_images=1, steps=20, guidance_scale=7.5, seed=None):
        """Gera arte personalizada"""
        
        print(f"🎨 Gerando arte: '{prompt[:50]}...'")
        print(f"📐 Tamanho: {width}x{height}")
        print(f"🎭 Estilo: {style}")
        
        # Melhorar prompt
        enhanced_prompt = self.enhance_prompt(prompt, style)
        
        # Configurar seed para reproduzibilidade
        generator = None
        if seed is not None:
            generator = torch.Generator(device=self.device).manual_seed(seed)
        
        # Gerar imagens
        with torch.inference_mode():
            results = self.pipe(
                prompt=enhanced_prompt,
                negative_prompt=self.negative_base,
                width=width,
                height=height,
                num_inference_steps=steps,
                guidance_scale=guidance_scale,
                num_images_per_prompt=num_images,
                generator=generator
            )
        
        return results.images, enhanced_prompt
    
    def create_art_series(self, theme, variations=5, style="realism"):
        """Cria uma série de arte com variações"""
        
        print(f"🎨 Criando série de arte: {theme}")
        
        # Variações do prompt base
        prompt_variations = [
            f"{theme}, morning light, peaceful atmosphere",
            f"{theme}, dramatic lighting, cinematic view",
            f"{theme}, sunset colors, warm tones",
            f"{theme}, misty atmosphere, ethereal mood",
            f"{theme}, vibrant colors, energetic composition"
        ]
        
        series_results = []
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        series_folder = f"art_series_{timestamp}"
        os.makedirs(series_folder, exist_ok=True)
        
        for i, prompt in enumerate(prompt_variations[:variations], 1):
            print(f"🖼️ Criando variação {i}/{variations}")
            
            images, enhanced_prompt = self.generate_art(
                prompt=prompt,
                style=style,
                seed=42 + i  # Seed diferente para cada variação
            )
            
            # Salvar imagem
            image_filename = f"variation_{i:02d}.png"
            image_path = os.path.join(series_folder, image_filename)
            images[0].save(image_path)
            
            series_results.append({
                'variation': i,
                'prompt': prompt,
                'enhanced_prompt': enhanced_prompt,
                'image_path': image_path
            })
            
            print(f"💾 Salvo: {image_path}")
        
        # Salvar metadata da série
        metadata = {
            'theme': theme,
            'style': style,
            'created_at': datetime.now().isoformat(),
            'variations': series_results
        }
        
        metadata_path = os.path.join(series_folder, "series_info.json")
        with open(metadata_path, 'w', encoding='utf-8') as f:
            json.dump(metadata, f, indent=2, ensure_ascii=False)
        
        print(f"🎉 Série completa salva em: {series_folder}")
        return series_results
    
    def create_style_comparison(self, prompt, styles=None):
        """Compara o mesmo prompt em diferentes estilos"""
        
        if styles is None:
            styles = ["realism", "anime", "oil_painting", "cyberpunk"]
        
        print(f"🎭 Comparando estilos para: '{prompt}'")
        
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        comparison_folder = f"style_comparison_{timestamp}"
        os.makedirs(comparison_folder, exist_ok=True)
        
        comparison_results = []
        
        for style in styles:
            print(f"🎨 Gerando estilo: {style}")
            
            images, enhanced_prompt = self.generate_art(
                prompt=prompt,
                style=style,
                seed=42  # Mesmo seed para comparação justa
            )
            
            # Salvar imagem
            image_filename = f"style_{style}.png"
            image_path = os.path.join(comparison_folder, image_filename)
            images[0].save(image_path)
            
            comparison_results.append({
                'style': style,
                'enhanced_prompt': enhanced_prompt,
                'image_path': image_path
            })
            
            print(f"💾 Salvo: {image_path}")
        
        # Criar grid de comparação
        self.create_comparison_grid(comparison_results, comparison_folder)
        
        return comparison_results
    
    def create_comparison_grid(self, results, folder):
        """Cria um grid com todas as comparações"""
        
        if len(results) < 2:
            return
        
        # Carregar todas as imagens
        images = []
        for result in results:
            img = Image.open(result['image_path'])
            images.append(img)
        
        # Calcular dimensões do grid
        cols = 2
        rows = (len(images) + 1) // 2
        
        img_width, img_height = images[0].size
        grid_width = img_width * cols
        grid_height = img_height * rows
        
        # Criar grid
        grid = Image.new('RGB', (grid_width, grid_height), (255, 255, 255))
        
        for i, img in enumerate(images):
            row = i // cols
            col = i % cols
            x = col * img_width
            y = row * img_height
            grid.paste(img, (x, y))
        
        # Salvar grid
        grid_path = os.path.join(folder, "comparison_grid.png")
        grid.save(grid_path)
        print(f"📊 Grid de comparação salvo: {grid_path}")

# Exemplo de uso completo
if __name__ == "__main__":
    # Inicializar gerador
    generator = ArtisticImageGenerator()
    
    # Exemplo 1: Arte single
    print("\n" + "="*50)
    print("🎨 EXEMPLO 1: ARTE ÚNICA")
    print("="*50)
    
    prompt = "Um dragão majestoso voando sobre um castelo medieval ao pôr do sol"
    images, enhanced = generator.generate_art(
        prompt=prompt,
        style="fantasy",
        width=768,
        height=512
    )
    
    images[0].save("dragao_fantastico.png")
    print(f"✅ Imagem salva: dragao_fantastico.png")
    print(f"📝 Prompt melhorado: {enhanced}")
    
    # Exemplo 2: Série de variações
    print("\n" + "="*50)
    print("🎨 EXEMPLO 2: SÉRIE DE ARTE")
    print("="*50)
    
    series = generator.create_art_series(
        theme="Uma floresta encantada com criaturas mágicas",
        variations=3,
        style="fantasy"
    )
    
    # Exemplo 3: Comparação de estilos
    print("\n" + "="*50)
    print("🎨 EXEMPLO 3: COMPARAÇÃO DE ESTILOS")
    print("="*50)
    
    comparison = generator.create_style_comparison(
        prompt="Um robô futurista em uma cidade cyberpunk",
        styles=["cyberpunk", "anime", "realism", "oil_painting"]
    )
    
    print("\n🎉 TODOS OS EXEMPLOS CONCLUÍDOS!")
    print("📁 Verifique as pastas criadas com suas artes!")

🚀 O que você criou:

  • ✅ Gerador de arte com 8 estilos diferentes
  • ✅ Sistema de prompts inteligentes
  • ✅ Criador de séries temáticas
  • ✅ Comparador de estilos
  • ✅ Organizador automático de arquivos
  • ✅ Grid de comparação visual

🎭 Galeria de Estilos

💎 Segredos dos Profissionais

🔢 Configurações Ideais

  • Steps: 20-30 (mais = melhor qualidade)
  • CFG Scale: 7-12 (controle do prompt)
  • Resolução: 512x512 ou 768x768
  • Sampler: DPM++ 2M Karras

📝 Prompt Engineering

  • Seja específico e descritivo
  • Use vírgulas para separar elementos
  • Coloque o mais importante no início
  • Teste variações até encontrar o ideal

⚡ Otimização

  • Use --medvram se tiver pouca VRAM
  • Batch size 1 para economizar memória
  • Feche outros programas durante geração
  • Use xformers para acelerar

🎨 Workflow Profissional

  • Comece com baixa resolução
  • Ajuste o prompt até ficar bom
  • Depois aumente a resolução
  • Use img2img para refinamentos

💰 Oportunidades Comerciais

🛍️ E-commerce

  • Fotos de produtos
  • Banners promocionais
  • Modelos virtuais
  • Cenários para produtos

💰 R$ 50-200 por imagem

📱 Redes Sociais

  • Posts para Instagram
  • Capas para YouTube
  • Stories personalizados
  • Avatares únicos

💰 R$ 30-100 por pacote

🎮 Games & NFTs

  • Arte conceitual
  • Personagens de games
  • NFTs exclusivos
  • Texturas e cenários

💰 R$ 100-500+ por arte

📰 Mídia & Marketing

  • Ilustrações para artigos
  • Campanhas publicitárias
  • Apresentações corporativas
  • Material educativo

💰 R$ 200-1000 por projeto

🎯 Parabéns! Você Dominou o Stable Diffusion!

Você acabou de se tornar um artista digital com poderes de criação ilimitados!

O que você conquistou hoje:

  • ✅ Domínio completo do Stable Diffusion
  • ✅ Arte do prompt engineering
  • ✅ Sistema personalizado de geração
  • ✅ Conhecimento de 8+ estilos artísticos
  • ✅ Técnicas de otimização e qualidade
  • ✅ Visão comercial das oportunidades

Na próxima aula, vamos aprender Fine-tuning - como treinar modelos com seus próprios dados para criar algo verdadeiramente único!

"A criatividade não tem limites quando você tem as ferramentas certas"

- Isaque Victor

🎯 Teste Seus Conhecimentos