Skip to content

Latest commit

 

History

History
479 lines (324 loc) · 20 KB

File metadata and controls

479 lines (324 loc) · 20 KB

Tworzenie aplikacji do generowania obrazów

Tworzenie aplikacji do generowania obrazów

Generowanie tekstu to nie jedyna funkcja LLM. Możliwe jest również generowanie obrazów na podstawie opisów tekstowych. Obrazy jako forma przekazu mogą być niezwykle przydatne w wielu dziedzinach, takich jak MedTech, architektura, turystyka, tworzenie gier i wiele innych. W tym rozdziale przyjrzymy się dwóm najpopularniejszym modelom generowania obrazów: DALL-E i Midjourney.

Wprowadzenie

W tej lekcji omówimy:

  • Generowanie obrazów i dlaczego jest przydatne.
  • DALL-E i Midjourney, czym są i jak działają.
  • Jak zbudować aplikację do generowania obrazów.

Cele nauki

Po ukończeniu tej lekcji będziesz w stanie:

  • Zbudować aplikację do generowania obrazów.
  • Określić granice dla swojej aplikacji za pomocą meta promptów.
  • Pracować z DALL-E i Midjourney.

Dlaczego warto zbudować aplikację do generowania obrazów?

Aplikacje do generowania obrazów to świetny sposób na eksplorowanie możliwości Generatywnej AI. Mogą być używane na przykład do:

  • Edycji i syntezy obrazów. Możesz generować obrazy dla różnych zastosowań, takich jak edycja obrazów czy ich synteza.

  • Zastosowania w różnych branżach. Mogą być również używane do generowania obrazów dla różnych branż, takich jak MedTech, turystyka, tworzenie gier i wiele innych.

Scenariusz: Edu4All

W ramach tej lekcji będziemy kontynuować pracę z naszym startupem, Edu4All. Studenci będą tworzyć obrazy do swoich zadań, jakie dokładnie obrazy to już ich decyzja, ale mogą to być ilustracje do ich własnej bajki, stworzenie nowej postaci do opowiadania lub pomoc w wizualizacji ich pomysłów i koncepcji.

Oto przykład, co studenci Edu4All mogliby wygenerować, jeśli pracują w klasie nad tematyką zabytków:

Startup Edu4All, klasa o zabytkach, Wieża Eiffla

używając takiego promptu jak:

"Pies obok Wieży Eiffla w porannym świetle słonecznym"

Czym są DALL-E i Midjourney?

DALL-E i Midjourney to dwa z najpopularniejszych modeli generowania obrazów, które pozwalają na użycie promptów do tworzenia obrazów.

DALL-E

Zacznijmy od DALL-E, który jest modelem Generatywnej AI generującym obrazy na podstawie opisów tekstowych.

DALL-E to połączenie dwóch modeli, CLIP i rozproszonej uwagi.

  • CLIP, to model generujący osadzenia, czyli numeryczne reprezentacje danych, z obrazów i tekstu.

  • Rozproszona uwaga, to model generujący obrazy z osadzeń. DALL-E jest trenowany na zbiorze danych obrazów i tekstów i może być używany do generowania obrazów na podstawie opisów tekstowych. Na przykład, DALL-E może być używany do generowania obrazów kota w kapeluszu lub psa z irokezem.

Midjourney

Midjourney działa w podobny sposób jak DALL-E, generuje obrazy na podstawie promptów tekstowych. Midjourney również może być używany do generowania obrazów za pomocą promptów takich jak „kot w kapeluszu” czy „pies z irokezem”.

Obraz wygenerowany przez Midjourney, mechaniczny gołąb Zdjęcie dzięki Wikipedia, obraz wygenerowany przez Midjourney

Jak działają DALL-E i Midjourney

Najpierw DALL-E. DALL-E to model Generatywnej AI oparty na architekturze transformera z autoregresywnym transformatorem.

Autoregresywny transformer definiuje sposób, w jaki model generuje obrazy na podstawie opisów tekstowych, generując jeden piksel na raz, a następnie używając wygenerowanych pikseli do generowania kolejnego. Proces ten przechodzi przez wiele warstw w sieci neuronowej, aż obraz zostanie ukończony.

Dzięki temu procesowi DALL-E kontroluje atrybuty, obiekty, cechy i inne elementy w generowanym obrazie. Jednak DALL-E 2 i 3 mają większą kontrolę nad generowanym obrazem.

Tworzenie pierwszej aplikacji do generowania obrazów

Co jest potrzebne do stworzenia aplikacji do generowania obrazów? Potrzebujesz następujących bibliotek:

  • python-dotenv, zaleca się użycie tej biblioteki do przechowywania tajnych danych w pliku .env z dala od kodu.
  • openai, biblioteka, której użyjesz do interakcji z API OpenAI.
  • pillow, do pracy z obrazami w Pythonie.
  • requests, do wykonywania żądań HTTP.

Tworzenie i wdrażanie modelu Azure OpenAI

Jeśli jeszcze tego nie zrobiłeś, postępuj zgodnie z instrukcjami na stronie Microsoft Learn, aby utworzyć zasób i model Azure OpenAI. Wybierz model DALL-E 3.

Tworzenie aplikacji

  1. Utwórz plik .env z następującą zawartością:

    AZURE_OPENAI_ENDPOINT=<your endpoint>
    AZURE_OPENAI_API_KEY=<your key>
    AZURE_OPENAI_DEPLOYMENT="dall-e-3"
    

    Znajdź te informacje w Azure OpenAI Foundry Portal dla swojego zasobu w sekcji "Deployments".

  2. Zbierz powyższe biblioteki w pliku requirements.txt w następujący sposób:

    python-dotenv
    openai
    pillow
    requests
    
  3. Następnie utwórz wirtualne środowisko i zainstaluj biblioteki:

    python3 -m venv venv
    source venv/bin/activate
    pip install -r requirements.txt

    Dla systemu Windows użyj następujących poleceń, aby utworzyć i aktywować wirtualne środowisko:

    python3 -m venv venv
    venv\Scripts\activate.bat
  4. Dodaj poniższy kod do pliku o nazwie app.py:

    import openai
    import os
    import requests
    from PIL import Image
    import dotenv
    from openai import OpenAI, AzureOpenAI
    
    # import dotenv
    dotenv.load_dotenv()
    
    # configure Azure OpenAI service client 
    client = AzureOpenAI(
      azure_endpoint = os.environ["AZURE_OPENAI_ENDPOINT"],
      api_key=os.environ['AZURE_OPENAI_API_KEY'],
      api_version = "2024-02-01"
      )
    try:
        # Create an image by using the image generation API
        generation_response = client.images.generate(
                                prompt='Bunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils',
                                size='1024x1024', n=1,
                                model=os.environ['AZURE_OPENAI_DEPLOYMENT']
                              )
    
        # Set the directory for the stored image
        image_dir = os.path.join(os.curdir, 'images')
    
        # If the directory doesn't exist, create it
        if not os.path.isdir(image_dir):
            os.mkdir(image_dir)
    
        # Initialize the image path (note the filetype should be png)
        image_path = os.path.join(image_dir, 'generated-image.png')
    
        # Retrieve the generated image
        image_url = generation_response.data[0].url  # extract image URL from response
        generated_image = requests.get(image_url).content  # download the image
        with open(image_path, "wb") as image_file:
            image_file.write(generated_image)
    
        # Display the image in the default image viewer
        image = Image.open(image_path)
        image.show()
    
    # catch exceptions
    except openai.InvalidRequestError as err:
        print(err)

Wyjaśnijmy ten kod:

  • Najpierw importujemy potrzebne biblioteki, w tym bibliotekę OpenAI, bibliotekę dotenv, bibliotekę requests i bibliotekę Pillow.

    import openai
    import os
    import requests
    from PIL import Image
    import dotenv
  • Następnie ładujemy zmienne środowiskowe z pliku .env.

    # import dotenv
    dotenv.load_dotenv()
  • Potem konfigurujemy klienta usługi Azure OpenAI.

    # Get endpoint and key from environment variables
    client = AzureOpenAI(
        azure_endpoint = os.environ["AZURE_OPENAI_ENDPOINT"],
        api_key=os.environ['AZURE_OPENAI_API_KEY'],
        api_version = "2024-02-01"
        )
  • Następnie generujemy obraz:

    # Create an image by using the image generation API
    generation_response = client.images.generate(
                          prompt='Bunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils',
                          size='1024x1024', n=1,
                          model=os.environ['AZURE_OPENAI_DEPLOYMENT']
                        )

    Powyższy kod odpowiada obiektem JSON zawierającym URL wygenerowanego obrazu. Możemy użyć tego URL, aby pobrać obraz i zapisać go w pliku.

  • Na koniec otwieramy obraz i używamy standardowego przeglądarki obrazów, aby go wyświetlić:

    image = Image.open(image_path)
    image.show()

Szczegóły dotyczące generowania obrazu

Przyjrzyjmy się bliżej kodowi generującemu obraz:

  generation_response = client.images.generate(
                            prompt='Bunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils',
                            size='1024x1024', n=1,
                            model=os.environ['AZURE_OPENAI_DEPLOYMENT']
                        )
  • prompt, to tekstowy prompt używany do generowania obrazu. W tym przypadku używamy promptu "Królik na koniu, trzymający lizaka, na mglistym łące, gdzie rosną żonkile".
  • size, to rozmiar generowanego obrazu. W tym przypadku generujemy obraz o rozmiarze 1024x1024 pikseli.
  • n, to liczba generowanych obrazów. W tym przypadku generujemy dwa obrazy.
  • temperature, to parametr kontrolujący losowość wyników modelu Generatywnej AI. Temperatura to wartość między 0 a 1, gdzie 0 oznacza, że wynik jest deterministyczny, a 1 oznacza, że wynik jest losowy. Domyślna wartość to 0.7.

Istnieje więcej rzeczy, które można zrobić z obrazami, o czym opowiemy w następnej sekcji.

Dodatkowe możliwości generowania obrazów

Jak dotąd widziałeś, jak można wygenerować obraz za pomocą kilku linii kodu w Pythonie. Jednak istnieje więcej rzeczy, które można zrobić z obrazami.

Możesz również:

  • Edytować obrazy. Podając istniejący obraz, maskę i prompt, możesz zmienić obraz. Na przykład możesz dodać coś do części obrazu. Wyobraź sobie nasz obraz z królikiem, możesz dodać kapelusz królikowi. Jak to zrobić? Podając obraz, maskę (identyfikującą część obszaru do zmiany) i prompt tekstowy, który określa, co należy zrobić.

Uwaga: to nie jest obsługiwane w DALL-E 3.

Oto przykład użycia GPT Image:

response = client.images.edit(
    model="gpt-image-1",
    image=open("sunlit_lounge.png", "rb"),
    mask=open("mask.png", "rb"),
    prompt="A sunlit indoor lounge area with a pool containing a flamingo"
)
image_url = response.data[0].url

Bazowy obraz zawierałby tylko salon z basenem, ale ostateczny obraz miałby flaminga:

  • Tworzyć wariacje. Chodzi o to, że bierzesz istniejący obraz i prosisz o stworzenie jego wariacji. Aby stworzyć wariację, podajesz obraz i prompt tekstowy oraz kod w następujący sposób:

    response = openai.Image.create_variation(
      image=open("bunny-lollipop.png", "rb"),
      n=1,
      size="1024x1024"
    )
    image_url = response['data'][0]['url']

    Uwaga, to jest obsługiwane tylko w OpenAI.

Temperatura

Temperatura to parametr kontrolujący losowość wyników modelu Generatywnej AI. Temperatura to wartość między 0 a 1, gdzie 0 oznacza, że wynik jest deterministyczny, a 1 oznacza, że wynik jest losowy. Domyślna wartość to 0.7.

Przyjrzyjmy się przykładowi działania temperatury, uruchamiając ten prompt dwukrotnie:

Prompt : "Królik na koniu, trzymający lizaka, na mglistym łące, gdzie rosną żonkile"

Królik na koniu trzymający lizaka, wersja 1

Teraz uruchommy ten sam prompt jeszcze raz, aby zobaczyć, że nie otrzymamy dwa razy tego samego obrazu:

Wygenerowany obraz królika na koniu

Jak widać, obrazy są podobne, ale nie identyczne. Spróbujmy zmienić wartość temperatury na 0.1 i zobaczyć, co się stanie:

 generation_response = client.images.create(
        prompt='Bunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils',    # Enter your prompt text here
        size='1024x1024',
        n=2
    )

Zmiana temperatury

Spróbujmy więc uczynić odpowiedź bardziej deterministyczną. Możemy zauważyć, że na dwóch wygenerowanych obrazach w pierwszym jest królik, a w drugim koń, więc obrazy znacznie się różnią.

Zmieńmy zatem nasz kod i ustawmy temperaturę na 0, w ten sposób:

generation_response = client.images.create(
        prompt='Bunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils',    # Enter your prompt text here
        size='1024x1024',
        n=2,
        temperature=0
    )

Teraz, gdy uruchomisz ten kod, otrzymasz te dwa obrazy:

  • Temperatura 0, v1
  • Temperatura 0 , v2

Tutaj wyraźnie widać, że obrazy są do siebie bardziej podobne.

Jak określić granice dla swojej aplikacji za pomocą meta promptów

Dzięki naszemu demo możemy już generować obrazy dla naszych klientów. Jednak musimy stworzyć pewne granice dla naszej aplikacji.

Na przykład, nie chcemy generować obrazów, które są nieodpowiednie dla pracy lub dla dzieci.

Możemy to zrobić za pomocą meta promptów. Meta prompty to tekstowe prompty używane do kontrolowania wyników modelu Generatywnej AI. Na przykład możemy użyć meta promptów, aby kontrolować wyniki i upewnić się, że generowane obrazy są odpowiednie dla pracy lub dzieci.

Jak to działa?

Jak działają meta prompty?

Meta prompty to tekstowe prompty używane do kontrolowania wyników modelu Generatywnej AI, są umieszczane przed promptem tekstowym i służą do kontrolowania wyników modelu oraz są wbudowane w aplikacje, aby kontrolować wyniki modelu. Łączą one dane wejściowe promptu i dane wejściowe meta promptu w jeden prompt tekstowy.

Przykładem meta promptu może być następujący:

You are an assistant designer that creates images for children.

The image needs to be safe for work and appropriate for children.

The image needs to be in color.

The image needs to be in landscape orientation.

The image needs to be in a 16:9 aspect ratio.

Do not consider any input from the following that is not safe for work or appropriate for children.

(Input)

Teraz zobaczmy, jak możemy użyć meta promptów w naszym demo.

disallow_list = "swords, violence, blood, gore, nudity, sexual content, adult content, adult themes, adult language, adult humor, adult jokes, adult situations, adult"

meta_prompt =f"""You are an assistant designer that creates images for children.

The image needs to be safe for work and appropriate for children.

The image needs to be in color.

The image needs to be in landscape orientation.

The image needs to be in a 16:9 aspect ratio.

Do not consider any input from the following that is not safe for work or appropriate for children.
{disallow_list}
"""

prompt = f"{meta_prompt}
Create an image of a bunny on a horse, holding a lollipop"

# TODO add request to generate image

Z powyższego promptu widać, jak wszystkie tworzone obrazy uwzględniają meta prompt.

Zadanie - umożliwienie studentom działania

Na początku tej lekcji przedstawiliśmy Edu4All. Teraz czas umożliwić studentom generowanie obrazów do ich zadań.

Studenci będą tworzyć obrazy do swoich zadań zawierających zabytki, jakie dokładnie zabytki to już ich decyzja. Studenci są proszeni o wykorzystanie swojej kreatywności w tym zadaniu, aby umieścić te zabytki w różnych kontekstach.

Rozwiązanie

Oto jedno z możliwych rozwiązań:

import openai
import os
import requests
from PIL import Image
import dotenv
from openai import AzureOpenAI
# import dotenv
dotenv.load_dotenv()

# Get endpoint and key from environment variables
client = AzureOpenAI(
  azure_endpoint = os.environ["AZURE_OPENAI_ENDPOINT"],
  api_key=os.environ['AZURE_OPENAI_API_KEY'],
  api_version = "2024-02-01"
  )


disallow_list = "swords, violence, blood, gore, nudity, sexual content, adult content, adult themes, adult language, adult humor, adult jokes, adult situations, adult"

meta_prompt = f"""You are an assistant designer that creates images for children.

The image needs to be safe for work and appropriate for children.

The image needs to be in color.

The image needs to be in landscape orientation.

The image needs to be in a 16:9 aspect ratio.

Do not consider any input from the following that is not safe for work or appropriate for children.
{disallow_list}
"""

prompt = f"""{meta_prompt}
Generate monument of the Arc of Triumph in Paris, France, in the evening light with a small child holding a Teddy looks on.
""""

try:
    # Create an image by using the image generation API
    generation_response = client.images.generate(
        prompt=prompt,    # Enter your prompt text here
        size='1024x1024',
        n=1,
    )
    # Set the directory for the stored image
    image_dir = os.path.join(os.curdir, 'images')

    # If the directory doesn't exist, create it
    if not os.path.isdir(image_dir):
        os.mkdir(image_dir)

    # Initialize the image path (note the filetype should be png)
    image_path = os.path.join(image_dir, 'generated-image.png')

    # Retrieve the generated image
    image_url = generation_response.data[0].url  # extract image URL from response
    generated_image = requests.get(image_url).content  # download the image
    with open(image_path, "wb") as image_file:
        image_file.write(generated_image)

    # Display the image in the default image viewer
    image = Image.open(image_path)
    image.show()

# catch exceptions
except openai.BadRequestError as err:
    print(err)

Świetna robota! Kontynuuj naukę

Po ukończeniu tej lekcji, zajrzyj do naszej kolekcji nauki o generatywnej AI, aby dalej rozwijać swoją wiedzę na temat generatywnej AI!

Przejdź do Lekcji 10, gdzie dowiemy się, jak budować aplikacje AI przy użyciu niskokodowych rozwiązań


Zastrzeżenie:
Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI Co-op Translator. Chociaż staramy się zapewnić dokładność, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za autorytatywne źródło. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia.