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 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, la didascalia delle immagini, le domande e risposte visive e l'ottimizzazione del modello di immagini basata su soggetto e stile.
Generazione di prompt
Per creare un'immagine utilizzando Imagen, devi fornire una descrizione testuale dell'immagine, nota come prompt, utilizzando la quale viene generata un'immagine. Tuttavia, per generare un'immagine fotorealistica di alta qualità, è necessaria una competenza di prompting. 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 è 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 anche una serie di componenti UI predefiniti, come campi di input, pulsanti, slider 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. Il prompt generato può essere modificato anche manualmente.
- Genera immagini dal prompt generato nell'UI.
Cosa imparerai a fare
- Come utilizzare l'apprendimento zero-shot e few-shot con il modello text-bison a livello di programmazione 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 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 notebook.
2. Preparazione
Crea il notebook
- Accedi al progetto.
- Vai a Workbench dal menu di navigazione a sinistra.
- In "NOTEBOOK GESTITI DALL'UTENTE", crea un nuovo notebook con le opzioni predefinite.
- Fai clic su "APRI JUPYTERLAB" dopo aver eseguito il provisioning dell'istanza.
Nota: se il notebook è in stato di arresto, potrebbe essere necessario attendere alcuni minuti prima che venga avviato.
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
Installa/importa le dipendenze e le librerie richieste
- Installa 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 dell'utente contenente parole chiave e/o frasi, ovvero un elenco di parole chiave o frasi separate da virgole che possono essere utilizzate per costruire una frase che descriva l'immagine richiesta 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 prompting zero-shot è una tecnica di generazione di testo in cui al modello non vengono forniti contesto o esempi per generare testo. Questa operazione può essere difficile, in quanto il modello deve fare affidamento sulle proprie conoscenze per generare testo coerente e informativo.
Tuttavia, il prompt 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 per generare testo. Questa operazione può essere più semplice del prompt zero-shot, in quanto il modello ha alcune indicazioni su cosa generare. Tuttavia, il prompting 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.
**# Prompt few-shot utilizzato nel codice**
few_shot_prompt = f"""You are an expert in writing prompts for Image Generation Models. Using the provided phrases and keywords, concatenate them and add on some realistic details to generate logical and Meaningful prompt that can be used for image generation.
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"""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 in modo specifico le parole: "{params_list_str}". Remember to include these words in the prompt and make the prompt meaningful."""
Generazione di immagini utilizzando 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: A Young Woman Showcasing and selling an undecorated Fresh Christmas Tree from A bunch of trees. Cold Lighting, High Quality and detailed Image Taken By Professional Photographer from far."
negative_prompt = "Distorted and unattractive faces"
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 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 forniscono 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")
with gr.Row():
btn = gr.Button("Submit")
with 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, cursore, menu a discesa, casella di testo, opzione di scelta 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 di ML.
Per questo progetto, l'applicazione viene creata utilizzando i blocchi per aggiungere flessibilità e complessità
flussi di dati all'applicazione. Oltre ai blocchi, vengono utilizzati più componenti Gradio
tra cui:
- Righe, colonne per layout corretti.
- Pulsante, casella di testo, menu a discesa e slider per ottenere la funzionalità richiesta e la facilità d'uso.
- Componente immagine per visualizzare i risultati.
- Altri helper come EventData, update per supportare le modifiche dinamiche all'UI.
Di seguito è riportato un 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 di testo e fai clic sul pulsante Genera. Imagen genererà un'immagine in base al prompt. Puoi provare diversi prompt 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) : A couple of friends boating.
[Immagine a destra] Prompt (utilizzo di prompt generati da Text-Bison) : A photo of 2 young men fishing on a boat surrounded by dark trees in the woods. Men are wearing a shirt and are standing on a boat. Natural Lighting, High Quality, 4K Photo photographed by Professional Photographer.

Esempio 2:
[Immagine a sinistra] Prompt (utilizzo di parole chiave semplici come prompt) : A Christmas tree
[Immagine a destra] Prompt (utilizzo di prompt generati da Text-Bison) : A Christmas tree in a room with a lamp and furniture. The tree is decorated with lights and ornaments. It is placed near a window, and there is a wall visible in the background. Warm Lighting, High Quality, HDR Photo photographed by Professional Photographer taken from far.

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