diffusers/controlnet-canny-sdxl-1.0-mid

diffusers
Texto a imagen

ControlNet experimental y ligero para Stable Diffusion XL que usa mapas de bordes Canny como condicionamiento. Está entrenado sobre stabilityai/stable-diffusion-xl-base-1.0 y ofrece pesos aproximadamente 5 veces más pequeños que el checkpoint XL ControlNet original, con buena generalización usando una escala de condicionamiento recomendada de 0.5.

Como usar

Instalación básica con Diffusers:

pip install -U diffusers transformers accelerate
from diffusers import ControlNetModel, StableDiffusionControlNetPipeline

controlnet = ControlNetModel.from_pretrained("diffusers/controlnet-canny-sdxl-1.0-mid")
pipe = StableDiffusionControlNetPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    controlnet=controlnet
)

Ejemplo completo de uso con SDXL, VAE FP16 y detección Canny con OpenCV:

pip install accelerate transformers safetensors opencv-python diffusers
from diffusers import ControlNetModel, StableDiffusionXLControlNetPipeline, AutoencoderKL
from diffusers.utils import load_image
from PIL import Image
import torch
import numpy as np
import cv2

prompt = "aerial view, a futuristic research complex in a bright foggy jungle, hard lighting"
negative_prompt = "low quality, bad quality, sketches"

image = load_image("https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/sd_controlnet/hf-logo.png")
controlnet_conditioning_scale = 0.5

controlnet = ControlNetModel.from_pretrained(
    "diffusers/controlnet-canny-sdxl-1.0-mid",
    torch_dtype=torch.float16
)
vae = AutoencoderKL.from_pretrained("madebyollin/sdxl-vae-fp16-fix", torch_dtype=torch.float16)
pipe = StableDiffusionXLControlNetPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    controlnet=controlnet,
    vae=vae,
    torch_dtype=torch.float16,
)
pipe.enable_model_cpu_offload()

image = np.array(image)
image = cv2.Canny(image, 100, 200)
image = image[:, :, None]
image = np.concatenate([image, image, image], axis=2)
image = Image.fromarray(image)

images = pipe(
    prompt,
    negative_prompt=negative_prompt,
    image=image,
    controlnet_conditioning_scale=controlnet_conditioning_scale,
).images

images[0].save(f"hug_lab.png")

El autor recomienda experimentar con controlnet_conditioning_scale y guidance_scale para mejorar la calidad. El checkpoint se marca como experimental y puede rendir peor que checkpoints más grandes en condicionamientos complejos.

Funcionalidades

Adaptador ControlNet para generación texto-a-imagen con Stable Diffusion XL.
Condicionamiento mediante bordes Canny extraídos de una imagen de entrada.
Checkpoint pequeño, unas 5 veces más ligero que el ControlNet XL original.
Compatible con Diffusers y formato Safetensors.
Entrenado sin destilación, inicializado desde el UNet de SDXL y sin bloques de atención.
Entrenado con 3 millones de imágenes de LAION aesthetic 6 plus, batch size 256, 50.000 pasos, learning rate constante 3e-5.
Pensado para FP16; el cómputo reportado fue una máquina 8xA100.

Casos de uso

Generar imágenes SDXL siguiendo la estructura de bordes de una imagen de referencia.
Crear variaciones visuales guiadas por contornos Canny con prompts de texto.
Prototipar flujos ControlNet más ligeros cuando el tamaño del checkpoint importa.
Experimentar con composición, poses, siluetas o geometría aproximada usando mapas de borde.
Investigación y mejora comunitaria de ControlNets compactos para SDXL.