Cosa c’è di nuovo nei diffusori? 🎨

Quali sono le novità nei diffusori? 🎨

Un mese e mezzo fa abbiamo rilasciato diffusers, una libreria che fornisce una serie di strumenti modulari per modelli di diffusione tra diverse modalità. Un paio di settimane dopo, abbiamo aggiunto il supporto per Stable Diffusion, un modello di alta qualità per la conversione di testo in immagine, con una demo gratuita per chiunque voglia provarlo. Oltre a bruciare un sacco di GPU, nelle ultime tre settimane il team ha deciso di aggiungere una o due nuove funzionalità alla libreria che speriamo la community apprezzi! Questo post sul blog fornisce una panoramica generale delle nuove funzionalità nella versione 0.3 di diffusers! Ricordatevi di dare una ⭐ al repository su GitHub.

  • Pipeline da immagine a immagine
  • Inversione testuale
  • Inpainting
  • Ottimizzazioni per GPU più piccole
  • Esecuzione su Mac
  • Esportatore ONNX
  • Nuovi documenti
  • Community
    • Generazione di video con spazio latente SD
    • Spiegabilità del modello
    • Stable Diffusion giapponese
    • Modello ad alta qualità sintonizzato
    • Controllo dell’attenzione incrociata con Stable Diffusion
    • Semi riutilizzabili

Pipeline da immagine a immagine

Una delle funzionalità più richieste era quella di avere la generazione da immagine a immagine. Questa pipeline permette di inserire un’immagine e una frase di input, e genererà un’immagine basata su di esse!

Vediamo un po’ di codice basato sul notebook ufficiale di Colab.

from diffusers import StableDiffusionImg2ImgPipeline

pipe = StableDiffusionImg2ImgPipeline.from_pretrained(
    "CompVis/stable-diffusion-v1-4",
    revision="fp16", 
    torch_dtype=torch.float16,
    use_auth_token=True
)

# Scarica un'immagine iniziale
# ...

init_image = preprocess(init_img)

prompt = "Un paesaggio fantastico, in tendenza su artstation"
images = pipe(prompt=prompt, init_image=init_image, strength=0.75, guidance_scale=7.5, generator=generator)["sample"]

Non hai tempo per il codice? Nessun problema, abbiamo anche creato una demo Space dove puoi provarlo direttamente.

Inversione testuale

L’inversione testuale ti permette di personalizzare un modello Stable Diffusion sulle tue immagini con soli 3-5 campioni. Con questo strumento, puoi addestrare un modello su un concetto e condividerlo con il resto della community!

In solo un paio di giorni, la community ha condiviso oltre 200 concetti! Dai un’occhiata!

  • Organizzazione dei concetti.
  • Navigator Colab: Naviga visualmente e usa oltre 150 concetti creati dalla community.
  • Training Colab: Insegna a Stable Diffusion un nuovo concetto e condividilo con il resto della community.
  • Inference Colab: Esegui Stable Diffusion con i concetti appresi.

Pipeline di inpainting sperimentale

L’inpainting consente di fornire un’immagine, quindi selezionare un’area nell’immagine (o fornire una maschera) e utilizzare Stable Diffusion per sostituire la maschera. Ecco un esempio:

Puoi provare un notebook minimale di Colab o controllare il codice qui sotto. Una demo sarà disponibile a breve!

from diffusers import StableDiffusionInpaintPipeline

pipe = StableDiffusionInpaintPipeline.from_pretrained(
    "CompVis/stable-diffusion-v1-4",
    revision="fp16", 
    torch_dtype=torch.float16,
    use_auth_token=True
).to(device)

images = pipe(
    prompt=["un gatto seduto su una panchina"] * 3,
    init_image=init_image,
    mask_image=mask_image,
    strength=0.75,
    guidance_scale=7.5,
    generator=None
).images

Si prega di notare che questa è una funzionalità sperimentale, quindi c’è spazio per miglioramenti.

Ottimizzazioni per GPU più piccole

Dopo alcuni miglioramenti, i modelli di diffusione possono richiedere molta meno VRAM. 🔥 Ad esempio, Stable Diffusion richiede solo 3,2 GB! Questo produce gli stessi risultati a scapito del 10% della velocità. Ecco come utilizzare queste ottimizzazioni

from diffusers import StableDiffusionPipeline

pipe = StableDiffusionPipeline.from_pretrained(
    "CompVis/stable-diffusion-v1-4", 
    revision="fp16", 
    torch_dtype=torch.float16,
    use_auth_token=True
)
pipe = pipe.to("cuda")
pipe.enable_attention_slicing()

Questo è super eccitante perché ridurrà ancora di più la barriera nell’utilizzo di questi modelli!

Diffusori in Mac OS

🍎 Esatto! Un’altra funzionalità molto richiesta è stata appena rilasciata! Leggi le istruzioni complete nella documentazione ufficiale (incluse comparazioni delle prestazioni, specifiche e altro).

Utilizzando il dispositivo PyTorch mps, le persone con hardware M1/M2 possono eseguire l’inferenza con Stable Diffusion. 🤯 Questo richiede una configurazione minima per gli utenti, provare!

from diffusers import StableDiffusionPipeline

pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", use_auth_token=True)
pipe = pipe.to("mps")

prompt = "una foto di un astronauta che cavalca un cavallo su Marte"
image = pipe(prompt).images[0]

Esportatore e pipeline ONNX sperimentali

La nuova pipeline sperimentale consente agli utenti di eseguire Stable Diffusion su qualsiasi hardware che supporti ONNX. Ecco un esempio di come utilizzarla (nota che viene utilizzata la revisione onnx)

from diffusers import StableDiffusionOnnxPipeline

pipe = StableDiffusionOnnxPipeline.from_pretrained(
    "CompVis/stable-diffusion-v1-4",
    revision="onnx",
    provider="CPUExecutionProvider",
    use_auth_token=True,
)

prompt = "una foto di un astronauta che cavalca un cavallo su Marte"
image = pipe(prompt).images[0]

In alternativa, è anche possibile convertire direttamente i checkpoint di SD in ONNX tramite lo script di esportazione.

python scripts/convert_stable_diffusion_checkpoint_to_onnx.py --model_path="CompVis/stable-diffusion-v1-4" --output_path="./stable_diffusion_onnx"

Nuova documentazione

Tutte le funzionalità precedenti sono molto interessanti. Come manutentori di librerie open-source, conosciamo l’importanza di documentazioni di alta qualità per renderle il più facile possibile per chiunque provi la libreria.

💅 Per questo motivo, abbiamo fatto uno sprint sulla documentazione e siamo molto entusiasti di fare una prima release della nostra documentazione. Questa è una prima versione, quindi ci sono molte cose che abbiamo intenzione di aggiungere (e i contributi sono sempre benvenuti!).

Alcuni punti salienti della documentazione:

  • Tecniche per l’ottimizzazione
  • La panoramica della formazione
  • Una guida per i contributori
  • Documentazione API approfondita per gli scheduler
  • Documentazione API approfondita per le pipeline

Comunità

E mentre stavamo facendo tutto ciò, la comunità non è rimasta con le mani in mano! Ecco alcuni punti salienti (anche se non esaustivi) di ciò che è stato fatto

Video di Stable Diffusion

Crea 🔥 video con Stable Diffusion esplorando lo spazio latente e trasformando tra promemoria di testo. Puoi:

  • Sognare diverse versioni dello stesso promemoria
  • Trasformarti tra promemoria diversi

Lo strumento Video di Stable Diffusion è installabile tramite pip, viene fornito con un notebook Colab e un notebook Gradio ed è molto facile da utilizzare!

Ecco un esempio

from stable_diffusion_videos import walk

video_path = walk(['un gatto', 'un cane'], [42, 1337], num_steps=3, make_video=True)

Diffusers Interpret

Diffusers interpret è uno strumento di spiegabilità sviluppato su diffusers. Ha funzionalità interessanti come:

  • Visualizza tutte le immagini nel processo di diffusione
  • Analizza come ogni token nel promemoria influenza la generazione
  • Analizza all’interno di bounding box specificate se si desidera comprendere una parte dell’immagine

(Immagine dal repository degli strumenti)

# passare il pipeline alla classe spiegatore
spiegatore = StableDiffusionPipelineExplainer(pipe)

# generare un'immagine con `spiegatore`
prompt = "Corgi con la Torre Eiffel"
output = spiegatore(
    prompt, 
    num_inference_steps=15
)

output.normalized_token_attributions # (token, percentuale_attribuzione)
#[('corgi', 40),
# ('con', 5),
# ('la', 5),
# ('torre', 25),
# ('eiffel', 25)]

Diffusione stabile giapponese

Il nome dice tutto! L’obiettivo del JSD era quello di addestrare un modello che catturasse anche informazioni sulla cultura, l’identità e le espressioni uniche. È stato addestrato con 100 milioni di immagini con didascalie giapponesi. Puoi leggere di più su come è stato addestrato il modello nella carta del modello

Diffusione waifu

La diffusione waifu è un modello SD sintonizzato per la generazione di immagini anime di alta qualità.

(Immagine dal repository degli strumenti)

Controllo dell’attenzione incrociata

Il controllo dell’attenzione incrociata consente un controllo preciso delle prompt modificando le mappe di attenzione dei modelli di diffusione. Alcune cose interessanti che puoi fare:

  • Sostituire un target nella prompt (ad esempio, sostituire “gatto” con “cane”)
  • Ridurre o aumentare l’importanza delle parole nella prompt (ad esempio, se si desidera che venga data meno attenzione a “rocks”)
  • Iniettare facilmente stili

E molto altro ancora! Dai un’occhiata al repository.

Semi riutilizzabili

Una delle dimostrazioni più impressionanti di Diffusione stabile è stata la riutilizzazione delle sementi per ottimizzare le immagini. L’idea è utilizzare la semente di un’immagine di interesse per generare una nuova immagine, con una prompt diversa. Questo produce risultati interessanti! Dai un’occhiata al Colab

Grazie per la lettura!

Spero che ti sia piaciuto leggere questo! Ricorda di dare una stella al nostro repository GitHub e unisciti al server Discord di Hugging Face, dove abbiamo una categoria di canali dedicati ai modelli di diffusione. Lì vengono condivise le ultime novità sulla libreria!

Sentiti libero di aprire issue con richieste di funzionalità e segnalazioni di bug! Tutto ciò che è stato realizzato non avrebbe potuto essere fatto senza una community così fantastica.