1. Einführung
Zuletzt aktualisiert:12.10.2023
Imagegen-Bildgenerierung
Google Imagen ist ein leistungsstarkes Large Language Model von Google, das realistische und kreative Bilder aus Textbeschreibungen generieren kann. Imagen in Vertex AI ermöglicht es Nutzern, KI-Produkte der nächsten Generation zu entwickeln, die die Fantasie ihrer Nutzer in Sekundenschnelle in hochwertige visuelle Assets verwandeln. Zusätzlich zur Bildgenerierung aus Text unterstützt es auch die Bildbearbeitung über Text-Prompts, Bilduntertitel, visuelle Fragen und Antworten sowie Stilbasierte Bildmodellabstimmung.
Prompts generieren
Um ein Bild mit Imagen zu erstellen, musst du eine Textbeschreibung des Bildes, den sogenannten Prompt, angeben, mit dem ein Bild generiert wird. Zum Generieren eines fotorealistischen Bildes in hoher Qualität sind jedoch Fachkenntnisse erforderlich. Es kann auch von der Domain abhängig sein, wenn Sie ein Bild generieren möchten, das sich auf bestimmte Geschäftsbereiche wie Einzelhandel, Fertigung usw. bezieht. Ein einfacherer Ansatz zum Entwerfen eines Prompts besteht darin, dem Text Bison-Modell eine Reihe von Keywords zuzuweisen.
Der Gesamtansatz ist:
Gradio UI
Gradio ist eine Open-Source-Python-Bibliothek, mit der Sie mit wenigen Codezeilen schnell nutzerfreundliche, anpassbare UI-Komponenten für Ihr ML-Modell, eine API oder sogar eine beliebige Python-Funktion erstellen können. Sie können das Gradio-GUI direkt in Ihr Jupyter-Notebook einbinden oder als Link mit anderen teilen. gradio unterstützt eine Vielzahl von Medientypen, einschließlich Text, Bilder, Videos und Audio. Außerdem bietet es eine Reihe vordefinierter UI-Komponenten wie Eingabefelder, Schaltflächen, Schieberegler und Drop-down-Menüs.
Inhalt
In diesem Codelab stellen Sie eine Gradio-App bereit, die:
- Generiere einen Text-Prompt mit Suchbegriffen oder Sätzen. Der generierte Prompt kann auch manuell bearbeitet werden.
- Mit dem generierten Prompt auf der Benutzeroberfläche Bilder generieren
Aufgaben in diesem Lab
- Anleitung zum programmatischen Verwenden von Zero-Shot- und Wenig-Shot-Lernen mit Text-Bison-Modell, um Imagen-spezifische Prompts für die Bildgenerierung zu generieren.
- Informationen zum Generieren von Bildern mithilfe des Imagen-Modells über die API und Eingabeaufforderung.
- gcloud-Anwendung mit 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
- Vertex AI API aktiviert.
- Netzwerkanforderungen für gcloud: öffentliche URL für den Zugriff auf Notebook-Instanzen
2. Einrichtung
Notebook erstellen
- Im Projekt anmelden
- Rufen Sie workbench über das Navigationsmenü auf der linken Seite auf.
- Erstellen Sie unter NUTZERVERWALTETE NOTEBOOKS ein neues Notebook mit den Standardoptionen.
- Klicken Sie auf OPEN JUPYTERLAB (JUPYTERLAB ÖFFNEN). sobald die Instanz bereitgestellt wurde.
Hinweis: Wenn das Notebook angehalten ist, kann es einige Minuten dauern, bis es gestartet wird.
Code abrufen
Wir haben die Codedatei hier eingefügt. 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 Image-Generierung.
- Importieren Sie alle anderen erforderlichen Bibliotheken.
Prompts mit Text-Bison erstellen
Verwendet eine Nutzereingabe, die Keywords und/oder Wortgruppen enthält, 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.
Zum Beispiel: Persona, Thema, Hintergrund, Beleuchtung und andere Beschreibungen.
Die Funktion, die den Prompt generiert, wird wie folgt angegeben:
ᰃdef prompt_generation(Persona,Signal,Design, Beleuchtung, Qualität, 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 für „Wenig-Shot“ und „Zero-Shot“
Zero-Shot-Prompts sind eine Methode zur Textgenerierung, bei der dem Modell kein Kontext oder Beispiele zur Verfügung gestellt werden, aus denen Text generiert werden kann. Dies kann eine Herausforderung sein, da sich das Modell auf sein eigenes Wissen verlassen muss, um kohärenten und informativen Text zu generieren.
Zero-Shot-Prompts können jedoch auch sehr kreativ sein, da das Modell nicht durch bereits vorhandene Beispiele eingeschränkt wird.
„Wenig-Shot-Prompts“ ist eine Methode zur Textgenerierung, bei der dem Modell einige Beispiele zur Textgenerierung zur Verfügung gestellt werden. Das kann einfacher sein als Zero-Shot-Prompts, da das Modell vorgibt, was generiert werden soll. Prompts mit wenigen Aktionen können jedoch auch einschränkend sein, da das Modell möglicherweise nur Text generieren kann, der den angegebenen Beispielen ähnelt.
Unten sehen Sie den Beispielcode für die Few-Shot- und Zero-Shot-Prompts.
ᰃ**# Wenige Aufnahmeaufforderung im Code verwendet**
wenige_shot_prompt = f"""Sie sind Experte im Schreiben von Prompts für Bildgenerierungsmodelle. Verketten Sie die bereitgestellten Wortgruppen und Schlüsselwörter und fügen Sie einige realistische Details hinzu, um logische und aussagekräftige Aufforderungen zu generieren, die für die Bildgenerierung verwendet werden können.
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 verwendete Zero Shot-Aufforderung
prompt = f"""Sie sind Experte im Schreiben von Prompts für Bildgenerierungsmodelle. Ich brauche Hilfe beim Verfassen einer Liste mit aussagekräftigen Prompts für das Bildgenerierungsmodell, insbesondere die Wörter „{params_list_str}“. Denken Sie daran, diese Wörter in den Prompt aufzunehmen, damit er aussagekräftig ist."""
Bilder mit Imagen generieren
Verwendet einen Nutzereingabe-Prompt und einen negativen Prompt(optional) und gibt diesen in das Modell ein (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 anhand einer Nutzereingabe und einer negativen Aufforderung zu generieren. Im endgültigen Code wird der vom Text-Bison-Modell generierte Prompt verwendet.
ᰃaus vertexai.preview.vision_models ImageGenerationModel importieren
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 unbemalten, frischen Weihnachtsbaum aus einer Reihe von Bäumen. Kaltes Licht, hochwertiges und detailliertes Bild eines professionellen Fotografen aus der Ferne.“
negative_prompt = "Verzerrte und unattraktive Gesichter"
generierten_images_list = image_generation(user_prompt,negative_prompt)
#Eins der generierten Bilder anzeigen
generated_images_list[0].show()
Ausgabe –
4. Gradio App bereitstellen
gcloud wird für Frontend verwendet, in dem Nutzer Suchbegriffe eingeben und strukturierte Prompts generieren können. Diese Prompts können direkt verwendet oder vom Nutzer weiter bearbeitet und dann in Imagen eingespeist werden, um Bilder entsprechend den Eingaben zu generieren. gcloud ist eine Python-Bibliothek, mit der Benutzeroberflächen für Modelle für maschinelles Lernen erstellt werden können. Für diese Anwendung werden Blocks verwendet, um die Flexibilität und komplexe Datenflüsse zu erhöhen. Blocks ermöglicht die Verwaltung von Anwendungslayouts mithilfe von Zeilen und Spalten:
ᰃmit gr.Blocks() als 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, Signales,Theme, photo_modifiers, quality_modifiers, other_desc], outputs = returns_prompts)
Zur Verarbeitung der Nutzereingaben und -ausgaben bietet gradio mehrere Komponenten wie Bild, Video, Schieberegler, Drop-down-Menü, Textfeld, Radio und andere Optionen. Diese Komponenten bieten Entwicklern die Flexibilität und Kontrolle darüber, wie Eingaben von Nutzern angenommen und in das Test-Bison-, Imagen- oder ein anderes ML-Modell eingespeist werden.
Für dieses Projekt wird die Anwendung mit Blocks erstellt, um für mehr Flexibilität und komplexe
zur Anwendung geleitet wird. Zusätzlich zu den Blöcken sind mehrere Gradio-Komponenten
verwendet werden, einschließlich:
- Zeilen, Spalten für die richtigen Layouts.
- Schaltfläche, Textfeld, Dropdown-Menü und Schieberegler, um die erforderliche Funktionalität und Nutzerfreundlichkeit zu erreichen
- Image-Komponente zum Anzeigen von Ergebnissen.
- Andere Hilfsfunktionen wie EventData, update, um dynamische Änderungen an der Benutzeroberfläche zu unterstützen.
Mit dem folgenden Code-Snippet werden Bilder anhand einer Eingabe und eines negativen Prompts generiert:
ᰃ #Bildgenerierungsteil
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])
Geben Sie zum Ausführen und Testen der Anwendung gcloud einfach einen Text-Prompt ein und klicken Sie auf die Schaltfläche Generate (Generieren). Imagen generiert anhand Ihres Prompts ein Bild. Du kannst verschiedene Aufforderungen ausprobieren, um zu sehen, welche Arten von Bildern Imagen generieren kann.
Unten sehen Sie den Screenshot der Aufforderungserstellung in der Gradio App.
Unten sehen Sie den Screenshot der Bildgenerierung in der Gradio App.
Beispiele:
Beispiel 1 –
[Left image] Aufforderung (Einfache Suchbegriffe als Prompts verwenden): Zwei Freunde beim Bootfahren.
[Right image] Prompt (mit den 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 in einem Hemd stehen auf einem Boot. Natürliches Licht, hohe Qualität, 4K-Foto eines professionellen Fotografen.
Beispiel 2 –
[Left image] Prompt ((Verwenden von einfachen Suchbegriffen als Prompts)): Ein Weihnachtsbaum
[Right image] 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 wird in der Nähe eines Fensters platziert und im Hintergrund ist eine Wand sichtbar. Warmes Licht, hohe Qualität, HDR-Foto eines professionellen Fotografen, aufgenommen aus der Ferne.
5. Klären
Um Ihre Ressourcen zu bereinigen,
- Beenden Sie die gradio-App.
- Beenden/löschen Sie das Workbench-Notebook.
6. Glückwunsch
Herzlichen 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.