Ottimizzazione delle istruzioni per la diffusione stabile con InstructPix2Pix

Ottimizzazione istruzioni diffusione stabile con InstructPix2Pix.

Questo post esplora l’addestramento delle istruzioni per insegnare a Stable Diffusion a seguire istruzioni per tradurre o elaborare immagini in ingresso. Con questo metodo, possiamo sollecitare Stable Diffusion utilizzando un’immagine in ingresso e un “istruzione”, come – Applica un filtro a cartone animato all’immagine naturale.

Questa idea di insegnare a Stable Diffusion a seguire le istruzioni dell’utente per eseguire modifiche alle immagini di input è stata introdotta in InstructPix2Pix: Learning to Follow Image Editing Instructions. Discutiamo come estendere la strategia di addestramento InstructPix2Pix per seguire istruzioni più specifiche relative a compiti di traduzione di immagini (come la cartoonizzazione) e di elaborazione di immagini a basso livello (come la derainizzazione dell’immagine). Copriamo:

  • Introduzione all’addestramento delle istruzioni
  • La motivazione dietro questo lavoro
  • Preparazione del set di dati
  • Esperimenti di addestramento e risultati
  • Potenziali applicazioni e limitazioni
  • Domande aperte

Il nostro codice, i modelli pre-addestrati e i set di dati possono essere trovati qui.

Introduzione e motivazione

L’addestramento delle istruzioni è un modo supervisionato per insegnare ai modelli di linguaggio a seguire istruzioni per risolvere un compito. È stato introdotto in Fine-tuned Language Models Are Zero-Shot Learners (FLAN) di Google. Di recente, potresti ricordare lavori come Alpaca e FLAN V2, che sono buoni esempi di quanto sia vantaggioso l’addestramento delle istruzioni per vari compiti.

La figura qui sotto mostra una formulazione dell’addestramento delle istruzioni (chiamato anche “addestramento delle istruzioni”). Nel paper FLAN V2, gli autori prendono un modello di linguaggio pre-addestrato (ad esempio, T5) e lo addestrano ulteriormente su un set di dati di esempi, come mostrato nella figura qui sotto.

Con questo approccio, è possibile creare esempi che coprono molti compiti diversi, rendendo l’addestramento delle istruzioni un obiettivo di formazione multi-task:

Utilizzando una filosofia simile, gli autori di FLAN V2 conducono l’addestramento delle istruzioni su una miscela di migliaia di compiti e ottengono la generalizzazione senza pre-avviso a compiti non visti:

La nostra motivazione dietro questo lavoro deriva in parte dalla linea di lavoro FLAN e in parte da InstructPix2Pix. Volevamo esplorare se fosse possibile sollecitare Stable Diffusion con istruzioni specifiche e immagini di input per elaborarle secondo le nostre esigenze.

I modelli pre-addestrati di InstructPix2Pix sono bravi a seguire istruzioni generali, ma potrebbero non essere in grado di seguire istruzioni che coinvolgono trasformazioni specifiche:

Ma possiamo comunque sfruttare le scoperte di InstructPix2Pix per adattarle alle nostre personalizzazioni.

D’altra parte, set di dati abbinati per compiti come la cartoonizzazione, la denoising delle immagini, la derainizzazione delle immagini, ecc. sono disponibili pubblicamente, che possiamo utilizzare per costruire set di dati sollecitati da istruzioni prendendo ispirazione da FLAN V2. In questo modo possiamo trasferire le idee di templating delle istruzioni esplorate in FLAN V2 a questo lavoro.

Preparazione del set di dati

Cartoonizzazione

Nelle nostre prime esperienze, abbiamo sollecitato InstructPix2Pix a eseguire la cartoonizzazione e i risultati non sono stati all’altezza delle nostre aspettative. Abbiamo provato diverse combinazioni di iperparametri durante l’inferenza (come la scala di guida dell’immagine e il numero di passaggi di inferenza), ma i risultati non erano ancora convincenti. Questo ci ha spinto ad affrontare il problema in modo diverso.

Come accennato nella sezione precedente, volevamo beneficiare di entrambi i mondi:

(1) la metodologia di addestramento di InstructPix2Pix e (2) la flessibilità di creare modelli di set di dati sollecitati da istruzioni da FLAN.

Abbiamo iniziato creando un set di dati sollecitato da istruzioni per il compito di cartoonizzazione. La Figura 5 mostra il nostro processo di creazione del set di dati:

In particolare, noi:

  1. Chiediamo a ChatGPT di generare 50 frasi sinonime per l’istruzione seguente: “Cartoonizza l’immagine”.
  2. Utilizziamo quindi un sottoinsieme casuale (5000 campioni) del set di dati Imagenette e sfruttiamo un modello pre-addestrato Whitebox CartoonGAN per produrre le versioni cartoonizzate di quelle immagini. Le versioni cartoonizzate sono le etichette che vogliamo che il nostro modello impari. Quindi, in un certo senso, questo corrisponde al trasferimento dei bias appresi dal modello Whitebox CartoonGAN al nostro modello.
  3. Poi creiamo i nostri esempi nel seguente formato:

Il nostro set di dati finale per la cartoonizzazione può essere trovato qui. Per ulteriori dettagli su come è stato preparato il set di dati, fare riferimento a questa directory. Abbiamo sperimentato con questo set di dati addestrando ulteriormente InstructPix2Pix e abbiamo ottenuto risultati promettenti (ulteriori dettagli nella sezione “Esperimenti di addestramento e risultati”).

Abbiamo quindi proceduto a vedere se potevamo generalizzare questo approccio a compiti di elaborazione delle immagini a basso livello, come la rimozione della pioggia, la riduzione del rumore e lo sfocamento dell’immagine.

Elaborazione delle immagini a basso livello

Ci concentriamo sui comuni compiti di elaborazione delle immagini a basso livello esplorati in MAXIM . In particolare, conduciamo i nostri esperimenti per i seguenti compiti: rimozione della pioggia, riduzione del rumore, miglioramento delle immagini a bassa illuminazione e sfocatura.

Abbiamo preso un numero diverso di campioni dai seguenti set di dati per ogni compito e abbiamo costruito un singolo set di dati con prompt aggiunti in questo modo:

I set di dati menzionati sopra di solito vengono forniti come coppie input-output, quindi non dobbiamo preoccuparci della verità di riferimento. Il nostro set di dati finale è disponibile qui . Il set di dati finale si presenta così:

Nel complesso, questa configurazione aiuta a stabilire parallelismi con la configurazione FLAN, in cui creiamo una miscela di diversi compiti. Questo ci aiuta anche ad addestrare un singolo modello una volta sola, che si comporta bene nei diversi compiti che abbiamo nella miscela. Questo varia significativamente da ciò che viene tipicamente fatto nell’elaborazione delle immagini a basso livello. Opere come MAXIM introducono un’architettura di modello singolo in grado di modellare i diversi compiti di elaborazione delle immagini a basso livello, ma l’addestramento avviene in modo indipendente sui singoli set di dati.

Esperimenti di addestramento e risultati

Abbiamo basato i nostri esperimenti di addestramento su questo script . I nostri registri di addestramento (inclusi campioni di convalida ed iperparametri di addestramento) sono disponibili su Weight and Biases:

  • Cartoonizzazione ( iperparametri )
  • Elaborazione delle immagini a basso livello ( iperparametri )

Nel corso dei nostri esperimenti, abbiamo scoperto che la prima opzione ci aiuta ad adattarci più velocemente ai nostri set di dati (in termini di qualità di generazione).

Per maggiori dettagli sull’addestramento e gli iperparametri, ti invitiamo a consultare il nostro codice e le rispettive pagine di esecuzione su Weights and Biases.

Risultati della cartoonizzazione

Per testare il modello di cartoonizzazione addestrato tramite istruzioni, abbiamo confrontato gli output come segue:

Per raccogliere questi risultati, abbiamo campionato immagini dalla divisione di validazione di ImageNette. Abbiamo utilizzato il seguente prompt quando abbiamo utilizzato il nostro modello e il modello pre-addestrato InstructPix2Pix: “Genera una versione cartoonizzata dell’immagine”. Per questi due modelli, abbiamo mantenuto image_guidance_scale e guidance_scale a 1,5 e 7,0, rispettivamente, e il numero di passaggi di inferenza a 20. In effetti, sono necessarie ulteriori sperimentazioni su questi iperparametri per studiare come influenzano i risultati del modello pre-addestrato InstructPix2Pix, in particolare.

Altri risultati comparativi sono disponibili qui . Il nostro codice per confrontare questi modelli è disponibile qui .

Il nostro modello, tuttavia, non riesce a produrre gli output attesi per le classi di ImageNette, che non ha visto abbastanza durante l’addestramento. Questo è in parte prevedibile e riteniamo che questo potrebbe essere mitigato scalando l’insieme di dati di addestramento.

Risultati dell’elaborazione delle immagini a basso livello

Per l’elaborazione delle immagini a basso livello ( nostro modello ), seguiamo gli stessi iperparametri di inferenza sopra indicati:

  • Numero di passaggi di inferenza: 20
  • Scala di guida dell’immagine: 1,5
  • Scala di guida: 7,0

Per la rimozione della pioggia, il nostro modello fornisce risultati convincenti se confrontati con la verità di riferimento e l’output del modello pre-addestrato InstructPix2Pix:

Tuttavia, per il miglioramento delle immagini a bassa illuminazione, lascia molto a desiderare:

Questo insuccesso, forse, può essere attribuito al fatto che il nostro modello non ha visto abbastanza esemplari per il compito e forse da un miglior addestramento. Notiamo risultati simili anche per lo sfocamento:

Riteniamo che ci sia un’opportunità per la comunità di esplorare quanto la miscela di compiti per l’elaborazione delle immagini a basso livello influisca sui risultati finali. Aumentare la miscela di compiti con campioni più rappresentativi aiuta a migliorare i risultati finali? Lasciamo questa domanda alla comunità per ulteriori approfondimenti.

Puoi provare la demo interattiva qui sotto per far sì che Stable Diffusion segua istruzioni specifiche:

Potenziali applicazioni e limitazioni

Nel mondo dell’editing delle immagini, c’è una disconnessione tra ciò che ha in mente un esperto del settore (i compiti da eseguire) e le azioni da applicare agli strumenti di editing (come Lightroom ). Avere un modo facile per tradurre gli obiettivi del linguaggio naturale in primitive di editing delle immagini a basso livello sarebbe un’esperienza utente senza soluzione di continuità. Con l’introduzione di meccanismi come InstructPix2Pix, è sicuro dire che ci stiamo avvicinando a quel mondo.

Tuttavia, rimangono ancora delle sfide:

  • Questi sistemi devono funzionare per immagini originali di grandi dimensioni ad alta risoluzione.
  • I modelli di diffusione spesso inventano o reinterpretano un’istruzione per eseguire le modifiche nello spazio dell’immagine. Per un’applicazione realistica di modifica delle immagini, questo è inaccettabile.

Domande aperte

Riconosciamo che i nostri esperimenti sono preliminari. Non siamo andati a fondo nell’analisi dei fattori apparenti nei nostri esperimenti. Pertanto, qui elenchiamo alcune domande aperte che sono emerse durante i nostri esperimenti:

  • Cosa succede se aumentiamo le dimensioni dei dataset? Come influisce sulla qualità dei campioni generati? Abbiamo sperimentato con alcuni esempi. Per confronto, InstructPix2Pix è stato addestrato su oltre 30000 campioni.

  • Quale è l’impatto dell’addestramento prolungato, soprattutto quando la miscela di compiti è più ampia? Nei nostri esperimenti, non abbiamo condotto un’ottimizzazione degli iperparametri, figuriamoci un’analisi del numero di passaggi di addestramento.

  • Come si generalizza questo approccio a una miscela più ampia di compiti comuni nel mondo del “tuning delle istruzioni”? Abbiamo coperto solo quattro compiti di elaborazione delle immagini a basso livello: rimozione della pioggia, sfocatura, rimozione del rumore e miglioramento delle immagini a bassa luminosità. Aggiungere più compiti alla miscela con campioni più rappresentativi aiuta il modello a generalizzare a compiti non visti o forse a una combinazione di compiti (ad esempio: “Sfoca l’immagine e rimuovi il rumore”?).

  • L’utilizzo di diverse variazioni della stessa istruzione al volo aiuta a migliorare le prestazioni? Per la creazione di disegni animati, abbiamo campionato casualmente un’istruzione dal set di istruzioni sinonime generate da ChatGPT durante la creazione del dataset. Ma cosa succede se effettuiamo campionamenti casuali durante l’addestramento?

    Per l’elaborazione delle immagini a basso livello, abbiamo utilizzato istruzioni fisse. Cosa succede se seguiamo una metodologia simile utilizzando istruzioni sinonime per ogni compito e immagine di input?

  • Cosa succede se utilizziamo la configurazione di addestramento di ControlNet, invece? ControlNet consente anche di adattare un modello di diffusione di testo-immagine preaddestrato per essere condizionato a immagini aggiuntive (come mappe di segmentazione semantica, mappe di bordi di Canny, ecc.). Se sei interessato, puoi utilizzare i dataset presentati in questo post e eseguire l’addestramento di ControlNet facendo riferimento a questo post.

Conclusioni

In questo post, abbiamo presentato la nostra esplorazione del “tuning delle istruzioni” di Stable Diffusion. Sebbene i modelli preaddestrati di InstructPix2Pix siano bravi nel seguire istruzioni generali di modifica delle immagini, possono fallire quando vengono presentate istruzioni più specifiche. Per mitigare questo problema, abbiamo discusso come abbiamo preparato i nostri dataset per ulteriori affinamenti di InstructPix2Pix e abbiamo presentato i nostri risultati. Come già detto, i nostri risultati sono ancora preliminari. Ma speriamo che questo lavoro fornisca una base per i ricercatori che lavorano su problemi simili e che si sentano motivati ad approfondire le domande aperte.

  • Codice di addestramento e inferenza: https://github.com/huggingface/instruction-tuned-sd
  • Demo: https://huggingface.co/spaces/instruction-tuning-sd/instruction-tuned-sd
  • InstructPix2Pix: https://huggingface.co/timbrooks/instruct-pix2pix
  • Dataset e modelli di questo post: https://huggingface.co/instruction-tuning-sd

Grazie ad Alara Dirik e Zhengzhong Tu per le utili discussioni. Grazie a Pedro Cuenca e Kashif Rasul per le utili recensioni sul post.

Citazione

Per citare questo lavoro, si prega di utilizzare la seguente citazione:

@article{
  Paul2023instruction-tuning-sd,
  author = {Paul, Sayak},
  title = {Instruction-tuning Stable Diffusion with InstructPix2Pix},
  journal = {Hugging Face Blog},
  year = {2023},
  note = {https://huggingface.co/blog/instruction-tuning-sd},
}