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:

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 –

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:
- Wiersze i kolumny do prawidłowego układu.
- Przycisk, pole tekstowe, menu i suwak, aby zapewnić wymaganą funkcjonalność i łatwość obsługi.
- Komponent Obraz do wyświetlania wyników.
- Inne pomocnicze interfejsy API, takie jak EventData czy update, które obsługują dynamiczne zmiany w interfejsie.
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.

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

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.

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.

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.