Composizione di immagini con modelli di diffusione pre-addestrati

Composizione immagini con modelli diffusione pre-addestrati

Una tecnica per aumentare il controllo sulle immagini generate dai modelli di diffusione testo-immagine pre-addestrati

Un'immagine generata con Stable Diffusion utilizzando il metodo descritto nel post. Immagine dell'autore.

I modelli di diffusione testo-immagine hanno raggiunto prestazioni sorprendenti nella generazione di immagini fotorealistiche conformi alle descrizioni di testo naturale. Il rilascio di modelli pre-addestrati open-source, come Stable Diffusion, ha contribuito alla democratizzazione di queste tecniche. I modelli di diffusione pre-addestrati consentono a chiunque di creare immagini straordinarie senza la necessità di una grande potenza di calcolo o di un processo di addestramento lungo.

Nonostante il livello di controllo offerto dalla generazione di immagini guidata dal testo, ottenere un’immagine con una composizione predeterminata è spesso difficile, anche con un’ampia richiesta. Infatti, i modelli di diffusione testo-immagine standard offrono poco controllo sugli elementi che saranno rappresentati nell’immagine generata.

In questo post, spiegherò una tecnica recente basata sul paper MultiDiffusion: Fusing Diffusion Paths for Controlled Image Generation. Questa tecnica permette di ottenere un maggiore controllo nel posizionamento degli elementi in un’immagine generata da un modello di diffusione guidato dal testo. Il metodo presentato nel paper è più generale e consente altre applicazioni, come la generazione di immagini panoramiche, ma qui mi limiterò al caso della composizione delle immagini utilizzando prompt di testo basati su regione. Il vantaggio principale di questo metodo è che può essere utilizzato con modelli di diffusione pre-addestrati pronti all’uso senza la necessità di costosi ritraining o fine-tuning.

Per completare questo post con il codice, ho preparato un semplice notebook Colab e un repository GitHub con l’implementazione del codice che ho utilizzato per generare le immagini in questo post. Il codice si basa sulla pipeline per Stable Diffusion contenuta nella libreria diffusers di Hugging Face, ma implementa solo le parti necessarie per il suo funzionamento per renderlo più semplice e leggibile.

Modelli di diffusione

In questa sezione, ricorderò alcuni fatti fondamentali sui modelli di diffusione. I modelli di diffusione sono modelli generativi che generano nuovi dati invertendo un processo di diffusione che mappa la distribuzione dei dati in una distribuzione gaussiana isotropa. Più specificamente, dato un’immagine, il processo di diffusione consiste in una serie di passaggi, ognuno dei quali aggiunge una piccola quantità di rumore gaussiano a quell’immagine. Nel limite di un numero infinito di passaggi, l’immagine con rumore sarà indistinguibile dal rumore puro campionato da una distribuzione gaussiana isotropa.

Lo scopo del modello di diffusione è invertire questo processo cercando di indovinare l’immagine con rumore al passaggio t-1 nel processo di diffusione dato l’immagine con rumore al passaggio t. Ciò può essere fatto, ad esempio, addestrando una rete neurale per predire il rumore aggiunto in quel passaggio e sottrarlo dall’immagine con rumore.

Una volta addestrato un tale modello, è possibile generare nuove immagini campionando rumore da una distribuzione gaussiana isotropa e utilizzare il modello per invertire il processo di diffusione rimuovendo gradualmente il rumore.

Lo scopo del modello di diffusione è imparare la probabilità q(x(t-1)|x(t)) per tutti i passaggi temporali t. Immagine dal paper: Denoising Diffusion Probabilistic Models.

I modelli di diffusione testo-immagine invertono il processo di diffusione cercando di raggiungere un’immagine che corrisponde alla descrizione di un prompt di testo. Questo viene generalmente fatto da una rete neurale che, ad ogni passaggio t, predice l’immagine con rumore al passaggio t-1 condizionata non solo all’immagine con rumore al passaggio t, ma anche a un prompt di testo che descrive l’immagine che sta cercando di ricostruire.

Molti modelli di diffusione delle immagini, inclusa Stable Diffusion, non operano nello spazio delle immagini originale, ma piuttosto in uno spazio latente appreso di dimensioni ridotte. In questo modo, è possibile ridurre le risorse computazionali richieste con una perdita di qualità minima. Lo spazio latente viene solitamente appreso attraverso un autoencoder variazionale. Il processo di diffusione nello spazio latente funziona esattamente come prima, consentendo di generare nuovi vettori latenti dal rumore gaussiano. Da questi, è possibile ottenere un’immagine appena generata utilizzando il decoder dell’autoencoder variazionale.

Composizione dell’immagine con MultiDiffusion

Passiamo ora a spiegare come ottenere una composizione dell’immagine controllabile utilizzando il metodo MultiDiffusion. L’obiettivo è ottenere un controllo migliore sugli elementi generati in un’immagine da un modello di diffusione testo-immagine pre-addestrato. Più specificamente, dato una descrizione generale dell’immagine (ad esempio, un soggiorno, come nell’immagine di copertina), vogliamo una serie di elementi, specificati tramite prompt di testo, che siano presenti in posizioni specifiche (ad esempio, un divano rosso al centro, una pianta da interno a sinistra e un quadro in alto a destra). Ciò può essere ottenuto fornendo un insieme di prompt di testo che descrivono gli elementi desiderati e un insieme di maschere binarie basate su regioni che specificano la posizione all’interno della quale devono essere raffigurati gli elementi. Come esempio, l’immagine sottostante contiene i bounding box per gli elementi dell’immagine nell’immagine di copertina.

Bounding boxes e prompt utilizzati per generare l'immagine di copertina. Immagine dell'autore.

L’idea principale di MultiDiffusion per la generazione controllabile di immagini è quella di combinare insieme più processi di diffusione, relativi a prompt specificati diversi, per ottenere un’immagine coerente e uniforme che mostri il contenuto di ogni prompt in una regione predefinita. La regione associata a ogni prompt è specificata tramite una maschera binaria delle stesse dimensioni dell’immagine. I pixel della maschera vengono impostati a 1 se il prompt deve essere raffigurato in quella posizione e a 0 altrimenti.

Più specificamente, indichiamo con t un passaggio generico in un processo di diffusione che opera nello spazio latente. Dati i vettori latenti rumorosi al passaggio t, il modello predirà il rumore per ciascun prompt di testo specificato. Da questi rumori previsti, otteniamo un insieme di vettori latenti al passaggio t-1 (uno per ciascun prompt) rimuovendo ciascun rumore previsto dai vettori latenti precedenti al passaggio t. Per ottenere l’input per il passaggio successivo nel processo di diffusione, dobbiamo combinare insieme questi diversi vettori. Ciò può essere fatto moltiplicando ciascun vettore latente per la maschera di prompt corrispondente e quindi prendendo una media per pixel ponderata dalle maschere. Seguendo questa procedura, nella regione specificata da una particolare maschera, i vettori latenti seguiranno le traiettorie del processo di diffusione guidate dal prompt locale corrispondente. Combinare i vettori latenti insieme ad ogni passaggio, prima di prevedere il rumore, assicura la coesione globale dell’immagine generata così come transizioni fluide tra diverse regioni mascherate.

MultiDiffusion introduce una fase di avvio all’inizio del processo di diffusione per una migliore aderenza alle maschere strette. Durante questi passaggi iniziali, i vettori latenti denoisati corrispondenti a diversi prompt non vengono combinati insieme ma vengono invece combinati con alcuni vettori latenti rumorosi corrispondenti a uno sfondo di colore costante. In questo modo, poiché la disposizione è generalmente determinata all’inizio del processo di diffusione, è possibile ottenere una migliore corrispondenza con le maschere specificate poiché il modello può inizialmente concentrarsi solo sulla regione mascherata per raffigurare il prompt.

Esempi

In questa sezione, mostrerò alcune applicazioni del metodo. Ho utilizzato il modello di diffusione stabile pre-addestrato 2 ospitato da HuggingFace per creare tutte le immagini in questo post, compresa l’immagine di copertina.

Come discusso, una semplice applicazione del metodo è ottenere un’immagine contenente elementi generati in posizioni predefinite.

Bounding boxes. Immagine dell'autore.
Immagine generata utilizzando i bounding box sopra. Immagine dell'autore.

Il metodo permette di specificare gli stili, o altre proprietà, degli elementi singoli da raffigurare. Ciò può essere utilizzato ad esempio per ottenere un’immagine nitida su uno sfondo sfocato.

Bounding boxes per sfondo sfocato. Immagine dell'autore.
Immagine generata utilizzando i bounding box sopra. Immagine dell'autore.

Lo stile degli elementi può essere molto diverso, portando a risultati visivi sorprendenti. Come esempio, l’immagine sottostante è ottenuta mescolando uno stile fotografico di alta qualità con una pittura in stile van Gogh.

Bounding box con diversi stili. Immagine dell'autore.
Immagine generata utilizzando i bounding box sopra. Immagine dell'autore.

Conclusioni

In questo articolo, abbiamo esplorato un metodo che combina diversi processi di diffusione per migliorare il controllo sulle immagini generate dai modelli di diffusione condizionati dal testo. Questo metodo aumenta il controllo sulla posizione in cui gli elementi dell’immagine vengono generati e consente anche di combinare senza soluzione di continuità elementi raffigurati in diversi stili.

Uno dei principali vantaggi della procedura descritta è che può essere utilizzata con modelli di diffusione testo-immagine pre-addestrati senza la necessità di un raffinamento, che è generalmente una procedura costosa. Un altro punto di forza è che la generazione controllabile delle immagini viene ottenuta attraverso maschere binarie che sono più semplici da specificare e gestire rispetto a condizioni più complicate.

Lo svantaggio principale di questa tecnica è che, ad ogni passaggio di diffusione, è necessario effettuare un passaggio della rete neurale per ogni prompt al fine di prevedere il rumore corrispondente. Fortunatamente, questi passaggi possono essere eseguiti in batch per ridurre il tempo di inferenza, ma a costo di una maggiore utilizzazione della memoria GPU. Inoltre, talvolta alcuni dei prompt (soprattutto quelli specificati solo in una piccola porzione dell’immagine) vengono trascurati o coprono un’area più grande rispetto a quella specificata dalla maschera corrispondente. Questo può essere mitigato con passaggi di bootstrap, ma un numero eccessivo di essi può ridurre significativamente la qualità complessiva dell’immagine poiché ci sono meno passaggi disponibili per armonizzare gli elementi insieme.

È importante sottolineare che l’idea di combinare diversi processi di diffusione non è limitata a quanto descritto in questo articolo, ma può essere utilizzata anche per ulteriori applicazioni, come la generazione di immagini panoramiche come descritto nel paper MultiDiffusion: Fusing Diffusion Paths for Controlled Image Generation.

Spero che ti sia piaciuto questo articolo, se vuoi approfondire i dettagli tecnici puoi consultare questo notebook Colab e il repository GitHub con l’implementazione del codice.