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

1. Wprowadzenie

Ostatnia aktualizacja: 12.10.2023 r.

Generowanie obrazów Imagegen

Obraz Google 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 pozwala użytkownikom tworzyć usługi AI nowej generacji, które w kilka sekund przekształcają wyobraźnię użytkownika w wysokiej jakości zasoby wizualne. Oprócz generowania obrazów na podstawie tekstu aplikacja obsługuje również edytowanie obrazów za pomocą promptów tekstowych, tworzenia podpisów do obrazów, pytań i odpowiedzi wizualnych, tematów i Dostrajanie modelu obrazu na podstawie stylu.

Generowanie promptów

Aby utworzyć obraz przy użyciu Imagen, musisz podać opis tekstowy obrazu nazywany promptem, na podstawie którego zostanie wygenerowany obraz. Jednak w celu wygenerowania wysokiej jakości fotorealistycznego obrazu niezbędna jest odpowiednia doświadczenie. Może też być zależny od domeny, jeśli chcesz wygenerować obraz związany z konkretnymi domenami biznesowymi, takimi jak handel detaliczny, produkcja itp. Łatwiejszym sposobem zaprojektowania promptu jest przypisanie zestawu słów kluczowych do modelu Text Bison.

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

fbb3826592b2816d.png

Interfejs użytkownika Gradio

Gradio to biblioteka open source w Pythonie, która umożliwia szybkie tworzenie łatwych w użyciu, niestandardowych komponentów interfejsu dla modelu systemów uczących się, dowolnego interfejsu API, a nawet dowolnej funkcji w Pythonie za pomocą kilku wierszy kodu. Możesz zintegrować graficzny interfejs użytkownika Gradio bezpośrednio z notatnikiem Jupyter lub udostępnić go innym jako link. Gradio obsługuje szeroką gamę typów multimediów, w tym tekst, obrazy, filmy i dźwięki. Zawiera też wiele gotowych komponentów interfejsu, takich jak pola do wprowadzania danych, przyciski, suwaki i menu.

Co utworzysz

W ramach tego ćwiczenia w Codelabs wdrożysz aplikację Gradio, która:

  • Wygeneruj prompt tekstowy, używając słów kluczowych lub wyrażeń. Wygenerowany prompt możesz też edytować ręcznie.
  • Generuj obrazy na podstawie wygenerowanego promptu w interfejsie.

Czego się nauczysz

  • Jak korzystać z nauki „zero-shot” i „few-shot” za pomocą modelu tekstowego bizonu, który automatycznie generuje prompty dla obrazów na potrzeby generowania obrazów.
  • Jak generować obrazy za pomocą modelu Imagen za pomocą interfejsu API i promptu.
  • Jak kompilować, wdrażać i testować aplikację Gradio z panelu roboczego Vertex AI.

Czego potrzebujesz

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

2. Przygotowanie

Tworzenie notatnika

  • Zaloguj się w projekcie
  • W menu nawigacyjnym po lewej stronie otwórz workbench.
  • W sekcji „NOTATKI ZARZĄDZANE PRZEZ UŻYTKOWNIKÓW” utwórz nowy notatnik z opcjami domyślnymi.
  • Kliknij „OTWÓRZ JUPYTERLAB”. po udostępnieniu instancji.

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

Pobierz kod

Umieściliśmy tutaj plik z kodem. Ten notatnik możesz zaimportować do swojego środowiska i uruchomić w niezmienionej formie (z wyjątkiem zmian w szczegółach projektu).

3. Uruchamianie kodu

Instalowanie/importowanie wymaganych zależności i bibliotek

  • Zainstaluj aplikację Gradio
  • Zaimportuj interfejsy API Vertex AI na potrzeby generowania obrazów Text-Bison i generowania obrazów.
  • Zaimportuj wszystkie pozostałe wymagane biblioteki.

Generowanie promptów za pomocą modelu Text-Bison

Wykorzystuje dane wejściowe użytkownika zawierające słowa kluczowe lub wyrażenia, czyli rozdzielaną przecinkami listę słów kluczowych lub wyrażeń, na podstawie których można utworzyć zdanie opisujące obraz do wygenerowania.

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

Funkcja generująca prompt ma postać:

ﰃdef prompt_generation(persona,sygnał,motyw, oświetlenie, jakość, 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 typu „few-shot” i „zero-shot”.

Prompt „zero-shot” to technika generowania tekstu, w której modelowi nie podaje się kontekstu ani przykładów, na podstawie których mógłby wygenerować tekst. Może to być trudne, ponieważ model musi bazować na własnej wiedzy, aby wygenerować spójny i zawierający informacje tekst.

Z kolei prompty typu „zero-shot” mogą być jednak bardzo kreatywne, ponieważ model nie jest ograniczony przez żadne istniejące przykłady.

Podpowiedzi typu „few-shot” to technika generowania tekstu, w której model otrzymuje niewielką liczbę przykładów do wygenerowania tekstu. Może to być łatwiejsze niż tworzenie promptów typu „zero-shot”, ponieważ model zawiera wskazówki dotyczące tego, co należy wygenerować. Pamiętaj jednak, że prompty „few-shot” również mogą stanowić ograniczenie, ponieważ model może wygenerować tylko tekst podobny do podanego w przykładach.

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

Ⰳ**# W kodzie użyto kilku promptów o nagraniu ujęć**

photos_shot_prompt = f"""Jesteś ekspertem w pisaniu promptów dla modeli generowania obrazów. Połącz podane wyrażenia i słowa kluczowe i dodaj realistyczne szczegóły, aby wygenerować logiczny i znaczący prompt, którego można użyć do wygenerowania obrazu.

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:
"""

# Prompt typu zero Shot używany w kodzie

prompt = f"""Jesteś ekspertem w pisaniu promptów dla modeli generowania obrazu. Pomóż mi utworzyć listę znaczących promptów dla modelu generowania obrazów, w tym słowa „{params_list_str}”. Pamiętaj o umieszczeniu tych słów w prompcie i zadbaj o to, aby prompt miał znaczenie."""

Generowanie obrazów za pomocą usługi Imagen

Wykorzystuje prompt z danymi wejściowymi użytkownika i prompty negatywne(opcjonalnie) i przekazuje te same dane 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

)

Dołączony jest poniższy kod służący do generowania obrazów na podstawie promptu użytkownika i negatywnego promptu. Końcowy kod używa promptu wygenerowanego przez model text-bison.

аz vertexai.preview.vision_models zaimportuj model ImageGenerationModel

defation_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 prezentuje i sprzedaje nieudekorowaną, świeżą choinkę z grupy drzew. Przy zimnym oświetleniu, wysokiej jakości i szczegółowym zdjęciu zrobionym z daleka profesjonalny fotograf”.

negative_prompt = "Zniekształcone i nieatrakcyjne twarze"

wygenerowane_images_list = image_generation(user_prompt,negative_prompt)

#show jeden z wygenerowanych obrazów

generated_images_list[0].show()

Dane wyjściowe –

db04a6bfdd78693b.jpeg

4. Wdrażanie aplikacji Gradio

Gradio jest używany we frontendzie, w którym użytkownicy mogą wpisywać słowa kluczowe i generować uporządkowane prompty. Te prompty można używać bezpośrednio lub mogą być dalej edytowane przez użytkownika, a następnie wprowadzać do Imagen w celu wygenerowania obrazów na podstawie danych wejściowych. Gradio to biblioteka w języku Python, której można używać do tworzenia interfejsów użytkownika modeli systemów uczących się. W tej aplikacji blokady służą do zwiększania elastyczności i złożonych przepływów danych. Blocks umożliwia zarządzanie układem aplikacji za pomocą wierszy i kolumn:

Ⰳz gr.Blocks() w ramach demonstracji:

#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")

za pomocą funkcji gr.Row():

    btn = gr.Button("Submit")

za pomocą funkcji 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 = Return_prompts)

Do obsługi danych wejściowych i wyjściowych użytkownika Gradio udostępnia wiele komponentów, takich jak obraz, wideo, suwak, menu, pole tekstowe, radio i inne. Komponenty te dają programistom elastyczność i kontrolę w zakresie przyjmowania danych wejściowych użytkowników i dostarczania ich do modelu Test-bison, Imagen lub innego modelu ML.

W tym projekcie aplikacja jest tworzona za pomocą bloków, co zwiększa elastyczność i złożoność.

do aplikacji. Oprócz bloków istnieje wiele komponentów Gradio.

między innymi:

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

а #Część procesu generowania obrazów

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 Wygeneruj. Imagen wygeneruje obraz na podstawie Twojego promptu. Możesz wypróbować różne prompty, aby sprawdzić, jakie rodzaje obrazów może wygenerować Imagen.

Poniżej znajdziesz zrzut ekranu z generowaniem promptów w aplikacji Gradio.

70331c9645b1e91b.png

Poniżej znajdziesz zrzut ekranu z funkcją generowania obrazów w aplikacji Gradio.

a7261e8fafab7073.png

Oto przykłady:

Przykład 1:

[Obraz po lewej stronie] Prompt (używanie prostych słów kluczowych jako promptów) : para przyjaciół pływających łódką.

[Po prawej stronie] Prompt (korzystanie z podpowiedzi wygenerowanych przez Text-Bison) : zdjęcie 2 młodych mężczyzn łowiących ryby na łodzi otoczonych ciemnymi drzewami w lesie. Mężczyźni w koszulce stoją na łodzi. Naturalne oświetlenie, wysokiej jakości zdjęcie 4K wykonane przez profesjonalnego fotografa.

c2f5fabd10baf42.jpeg abc9b8204a9fdf7f.jpeg

Przykład 2:

[Obraz po lewej stronie] Prompt ((proste słowa kluczowe jako prompty): choinka

[Right image] Prompt (używanie promptów wygenerowanych przez komponent Text-Bison) : choinka w pomieszczeniu z lampą i meblami. Drzewo jest ozdobione lampkami i ozdobami. Znajduje się w pobliżu okna, a w tle widoczna jest ściana. Ciepłe oświetlenie, wysokiej jakości zdjęcie HDR zrobione przez profesjonalnego fotografa zrobione z daleka.

f10cf9f52ffd92c7.jpeg cce36df7a439b309.jpeg

5. Porządkowanie roszczeń

Aby wyczyścić zasoby,

  • Zatrzymaj aplikację gradio.
  • Zatrzymaj/usuń notatnik Workbench.

6. Gratulacje

Gratulujemy! 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.