Skip to content

Latest commit

 

History

History
478 lines (324 loc) · 28.4 KB

File metadata and controls

478 lines (324 loc) · 28.4 KB

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

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

Генеративните езикови модели (LLMs) не се ограничават само до генериране на текст. Възможно е също така да се създават изображения от текстови описания. Наличието на изображения като модалност може да бъде изключително полезно в редица области като медицински технологии, архитектура, туризъм, разработка на игри и други. В тази глава ще разгледаме двата най-популярни модела за генериране на изображения – 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 е модел, който генерира вградени представяния (embeddings), числови представяния на данни, от изображения и текст.

  • Дифузно внимание е модел, който генерира изображения от вградени представяния. 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. Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.