Generative AI – Bilder aus Keywords generieren

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:

fbb3826592b2816d.png

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:

db04a6bfdd78693b.jpeg

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:

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.

70331c9645b1e91b.png

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

a7261e8fafab7073.png

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.

c2f5fabd10baf42.jpeg abc9b8204a9fdf7f.jpeg

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.

f10cf9f52ffd92c7.jpeg cce36df7a439b309.jpeg

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.