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:
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 –
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:
- Wiersze, kolumny w przypadku prawidłowych układów.
- Przycisk, Pole tekstowe, Menu i Suwak do osiągnięcia wymaganej funkcjonalności i łatwości obsługi.
- Komponent Obraz do wyświetlania wyników.
- Inne elementy pomocnicze, takie jak EventData, update, aby obsługiwać dynamiczne zmiany w interfejsie.
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.
Poniżej znajdziesz zrzut ekranu z funkcją generowania obrazów w aplikacji Gradio.
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.
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.
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.