Skip to content

Latest commit

 

History

History
480 lines (325 loc) · 27.2 KB

File metadata and controls

480 lines (325 loc) · 27.2 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, који је генеративни AI модел који генерише слике на основу текстуалних описа.

DALL-E је комбинација два модела, CLIP и дифузне пажње.

  • CLIP, је модел који генерише ембединг, што су нумерички прикази података, из слика и текста.

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

Midjourney

Midjourney функционише на сличан начин као DALL-E, генерише слике на основу текстуалних промптова. Midjourney се такође може користити за генерисање слика помоћу промптова као што су „мачка са шеширом“ или „пас са ирокезом“.

Слика генерисана помоћу Midjourney, механичка голубица Аутор слике Википедија, слика генерисана помоћу 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)

Одличан рад! Наставите са учењем

Након што завршите ову лекцију, погледајте нашу колекцију за учење о генеративној вештачкој интелигенцији како бисте наставили да унапређујете своје знање о генеративној вештачкој интелигенцији!

Прелазите на лекцију 10 где ћемо истражити како изградити AI апликације уз помоћ low-code алата


Одрицање од одговорности:
Овај документ је преведен помоћу услуге за превођење уз помоћ вештачке интелигенције Co-op Translator. Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода.