Generative AI – Bilder aus Keywords generieren

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:

fbb3826592b2816d.png

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 wirken, 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 –

db04a6bfdd78693b.jpeg

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 Blöcke verwendet, um die Anwendung flexibler und komplexer Datenflüsse zu gestalten. 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 gcloud 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:

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.

70331c9645b1e91b.png

Unten sehen Sie den Screenshot der Bildgenerierung in der Gradio App.

a7261e8fafab7073.png

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.

c2f5fabd10baf42.jpeg abc9b8204a9fdf7f.jpeg

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.

f10cf9f52ffd92c7.jpeg cce36df7a439b309.jpeg

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.