Skip to content

Latest commit

 

History

History
477 lines (323 loc) · 19.6 KB

File metadata and controls

477 lines (323 loc) · 19.6 KB

Tvorba aplikací pro generování obrázků

Tvorba aplikací pro generování obrázků

LLM nejsou jen o generování textu. Je také možné generovat obrázky z textových popisů. Obrázky jako modalita mohou být velmi užitečné v mnoha oblastech, od MedTechu, architektury, turismu, vývoje her a dalších. V této kapitole se podíváme na dva nejoblíbenější modely pro generování obrázků, DALL-E a Midjourney.

Úvod

V této lekci se budeme věnovat:

  • Generování obrázků a proč je užitečné.
  • DALL-E a Midjourney, co to jsou a jak fungují.
  • Jak vytvořit aplikaci pro generování obrázků.

Cíle učení

Po dokončení této lekce budete schopni:

  • Vytvořit aplikaci pro generování obrázků.
  • Definovat hranice vaší aplikace pomocí metapromptů.
  • Pracovat s DALL-E a Midjourney.

Proč vytvářet aplikaci pro generování obrázků?

Aplikace pro generování obrázků jsou skvělým způsobem, jak prozkoumat možnosti Generativní AI. Mohou být využity například pro:

  • Úpravu a syntézu obrázků. Můžete generovat obrázky pro různé účely, jako je úprava obrázků nebo jejich syntéza.

  • Použití v různých odvětvích. Mohou být také použity k vytváření obrázků pro různá odvětví, jako je Medtech, turismus, vývoj her a další.

Scénář: Edu4All

V rámci této lekce budeme pokračovat v práci s naším startupem Edu4All. Studenti budou vytvářet obrázky pro své úkoly, jaké přesně obrázky, to záleží na nich – mohou to být ilustrace k jejich vlastní pohádce, vytvoření nové postavy pro jejich příběh nebo pomoc s vizualizací jejich nápadů a konceptů.

Tady je příklad, co by studenti Edu4All mohli vytvořit, pokud pracují ve třídě na památkách:

Edu4All startup, třída o památkách, Eiffelova věž

pomocí promptu

"Pes vedle Eiffelovy věže v ranním slunečním světle"

Co je DALL-E a Midjourney?

DALL-E a Midjourney jsou dva z nejpopulárnějších modelů pro generování obrázků, které umožňují generovat obrázky na základě textových promptů.

DALL-E

Začněme s DALL-E, což je model Generativní AI, který vytváří obrázky z textových popisů.

DALL-E je kombinací dvou modelů, CLIP a diffused attention.

  • CLIP je model, který vytváří embeddingy, tedy číselné reprezentace dat, z obrázků a textu.

  • Diffused attention je model, který generuje obrázky z embeddingů. DALL-E je trénován na datech obsahujících obrázky a text a může být použit k vytváření obrázků na základě textových popisů. Například DALL-E může vytvořit obrázek kočky v klobouku nebo psa s mohawkem.

Midjourney

Midjourney funguje podobně jako DALL-E, generuje obrázky z textových promptů. Midjourney lze také použít k vytvoření obrázků na základě promptů jako „kočka v klobouku“ nebo „pes s mohawkem“.

Obrázek vytvořený Midjourney, mechanický holub Obrázek z Wikipedie, vytvořeno Midjourney

Jak fungují DALL-E a Midjourney

Nejprve DALL-E. DALL-E je model Generativní AI založený na architektuře transformeru s autoregresivním transformerem.

Autoregresivní transformer určuje, jak model generuje obrázky z textových popisů – generuje jeden pixel po druhém a využívá již vygenerované pixely k vytvoření dalších. Prochází přitom několika vrstvami neuronové sítě, dokud není obrázek kompletní.

Tímto způsobem DALL-E ovládá atributy, objekty, charakteristiky a další prvky v generovaném obrázku. Nicméně DALL-E 2 a 3 mají nad generovaným obrázkem ještě větší kontrolu.

Vytvoření první aplikace pro generování obrázků

Co je potřeba k vytvoření aplikace pro generování obrázků? Budete potřebovat následující knihovny:

  • python-dotenv, doporučujeme tuto knihovnu pro uchování vašich tajných klíčů v souboru .env mimo kód.
  • openai, tato knihovna slouží k interakci s OpenAI API.
  • pillow, pro práci s obrázky v Pythonu.
  • requests, pro usnadnění HTTP požadavků.
  1. Vytvořte soubor .env s následujícím obsahem:

    AZURE_OPENAI_ENDPOINT=<your endpoint>
    AZURE_OPENAI_API_KEY=<your key>
    

    Tyto informace najdete v Azure Portálu u vašeho zdroje v sekci „Keys and Endpoint“.

  2. Vytvořte soubor requirements.txt s následujícím obsahem:

    python-dotenv
    openai
    pillow
    requests
    
  3. Vytvořte virtuální prostředí a nainstalujte knihovny:

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

    Pro Windows použijte tyto příkazy k vytvoření a aktivaci virtuálního prostředí:

    python3 -m venv venv
    venv\Scripts\activate.bat
  4. Přidejte následující kód do souboru app.py:

    import openai
    import os
    import requests
    from PIL import Image
    import dotenv
    
    # import dotenv
    dotenv.load_dotenv()
    
    # Get endpoint and key from environment variables
    openai.api_base = os.environ['AZURE_OPENAI_ENDPOINT']
    openai.api_key = os.environ['AZURE_OPENAI_API_KEY']
    
    # Assign the API version (DALL-E is currently supported for the 2023-06-01-preview API version only)
    openai.api_version = '2023-06-01-preview'
    openai.api_type = 'azure'
    
    
    try:
        # Create an image by using the image generation API
        generation_response = openai.Image.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,
        )
        # 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)

Vysvětlíme si tento kód:

  • Nejprve importujeme potřebné knihovny, včetně OpenAI, dotenv, requests a Pillow.

    import openai
    import os
    import requests
    from PIL import Image
    import dotenv
  • Poté načteme proměnné prostředí ze souboru .env.

    # import dotenv
    dotenv.load_dotenv()
  • Následně nastavíme endpoint, klíč pro OpenAI API, verzi a typ.

    # Get endpoint and key from environment variables
    openai.api_base = os.environ['AZURE_OPENAI_ENDPOINT']
    openai.api_key = os.environ['AZURE_OPENAI_API_KEY']
    
    # add version and type, Azure specific
    openai.api_version = '2023-06-01-preview'
    openai.api_type = 'azure'
  • Dále generujeme obrázek:

    # Create an image by using the image generation API
    generation_response = openai.Image.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,
    )

    Výše uvedený kód vrací JSON objekt obsahující URL vygenerovaného obrázku. Tuto URL můžeme použít ke stažení obrázku a jeho uložení do souboru.

  • Nakonec otevřeme obrázek a zobrazíme ho pomocí standardního prohlížeče obrázků:

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

Podrobnější pohled na generování obrázku

Podívejme se podrobněji na kód, který generuje obrázek:

generation_response = openai.Image.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,
    )
  • prompt je textový prompt, který se používá k vytvoření obrázku. V tomto případě používáme prompt „Zajíček na koni, držící lízátko, na mlhavé louce, kde rostou narcisy“.
  • size je velikost generovaného obrázku. V tomto případě generujeme obrázek o rozměrech 1024x1024 pixelů.
  • n je počet generovaných obrázků. V tomto případě generujeme dva obrázky.
  • temperature je parametr, který ovlivňuje náhodnost výstupu modelu Generativní AI. Hodnota teploty je mezi 0 a 1, kde 0 znamená deterministický výstup a 1 náhodný výstup. Výchozí hodnota je 0,7.

Existuje ještě více možností, co s obrázky dělat, o tom si povíme v další části.

Další možnosti generování obrázků

Už jste viděli, jak jsme pomocí pár řádků v Pythonu vytvořili obrázek. Ale existuje i další možnosti práce s obrázky.

Můžete také:

  • Provádět úpravy. Poskytnutím existujícího obrázku, masky a promptu můžete obrázek upravit. Například můžete přidat něco do určité části obrázku. Představte si náš obrázek se zajíčkem, můžete mu přidat klobouk. Jak na to? Poskytnete obrázek, masku (která označuje oblast pro změnu) a textový prompt, co se má udělat.

    response = openai.Image.create_edit(
      image=open("base_image.png", "rb"),
      mask=open("mask.png", "rb"),
      prompt="An image of a rabbit with a hat on its head.",
      n=1,
      size="1024x1024"
    )
    image_url = response['data'][0]['url']

    Základní obrázek by obsahoval pouze zajíčka, ale finální obrázek by měl klobouk na zajíčkovi.

  • Vytvářet variace. Myšlenka je, že vezmete existující obrázek a požádáte o vytvoření jeho variací. Pro vytvoření variace poskytnete obrázek a textový prompt a použijete kód jako tento:

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

    Poznámka: tato funkce je podporována pouze v OpenAI.

Teplota (Temperature)

Teplota je parametr, který ovlivňuje náhodnost výstupu modelu Generativní AI. Hodnota teploty je mezi 0 a 1, kde 0 znamená deterministický výstup a 1 náhodný výstup. Výchozí hodnota je 0,7.

Podívejme se na příklad, jak teplota funguje, když spustíme tento prompt dvakrát:

Prompt: „Zajíček na koni, držící lízátko, na mlhavé louce, kde rostou narcisy“

Zajíček na koni držící lízátko, verze 1

Nyní spustíme stejný prompt znovu, abychom viděli, že nedostaneme stejný obrázek dvakrát:

Vygenerovaný obrázek zajíčka na koni

Jak vidíte, obrázky jsou podobné, ale ne stejné. Zkusme změnit hodnotu teploty na 0,1 a uvidíme, co se stane:

 generation_response = openai.Image.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
    )

Změna teploty

Zkusme tedy udělat odpověď více deterministickou. Z obrázků, které jsme vytvořili, vidíme, že na prvním je zajíček a na druhém kůň, takže se obrázky výrazně liší.

Proto změníme náš kód a nastavíme teplotu na 0, takto:

generation_response = openai.Image.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
    )

Když teď tento kód spustíte, dostanete tyto dva obrázky:

  • Teplota 0, verze 1
  • Teplota 0, verze 2

Zde je jasně vidět, že obrázky jsou si mnohem podobnější.

Jak definovat hranice vaší aplikace pomocí metapromptů

S naší ukázkou už můžeme generovat obrázky pro naše klienty. Nicméně je potřeba nastavit určité hranice pro naši aplikaci.

Například nechceme generovat obrázky, které nejsou vhodné pro práci (NSFW) nebo nejsou vhodné pro děti.

To můžeme udělat pomocí metapromptů. Metaprompt jsou textové prompt, které slouží k řízení výstupu modelu Generativní AI. Například můžeme metaprompt použít k zajištění, že generované obrázky jsou bezpečné pro práci nebo vhodné pro děti.

Jak to funguje?

Jak tedy metaprompt fungují?

Metaprompt jsou textové prompt, které se používají k řízení výstupu modelu Generativní AI, umisťují se před hlavní textový prompt a slouží k řízení výstupu modelu. Jsou integrovány do aplikací, aby kontrolovaly výstup modelu. Vstupní prompt a metaprompt jsou spojeny do jednoho textového promptu.

Příklad metaprompt může vypadat takto:

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)

Podívejme se nyní, jak můžeme metaprompt použít v naší ukázce.

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 výše uvedeného promptu vidíte, že všechny generované obrázky berou v úvahu metaprompt.

Zadání – umožněme studentům tvořit

Na začátku lekce jsme představili Edu4All. Nyní je čas umožnit studentům generovat obrázky pro jejich úkoly.

Studenti budou vytvářet obrázky obsahující památky, jaké přesně památky, to je na nich. Studenti mají v tomto úkolu využít svou kreativitu a umístit tyto památky do různých kontextů.

Řešení

Tady je jedno možné řešení:

import openai
import os
import requests
from PIL import Image
import dotenv

# import dotenv
dotenv.load_dotenv()

# Get endpoint and key from environment variables
openai.api_base = "<replace with endpoint>"
openai.api_key = "<replace with api key>"

# Assign the API version (DALL-E is currently supported for the 2023-06-01-preview API version only)
openai.api_version = '2023-06-01-preview'
openai.api_type = 'azure'

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 = openai.Image.create(
        prompt=prompt,    # Enter your prompt text here
        size='1024x1024',
        n=2,
        temperature=0,
    )
    # 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)

Skvělá práce! Pokračujte ve svém vzdělávání

Po dokončení této lekce si prohlédněte naši kolekci Generativní AI a pokračujte v rozšiřování svých znalostí o Generativní AI!

Přejděte na Lekci 10, kde se podíváme, jak vytvářet AI aplikace s nízkým kódem

Prohlášení o vyloučení odpovědnosti:
Tento dokument byl přeložen pomocí AI překladatelské služby Co-op Translator. I když usilujeme o přesnost, mějte prosím na paměti, že automatizované překlady mohou obsahovat chyby nebo nepřesnosti. Původní dokument v jeho mateřském jazyce by měl být považován za závazný zdroj. Pro důležité informace se doporučuje profesionální lidský překlad. Nejsme odpovědní za jakékoliv nedorozumění nebo nesprávné výklady vyplývající z použití tohoto překladu.