GenAI – generowanie obrazów na podstawie słów kluczowych

1. Wprowadzenie

Ostatnia aktualizacja: 12.10.2023

Generowanie obrazów Imagegen

Google Imagen to zaawansowany duży model językowy Google, który może generować realistyczne i kreatywne obrazy na podstawie opisów tekstowych. Imagen w Vertex AI umożliwia użytkownikom tworzenie produktów AI nowej generacji, które w ciągu kilku sekund przekształcają wyobraźnię użytkowników w wysokiej jakości komponenty wizualne. Oprócz generowania obrazów na podstawie tekstu obsługuje też edytowanie obrazów za pomocą promptów tekstowych, tworzenie podpisów do obrazów, pytania i odpowiedzi dotyczące obrazów oraz dostrajanie modeli obrazów na podstawie tematu i stylu.

Generowanie promptów

Aby utworzyć obraz za pomocą Imagen, musisz podać tekstowy opis obrazu, czyli prompt, na podstawie którego zostanie wygenerowany obraz. Aby jednak wygenerować fotorealistyczny obraz o wysokiej jakości, trzeba mieć doświadczenie w tworzeniu promptów. Może to również zależeć od domeny, jeśli chcesz wygenerować obraz związany z określonymi branżami, takimi jak handel detaliczny czy produkcja. Łatwiejszym sposobem na zaprojektowanie promptu jest podanie modelu Text Bison zestawu słów kluczowych.

Ogólne podejście jest następujące:

fbb3826592b2816d.png

Interfejs Gradio

Gradio to biblioteka Pythona typu open source, która umożliwia szybkie tworzenie łatwych w użyciu i dostosowywanych komponentów interfejsu do modelu uczenia maszynowego, dowolnego interfejsu API lub nawet dowolnej funkcji Pythona za pomocą kilku wierszy kodu. Interfejs GUI Gradio możesz zintegrować bezpośrednio z notatnikiem Jupyter lub udostępnić go w postaci linku dowolnej osobie. Gradio obsługuje szeroką gamę typów multimediów, w tym tekst, obrazy, filmy i dźwięk. Zawiera też wiele gotowych komponentów interfejsu, takich jak pola wprowadzania, przyciski, suwaki i menu.

Co utworzysz

W tym ćwiczeniu z programowania wdrożysz aplikację Gradio, która będzie:

  • Wygeneruj prompt tekstowy za pomocą słów kluczowych lub wyrażeń. Wygenerowany prompt można też edytować ręcznie.
  • Generuj obrazy na podstawie wygenerowanego prompta w interfejsie.

Czego się nauczysz

  • Jak programowo korzystać z uczenia bez przykładów i uczenia z małą liczbą przykładów za pomocą modelu text-bison, aby generować prompty specyficzne dla Imagen do generowania obrazów.
  • Jak generować obrazy za pomocą modelu Imagen za pomocą interfejsu API i promptu.
  • Jak tworzyć, wdrażać i testować aplikację Gradio z notatnika Vertex AI Workbench.

Czego potrzebujesz

  • Dostęp do projektu GCP, np. „Cloud-llm-preview4”.
  • Dostęp do tworzenia Vertex AI Workbench
  • Interfejs Vertex AI API został włączony.
  • Wymagania sieciowe dotyczące Gradio: publiczny adres URL dostępu do instancji notatnika

2. Przygotowania

Utwórz notatnik

  • Logowanie się w projekcie
  • W menu nawigacyjnym po lewej stronie otwórz workbench.
  • W sekcji „NOTATNIKI ZARZĄDZANE PRZEZ UŻYTKOWNIKA” utwórz nowy notatnik z opcjami domyślnymi.
  • Gdy instancja zostanie udostępniona, kliknij OTWÓRZ JUPYTERLAB.

Uwaga: jeśli notatnik jest zatrzymany, jego uruchomienie może potrwać kilka minut.

Pobierz kod

Plik z kodem znajdziesz tutaj. Ten notatnik można zaimportować do środowiska i uruchomić w takiej postaci, w jakiej jest (z wyjątkiem zmiany szczegółów projektu).

3. Uruchom kod

Zainstaluj lub zaimportuj wymagane zależności i biblioteki

  • Instalowanie aplikacji Gradio
  • Zaimportuj interfejsy Vertex AI API do generowania tekstu (Text-Bison) i obrazów.
  • Zaimportuj wszystkie inne wymagane biblioteki.

Generowanie promptów za pomocą modelu Text-Bison

Wykorzystuje dane wejściowe użytkownika zawierające słowa kluczowe lub wyrażenia, np. listę słów kluczowych lub wyrażeń oddzielonych przecinkami, których można użyć do utworzenia zdania opisującego wymagany obraz do wygenerowania.

Na przykład: persona, temat, tło, oświetlenie i inne opisy.

Funkcja generująca prompt jest podana poniżej:

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

)

Prompty few-shot i zero-shot

Tworzenie promptów zero-shot to technika generowania tekstu, w której model nie otrzymuje żadnego kontekstu ani przykładów, na podstawie których ma generować tekst. Może to być trudne, ponieważ model musi polegać na własnej wiedzy, aby generować spójny i informacyjny tekst.

Tworzenie promptów zero-shot może być jednak bardzo kreatywne, ponieważ model nie jest ograniczone żadnymi wcześniejszymi przykładami.

Tworzenie promptów few-shot to technika generowania tekstu, w której model otrzymuje niewielką liczbę przykładów, na podstawie których ma generować tekst. Może to być łatwiejsze niż tworzenie promptów zero-shot, ponieważ model ma pewne wskazówki dotyczące tego, co ma wygenerować. W przypadku tworzenia promptów few-shot model może jednak generować tylko tekst podobny do podanych przykładów.

Poniżej znajdziesz przykładowy kod promptów Few-Shot i Zero-Shot.

**# Few Shot Prompt użyty w kodzie**

few_shot_prompt = f"""Jesteś ekspertem w pisaniu promptów dla modeli generowania obrazów. Użyj podanych wyrażeń i słów kluczowych, połącz je i dodaj realistyczne szczegóły, aby wygenerować logiczny i sensowny prompt, którego można użyć do generowania obrazów.

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 użyty w kodzie

prompt = f"""Jesteś ekspertem w pisaniu promptów dla modeli generowania obrazów. Pomóż mi napisać listę przydatnych promptów dla modelu generowania obrazów, które będą zawierać słowa: „{params_list_str}”. Pamiętaj, aby uwzględnić te słowa w prompcie i nadać mu sens”.

Generowanie obrazów za pomocą Imagen

Wykorzystuje dane wejściowe użytkownika i negatywny prompt(opcjonalnie) i przekazuje je do modelu (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

)

Poniższy kod służy do generowania obrazów na podstawie prompta i negatywnego prompta wprowadzonych przez użytkownika. Ostateczny kod korzysta z promptu wygenerowanego przez model text-bison.

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: młoda kobieta prezentująca i sprzedająca nieozdobioną świeżą choinkę z grupy drzew. Chłodne oświetlenie, wysokiej jakości szczegółowe zdjęcie wykonane przez profesjonalnego fotografa z daleka”.

negative_prompt = "Zniekształcone i nieatrakcyjne twarze"

generated_images_list = image_generation(user_prompt,negative_prompt)

#show one of the generated image

generated_images_list[0].show()

Dane wyjściowe –

db04a6bfdd78693b.jpeg

4. Wdrażanie aplikacji Gradio

Gradio jest używane w przypadku interfejsu, w którym użytkownicy mogą wpisywać słowa kluczowe i generować strukturalne prompty. Można ich używać bezpośrednio lub edytować, a następnie przekazywać do Imagen, aby generować obrazy zgodnie z danymi wejściowymi. Gradio to biblioteka Pythona, której można używać do tworzenia interfejsów użytkownika dla modeli uczenia maszynowego. W tej aplikacji bloki służą do zwiększania elastyczności i dodawania złożonych przepływów danych. Bloki umożliwiają zarządzanie układem aplikacji za pomocą wierszy i kolumn:

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)

Do obsługi danych wejściowych i wyjściowych użytkownika Gradio udostępnia wiele komponentów, takich jak Image, Video, Slider, Dropdown, Textbox, Radio i inne opcje. Te komponenty zapewniają deweloperom elastyczność i kontrolę nad sposobem przyjmowania danych wejściowych od użytkowników i przekazywania ich do modelu Test-bison, Imagen lub dowolnego innego modelu ML.

W tym projekcie aplikacja jest tworzona za pomocą bloków, co zapewnia elastyczność i umożliwia tworzenie złożonych

dane są przesyłane do aplikacji. Oprócz bloków dostępnych jest wiele komponentów Gradio.

używane, w tym:

Poniżej znajduje się fragment kodu używany do generowania obrazów na podstawie promptu wejściowego i negatywnego:

 #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])       

Aby uruchomić i przetestować aplikację Gradio, wpisz prompt tekstowy i kliknij przycisk Generate (Wygeneruj). Imagen wygeneruje obraz na podstawie prompta. Możesz wypróbować różne prompty, aby sprawdzić, jakie obrazy może wygenerować Imagen.

Poniżej znajduje się zrzut ekranu z aplikacji Gradio, na którym widać generowanie promptu.

70331c9645b1e91b.png

Poniżej znajduje się zrzut ekranu przedstawiający generowanie obrazów w aplikacji Gradio.

a7261e8fafab7073.png

Przykłady:

Przykład 1

[Lewe zdjęcie] Prompt (użycie prostych słów kluczowych jako promptów) : para znajomych pływa łódką.

[Obraz po prawej] Prompt (wygenerowany przez Text-Bison) : zdjęcie 2 młodych mężczyzn łowiących ryby na łodzi otoczonej ciemnymi drzewami w lesie. Mężczyźni w koszulach stoją na łodzi. Naturalne oświetlenie, wysoka jakość, zdjęcie 4K wykonane przez profesjonalnego fotografa.

c2f5fabd10baf42.jpeg abc9b8204a9fdf7f.jpeg

Przykład 2

[Lewe zdjęcie] Prompt ((używanie prostych słów kluczowych jako promptów) : choinka

[Obraz po prawej] Prompt (wygenerowany przez Text-Bison) : choinka w pokoju z lampą i meblami. Drzewko jest ozdobione światełkami i ozdobami. Stoi przy oknie, a w tle widać ścianę. Ciepłe oświetlenie, wysoka jakość, zdjęcie HDR wykonane przez profesjonalnego fotografa z daleka.

f10cf9f52ffd92c7.jpeg cce36df7a439b309.jpeg

5. Porządkowanie roszczeń

Aby zwolnić miejsce na zasoby:

  • Zatrzymaj aplikację Gradio.
  • Zatrzymaj lub usuń notatnik Workbench.

6. Gratulacje

Gratulacje! Udało Ci się wdrożyć aplikację Gradio do tworzenia promptów i obrazów za pomocą interfejsów Google Text-Bison API i Imagen API.