1. Introduzione
Ultimo aggiornamento: 12/10/2023
Generazione di immagini Imagegen
Google Imagen è un potente modello linguistico di grandi dimensioni 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 AI di nuova generazione che trasformano l'immaginazione degli utenti in asset visivi di alta qualità in pochi secondi. Oltre alla generazione di immagini da testo, supporta anche la modifica delle immagini tramite prompt di testo, l'aggiunta di didascalie alle immagini, le domande e risposte visive e l'ottimizzazione del modello di immagine basata su soggetto e stile.
Generazione di prompt
Per creare un'immagine utilizzando Imagen, devi fornire una descrizione testuale dell'immagine, nota come prompt, in base alla quale viene generata un'immagine. Tuttavia, per generare un'immagine fotorealistica di alta qualità, è necessaria una certa esperienza con i prompt. Potrebbe anche dipendere 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 nel fornire un insieme di parole chiave al modello Text Bison.
L'approccio generale è il seguente:
UI di Gradio
Gradio è una libreria Python open source che ti consente di creare rapidamente componenti UI personalizzabili e facili da usare per il tuo modello di machine learning, qualsiasi API o anche una funzione Python arbitraria utilizzando poche righe di codice. Puoi integrare la GUI di Gradio direttamente nel tuo notebook Jupyter o condividerla come link con chiunque. Gradio supporta un'ampia gamma di tipi di media, tra cui testo, immagini, video e audio. Fornisce inoltre una serie di componenti UI predefiniti, come campi di input, pulsanti, cursori e menu a discesa.
Cosa creerai
In questo codelab, eseguirai il deployment di un'app Gradio che:
- Genera un prompt testuale utilizzando parole chiave o frasi. Il prompt generato può essere modificato anche manualmente.
- Genera immagini dal prompt generato nell'interfaccia utente.
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 di Imagen 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 notebook 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 networking per Gradio: URL pubblico di accesso all'istanza notebook
2. Preparazione
Crea il notebook
- Log nel progetto
- Vai a Workbench dal menu di navigazione a sinistra.
- Nella sezione "NOTEBOOK GESTITI DALL'UTENTE", crea un nuovo notebook con le opzioni predefinite.
- Una volta eseguito il provisioning dell'istanza, fai clic su "APRI JUPYTERLAB".
Nota: l'avvio del notebook potrebbe richiedere alcuni minuti se il notebook è in stato di arresto.
Ottieni il codice
Abbiamo inserito il file di codice qui. Questo notebook può essere importato nel tuo ambiente ed eseguito così com'è (ad eccezione della modifica dei dettagli del progetto).
3. Esegui il codice
Installare/importare le dipendenze e le librerie richieste
- Installare l'app Gradio
- Importa le API Vertex AI per Text-Bison e la generazione di immagini.
- Importa tutte le altre librerie richieste.
Generazione di prompt utilizzando Text-Bison
Utilizza un input utente contenente parole chiave e/o frasi, ad esempio un elenco di parole chiave o frasi separate da virgole che possono essere utilizzate per costruire una frase che descriva l'immagine da generare.
Ad esempio, persona, soggetto, sfondo, illuminazione e altre descrizioni.
La funzione che genera il prompt è la seguente:
def prompt_generation(persona,signal,theme, lighting, 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
Il prompt zero-shot è una tecnica di generazione di testo in cui al modello non vengono forniti contesto o esempi da cui generare il testo. Può essere difficile, in quanto il modello deve fare affidamento sulle proprie conoscenze per generare un testo coerente e informativo.
Tuttavia, il prompting zero-shot può anche essere molto creativo, in quanto il modello non è vincolato da esempi preesistenti.
Il 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. Questo può essere più semplice del prompt zero-shot, in quanto il modello ha alcune indicazioni su cosa generare. Tuttavia, il prompt few-shot può anche essere limitante, in quanto il modello potrebbe essere in grado di generare solo testo simile agli esempi forniti.
Di seguito è riportato il codice campione per i prompt Few-Shot e Zero-Shot.
**# Few Shot Prompt used in the code**
few_shot_prompt = f"""You are an expert in writing prompts for Image Generation Models. Utilizzando le frasi e le parole chiave fornite, concatenale e aggiungi alcuni dettagli realistici per generare un prompt logico e significativo che possa essere utilizzato 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:
"""
# Zero Shot Prompt used in the code
prompt = f"""You are an expert in writing prompts for Image Generation Models. Aiutami a scrivere un elenco di prompt significativi per il modello di generazione di immagini, includendo 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 dell'utente e un prompt negativo(facoltativo) e li inserisce nel modello (imagegeneration@002).
def image_generation_completion(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
negative_prompt=negative_prompt
)
Il seguente codice è incluso per generare immagini da un prompt di input dell'utente e da un prompt negativo. Il codice finale utilizza il prompt generato dal modello text-bison.
from 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: Una giovane donna mostra e vende un albero di Natale fresco e non decorato di un gruppo di alberi. Illuminazione fredda, immagine di alta qualità e dettagliata scattata da lontano da un fotografo professionista".
negative_prompt = "Volti distorti e poco attraenti"
generated_images_list = image_generation(user_prompt,negative_prompt)
#show one of the generated image
generated_images_list[0].show()
Output -

4. Esegui il deployment dell'app Gradio
Gradio viene utilizzato per il frontend, dove gli utenti possono inserire le parole chiave e generare prompt strutturati. Questi prompt possono essere utilizzati direttamente o possono essere 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 i modelli di machine learning. Per questa applicazione, i blocchi vengono utilizzati per aggiungere flessibilità e flussi di dati complessi. I blocchi consentono la gestione del layout dell'applicazione utilizzando righe e colonne:
with gr.Blocks() as 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)
btn.click(fn=prompt_generation, inputs=[Persona, Signals,Theme, photo_modifiers, quality_modifiers, other_desc], outputs = returned_prompts)
Per gestire gli input e gli output dell'utente, Gradio fornisce più componenti come Immagine, Video, Slider, Menu a discesa, Casella di testo, Pulsante di opzione e altre opzioni. Questi componenti offrono agli sviluppatori flessibilità e controllo su come accettare gli input degli utenti e inserirli in Test-bison, imagen o qualsiasi altro modello ML.
Per questo progetto, l'applicazione viene creata utilizzando Blocchi per aggiungere flessibilità e complessità
i dati vengono inviati all'applicazione. Oltre ai blocchi, sono disponibili più componenti Gradio
utilizzati, tra cui:
- Righe, Colonne per layout corretti.
- Pulsante, casella di testo, menu a discesa e cursore per ottenere la funzionalità e la facilità d'uso richieste
- Componente Immagine per visualizzare i risultati.
- Altri helper come EventData, update per supportare le modifiche dinamiche all'interfaccia utente.
Di seguito è riportato uno snippet di codice utilizzato per generare immagini da input e prompt negativi:
#Image Generation part
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, digita un prompt testuale e fai clic sul pulsante Genera. Imagen genererà un'immagine in base al tuo prompt. Puoi provare prompt diversi per vedere quali tipi di immagini può generare Imagen.
Di seguito è riportato lo screenshot della generazione di prompt nell'app Gradio.

Di seguito è riportato lo screenshot della generazione di immagini nell'app Gradio.

Alcuni esempi:
Esempio 1 -
[Immagine a sinistra] Prompt (utilizzo di parole chiave semplici come prompt) : una coppia di amici in barca.
[Immagine a destra] Prompt (utilizzo di 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 si trovano su una barca. Illuminazione naturale, alta qualità, foto in 4K scattata da un fotografo professionista.

Esempio 2 -
[Immagine a sinistra] Prompt ((Utilizzo di parole chiave semplici come prompt)) : un albero di Natale
[Immagine a destra] Prompt (utilizzo di prompt generati da Text-Bison): un albero di Natale in una stanza con una lampada e dei mobili. L'albero è decorato con luci e addobbi. È posizionata vicino a una finestra e sullo sfondo si vede un muro. Illuminazione calda, alta qualità, foto HDR scattata da un fotografo professionista da lontano.

5. Eliminazione
Per liberare spazio dalle risorse:
- Interrompi l'app Gradio.
- Arresta/Elimina il notebook Workbench.
6. Complimenti
Congratulazioni, hai eseguito il deployment di un'applicazione Gradio per creare prompt e immagini con l'API Google Text-Bison e l'API Imagen.