Skip to content

Latest commit

 

History

History
477 lines (323 loc) · 27.3 KB

File metadata and controls

477 lines (323 loc) · 27.3 KB

Създаване на приложения за генериране на изображения

Създаване на приложения за генериране на изображения

LLM моделите не са само за генериране на текст. Възможно е също така да се генерират изображения от текстови описания. Използването на изображения като модалност може да бъде изключително полезно в различни области като Медицински технологии, архитектура, туризъм, разработка на игри и други. В тази глава ще разгледаме двата най-популярни модела за генериране на изображения – DALL-E и Midjourney.

Въведение

В този урок ще разгледаме:

  • Генериране на изображения и защо е полезно.
  • Какво представляват DALL-E и Midjourney и как работят.
  • Как да създадете приложение за генериране на изображения.

Цели на обучението

След завършване на този урок ще можете да:

  • Създавате приложение за генериране на изображения.
  • Определяте граници за вашето приложение с помощта на мета промпти.
  • Работите с DALL-E и Midjourney.

Защо да създавате приложение за генериране на изображения?

Приложенията за генериране на изображения са отличен начин да изследвате възможностите на Генеративния AI. Те могат да се използват, например, за:

  • Редактиране и синтез на изображения. Можете да генерирате изображения за различни случаи на употреба, като редактиране и синтез на изображения.

  • Приложение в различни индустрии. Те могат да се използват за създаване на изображения в различни индустрии като Медицински технологии, Туризъм, Разработка на игри и други.

Сценарий: Edu4All

В рамките на този урок ще продължим да работим със стартиращата ни компания Edu4All. Учениците ще създават изображения за своите оценки – какви точно изображения зависи от тях, но това могат да бъдат илюстрации за собствена приказка, нов герой за тяхната история или помощ за визуализиране на идеи и концепции.

Ето какво биха могли да създадат учениците на Edu4All, ако работят в час по темата за паметници:

Edu4All startup, class on monuments, Eiffel Tower

с помощта на промпт като

"Куче до Айфеловата кула в ранна сутрешна светлина"

Какво са DALL-E и Midjourney?

DALL-E и Midjourney са два от най-популярните модела за генериране на изображения, които позволяват използването на промпти за създаване на изображения.

DALL-E

Нека започнем с DALL-E, който е генеративен AI модел, създаващ изображения от текстови описания.

DALL-E е комбинация от два модела – CLIP и diffused attention.

  • CLIP е модел, който създава вграждания (embeddings) – числови представяния на данни – от изображения и текст.

  • Diffused attention е модел, който генерира изображения от тези вграждания. DALL-E е обучен върху набор от изображения и текст и може да се използва за създаване на изображения от текстови описания. Например, DALL-E може да генерира изображения на котка с шапка или куче с ирокез.

Midjourney

Midjourney работи по подобен начин на DALL-E – генерира изображения от текстови промпти. Midjourney също може да създава изображения с промпти като „котка с шапка“ или „куче с ирокез“.

Изображение, генерирано от Midjourney, механичен гълъб
Източник: Wikipedia, изображение, генерирано от Midjourney

Как работят DALL-E и Midjourney

Първо, DALL-E. DALL-E е генеративен AI модел, базиран на архитектурата на трансформър с авторегресивен трансформър.

Авторегресивният трансформър определя как моделът генерира изображения от текстови описания – той създава по един пиксел наведнъж и използва вече генерираните пиксели, за да създаде следващия. Процесът преминава през множество слоеве в невронна мрежа, докато изображението е завършено.

С този процес DALL-E контролира атрибути, обекти, характеристики и други в генерираното изображение. Въпреки това, DALL-E 2 и 3 предлагат по-голям контрол върху генерираното изображение.

Създаване на първото ви приложение за генериране на изображения

Какво е необходимо, за да създадете приложение за генериране на изображения? Трябват ви следните библиотеки:

  • python-dotenv – силно препоръчително е да използвате тази библиотека, за да съхранявате тайните си в .env файл, отделен от кода.
  • openai – тази библиотека ще използвате за взаимодействие с OpenAI API.
  • pillow – за работа с изображения в Python.
  • requests – за изпращане на HTTP заявки.
  1. Създайте файл .env със следното съдържание:

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

    Намерете тази информация в Azure Portal за вашия ресурс в секцията „Keys and Endpoint“.

  2. Съберете горните библиотеки в файл с име requirements.txt по следния начин:

    python-dotenv
    openai
    pillow
    requests
    
  3. След това създайте виртуална среда и инсталирайте библиотеките:

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

    За Windows използвайте следните команди за създаване и активиране на виртуалната среда:

    python3 -m venv venv
    venv\Scripts\activate.bat
  4. Добавете следния код във файл с име 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)

Нека обясним този код:

  • Първо импортираме необходимите библиотеки, включително OpenAI, dotenv, requests и Pillow.

    import openai
    import os
    import requests
    from PIL import Image
    import dotenv
  • След това зареждаме променливите на средата от .env файла.

    # import dotenv
    dotenv.load_dotenv()
  • След това задаваме endpoint, ключ за OpenAI API, версия и тип.

    # 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'
  • След това генерираме изображението:

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

    Горният код връща JSON обект, съдържащ URL адреса на генерираното изображение. Можем да използваме този URL, за да изтеглим изображението и да го запишем във файл.

  • Накрая отваряме изображението и използваме стандартен преглед на изображения, за да го покажем:

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

Повече подробности за генерирането на изображението

Нека разгледаме кода за генериране на изображението по-подробно:

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 е текстовият промпт, използван за генериране на изображението. В този случай използваме промпта „Зайче на кон, държащо близалка, на мъглива поляна, където растат нарциси“.
  • size е размерът на генерираното изображение. В този случай генерираме изображение с размер 1024x1024 пиксела.
  • n е броят на генерираните изображения. В този случай генерираме две изображения.
  • temperature е параметър, който контролира случайността на изхода на генеративния AI модел. Температурата е стойност между 0 и 1, където 0 означава детерминиран изход, а 1 – случаен. По подразбиране е 0.7.

Има още неща, които можете да правите с изображения, които ще разгледаме в следващия раздел.

Допълнителни възможности при генериране на изображения

Вече видяхте как с няколко реда Python код успяхме да генерираме изображение. Но има още възможности с изображенията.

Можете също така да:

  • Правите редакции. Като предоставите съществуващо изображение, маска и промпт, можете да променяте изображението. Например, можете да добавите нещо в част от изображението. Представете си нашето зайче – можете да му добавите шапка. Това става като подадете изображението, маска (определяща зоната за промяна) и текстов промпт, описващ какво трябва да се направи.

    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']

    Основното изображение съдържа само зайчето, но крайното изображение ще има шапка на зайчето.

  • Създавате вариации. Идеята е да вземете съществуващо изображение и да поискате да се създадат вариации. За да създадете вариация, подавате изображение и текстов промпт и използвате код като този:

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

    Забележка: това се поддържа само в OpenAI

Температура

Температурата е параметър, който контролира случайността на изхода на генеративен AI модел. Стойността е между 0 и 1, където 0 означава детерминиран изход, а 1 – случаен. По подразбиране е 0.7.

Нека видим пример как работи температурата, като изпълним този промпт два пъти:

Промпт: "Зайче на кон, държащо близалка, на мъглива поляна, където растат нарциси"

Зайче на кон, държащо близалка, версия 1

Сега нека изпълним същия промпт отново, за да видим, че няма да получим същото изображение два пъти:

Генерирано изображение на зайче на кон

Както виждате, изображенията са сходни, но не еднакви. Нека опитаме да променим стойността на температурата на 0.1 и да видим какво ще се случи:

 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
    )

Промяна на температурата

Нека опитаме да направим отговора по-детерминиран. От двете генерирани изображения видяхме, че в първото има зайче, а във второто – кон, така че изображенията се различават значително.

Затова нека променим кода и зададем температурата на 0, както следва:

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
    )

Сега, когато изпълните този код, ще получите тези две изображения:

  • Температура 0, версия 1
  • Температура 0, версия 2

Тук ясно се вижда, че изображенията са много по-подобни.

Как да определите граници за вашето приложение с мета промпти

С нашето демо вече можем да генерираме изображения за нашите клиенти. Въпреки това, трябва да създадем някои граници за приложението.

Например, не искаме да генерираме изображения, които не са подходящи за работна среда или за деца.

Това може да се направи с помощта на мета промпти. Мета промптите са текстови промпти, използвани за контролиране на изхода на генеративен AI модел. Например, можем да използваме мета промпти, за да гарантираме, че генерираните изображения са безопасни за работна среда или подходящи за деца.

Как работи това?

Как работят мета промптите?

Мета промптите са текстови промпти, които се поставят преди основния текстов промпт и служат за контролиране на изхода на модела. Те се вграждат в приложенията, за да управляват резултатите от модела, като обединяват входа на основния промпт и мета промпта в един текстов промпт.

Един пример за мета промпт е следният:

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)

Сега нека видим как можем да използваме мета промпти в нашето демо.

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

От горния промпт се вижда как всички генерирани изображения вземат предвид мета промпта.

Задача – нека дадем възможност на учениците

В началото на урока представихме Edu4All. Сега е време да дадем възможност на учениците да генерират изображения за своите оценки.

Учениците ще създават изображения, съдържащи паметници – кои точно паметници зависи от тях. Те са насърчени да използват креативността си, за да поставят тези паметници в различни контексти.

Решение

Ето едно възможно решение:

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)

Отлична работа! Продължете обучението си

След като завършите този урок, разгледайте нашата колекция за обучение по Генеративен AI, за да продължите да развивате знанията си в областта на Генеративния AI!

Преминете към Урок 10, където ще разгледаме как да създавате AI приложения с нисък код

Отказ от отговорност:
Този документ е преведен с помощта на AI преводаческа услуга Co-op Translator. Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи могат да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или неправилни тълкувания, произтичащи от използването на този превод.