Skip to content

Latest commit

 

History

History
487 lines (333 loc) · 28.4 KB

File metadata and controls

487 lines (333 loc) · 28.4 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 та розсіяної уваги.

  • CLIP — це модель, яка створює векторні представлення даних з зображень та тексту.

  • Розсіяна увага — це модель, яка створює зображення з векторних представлень. DALL-E навчена на наборі даних зображень та тексту і може бути використана для створення зображень на основі текстових описів. Наприклад, DALL-E може створити зображення кота в капелюсі або собаки з ірокезом.

Midjourney

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

Зображення, створене Midjourney, механічний голуб Автор зображення: Вікіпедія, зображення створене 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 Portal для вашого ресурсу в розділі "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, v1
  • Температура 0, v2

Тут ви чітко бачите, як зображення більше схожі одне на одного.

Як визначити межі для вашого додатка за допомогою метапідказок

З нашим демо ми вже можемо створювати зображення для наших клієнтів. Однак нам потрібно створити деякі межі для нашого додатка.

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

Ми можемо зробити це за допомогою метапідказок. Метапідказки — це текстові підказки, які використовуються для контролю результату генеративної моделі штучного інтелекту. Наприклад, ми можемо використовувати метапідказки для контролю результату та забезпечення того, щоб створені зображення були безпечними для роботи або підходили для дітей.

Як це працює?

Як працюють метапідказки?

Метапідказки — це текстові підказки, які використовуються для контролю результату генеративної моделі штучного інтелекту. Вони розташовані перед текстовою підказкою і використовуються для контролю результату моделі, вбудовуючись у додатки для контролю результату моделі. Інкапсулюючи введення підказки та введення метапідказки в одну текстову підказку.

Один приклад метапідказки може виглядати так:

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, де ми розглянемо, як створювати AI-додатки за допомогою low-code


Відмова від відповідальності:
Цей документ був перекладений за допомогою сервісу автоматичного перекладу Co-op Translator. Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу.