1. Einführung
Letzte Aktualisierung:12.10.2023
Imagegen-Bildgenerierung
Google Imagen ist ein leistungsstarkes großes Sprachmodell von Google, mit dem sich realistische und kreative Bilder aus Textbeschreibungen generieren lassen. Mit Imagen in Vertex AI können Nutzer KI-Produkte der nächsten Generation erstellen und aus den Vorstellungen der Nutzer durch KI-Generierung in Sekundenschnelle hochwertige visuelle Assets machen. Neben der Bildgenerierung aus Text werden auch die Bildbearbeitung über Text-Prompts, die Bildunterschriftung, visuelle Fragen und Antworten sowie die Modellabstimmung auf Grundlage von Motiv und Stil unterstützt.
Prompt-Generierung
Wenn Sie mit Imagen ein Bild erstellen möchten, müssen Sie eine Textbeschreibung des Bildes angeben, den sogenannten Prompt. Anhand dieses Prompts wird ein Bild generiert. Um ein hochwertiges fotorealistisches Bild zu generieren, sind jedoch Kenntnisse im Prompting erforderlich. Es kann auch von der Domain abhängen, wenn Sie ein Bild zu bestimmten Geschäftsfeldern wie Einzelhandel oder Fertigung generieren möchten. Ein einfacherer Ansatz zum Erstellen eines Prompts besteht darin, dem Text-Bison-Modell eine Reihe von Keywords zu geben.
Der allgemeine Ansatz ist wie folgt:

Gradio-UI
Gradio ist eine Open-Source-Python-Bibliothek, mit der Sie schnell benutzerfreundliche, anpassbare UI-Komponenten für Ihr Machine-Learning-Modell, eine beliebige API oder sogar eine beliebige Python-Funktion mit nur wenigen Codezeilen erstellen können. Sie können die Gradio-GUI direkt in Ihr Jupyter-Notebook einbinden oder als Link für andere freigeben. Gradio unterstützt eine Vielzahl von Medientypen, darunter Text, Bilder, Videos und Audio. Außerdem bietet es eine Reihe vorgefertigter UI-Komponenten wie Eingabefelder, Schaltflächen, Schieberegler und Drop-down-Menüs.
Was Sie erstellen
In diesem Codelab stellen Sie eine Gradio-App bereit, mit der Sie Folgendes tun können:
- Mit Keywords oder Phrasen einen Text-Prompt generieren. Der generierte Prompt kann auch manuell bearbeitet werden.
- Bilder aus dem generierten Prompt in der UI generieren.
Lerninhalte
- Wie Sie Zero-Shot- und Few-Shot-Learning mit dem Text-Bison-Modell programmatisch verwenden, um Imagen-spezifische Prompts für die Bildgenerierung zu erstellen.
- Wie Sie mit dem Imagen-Modell über die API und einen Prompt Bilder generieren.
- Wie Sie eine Gradio-Anwendung über ein Vertex AI Workbench-Notebook erstellen, bereitstellen und testen.
Voraussetzungen
- Zugriff auf ein GCP-Projekt, z. B. „Cloud-llm-preview4“
- Zugriff zum Erstellen von Vertex AI Workbench
- Vertex AI API aktiviert.
- Netzwerkanforderungen für Gradio: Öffentliche URL für den Zugriff auf Notebook-Instanzen
2. Einrichtung
Notebook erstellen
- Melden Sie sich im Projekt an.
- Rufen Sie im linken Navigationsmenü Workbench auf.
- Erstellen Sie unter "USER-MANAGED NOTEBOOKS" (Von Nutzern verwaltete Notebooks) ein neues Notebook mit den Standardoptionen.
- Klicken Sie auf OPEN JUPYTERLAB (JupyterLab öffnen), sobald die Instanz bereitgestellt wurde.
Hinweis: Wenn sich das Notebook im Status „Beendet“ befindet, kann es einige Minuten dauern, bis es gestartet wird.
Code abrufen
Die Codedatei finden Sie hier. Dieses Notebook kann in Ihre Umgebung importiert und unverändert ausgeführt werden (mit Ausnahme der Änderung Ihrer Projektdetails).
3. Code ausführen
Erforderliche Abhängigkeiten und Bibliotheken installieren/importieren
- Gradio-App installieren
- Vertex AI APIs für Text-Bison und die Bildgenerierung importieren.
- Alle anderen erforderlichen Bibliotheken importieren.
Prompt-Generierung mit Text-Bison
Verwendet eine Nutzereingabe mit Keywords und/oder Phrasen, d.h. eine durch Kommas getrennte Liste von Keywords oder Phrasen, mit denen ein Satz erstellt werden kann, der das zu generierende Bild beschreibt.
Beispiel: Persona, Motiv, Hintergrund, Beleuchtung und andere Beschreibungen.
Die Funktion, die den Prompt generiert, ist wie folgt:
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
)
Few-Shot- und Zero-Shot-Prompt
Zero-Shot-Prompting ist eine Technik zur Textgenerierung, bei der dem Modell kein Kontext oder keine Beispiele zur Verfügung gestellt werden, aus denen es Text generieren kann. Das kann eine Herausforderung sein, da das Modell auf sein eigenes Wissen zurückgreifen muss, um kohärenten und informativen Text zu generieren.
Zero-Shot-Prompting kann aber auch sehr kreativ sein, da das Modell nicht durch vorhandene Beispiele eingeschränkt wird.
Few-Shot-Prompting ist eine Technik zur Textgenerierung, bei der dem Modell eine kleine Anzahl von Beispielen zur Verfügung gestellt wird, aus denen es Text generieren kann. Das kann einfacher sein als Zero-Shot-Prompting, da das Modell einige Anleitungen dazu erhält, was generiert werden soll. Few-Shot-Prompting kann aber auch einschränkend sein, da das Modell möglicherweise nur Text generieren kann, der den Beispielen ähnelt, die ihm zur Verfügung gestellt wurden.
Unten sehen Sie den Beispielcode für die Few-Shot- und Zero-Shot-Prompts.
**# Few-Shot-Prompt im Code verwendet**
few_shot_prompt = f"""Sie sind ein Experte im Schreiben von Prompts für Bildgenerierungsmodelle. Verknüpfen Sie die angegebenen Phrasen und Keywords und fügen Sie einige realistische Details hinzu, um einen logischen und aussagekräftigen Prompt zu generieren, der für die Bildgenerierung verwendet werden kann.
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 im Code verwendet
prompt = f"""Sie sind ein Experte im Schreiben von Prompts für Bildgenerierungsmodelle. Erstellen Sie eine Liste aussagekräftiger Prompts für das Bildgenerierungsmodell, die speziell die folgenden Wörter enthalten: „{params_list_str}“. Denken Sie daran, diese Wörter in den Prompt aufzunehmen und den Prompt aussagekräftig zu gestalten."""
Bildgenerierung mit Imagen
Verwendet einen Nutzereingabe-Prompt und einen negativen Prompt(optional) und übergibt diese an das Modell (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
)
Der folgende Code wird verwendet, um Bilder aus einem Nutzereingabe-Prompt und einem negativen Prompt zu generieren. Im endgültigen Code wird der vom Text-Bison-Modell generierte Prompt verwendet.
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: Eine junge Frau präsentiert und verkauft einen ungeschmückten frischen Weihnachtsbaum aus einer Gruppe von Bäumen. Kaltes Licht, hohe Qualität und detailliertes Bild, das von einem professionellen Fotografen aus der Ferne aufgenommen wurde."
negative_prompt = "Verzerrte und unattraktive Gesichter"
generated_images_list = image_generation(user_prompt,negative_prompt)
#show one of the generated image
generated_images_list[0].show()
Ausgabe:

4. Gradio-App bereitstellen
Gradio wird für das Frontend verwendet, in dem Nutzer die Keywords eingeben und strukturierte Prompts generieren können. Diese Prompts können direkt verwendet oder vom Nutzer weiter bearbeitet und dann an Imagen übergeben werden, um Bilder gemäß den Eingaben zu generieren. Gradio ist eine Python-Bibliothek, mit der Benutzeroberflächen für Machine-Learning-Modelle erstellt werden können. Für diese Anwendung werden Blöcke verwendet, um Flexibilität und komplexe Datenflüsse hinzuzufügen. Mit Blöcken lässt sich das Anwendungs-Layout mithilfe von Zeilen und Spalten verwalten:
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)
Zur Verarbeitung der Nutzereingaben und -ausgaben bietet Gradio mehrere Komponenten wie Bild, Video, Schieberegler, Drop-down-Menü, Textfeld, Optionsfeld und andere Optionen. Diese Komponenten bieten Entwicklern Flexibilität und Kontrolle darüber, wie Eingaben von Nutzern akzeptiert und an Text-Bison, Imagen oder ein anderes ML-Modell übergeben werden.
Für dieses Projekt wird die Anwendung mit Blöcken erstellt, um Flexibilität und komplexe
Datenflüsse hinzuzufügen. Neben Blöcken werden mehrere Gradio-Komponenten
verwendet, darunter:
- Zeilen und Spalten für geeignete Layouts.
- Schaltfläche, Textfeld, Dropdown und Schieberegler, um die erforderliche Funktionalität und Benutzerfreundlichkeit zu erreichen.
- Bild Komponente zum Anzeigen von Ergebnissen.
- Andere Hilfselemente wie EventData und Update zur Unterstützung dynamischer Änderungen an der UI.
Unten sehen Sie ein Code-Snippet, mit dem Bilder aus einem Eingabe-Prompt und einem negativen Prompt generiert werden:
#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])
Wenn Sie die Gradio-Anwendung ausführen und testen möchten, geben Sie einfach einen Text-Prompt ein und klicken Sie auf die Schaltfläche „Generieren“. Imagen generiert ein Bild basierend auf Ihrem Prompt. Sie können verschiedene Prompts ausprobieren, um zu sehen, welche Arten von Bildern Imagen generieren kann.
Unten sehen Sie einen Screenshot der Prompt-Generierung in der Gradio-App.

Unten sehen Sie einen Screenshot der Bildgenerierung in der Gradio-App.

Einige Beispiele:
Beispiel 1:
[Linkes Bild] Prompt (einfache Keywords als Prompts verwenden) : Ein Paar Freunde auf einem Boot.
[Rechtes Bild] Prompt (mit von Text-Bison generierten Prompts) : Ein Foto von zwei jungen Männern, die auf einem Boot angeln, umgeben von dunklen Bäumen im Wald. Die Männer tragen ein Hemd und stehen auf einem Boot. Natürliche Beleuchtung, hohe Qualität, 4K-Foto, aufgenommen von einem professionellen Fotografen.

Beispiel 2:
[Linkes Bild] Prompt (einfache Keywords als Prompts verwenden) : Ein Weihnachtsbaum
[Rechtes Bild] Prompt (mit von Text-Bison generierten Prompts) : Ein Weihnachtsbaum in einem Raum mit einer Lampe und Möbeln. Der Baum ist mit Lichtern und Ornamenten geschmückt. Er steht in der Nähe eines Fensters und im Hintergrund ist eine Wand zu sehen. Warme Beleuchtung, hohe Qualität, HDR-Foto, aufgenommen von einem professionellen Fotografen aus der Ferne.

5. Klären
So bereinigen Sie Ihre Ressourcen:
- Beenden Sie die Gradio-App.
- Beenden/Löschen Sie das Workbench-Notebook.
6. Glückwunsch
Glückwunsch! Sie haben erfolgreich eine Gradio-Anwendung zum Erstellen von Prompts und Bildern mit der Google Text-Bison API und der Imagen API bereitgestellt.