diffusers/controlnet-depth-sdxl-1.0-small

diffusers
Texto a imagen

Estos son pesos de ControlNet entrenados en stabilityai/stable-diffusion-xl-base-1.0 con acondicionamiento de profundidad. Este punto de control es 7 veces más pequeño que el punto de control ControlNet XL original. Se recomienda experimentar con los parámetros controlnet_conditioning_scale y guidance_scale para potencialmente mejorar la calidad de generación de imágenes. Este punto de control es experimental y tiene mucho margen de mejora.

Como usar

Primero, asegúrese de instalar las bibliotecas necesarias:

pip install accelerate transformers safetensors diffusers

Luego puede usar el modelo con el siguiente código:

import torch
import numpy as np
from PIL import Image
from transformers import DPTFeatureExtractor, DPTForDepthEstimation
from diffusers import ControlNetModel, StableDiffusionXLControlNetPipeline, AutoencoderKL
from diffusers.utils import load_image

depth_estimator = DPTForDepthEstimation.from_pretrained("Intel/dpt-hybrid-midas").to("cuda")
feature_extractor = DPTFeatureExtractor.from_pretrained("Intel/dpt-hybrid-midas")
controlnet = ControlNetModel.from_pretrained(
    "diffusers/controlnet-depth-sdxl-1.0-small",
    variant="fp16",
    use_safetensors=True,
    torch_dtype=torch.float16,
).to("cuda")
vae = AutoencoderKL.from_pretrained("madebyollin/sdxl-vae-fp16-fix", torch_dtype=torch.float16).to("cuda")
pipe = StableDiffusionXLControlNetPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    controlnet=controlnet,
    vae=vae,
    variant="fp16",
    use_safetensors=True,
    torch_dtype=torch.float16,
).to("cuda")
pipe.enable_model_cpu_offload()

def get_depth_map(image):
    image = feature_extractor(images=image, return_tensors="pt").pixel_values.to("cuda")
    with torch.no_grad(), torch.autocast("cuda"):
        depth_map = depth_estimator(image).predicted_depth

    depth_map = torch.nn.functional.interpolate(
        depth_map.unsqueeze(1),
        size=(1024, 1024),
        mode="bicubic",
        align_corners=False,
    )
    depth_min = torch.amin(depth_map, dim=[1, 2, 3], keepdim=True)
    depth_max = torch.amax(depth_map, dim=[1, 2, 3], keepdim=True)
    depth_map = (depth_map - depth_min) / (depth_max - depth_min)
    image = torch.cat([depth_map] * 3, dim=1)

    image = image.permute(0, 2, 3, 1).cpu().numpy()[0]
    image = Image.fromarray((image * 255.0).clip(0, 255).astype(np.uint8))
    return image

prompt = "stormtrooper lecture, photorealistic"
image = load_image("https://huggingface.co/lllyasviel/sd-controlnet-depth/resolve/main/images/stormtrooper.png")
controlnet_conditioning_scale = 0.5 # recomendado para una buena generalización

depth_image = get_depth_map(image)

images = pipe(
    prompt, image=depth_image, num_inference_steps=30, controlnet_conditioning_scale=controlnet_conditioning_scale,
).images
images[0]

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

Para más detalles, visite la documentación oficial de StableDiffusionXLControlNetPipeline.

Funcionalidades

Pesos de ControlNet entrenados con acondicionamiento de profundidad.
7 veces más pequeño que el punto de control ControlNet XL original.
El modelo funciona bastante bien con la mayoría de las imágenes de acondicionamiento.
No posee bloques de atención.
Entrenado con 3M imágenes del subconjunto estético 6 plus de LAION.

Casos de uso

Generación de imágenes fotorrealistas a partir de prompts.
Acondicionamiento de imágenes con mapas de profundidad para mejorar la calidad.
Experimentación con generación de imágenes complejas mediante ControlNet.