LLM — это не только генерация текста. Также можно создавать изображения на основе текстовых описаний. Использование изображений как модальности может быть очень полезным во многих сферах: от медицины и архитектуры до туризма, разработки игр и других областей. В этой главе мы рассмотрим два самых популярных модели генерации изображений — DALL-E и Midjourney.
В этом уроке мы рассмотрим:
- Генерацию изображений и её полезность.
- Что такое DALL-E и Midjourney, и как они работают.
- Как создать приложение для генерации изображений.
После прохождения этого урока вы сможете:
- Создавать приложение для генерации изображений.
- Определять границы вашего приложения с помощью мета-промптов.
- Работать с DALL-E и Midjourney.
Приложения для генерации изображений — отличный способ исследовать возможности генеративного ИИ. Их можно использовать, например, для:
-
Редактирования и синтеза изображений. Вы можете создавать изображения для разных задач, таких как редактирование и синтез.
-
Применения в различных отраслях. Их также можно использовать для создания изображений в таких сферах, как медицина, туризм, разработка игр и другие.
В рамках этого урока мы продолжим работать с нашим стартапом Edu4All. Студенты будут создавать изображения для своих заданий — какие именно, решают они сами: это могут быть иллюстрации к собственной сказке, создание нового персонажа для истории или визуализация идей и концепций.
Вот что студенты Edu4All могли бы создать, если работают в классе над темой памятников:
используя такой промпт
"Собака рядом с Эйфелевой башней на рассвете"
DALL-E и Midjourney — две из самых популярных моделей генерации изображений, которые позволяют создавать картинки по текстовым запросам.
Начнём с DALL-E — это модель генеративного ИИ, которая создаёт изображения на основе текстовых описаний.
DALL-E — это сочетание двух моделей, CLIP и diffused attention.
-
CLIP — модель, которая создаёт эмбеддинги, то есть числовые представления данных, из изображений и текста.
-
Diffused attention — модель, которая генерирует изображения из эмбеддингов. DALL-E обучена на наборе данных из изображений и текстов и может создавать картинки по текстовым описаниям. Например, DALL-E может сгенерировать изображение кота в шляпе или собаки с ирокезом.
Midjourney работает похожим образом — она создаёт изображения по текстовым промптам. Midjourney также может генерировать картинки по запросам вроде «кот в шляпе» или «собака с ирокезом».
Источник изображения: Wikipedia, создано Midjourney
Сначала о DALL-E. DALL-E — это модель генеративного ИИ на основе архитектуры трансформера с авторегрессионным трансформером.
Авторегрессионный трансформер описывает, как модель создаёт изображения из текстовых описаний: она генерирует по одному пикселю за раз, используя уже сгенерированные пиксели для создания следующего. Проходя через несколько слоёв нейронной сети, пока изображение не будет полностью сформировано.
Таким образом, DALL-E контролирует атрибуты, объекты, характеристики и другие детали создаваемого изображения. Однако DALL-E 2 и 3 обеспечивают ещё более точный контроль над результатом.
Что нужно для создания приложения генерации изображений? Вам понадобятся следующие библиотеки:
- python-dotenv — настоятельно рекомендуется использовать эту библиотеку, чтобы хранить секреты в файле .env, отдельно от кода.
- openai — библиотека для взаимодействия с OpenAI API.
- pillow — для работы с изображениями в Python.
- requests — для выполнения HTTP-запросов.
-
Создайте файл .env со следующим содержимым:
AZURE_OPENAI_ENDPOINT=<your endpoint> AZURE_OPENAI_API_KEY=<your key>Найдите эту информацию в Azure Portal для вашего ресурса в разделе «Keys and Endpoint».
-
Соберите перечисленные библиотеки в файл requirements.txt следующим образом:
python-dotenv openai pillow requests -
Затем создайте виртуальное окружение и установите библиотеки:
python3 -m venv venv source venv/bin/activate pip install -r requirements.txtДля Windows используйте следующие команды для создания и активации виртуального окружения:
python3 -m venv venv venv\Scripts\activate.bat
-
Добавьте следующий код в файл 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.
Рассмотрим пример работы температуры, выполнив этот промпт дважды:
Промпт: "Заяц на лошади, держащий леденец, на туманном лугу, где растут нарциссы"
Теперь выполним тот же промпт ещё раз, чтобы убедиться, что изображения не будут одинаковыми:
Как видите, изображения похожи, но не идентичны. Попробуем изменить значение температуры на 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
)Теперь при запуске этого кода вы получите следующие два изображения:
Здесь видно, что изображения стали гораздо более похожими друг на друга.
С нашим демо мы уже можем генерировать изображения для клиентов. Однако нам нужно задать некоторые ограничения для приложения.
Например, мы не хотим создавать изображения, которые не подходят для работы или неуместны для детей.
Это можно сделать с помощью мета-промптов. Мета-промпты — это текстовые запросы, которые используются для контроля вывода генеративной модели. Например, с их помощью можно гарантировать, что создаваемые изображения будут безопасными для работы или подходящими для детей.
Итак, как работают мета-промпты?
Мета-промпты — это текстовые запросы, которые размещаются перед основным промптом и служат для контроля вывода модели. Они встроены в приложения для управления результатом, объединяя ввод основного промпта и мета-промпта в один текстовый запрос.
Пример мета-промпта:
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. Несмотря на наши усилия по обеспечению точности, просим учитывать, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется обращаться к профессиональному человеческому переводу. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования данного перевода.





