Generazione efficiente e controllabile per SDXL con T2I-Adapters

Efficient and controllable generation for SDXL with T2I-Adapters

T2I-Adapter è un modello plug-and-play efficiente che fornisce ulteriori indicazioni ai modelli pre-addestrati di testo-immagine mentre congelano i modelli originali di grandi dimensioni di testo-immagine. T2I-Adapter allinea le conoscenze interne nei modelli T2I con segnali di controllo esterni. Possiamo allenare vari adattatori in base a diverse condizioni e ottenere effetti di controllo e modifica ricchi.

Come lavoro contemporaneo, ControlNet ha una funzione simile ed è ampiamente utilizzato. Tuttavia, può essere computazionalmente costoso da eseguire. Questo perché, durante ogni passaggio di denoising del processo di diffusione inversa, sia il ControlNet che UNet devono essere eseguiti. Inoltre, ControlNet enfatizza l’importanza di copiare l’encoder UNet come modello di controllo, il che porta ad un numero maggiore di parametri. Pertanto, la generazione è limitata dalle dimensioni del ControlNet (più grande è, più lento diventa il processo).

I T2I-Adapters forniscono un vantaggio competitivo rispetto ai ControlNets in questa materia. I T2I-Adapters sono di dimensioni più piccole e, a differenza dei ControlNets, i T2I-Adapters vengono eseguiti solo una volta per l’intero processo di denoising.

Nelle ultime settimane, il team Diffusers e gli autori di T2I-Adapter hanno collaborato per portare il supporto dei T2I-Adapters per Stable Diffusion XL (SDXL) in diffusers. In questo post sul blog, condivideremo i nostri risultati dall’allenamento dei T2I-Adapters su SDXL da zero, alcuni risultati interessanti e, naturalmente, i checkpoint dei T2I-Adapters su diverse condizioni (schizzo, canny, lineart, profondità e openpose)!

Rispetto alle versioni precedenti di T2I-Adapter (SD-1.4/1.5), T2I-Adapter-SDXL utilizza ancora la ricetta originale, guidando 2.6B SDXL con un Adapter di 79M! T2I-Adapter-SDXL mantiene potenti capacità di controllo mentre eredita la generazione di alta qualità di SDXL!

Allenamento di T2I-Adapter-SDXL con diffusers

Abbiamo costruito il nostro script di allenamento su questo esempio ufficiale fornito da diffusers.

La maggior parte dei modelli T2I-Adapter che menzioniamo in questo post sul blog sono stati allenati su 3M di coppie di immagini-testo ad alta risoluzione da LAION-Aesthetics V2 con le seguenti impostazioni:

  • Passi di allenamento: 20000-35000
  • Dimensione del batch: Data parallel con una dimensione del batch singolo di 16 per una dimensione totale del batch di 128.
  • Learning rate: Learning rate costante di 1e-5.
  • Precisione mista: fp16

Invitiamo la comunità ad utilizzare i nostri script per allenare T2I-Adapters personalizzati e potenti, trovando un equilibrio competitivo tra velocità, memoria e qualità.

Utilizzo di T2I-Adapter-SDXL in diffusers

Qui, prendiamo come esempio la condizione lineart per dimostrare l’utilizzo di T2I-Adapter-SDXL. Per iniziare, installa prima le dipendenze necessarie:

pip install -U git+https://github.com/huggingface/diffusers.git
pip install -U controlnet_aux==0.0.7 # per i modelli di condizionamento e i rilevatori
pip install transformers accelerate 

Il processo di generazione del T2I-Adapter-SDXL consiste principalmente nei seguenti due passaggi:

  1. Le immagini di condizionamento vengono preparate nel formato di immagine di controllo appropriato.
  2. L’immagine di controllo e la prompt vengono passate alla StableDiffusionXLAdapterPipeline.

Diamo un’occhiata ad un semplice esempio usando l’Adapter Lineart. Iniziamo inizializzando la pipeline del T2I-Adapter per SDXL e il rilevatore di lineart.

import torch
from controlnet_aux.lineart import LineartDetector
from diffusers import (AutoencoderKL, EulerAncestralDiscreteScheduler,
                       StableDiffusionXLAdapterPipeline, T2IAdapter)
from diffusers.utils import load_image, make_image_grid

# carica l'adapter
adapter = T2IAdapter.from_pretrained(
    "TencentARC/t2i-adapter-lineart-sdxl-1.0", torch_dtype=torch.float16, varient="fp16"
).to("cuda")

# carica la pipeline
model_id = "stabilityai/stable-diffusion-xl-base-1.0"
euler_a = EulerAncestralDiscreteScheduler.from_pretrained(
    model_id, subfolder="scheduler"
)
vae = AutoencoderKL.from_pretrained(
    "madebyollin/sdxl-vae-fp16-fix", torch_dtype=torch.float16
)
pipe = StableDiffusionXLAdapterPipeline.from_pretrained(
    model_id,
    vae=vae,
    adapter=adapter,
    scheduler=euler_a,
    torch_dtype=torch.float16,
    variant="fp16",
).to("cuda")

# carica il rilevatore di lineart
line_detector = LineartDetector.from_pretrained("lllyasviel/Annotators").to("cuda")

Successivamente, carica un’immagine per rilevare il lineart:

url = "https://huggingface.co/Adapter/t2iadapter/resolve/main/figs_SDXLV1.0/org_lin.jpg"
immagine = carica_immagine(url)
immagine = rilevatore_linea(immagine, risoluzione_rilevazione=384, risoluzione_immagine=1024)

Successivamente generiamo:

prompt = "Ruggito di drago di ghiaccio, foto 4k"
prompt_negativo = "anime, cartone animato, grafica, testo, pittura, pastello, grafite, astratto, glitch, deformato, mutato, brutto, sfigurato"
immagini_generate = pipe(
    prompt=prompt,
    prompt_negativo=prompt_negativo,
    immagine=immagine,
    num_passi_inferenza=30,
    scala_condizionamento_adattatore=0.8,
    scala_guida=7.5,
).immagini[0]
immagini_generate.salva("out_lin.png")

Ci sono due argomenti importanti da comprendere che ti aiutano a controllare la quantità di condizionamento.

  1. scala_condizionamento_adattatore

    Questo argomento controlla quanto influisce il condizionamento sull’input. Valori alti significano un effetto di condizionamento maggiore e viceversa.

  2. fattore_condizionamento_adattatore

    Questo argomento controlla quanti passi di generazione iniziali devono avere il condizionamento applicato. Il valore dovrebbe essere impostato tra 0-1 (il valore predefinito è 1). Il valore di fattore_condizionamento_adattatore=1 significa che l’adattatore dovrebbe essere applicato a tutti i passaggi, mentre il fattore_condizionamento_adattatore=0.5 significa che sarà applicato solo per il 50% dei passi.

Per ulteriori dettagli, ti invitiamo a consultare la documentazione ufficiale.

Prova la Demo

Puoi facilmente provare T2I-Adapter-SDXL in questo Spazio o nel playground incorporato di seguito:

Altri Risultati

Di seguito, presentiamo i risultati ottenuti utilizzando diversi tipi di condizioni. Integreremo anche i risultati con i collegamenti ai relativi checkpoint pre-addestrati. Le loro schede modello contengono ulteriori dettagli su come sono stati addestrati, insieme a un esempio di utilizzo.

Guidato da Lineart

Modello da TencentARC/t2i-adapter-lineart-sdxl-1.0

Guidato da Sketch

Modello da TencentARC/t2i-adapter-sketch-sdxl-1.0

Guidato da Canny

Modello da TencentARC/t2i-adapter-canny-sdxl-1.0

Guidato da Depth

Modelli guidati dalla profondità da TencentARC/t2i-adapter-depth-midas-sdxl-1.0 e TencentARC/t2i-adapter-depth-zoe-sdxl-1.0 rispettivamente

Guidato da OpenPose

Modello da TencentARC/t2i-adapter-openpose-sdxl-1.0


Riconoscimenti: Un immenso ringraziamento a William Berman per averci aiutato ad allenare i modelli e per aver condiviso le sue conoscenze.