1. Introduzione
Ultimo aggiornamento: 12/10/2023
Generazione di immagini per la generazione di immagini
Google Imagen è un potente modello linguistico di grandi dimensioni (LLM) di Google in grado di generare immagini realistiche e creative a partire da descrizioni testuali. Imagen su Vertex AI consente agli utenti di creare prodotti di IA di nuova generazione che trasformano l'immaginazione degli utenti in asset visivi di alta qualità, in pochi secondi. Oltre alla generazione di immagini dal testo, supporta anche la modifica delle immagini tramite prompt di testo, didascalie delle immagini, Domande e risposte visive e Soggetto e Ottimizzazione del modello di immagine basata su stile.
Generazione di prompt
Per creare un'immagine utilizzando Imagen, devi fornire una descrizione testuale dell'immagine, nota come prompt, con cui viene generata un'immagine. Tuttavia, per generare un'immagine fotorealistica di alta qualità, sono necessarie competenze di prompt. Potrebbe dipendere anche dal dominio se vuoi generare un'immagine correlata a domini aziendali specifici come vendita al dettaglio, produzione e così via. Un approccio più semplice per progettare un prompt consiste nell'assegnare un insieme di parole chiave al modello Text Bison.
L'approccio generale è pari a -
UI di Gradio
Gradio è una libreria Python open source che consente di creare rapidamente componenti UI personalizzabili e facili da usare per il modello di machine learning, qualsiasi API o persino una funzione Python arbitraria utilizzando poche righe di codice. Puoi integrare la GUI di Gradio direttamente nel tuo blocco note Jupyter o condividerla come link con chiunque. GRadio supporta un'ampia gamma di tipi di contenuti multimediali, tra cui testo, immagini, video e audio. Fornisce inoltre una serie di componenti predefiniti dell'interfaccia utente, come campi di immissione, pulsanti, dispositivi di scorrimento e menu a discesa.
Cosa creerai
In questo codelab, eseguirai il deployment di un'app Gradio che:
- Genera un prompt di testo utilizzando parole chiave o frasi. Anche il prompt generato può essere modificato manualmente.
- Genera immagini dal prompt generato nella UI.
Cosa imparerai a fare
- Come utilizzare l'apprendimento zero-shot e few-shot con il modello text-bison in modo programmatico per generare prompt specifici per le immagini per la generazione di immagini.
- Come generare immagini utilizzando il modello Imagen tramite API e prompt.
- Come creare, eseguire il deployment e testare l'applicazione Gradio dal blocco note di Vertex AI Workbench.
Che cosa ti serve
- Accesso a un progetto Google Cloud, ad esempio "Cloud-llm-preview4"
- Accesso per creare Vertex AI Workbench
- API Vertex AI abilitata.
- Requisiti di rete per Gradio: URL pubblico di accesso all'istanza di blocco note
2. Preparazione
Crea il blocco note
- Accedi al progetto
- Vai a workbench dal menu di navigazione a sinistra.
- Nella sezione "QUADRI GESTITI DALL'UTENTE", crea un nuovo blocco note con le opzioni predefinite.
- Fai clic su "APRI JUPYTERLAB" una volta eseguito il provisioning dell'istanza.
Nota: se il blocco note è fermo, l'avvio del blocco note potrebbe richiedere alcuni minuti.
Ottieni il codice
Abbiamo inserito il file di codice qui. Questo blocco note può essere importato nel tuo ambiente ed eseguito così com'è, tranne quando vengono modificati i dettagli del progetto.
3. Esegui il codice
Installa/importa le dipendenze e le librerie richieste
- Installa l'app Gradio
- Importa le API Vertex AI per Text-Bison e Image Generation.
- Importa tutte le altre librerie richieste.
Generazione di prompt utilizzando Text-Bison
Utilizza un input utente contenente parole chiave e/o una frase, ad esempio un elenco separato da virgole di parole chiave o frasi che possono essere utilizzate per costruire una frase che descriva l'immagine da generare.
Ad esempio: utente tipo, soggetto, sfondo, illuminazione e altre descrizioni.
La funzione che genera il prompt è indicata come segue:
●def prompt_generation(persona,signal,theme, lights, quality, extra_desc):
model = TextGenerationModel.from_pretrained("text-bison")
response_few_shot = model.predict(
few_shot_prompt,
**parameters
)
response_single_shot = model.predict(
prompt,
**parameters
)
Prompt few-shot e zero-shot
Prompt zero-shot è una tecnica di generazione di testo in cui al modello non viene fornito alcun contesto o esempi da cui generare testo. Questo può essere difficile, poiché il modello deve fare affidamento sulle proprie conoscenze per generare un testo coerente e informativo.
Tuttavia, i prompt zero-shot possono essere molto creativi, in quanto il modello non è vincolato da esempi preesistenti.
Prompt few-shot è una tecnica di generazione di testo in cui al modello viene fornito un piccolo numero di esempi da cui generare il testo. Questa operazione può essere più semplice rispetto ai prompt zero-shot, in quanto il modello ha alcune indicazioni su cosa generare. Tuttavia, anche i prompt few-shot possono essere limitativi, poiché il modello potrebbe essere in grado di generare solo testo simile agli esempi che gli è stato fornito.
Di seguito è riportato il codice campione per i prompt Few-Shot e Zero-shot.
Ⰳ**# Pochi prompt shot utilizzati nel codice**
few_shot_prompt = f"""Sei un esperto nella scrittura di prompt per i modelli di generazione di immagini. Utilizza le frasi e le parole chiave fornite, concatenale e aggiungi alcuni dettagli realistici per generare prompt logici e significativi da utilizzare per la generazione di immagini.
input: people, gardening, house garden, colorful plants, Real, HD image, Photo.
output: A Photo of people gardening in a house garden landscape with few coloured flowering plants. Realistic FULL HD Images, Elegant and natural facial and eye features taken by professional photographer
input: plumber, faucet, kitchen, high quality, natural lighting, Photo
output: A Photo of a plumber fixing a faucet in the kitchen. High quality image with natural indoor lighting.
input: house and garden, halloween, warm lighting, high quality image, Sketch
output: A Sketch of Beautiful House and Garden with Halloween Decorations. Warm lighting, High Quality, 4K photograph taken by professional photographer from front.
input: nice living room, warm lighting,Professional Photographer from far, Photo
output: A photo of a Well designed Living Room. Warm lighting, High Quality, 4K photograph taken by Professional Photographer from far
input: {params_list_str}
output:
"""
# prompt Zero Shot utilizzato nel codice
prompt = f"""Sei un esperto nella scrittura di prompt per i modelli di generazione di immagini. Aiutami a scrivere un elenco di prompt significativi per il modello di generazione di immagini che includono specificamente le parole: "{params_list_str}". Ricorda di includere queste parole nel prompt e di renderlo significativo."""
Generazione di immagini con Imagen
Utilizza un prompt di input utente e un prompt negativo(facoltativo) e invia lo stesso feed al modello (imagegeneration@002).
fiaetto di completamento_generazione_immagine(input, prompt_negativo):
input_prompt = input
model = ImageGenerationModel.from_pretrained("imagegeneration@002")
response = model.generate_images(
prompt=input_prompt,
number_of_images=4, #kept to static value of 4
negative_prompt=negative_prompt
)
È incluso il codice seguente per generare immagini da un prompt di input dell'utente e un prompt negativo. Il codice finale utilizza il prompt generato dal modello text-bison.
da vertexai.preview.vision_models import ImageGenerationModel
def image_generation(input, negative_prompt):
input_prompt = input
model = ImageGenerationModel.from_pretrained("imagegeneration@002")
response = model.generate_images(
prompt=input_prompt,
number_of_images=4, #kept to static value of 4.. can be a max value of 8
negative_prompt=negative_prompt
)
images = response.images
return images
user_prompt = "Prompt: Donna che mostra e vende un albero di Natale fresco senza decorazioni da un gruppo di alberi. Illuminazione fredda, immagini dettagliate e di alta qualità scattate da un fotografo professionista da lontano."
negative_prompt = "Volti distorti e non attraenti"
elenco_immagini_generato = generazione_immagine(prompt_utente;prompt_negativa)
#mostra una delle immagini generate
generated_images_list[0].show()
Output -
4. Distribuisci l'app Gradio
Gradio viene utilizzato per il frontend, in cui gli utenti possono inserire le parole chiave e generare prompt strutturati e questi prompt possono essere utilizzati direttamente o modificati ulteriormente dall'utente e poi inseriti in Imagen per generare immagini in base agli input. Gradio è una libreria Python che può essere utilizzata per creare interfacce utente per modelli di machine learning. Per questa applicazione, vengono utilizzati i blocchi per aggiungere flessibilità e flussi di dati complessi. Blocks consente di gestire il layout delle applicazioni utilizzando righe e colonne:
●con gr.Blocks() come demo:
#Prompt Generation Part
with gr.Row():
with gr.Column(scale=1):
Persona = gr.Textbox(label="Persona", info = "Customer segment such as Plumber, Electrician etc.")
with gr.Column(scale=1):
Signals = gr.Textbox(label="Signals", info = "Main content of banner such as Faucet, Lamp etc.")
with gr.Column(scale=1):
Theme = gr.Textbox(label="Theme", info = "Context of the banner such as Halloween, Kitchen etc.")
with gr.Row():
with gr.Column(scale=1):
photo_modifiers = gr.Textbox(label="Photography Modifiers", info = "Photography specific modifiers and parameters such as Lighting(Dramatic/Natural/Warm/Cold), Camera Proximity etc.")
with gr.Column(scale=1):
quality_modifiers = gr.Textbox(label="Image Quality Modifier", info = "Quality Modifiers like high-quality, beautiful, stylized. 4K, HDR, By a professional etc")
with gr.Column(scale=1):
other_desc = gr.Textbox(label="Any Other Description", info = "Other Descriptions for Image such as Style (Painting/Photo/Sketch), Bakground/Foreground Context")
con gr.Row():
btn = gr.Button("Submit")
con gr.Row():
returned_prompts = gr.Textbox(label="Result Prompts", interactive = True)
App.App
Per gestire gli input e le uscite dell'utente, Gradio fornisce diversi componenti come Immagine, Video, Dispositivo di scorrimento, Menu a discesa, Casella di testo, Radio e altre opzioni. Questi componenti offrono agli sviluppatori flessibilità e controllo su come accettare gli input dagli utenti e inviarli al Test-bison, all'immagine o a qualsiasi altro modello ML.
Per questo progetto, l'applicazione viene creata utilizzando Blocks per aggiungere flessibilità e complessità
i flussi di dati verso l'applicazione. Oltre ai blocchi, esistono diversi componenti Gradio
utilizzati, tra cui:
- Righe e colonne per i layout corretti.
- Pulsante, Casella di testo, Menu a discesa e Cursore per ottenere le funzionalità richieste e la facilità d'uso
- Componente Immagine per visualizzare i risultati.
- Altri strumenti come EventData, update per supportare le modifiche dinamiche alla UI.
Di seguito è riportato uno snippet di codice utilizzato per generare immagini dall'input e dal prompt escluso:
#Parte per la generazione di immagini
with gr.Row():
with gr.Column(scale=1):
image_prompt = gr.Textbox(label="Image Generation Prompt")
with gr.Accordion("Advanced options", open=False): #Let's hide the advanced options!
with gr.Row():
negative_prompt = gr.Textbox(label="Negative prompt", info = "Specify What not to Include in Image ex. Bad Quality Image")
with gr.Row():
with gr.Column(scale=1):
img_btn = gr.Button("Generate Images")
with gr.Row():
with gr.Column():
output_image_1 = gr.Image(label = "Result Image 1", visible = False)
with gr.Column():
output_image_2 = gr.Image(label = "Result Image 2", visible = False)
with gr.Row():
with gr.Column():
output_image_3 = gr.Image(label = "Result Image 3", visible = False)
with gr.Column():
output_image_4 = gr.Image(label = "Result Image 4", visible = False)
returned_prompts.select(populate_image_prompt, inputs = [returned_prompts], outputs = image_prompt)
img_btn.click(fn=image_generation_completion, inputs=[image_prompt,negative_prompt], outputs = [output_image_1,output_image_2,output_image_3,output_image_4])
Per eseguire e testare l'applicazione Gradio, basta digitare un prompt di testo e fare clic sul pulsante Genera. Imagen genererà un'immagine in base al tuo prompt. Puoi provare diversi prompt per vedere che tipi di immagini possono generare Imagen.
Di seguito è riportato lo screenshot della generazione di prompt nell'app Gradio.
Di seguito è riportato lo screenshot della generazione di immagini sull'app Gradio.
Alcuni esempi:
Esempio 1 -
[Left image] Prompt (utilizzando parole chiave semplici come prompt) : un paio di amici che fanno un giro in barca.
[Right image] Prompt (utilizzando prompt generati da Text-Bison): una foto di due giovani che pescano su una barca circondata da alberi scuri nel bosco. Uomini che indossano una camicia e sono in piedi su una barca. Illuminazione naturale, foto 4K di alta qualità fotografata da un fotografo professionista.
Esempio 2 -
[Left image] Prompt ((utilizzando parole chiave semplici come prompt) : un albero di Natale
[Immagine a destra] Prompt (utilizzando prompt generati da Text-Bison) : un albero di Natale in una stanza con una lampada e mobili. L'albero è decorato con luci e ornamenti. È posizionato vicino a una finestra e sullo sfondo è visibile un muro. Foto HDR, luce calda e di alta qualità, scattata da un fotografo professionista scattata da lontano.
5. Eliminazione
Per eseguire la pulizia delle risorse,
- Interrompi l'app Grado.
- Arresta/elimina il blocco note di Workbench.
6. Complimenti
Congratulazioni: hai eseguito correttamente il deployment di un'applicazione Gradio per la creazione di prompt e immagini con l'API Google Text-Bison e l'API Imagen.