Imagens IA: Controle Total Com Código!

O Segredo Revelado: Crie Imagens de IA Surrealmente Perfeitas (Rápido e Fácil com Diffusers)!

Olá, pessoal! Aqui é o Lucas Tech, e hoje a gente vai mergulhar de cabeça em algo que eu amo: a criação de imagens com Inteligência Artificial! Se você já tentou gerar umas imagens e sentiu que faltava algo, ou que era lento demais, seus problemas acabaram! Prepare-se, porque vamos transformar você num mago da geração de imagens usando a biblioteca Diffusers, Stable Diffusion e algumas técnicas que vão mudar seu jogo. Bora turbinar suas criações?

Fonte: ZDNet


Preparando o Terreno: Configuração Essencial

Primeiro passo, como em todo projeto de respeito, é organizar a casa! Vamos garantir que nosso ambiente esteja redondinho, sem conflitos, pra gente poder focar só na criação. É tipo preparar a bancada do seu laboratório secreto de IA! Vamos instalar tudo que precisamos e importar as bibliotecas essenciais. Ah, e fica tranquilo(a), já vamos otimizar tudo pra rodar liso!

Fonte: ZDNet

Essa primeira leva de código é fundamental. Basicamente, estamos garantindo que todas as dependências estão no lugar certo e que o Pillow (uma biblioteca essencial para processamento de imagens) está na versão ideal. Depois, importamos os módulos do Diffusers que vão ser nossos melhores amigos nesse processo.

Fonte: ZDNet

php
!pip -q uninstall -y pillow Pillow || true
!pip -q install –upgrade –force-reinstall "pillow<12.0"
!pip -q install –upgrade diffusers transformers accelerate safetensors huggingface_hub opencv-python

Fonte: ZDNet

import os, math, random
import torch
import numpy as np
import cv2
from PIL import Image, ImageDraw, ImageFilter
from diffusers import (
StableDiffusionPipeline,
StableDiffusionInpaintPipeline,
ControlNetModel,
StableDiffusionControlNetPipeline,
UniPCMultistepScheduler,
)

Fonte: ZDNet

Ferramentas Úteis para um Workflow Perfeito

Pra gente ter controle total e não se perder no meio do caminho, vamos criar umas funções auxiliares. Elas são pequenas, mas fazem uma diferença GIGANTE! Uma delas vai garantir que suas imagens sejam sempre iguais se você rodar o código de novo (adeus, aleatoriedade indesejada!), e a outra ajuda a organizar várias imagens numa grade, tipo um mural.

Fonte: ZDNet

Ah, e claro, vamos ver se você está rodando na GPU (placa de vídeo) ou na CPU (processador principal) pra extrair o máximo de desempenho!

Fonte: ZDNet

php
def seed_everything(seed=42):
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)

Fonte: ZDNet

def to_grid(images, cols=2, bg=255):
if isinstance(images, Image.Image):
images = [images]
w, h = images[0].size
rows = math.ceil(len(images) / cols)
grid = Image.new("RGB", (colsw, rowsh), (bg, bg, bg))
for i, im in enumerate(images):
grid.paste(im, ((i % cols)w, (i // cols)h))
return grid

Fonte: ZDNet

device = "cuda" if torch.cuda.is_available() else "cpu"
dtype = torch.float16 if device == "cuda" else torch.float32
print("device:", device, "| dtype:", dtype)

Fonte: ZDNet

O Começo de Tudo: Gerando Imagens Pelo Texto

Agora a mágica começa pra valer! Vamos carregar o coração do nosso sistema: o Stable Diffusion! É ele que vai pegar nossas ideias em texto e transformar em imagens. E pra deixar tudo ainda mais rápido e suave, vamos trocar o ‘motor’ dele por um agendador (scheduler) mais eficiente, o UniPCMultistepScheduler. É como dar um upgrade na performance do seu carro!

Fonte: ZDNet

Depois, é só escrever o que a gente quer (o ‘prompt’) e o que não quer (o ‘negative_prompt’) e deixar a IA trabalhar. Essa é a nossa imagem de partida, nosso ‘ponto zero’ antes das otimizações e truques que vêm por aí!

Fonte: ZDNet

php
seed_everything(7)
BASE_MODEL = "runwayml/stable-diffusion-v1-5"

Fonte: ZDNet

pipe = StableDiffusionPipeline.from_pretrained(
BASE_MODEL,
torch_dtype=dtype,
safety_checker=None,
).to(device)

Fonte: ZDNet

pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)

Fonte: ZDNet

if device == "cuda":
pipe.enable_attention_slicing()
pipe.enable_vae_slicing()

Fonte: ZDNet

prompt = "a cinematic photo of a futuristic street market at dusk, ultra-detailed, 35mm, volumetric lighting"
negative_prompt = "blurry, low quality, deformed, watermark, text"

Fonte: ZDNet

img_text = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
num_inference_steps=25,
guidance_scale=6.5,
width=768,
height=512,
).images[0]

Fonte: ZDNet

Turbinando a Geração: Velocidade com LoRA e Controle com ControlNet

Bora acelerar esse processo? Sabe aqueles modelos LoRA que estão super em alta? Vamos usar um deles (o LCM-LoRA) pra deixar a geração de imagens muuuito mais rápida, com menos passos de difusão! É impressionante como a gente consegue resultados excelentes em segundos. É tipo botar um turbo na sua IA!

Fonte: ZDNet

Mas não é só velocidade! E se eu te dissesse que dá pra ‘desenhar’ a estrutura da sua imagem e deixar a IA preencher os detalhes? É exatamente isso que o ControlNet faz! A gente cria um ‘esqueleto’ (aqui, usando bordas Canny) e o ControlNet usa isso como guia pra IA montar a cena. É o casamento perfeito entre sua visão e a criatividade da máquina!

Fonte: ZDNet

php
LCM_LORA = "latent-consistency/lcm-lora-sdv1-5"
pipe.load_lora_weights(LCM_LORA)

Fonte: ZDNet

try:
pipe.fuse_lora()
lora_fused = True
except Exception as e:
lora_fused = False
print("LoRA fuse skipped:", e)

Fonte: ZDNet

fast_prompt = "a clean product photo of a minimal smartwatch on a reflective surface, studio lighting"
fast_images = []
for steps in [4, 6, 8]:
fast_images.append(
pipe(
prompt=fast_prompt,
negative_prompt=negative_prompt,
num_inference_steps=steps,
guidance_scale=1.5,
width=768,
height=512,
).images[0]
)

Fonte: ZDNet

grid_fast = to_grid(fast_images, cols=3)
print("LoRA fused:", lora_fused)

Fonte: ZDNet

W, H = 768, 512
layout = Image.new("RGB", (W, H), "white")
draw = ImageDraw.Draw(layout)
draw.rectangle([40, 80, 340, 460], outline="black", width=6)
draw.ellipse([430, 110, 720, 400], outline="black", width=6)
draw.line([0, 420, W, 420], fill="black", width=5)

Fonte: ZDNet

edges = cv2.Canny(np.array(layout), 80, 160)
edges = np.stack([edges]*3, axis=-1)
canny_image = Image.fromarray(edges)

Fonte: ZDNet

CONTROLNET = "lllyasviel/sd-controlnet-canny"
controlnet = ControlNetModel.from_pretrained(
CONTROLNET,
torch_dtype=dtype,
).to(device)

Fonte: ZDNet

cn_pipe = StableDiffusionControlNetPipeline.from_pretrained(
BASE_MODEL,
controlnet=controlnet,
torch_dtype=dtype,
safety_checker=None,
).to(device)

Fonte: ZDNet

cn_pipe.scheduler = UniPCMultistepScheduler.from_config(cn_pipe.scheduler.config)

Fonte: ZDNet

if device == "cuda":
cn_pipe.enable_attention_slicing()
cn_pipe.enable_vae_slicing()

Fonte: ZDNet

cn_prompt = "a modern cafe interior, architectural render, soft daylight, high detail"
img_controlnet = cn_pipe(
prompt=cn_prompt,
negative_prompt=negative_prompt,
image=canny_image,
num_inference_steps=25,
guidance_scale=6.5,
controlnet_conditioning_scale=1.0,
).images[0]

Fonte: ZDNet

Toque Final: Edições Locais com Inpainting

Ok, você gerou uma imagem incrível, mas quer mudar só um detalhezinho? Sem problemas! Com o Inpainting, a gente consegue ‘mascarar’ uma área específica da imagem e pedir pra IA criar algo novo só naquele pedacinho. É como ter um editor de fotos superpoderoso, mas que entende o que você quer dizer!

Fonte: ZDNet

É perfeito pra corrigir falhas, adicionar elementos ou refinar partes sem estragar o resto da sua obra de arte. No final, vamos salvar tudo bonitinho pra você poder conferir cada etapa do nosso processo.

Fonte: ZDNet

php
mask = Image.new("L", img_controlnet.size, 0)
mask_draw = ImageDraw.Draw(mask)
mask_draw.rectangle([60, 90, 320, 170], fill=255)
mask = mask.filter(ImageFilter.GaussianBlur(2))

Fonte: ZDNet

inpaint_pipe = StableDiffusionInpaintPipeline.from_pretrained(
BASE_MODEL,
torch_dtype=dtype,
safety_checker=None,
).to(device)

Fonte: ZDNet

inpaint_pipe.scheduler = UniPCMultistepScheduler.from_config(inpaint_pipe.scheduler.config)

Fonte: ZDNet

if device == "cuda":
inpaint_pipe.enable_attention_slicing()
inpaint_pipe.enable_vae_slicing()

Fonte: ZDNet

inpaint_prompt = "a glowing neon sign that says ‘CAFÉ’, cyberpunk style, realistic lighting"

Fonte: ZDNet

img_inpaint = inpaint_pipe(
prompt=inpaint_prompt,
negative_prompt=negative_prompt,
image=img_controlnet,
mask_image=mask,
num_inference_steps=30,
guidance_scale=7.0,
).images[0]

Fonte: ZDNet

os.makedirs("outputs", exist_ok=True)
img_text.save("outputs/text2img.png")
grid_fast.save("outputs/lora_fast_grid.png")
layout.save("outputs/layout.png")
canny_image.save("outputs/canny.png")
img_controlnet.save("outputs/controlnet.png")
mask.save("outputs/mask.png")
img_inpaint.save("outputs/inpaint.png")

Fonte: ZDNet

print("Saved outputs:", sorted(os.listdir("outputs")))
print("Done.")

Fonte: ZDNet


Minha Visão

Poxa, que jornada incrível, não é? A gente viu como a biblioteca Diffusers não é só mais uma ferramenta, mas um verdadeiro canivete suíço para quem quer ir além na geração de imagens com IA. Sair de um simples ‘texto pra imagem’ e chegar a um controle tão fino de velocidade, estrutura e até edição localizada, tudo dentro do mesmo framework, é algo revolucionário. Pra mim, isso significa que a barreira entre a ideia e a imagem final está cada vez menor, abrindo um universo de possibilidades para artistas, desenvolvedores e qualquer um que sonhe em dar vida às suas criações digitais de forma eficiente e controlada. É a tecnologia nos capacitando para sermos ainda mais criativos!

Fonte: ZDNet

E aí, galera tech! Qual dessas ferramentas – o LoRA pra velocidade, o ControlNet pra composição, ou o Inpainting pra retoques – vocês estão mais animados pra testar primeiro nas suas próprias criações de IA? Deixem suas ideias nos comentários!

Fonte: ZDNet

Referência: Matéria Original

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima