Skip to content

Latest commit

 

History

History
487 lines (333 loc) · 28.9 KB

File metadata and controls

487 lines (333 loc) · 28.9 KB

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

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

Генеративные языковые модели (LLM) могут не только создавать текст. С их помощью также можно генерировать изображения на основе текстовых описаний. Наличие изображений как модальности может быть крайне полезным в таких областях, как медицинские технологии, архитектура, туризм, разработка игр и многое другое. В этой главе мы рассмотрим две самые популярные модели генерации изображений: DALL-E и Midjourney.

Введение

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

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

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

После завершения урока вы сможете:

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

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

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

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

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

Сценарий: Edu4All

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

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

Стартап Edu4All, класс о памятниках, Эйфелева башня

используя подсказку, например:

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

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

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

DALL-E

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

DALL-E — это комбинация двух моделей: CLIP и diffused attention.

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

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

Midjourney

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

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

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

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

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

С помощью этого процесса DALL-E контролирует атрибуты, объекты, характеристики и многое другое в создаваемом изображении. Однако DALL-E 2 и 3 обеспечивают больший контроль над созданным изображением.

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

Что нужно для создания приложения для генерации изображений? Вам понадобятся следующие библиотеки:

  • python-dotenv — настоятельно рекомендуется использовать эту библиотеку для хранения секретов в файле .env отдельно от кода.
  • openai — библиотека для взаимодействия с API OpenAI.
  • pillow — для работы с изображениями в Python.
  • requests — для выполнения HTTP-запросов.

Создание и развертывание модели Azure OpenAI

Если вы еще не сделали этого, следуйте инструкциям на странице Microsoft Learn, чтобы создать ресурс и модель Azure OpenAI. Выберите модель DALL-E 3.

Создание приложения

  1. Создайте файл .env со следующим содержимым:

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

    Найдите эту информацию в портале Azure OpenAI Foundry для вашего ресурса в разделе "Deployments".

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

Объясним этот код:

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

    import openai
    import os
    import requests
    from PIL import Image
    import dotenv
  • Затем мы загружаем переменные окружения из файла .env.

    # import dotenv
    dotenv.load_dotenv()
  • После этого мы настраиваем клиент службы 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"
        )
  • Далее мы генерируем изображение:

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

    Код выше возвращает JSON-объект, содержащий URL созданного изображения. Мы можем использовать этот URL для загрузки изображения и сохранения его в файл.

  • Наконец, мы открываем изображение и используем стандартный просмотрщик изображений для его отображения:

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

Подробнее о генерации изображения

Рассмотрим код, который генерирует изображение, более подробно:

  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 — текстовая подсказка, используемая для генерации изображения. В данном случае мы используем подсказку "Кролик на лошади, держащий леденец, на туманном лугу, где растут нарциссы".
  • size — размер создаваемого изображения. В данном случае мы создаем изображение размером 1024x1024 пикселей.
  • n — количество создаваемых изображений. В данном случае мы создаем два изображения.
  • temperature — параметр, контролирующий случайность вывода генеративной модели ИИ. Температура — это значение от 0 до 1, где 0 означает детерминированный вывод, а 1 — случайный. Значение по умолчанию — 0.7.

Есть и другие возможности работы с изображениями, которые мы рассмотрим в следующем разделе.

Дополнительные возможности генерации изображений

Вы уже видели, как можно создать изображение с помощью нескольких строк кода на Python. Однако есть и другие возможности работы с изображениями.

Вы также можете:

  • Редактировать изображения. Предоставив существующее изображение, маску и подсказку, вы можете изменить изображение. Например, вы можете добавить что-то на определенную часть изображения. Представьте наше изображение с кроликом: вы можете добавить шляпу кролику. Для этого нужно предоставить изображение, маску (определяющую область для изменения) и текстовую подсказку, описывающую, что должно быть сделано.

Примечание: это не поддерживается в DALL-E 3.

Вот пример с использованием 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

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

  • Создавать вариации. Идея заключается в том, чтобы взять существующее изображение и попросить создать его вариации. Для создания вариации нужно предоставить изображение и текстовую подсказку, а также использовать код, например:

    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 = 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
    )

Изменение температуры

Попробуем сделать вывод более детерминированным. Мы могли наблюдать, что на первом изображении есть кролик, а на втором — лошадь, так что изображения сильно различаются.

Изменим наш код и установим температуру на 0, как показано ниже:

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
    )

Теперь, запустив этот код, вы получите следующие два изображения:

  • Температура 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
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)

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

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

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


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