Skip to content

Latest commit

 

History

History
477 lines (323 loc) · 26.7 KB

File metadata and controls

477 lines (323 loc) · 26.7 KB

Создание приложений для генерации изображений

Создание приложений для генерации изображений

LLM — это не только генерация текста. Также можно создавать изображения на основе текстовых описаний. Использование изображений как модальности может быть очень полезным во многих сферах: от медицины и архитектуры до туризма, разработки игр и других областей. В этой главе мы рассмотрим два самых популярных модели генерации изображений — DALL-E и Midjourney.

Введение

В этом уроке мы рассмотрим:

  • Генерацию изображений и её полезность.
  • Что такое DALL-E и Midjourney, и как они работают.
  • Как создать приложение для генерации изображений.

Цели обучения

После прохождения этого урока вы сможете:

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

Зачем создавать приложение для генерации изображений?

Приложения для генерации изображений — отличный способ исследовать возможности генеративного ИИ. Их можно использовать, например, для:

  • Редактирования и синтеза изображений. Вы можете создавать изображения для разных задач, таких как редактирование и синтез.

  • Применения в различных отраслях. Их также можно использовать для создания изображений в таких сферах, как медицина, туризм, разработка игр и другие.

Сценарий: Edu4All

В рамках этого урока мы продолжим работать с нашим стартапом Edu4All. Студенты будут создавать изображения для своих заданий — какие именно, решают они сами: это могут быть иллюстрации к собственной сказке, создание нового персонажа для истории или визуализация идей и концепций.

Вот что студенты Edu4All могли бы создать, если работают в классе над темой памятников:

Edu4All startup, class on monuments, Eiffel Tower

используя такой промпт

"Собака рядом с Эйфелевой башней на рассвете"

Что такое DALL-E и Midjourney?

DALL-E и Midjourney — две из самых популярных моделей генерации изображений, которые позволяют создавать картинки по текстовым запросам.

DALL-E

Начнём с DALL-E — это модель генеративного ИИ, которая создаёт изображения на основе текстовых описаний.

DALL-E — это сочетание двух моделей, CLIP и diffused attention.

  • CLIP — модель, которая создаёт эмбеддинги, то есть числовые представления данных, из изображений и текста.

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

Midjourney

Midjourney работает похожим образом — она создаёт изображения по текстовым промптам. Midjourney также может генерировать картинки по запросам вроде «кот в шляпе» или «собака с ирокезом».

Изображение, созданное Midjourney, механический голубь Источник изображения: Wikipedia, создано Midjourney

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

Сначала о DALL-E. DALL-E — это модель генеративного ИИ на основе архитектуры трансформера с авторегрессионным трансформером.

Авторегрессионный трансформер описывает, как модель создаёт изображения из текстовых описаний: она генерирует по одному пикселю за раз, используя уже сгенерированные пиксели для создания следующего. Проходя через несколько слоёв нейронной сети, пока изображение не будет полностью сформировано.

Таким образом, 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 — параметр, контролирующий случайность результата генеративной модели. Значение от 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.

Температура

Температура — параметр, который регулирует случайность результата генеративной модели. Значение от 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

Здесь видно, что изображения стали гораздо более похожими друг на друга.

Как определить границы для вашего приложения с помощью мета-промптов

С нашим демо мы уже можем генерировать изображения для клиентов. Однако нам нужно задать некоторые ограничения для приложения.

Например, мы не хотим создавать изображения, которые не подходят для работы или неуместны для детей.

Это можно сделать с помощью мета-промптов. Мета-промпты — это текстовые запросы, которые используются для контроля вывода генеративной модели. Например, с их помощью можно гарантировать, что создаваемые изображения будут безопасными для работы или подходящими для детей.

Как это работает?

Итак, как работают мета-промпты?

Мета-промпты — это текстовые запросы, которые размещаются перед основным промптом и служат для контроля вывода модели. Они встроены в приложения для управления результатом, объединяя ввод основного промпта и мета-промпта в один текстовый запрос.

Пример мета-промпта:

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)

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

После прохождения этого урока ознакомьтесь с нашей коллекцией по генеративному ИИ, чтобы продолжить развивать свои знания в области генеративного ИИ!

Переходите к уроку 10, где мы рассмотрим, как создавать AI-приложения с помощью low-code

Отказ от ответственности:
Этот документ был переведен с помощью сервиса автоматического перевода Co-op Translator. Несмотря на наши усилия по обеспечению точности, просим учитывать, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется обращаться к профессиональному человеческому переводу. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования данного перевода.