Shakker-Labs/FLUX.1-dev-ControlNet-Union-Pro-2.0

Shakker-Labs
Texto a imagen

Modelo ControlNet unificado para FLUX.1-dev, entrenado desde cero por Shakker Labs para generación de imágenes condicionada con múltiples modos de control. Esta versión elimina la incrustación de modo para reducir tamaño, mejora especialmente el control de canny y pose, añade soporte para soft edge y elimina soporte para tile.

Como usar

Carga el modelo como ControlNet para black-forest-labs/FLUX.1-dev usando Diffusers. Ejemplo de inferencia con una sola condición:

import torch
from diffusers.utils import load_image
from diffusers import FluxControlNetPipeline, FluxControlNetModel

base_model = 'black-forest-labs/FLUX.1-dev'
controlnet_model_union = 'Shakker-Labs/FLUX.1-dev-ControlNet-Union-Pro-2.0'

controlnet = FluxControlNetModel.from_pretrained(controlnet_model_union, torch_dtype=torch.bfloat16)
pipe = FluxControlNetPipeline.from_pretrained(base_model, controlnet=controlnet, torch_dtype=torch.bfloat16)
pipe.to("cuda")

control_image = load_image("./conds/canny.png")
width, height = control_image.size
prompt = "A young girl stands gracefully at the edge of a serene beach..."

image = pipe(
    prompt,
    control_image=control_image,
    width=width,
    height=height,
    controlnet_conditioning_scale=0.7,
    control_guidance_end=0.8,
    num_inference_steps=30,
    guidance_scale=3.5,
    generator=torch.Generator(device="cuda").manual_seed(42),
).images[0]

Ejemplo de inferencia con múltiples condiciones:

import torch
from diffusers.utils import load_image
from pipeline_flux_controlnet import FluxControlNetPipeline
from controlnet_flux import FluxControlNetModel

base_model = 'black-forest-labs/FLUX.1-dev'
controlnet_model_union = 'Shakker-Labs/FLUX.1-dev-ControlNet-Union-Pro-2.0'

controlnet = FluxControlNetModel.from_pretrained(controlnet_model_union, torch_dtype=torch.bfloat16)
pipe = FluxControlNetPipeline.from_pretrained(base_model, controlnet=[controlnet], torch_dtype=torch.bfloat16)
pipe.to("cuda")

control_image = load_image("./conds/canny.png")
width, height = control_image.size
prompt = "A young girl stands gracefully at the edge of a serene beach..."

image = pipe(
    prompt,
    control_image=[control_image, control_image],
    width=width,
    height=height,
    controlnet_conditioning_scale=[0.35, 0.35],
    control_guidance_end=[0.8, 0.8],
    num_inference_steps=30,
    guidance_scale=3.5,
    generator=torch.Generator(device="cuda").manual_seed(42),
).images[0]

Parámetros recomendados específicos por modo:

  • Canny: controlnet_conditioning_scale=0.7, control_guidance_end=0.8
  • Soft Edge: controlnet_conditioning_scale=0.7, control_guidance_end=0.8
  • Depth: controlnet_conditioning_scale=0.8, control_guidance_end=0.8
  • Pose: controlnet_conditioning_scale=0.9, control_guidance_end=0.65
  • Gray: controlnet_conditioning_scale=0.9, control_guidance_end=0.8

Se recomienda usar prompts detallados para mejorar estabilidad y, en algunos casos, múltiples condiciones para un control más robusto.

Funcionalidades

Compatible con múltiples modos de control: canny, soft edge, depth, pose y gray
Puede usarse como un ControlNet normal o en combinación con otros ControlNet
Arquitectura con 6 double blocks y 0 single block
Entrenado durante 300k pasos con 20 millones de imágenes generales y humanas de alta calidad
Entrenamiento a 512x512 en BFloat16 con batch size 128 y learning rate 2e-5
Mejoras de control y estética frente a la versión Union Pro anterior, especialmente en canny y pose
Soporta inferencia con una o varias condiciones de control

Casos de uso

Generación de imágenes a partir de texto con control estructural mediante bordes canny
Composición de escenas guiadas por mapas de profundidad
Posado controlado de figuras humanas mediante estimación de pose
Generación condicionada por soft edges para conservar contornos suaves
Flujos de trabajo avanzados con varias condiciones simultáneas, como canny + depth o pose + depth