1. Einführung
Zuletzt aktualisiert: 12.10.2023
Bildgenerierung mit Imagegen
Google Imagen ist ein leistungsstarkes Large Language Model von Google, das realistische und kreative Bilder aus Textbeschreibungen generieren kann. Mit Imagen in Vertex AI können Nutzer KI-Produkte der nächsten Generation erstellen, die die Vorstellungen der Nutzer durch KI-Erzeugung in Sekundenschnelle in hochwertige visuelle Assets transformieren. Neben der Bildgenerierung aus Text werden auch die Bildbearbeitung über Text-Prompts, die Bildunterschriftung, Visual Q&A und die Feinabstimmung von Bildmodellen auf Grundlage von Thema und Stil unterstützt.
Prompt-Generierung
Wenn Sie mit Imagen ein Bild erstellen möchten, müssen Sie eine Textbeschreibung des Bildes angeben, die als Prompt bezeichnet wird. Anhand dieses Prompts wird ein Bild generiert. Um ein hochwertiges fotorealistisches Bild zu erstellen, sind jedoch entsprechende Kenntnisse im Bereich Prompting erforderlich. Das kann auch domainabhängig sein, wenn Sie ein Bild zu bestimmten Geschäftsbereichen wie Einzelhandel oder Fertigung generieren möchten. Eine einfachere Methode zum Erstellen eines Prompts besteht darin, dem Text Bison-Modell eine Reihe von Keywords zu geben.
Der allgemeine Ansatz ist wie folgt:
Gradio-Benutzeroberfläche
Gradio ist eine Open-Source-Python-Bibliothek, mit der Sie mit wenigen Codezeilen schnell benutzerfreundliche, anpassbare UI-Komponenten für Ihr Machine-Learning-Modell, eine beliebige API oder sogar eine beliebige Python-Funktion erstellen können. Sie können die Gradio-GUI direkt in Ihr Jupyter-Notebook einbinden oder als Link mit anderen teilen. 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.
Umfang
In diesem Codelab stellen Sie eine Gradio-App bereit, die Folgendes ausführt:
- Text-Prompt mit Keywords oder Wortgruppen erstellen Der generierte Prompt kann auch manuell bearbeitet werden.
- Bilder aus dem generierten Prompt auf der Benutzeroberfläche generieren
Lerninhalte
- So verwenden Sie Zero-Shot- und Few-Shot-Learning mit dem Text-Bison-Modell programmatisch, um Imagen-spezifische Prompts für die Bildgenerierung zu erstellen.
- Bilder mit dem Imagen-Modell über API und Prompt generieren
- Gradio-Anwendung in einem 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
- Die Vertex AI API ist aktiviert.
- Netzwerkanforderungen für Gradio: Öffentliche URL für den Zugriff auf Notebook-Instanzen
2. Einrichtung
Notebook erstellen
- Im Projekt anmelden
- Rufen Sie im linken Navigationsmenü die Workbench auf.
- Erstellen Sie unter NUTZERVERWALTETE NOTEBOOKS ein neues Notebook mit den Standardoptionen.
- Klicken Sie auf 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
- Importieren Sie die Vertex AI APIs für Text-Bison und die Bildgenerierung.
- Importieren Sie alle anderen erforderlichen Bibliotheken.
Prompt-Generierung mit Text-Bison
Verwendet eine Nutzereingabe mit Keywords und/oder Wortgruppen, d.h. eine durch Kommas getrennte Liste von Keywords oder Wortgruppen, die zum Erstellen eines Satzes verwendet werden können, 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-Prompts
Zero-Shot-Prompting ist eine Textgenerierungstechnik, bei der dem Modell kein Kontext oder keine Beispiele zum Generieren von Text zur Verfügung gestellt werden. Das kann eine Herausforderung sein, da das Modell auf sein eigenes Wissen angewiesen ist, um kohärenten und informativen Text zu generieren.
Zero-Shot-Prompts können jedoch 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 gegeben wird, aus denen es Text generieren kann. Das kann einfacher sein als Zero-Shot-Prompting, da das Modell einige Anleitungen dazu hat, was generiert werden soll. Few-Shot-Prompts können jedoch auch einschränkend sein, da das Modell möglicherweise nur Text generieren kann, der den angegebenen Beispielen ähnelt.
Unten finden Sie den Beispielcode für Few-Shot- und Zero-Shot-Prompts.
**# Im Code verwendeter Few-Shot-Prompt**
few_shot_prompt = f"""You are an expert in writing prompts for Image Generation Models. Verknüpfen Sie die bereitgestellten Formulierungen 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:
"""
# Im Code verwendeter Zero-Shot-Prompt
prompt = f"""You are an expert in writing prompts for Image Generation Models. Formuliere für mich eine Liste mit aussagekräftigen Prompts für das Bildgenerierungsmodell, die speziell die Wörter „{params_list_str}“ enthalten. Denken Sie daran, diese Wörter in den Prompt aufzunehmen und den Prompt aussagekräftig zu gestalten.“““
Bildgenerierung mit Imagen
Verwendet eine Nutzereingabe und einen optionalen negativen Prompt 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 einer Nutzereingabe 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, hochwertiges und detailliertes Bild, das von einem professionellen Fotografen aus der Ferne aufgenommen wurde.“
negative_prompt = "Distorted and unattractive faces" (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 in Imagen eingegeben werden, um Bilder entsprechend den Eingaben zu generieren. Gradio ist eine Python-Bibliothek, mit der Benutzeroberflächen für Modelle für maschinelles Lernen erstellt werden können. In dieser Anwendung werden Blöcke verwendet, um Flexibilität und komplexe Datenflüsse zu ermöglichen. 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")
mit gr.Row():
btn = gr.Button("Submit")
mit 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)
Für die Verarbeitung der Nutzereingaben und ‑ausgaben bietet Gradio mehrere Komponenten wie „Image“, „Video“, „Slider“, „Dropdown“, „Textbox“, „Radio“ und andere Optionen. Diese Komponenten bieten Entwicklern Flexibilität und Kontrolle darüber, wie sie Eingaben von Nutzern entgegennehmen und an Test-bison, Imagen oder ein anderes ML-Modell weiterleiten.
Für dieses Projekt wird die Anwendung mit Blöcken erstellt, um Flexibilität und Komplexität zu ermöglichen.
Daten an die Anwendung gesendet werden. Neben Blöcken gibt es mehrere Gradio-Komponenten.
Verwendet für:
- Zeilen, Spalten für das richtige Layout.
- Schaltfläche, Textfeld, Dropdown-Menü und Schieberegler, um die erforderliche Funktionalität und Benutzerfreundlichkeit zu erreichen
- Bildkomponente zum Anzeigen von Ergebnissen.
- Andere Hilfsfunktionen wie EventData und update unterstützen dynamische Änderungen an der Benutzeroberfläche.
Unten sehen Sie ein Code-Snippet, das zum Generieren von Bildern aus Eingabe- und Negativ-Prompts verwendet wird:
#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])
Um die Gradio-Anwendung auszuführen und zu testen, geben Sie einfach einen Text-Prompt ein und klicken Sie auf die Schaltfläche „Generieren“. Imagen generiert ein Bild auf Grundlage Ihres Prompts. 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:
[Bild links] Prompt (einfache Keywords als Prompts) : Ein Paar Freunde beim Bootfahren.
[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. Männer, die ein Hemd tragen und auf einem Boot stehen Natürliche Beleuchtung, hohe Qualität, 4K-Foto, aufgenommen von einem professionellen Fotografen.

Beispiel 2
[Linkes Bild] Prompt ((Using simple keywords as prompts)): Ein Weihnachtsbaum
[Bild rechts] 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. Es steht in der Nähe eines Fensters und im Hintergrund ist eine Wand zu sehen. Warmes Licht, 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.
- Stoppen oder löschen Sie das Workbench-Notebook.
6. Glückwunsch
Herzlichen Glückwunsch! Sie haben erfolgreich eine Gradio-Anwendung bereitgestellt, mit der Prompts und Bilder mit der Google Text-Bison API und der Imagen API erstellt werden können.