Skip to content

Latest commit

 

History

History
487 lines (333 loc) · 29.1 KB

File metadata and controls

487 lines (333 loc) · 29.1 KB

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

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

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

Въведение

В този урок ще разгледаме:

  • Генериране на изображения и защо е полезно.
  • DALL-E и Midjourney – какво представляват и как работят.
  • Как да създадете приложение за генериране на изображения.

Цели на обучението

След завършване на този урок ще можете:

  • Да създадете приложение за генериране на изображения.
  • Да дефинирате граници за вашето приложение с помощта на мета промптове.
  • Да работите с DALL-E и Midjourney.

Защо да създадем приложение за генериране на изображения?

Приложенията за генериране на изображения са чудесен начин да изследвате възможностите на Генеративния AI. Те могат да се използват например за:

  • Редактиране и синтез на изображения. Можете да генерирате изображения за различни случаи на употреба, като редактиране и синтез на изображения.

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

Сценарий: Edu4All

Като част от този урок ще продължим да работим с нашия стартъп Edu4All. Учениците ще създават изображения за своите задачи – какви точно изображения зависи от тях, но те могат да бъдат илюстрации за собствена приказка, нов герой за тяхната история или визуализация на идеи и концепции.

Ето какво биха могли да генерират учениците на Edu4All, ако работят в клас върху паметници:

Стартъп Edu4All, клас за паметници, Айфеловата кула

с помощта на промпт като:

"Куче до Айфеловата кула в ранна утринна светлина"

Какво представляват DALL-E и Midjourney?

DALL-E и Midjourney са два от най-популярните модели за генериране на изображения, които позволяват използването на промптове за създаване на изображения.

DALL-E

Да започнем с DALL-E, който е генеративен AI модел, създаващ изображения от текстови описания.

DALL-E е комбинация от два модела – CLIP и дифузно внимание.

  • CLIP е модел, който генерира ембединг (числови представяния на данни) от изображения и текст.

  • Дифузно внимание е модел, който генерира изображения от ембединг. DALL-E е обучен върху набор от данни с изображения и текст и може да се използва за създаване на изображения от текстови описания. Например, DALL-E може да се използва за генериране на изображения на котка с шапка или куче с ирокез.

Midjourney

Midjourney работи по подобен начин на DALL-E – генерира изображения от текстови промптове. Midjourney също може да се използва за създаване на изображения с промптове като „котка с шапка“ или „куче с ирокез“.

Изображение, генерирано от Midjourney, механичен гълъб Кредит: Wikipedia, изображение, генерирано от Midjourney

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

Първо, DALL-E. DALL-E е генеративен AI модел, базиран на трансформаторна архитектура с авторегресивен трансформатор.

Авторегресивен трансформатор определя как моделът генерира изображения от текстови описания – генерира един пиксел наведнъж и след това използва генерираните пиксели, за да създаде следващия пиксел. Процесът преминава през множество слоеве в невронна мрежа, докато изображението бъде завършено.

С този процес DALL-E контролира атрибути, обекти, характеристики и други елементи в генерираното изображение. Въпреки това, DALL-E 2 и 3 предоставят повече контрол върху генерираното изображение.

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

Какво е необходимо за създаване на приложение за генериране на изображения? Трябват ви следните библиотеки:

  • python-dotenv – препоръчително е да използвате тази библиотека, за да съхранявате тайните си в .env файл, далеч от кода.
  • openai – тази библиотека се използва за взаимодействие с OpenAI API.
  • 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 е параметър, който контролира случайността на изхода на генеративния AI модел. Температурата е стойност между 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.

Температура

Температурата е параметър, който контролира случайността на изхода на генеративния AI модел. Температурата е стойност между 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

Тук ясно се вижда как изображенията си приличат повече.

Как да дефинирате граници за вашето приложение с мета промптове

С нашата демонстрация вече можем да генерираме изображения за нашите клиенти. Въпреки това трябва да създадем някои граници за нашето приложение.

Например, не искаме да генерираме изображения, които не са подходящи за работа или които не са подходящи за деца.

Можем да направим това с мета промптове. Мета промптовете са текстови промптове, които се използват за контролиране на изхода на генеративния AI модел. Например, можем да използваме мета промптове, за да контролираме изхода и да гарантираме, че генерираните изображения са подходящи за работа или за деца.

Как работи?

Как работят мета промптовете?

Мета промптовете са текстови промптове, които се използват за контролиране на изхода на генеративния AI модел. Те се позиционират преди текстовия промпт и се използват за контролиране на изхода на модела, като се вграждат в приложенията за контролиране на изхода на модела. Те обединяват входа на промпта и входа на мета промпта в един текстов промпт.

Един пример за мета промпт би бил следният:

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)

Страхотна работа! Продължете да учите

След като завършите този урок, разгледайте нашата колекция за обучение по Генеративен AI, за да продължите да развивате знанията си за Генеративен AI!

Преминете към Урок 10, където ще разгледаме как да създаваме AI приложения с нисък код


Отказ от отговорност:
Този документ е преведен с помощта на AI услуга за превод Co-op Translator. Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.