LLM — це не лише генерація тексту. Також можливо створювати зображення на основі текстових описів. Використання зображень як модальності може бути дуже корисним у багатьох сферах: від медичних технологій, архітектури, туризму, розробки ігор і не тільки. У цьому розділі ми розглянемо дві найпопулярніші моделі генерації зображень — DALL-E та Midjourney.
У цьому уроці ми розглянемо:
- Генерацію зображень і чому це корисно.
- DALL-E та Midjourney: що це таке і як вони працюють.
- Як створити додаток для генерації зображень.
Після проходження цього уроку ви зможете:
- Створити додаток для генерації зображень.
- Визначати межі вашого додатку за допомогою мета-промптів.
- Працювати з DALL-E та Midjourney.
Додатки для генерації зображень — це чудовий спосіб дослідити можливості генеративного ШІ. Вони можуть бути використані, наприклад, для:
-
Редагування та синтезу зображень. Ви можете створювати зображення для різних випадків використання, таких як редагування чи синтез зображень.
-
Застосування у різних галузях. Їх також можна використовувати для створення зображень у різних сферах, таких як медичні технології, туризм, розробка ігор тощо.
У рамках цього уроку ми продовжимо працювати з нашим стартапом Edu4All. Студенти створюватимуть зображення для своїх завдань. Які саме — вирішують вони самі: це можуть бути ілюстрації до власної казки, створення нового персонажа для історії або допомога у візуалізації ідей та концепцій.
Ось що, наприклад, могли б створити студенти Edu4All, якщо вони працюють у класі над пам’ятками:
використовуючи промпт
"Собака біля Ейфелевої вежі на ранковому сонці"
DALL-E та Midjourney — дві з найпопулярніших моделей генерації зображень, які дозволяють створювати зображення за допомогою текстових промптів.
Почнемо з DALL-E — це модель генеративного ШІ, яка створює зображення на основі текстових описів.
DALL-E — це поєднання двох моделей, CLIP та diffused attention.
-
CLIP — модель, яка створює вбудовування (embedding), тобто числові представлення даних, зображень і тексту.
-
Diffused attention — модель, яка генерує зображення на основі цих вбудовувань. DALL-E навчається на наборі даних із зображень і тексту і може створювати зображення за текстовими описами. Наприклад, DALL-E може створити зображення кота в капелюсі або собаки з ірокезом.
Midjourney працює схожим чином на DALL-E — генерує зображення за текстовими промптами. 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.
Розглянемо приклад роботи температури, запустивши цей промпт двічі:
Промпт: "Кролик на коні, тримає льодяник, на туманному лузі, де ростуть нарциси"
Тепер запустимо той самий промпт ще раз, щоб побачити, що зображення не будуть однаковими:
Як бачите, зображення схожі, але не однакові. Спробуємо змінити значення temperature на 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
)Спробуємо зробити відповідь більш детермінованою. З двох згенерованих зображень видно, що на першому — кролик, а на другому — кінь, тобто зображення суттєво відрізняються.
Тож змінимо код і встановимо temperature в 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
)Тепер, коли ви запустите цей код, отримаєте такі два зображення:
Тут чітко видно, що зображення стали більш схожими.
У нашому демо ми вже можемо генерувати зображення для клієнтів. Проте нам потрібно встановити певні межі для додатку.
Наприклад, ми не хочемо створювати зображення, які не підходять для роботи (NSFW) або неприйнятні для дітей.
Цього можна досягти за допомогою мета-промптів. Мета-промпти — це текстові промпти, які використовуються для контролю результату генеративної моделі. Наприклад, ми можемо використовувати мета-промпти, щоб гарантувати, що створені зображення будуть безпечними для роботи або підходящими для дітей.
Як працюють мета-промпти?
Мета-промпти — це текстові промпти, які розміщуються перед основним текстовим промптом і використовуються для контролю результату моделі. Вони вбудовуються в додатки для контролю виходу моделі, об’єднуючи вхідний промпт і мета-промпт в один текстовий запит.
Ось приклад мета-промпта:
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-додатки з мінімальним кодуванням
Відмова від відповідальності:
Цей документ було перекладено за допомогою сервісу автоматичного перекладу Co-op Translator. Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ рідною мовою слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується звертатися до професійного людського перекладу. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу.





