Skip to content

Latest commit

 

History

History
478 lines (324 loc) · 19.1 KB

File metadata and controls

478 lines (324 loc) · 19.1 KB

Gradnja aplikacij za generiranje slik

Gradnja aplikacij za generiranje slik

LLM-ji niso omejeni le na generiranje besedila. Možno je tudi generirati slike iz opisov besedila. Slike kot modalnost so lahko zelo uporabne na številnih področjih, kot so MedTech, arhitektura, turizem, razvoj iger in še več. V tem poglavju si bomo ogledali dva najbolj priljubljena modela za generiranje slik, DALL-E in Midjourney.

Uvod

V tej lekciji bomo obravnavali:

  • Generiranje slik in zakaj je koristno.
  • DALL-E in Midjourney, kaj sta in kako delujeta.
  • Kako zgraditi aplikacijo za generiranje slik.

Cilji učenja

Po zaključku te lekcije boste sposobni:

  • Zgraditi aplikacijo za generiranje slik.
  • Določiti meje za svojo aplikacijo z meta pozivi.
  • Delati z DALL-E in Midjourney.

Zakaj graditi aplikacijo za generiranje slik?

Aplikacije za generiranje slik so odličen način za raziskovanje zmogljivosti generativne umetne inteligence. Uporabljajo se lahko na primer za:

  • Urejanje in sintezo slik. Lahko generirate slike za različne namene, kot so urejanje slik in sinteza slik.

  • Uporaba v različnih industrijah. Uporabljajo se lahko tudi za generiranje slik za različne industrije, kot so MedTech, turizem, razvoj iger in še več.

Scenarij: Edu4All

V okviru te lekcije bomo nadaljevali delo z našim startupom Edu4All. Študenti bodo ustvarjali slike za svoje naloge, kakšne slike bodo ustvarili, je odvisno od njih, lahko pa so to ilustracije za njihovo pravljico, ustvarjanje novega lika za njihovo zgodbo ali pomoč pri vizualizaciji njihovih idej in konceptov.

Tukaj je primer, kaj bi lahko ustvarili študenti Edu4All, če bi v razredu delali na spomenikih:

Startup Edu4All, razred o spomenikih, Eifflov stolp

z uporabo poziva, kot je:

"Pes poleg Eifflovega stolpa v jutranji sončni svetlobi"

Kaj sta DALL-E in Midjourney?

DALL-E in Midjourney sta dva izmed najbolj priljubljenih modelov za generiranje slik, ki omogočata uporabo pozivov za generiranje slik.

DALL-E

Začnimo z DALL-E, ki je generativni AI model za generiranje slik iz opisov besedila.

DALL-E je kombinacija dveh modelov, CLIP in razpršene pozornosti.

  • CLIP je model, ki generira vdelave, kar so numerične predstavitve podatkov, iz slik in besedila.

  • Razpršena pozornost je model, ki generira slike iz vdelav. DALL-E je treniran na naboru podatkov slik in besedila ter se lahko uporablja za generiranje slik iz opisov besedila. Na primer, DALL-E lahko generira slike mačke v klobuku ali psa z irokezo.

Midjourney

Midjourney deluje podobno kot DALL-E, saj generira slike iz besedilnih pozivov. Midjourney lahko generira slike z uporabo pozivov, kot so "mačka v klobuku" ali "pes z irokezo".

Slika, generirana z Midjourney, mehanska golobica Slika: Wikipedia, slika generirana z Midjourney

Kako delujeta DALL-E in Midjourney

Najprej DALL-E. DALL-E je generativni AI model, ki temelji na arhitekturi transformatorja z avtoregresivnim transformatorjem.

Avtoregresivni transformator določa, kako model generira slike iz opisov besedila; generira en piksel naenkrat in nato uporabi generirane piksle za generiranje naslednjega piksla. Proces poteka skozi več plasti v nevronski mreži, dokler slika ni dokončana.

S tem procesom DALL-E nadzoruje atribute, objekte, značilnosti in več v generirani sliki. Vendar pa imata DALL-E 2 in 3 več nadzora nad generirano sliko.

Gradnja vaše prve aplikacije za generiranje slik

Kaj potrebujete za gradnjo aplikacije za generiranje slik? Potrebujete naslednje knjižnice:

  • python-dotenv, močno priporočamo uporabo te knjižnice za shranjevanje vaših skrivnosti v datoteki .env stran od kode.
  • openai, ta knjižnica se uporablja za interakcijo z OpenAI API-jem.
  • pillow, za delo s slikami v Pythonu.
  • requests, za pomoč pri izvajanju HTTP zahtevkov.

Ustvarjanje in uvajanje modela Azure OpenAI

Če tega še niste storili, sledite navodilom na strani Microsoft Learn, da ustvarite vir in model Azure OpenAI. Izberite model DALL-E 3.

Ustvarjanje aplikacije

  1. Ustvarite datoteko .env z naslednjo vsebino:

    AZURE_OPENAI_ENDPOINT=<your endpoint>
    AZURE_OPENAI_API_KEY=<your key>
    AZURE_OPENAI_DEPLOYMENT="dall-e-3"
    

    Poiščite te informacije v portalu Azure OpenAI Foundry za vaš vir v razdelku "Deployments".

  2. Zberite zgoraj navedene knjižnice v datoteki requirements.txt na naslednji način:

    python-dotenv
    openai
    pillow
    requests
    
  3. Nato ustvarite virtualno okolje in namestite knjižnice:

    python3 -m venv venv
    source venv/bin/activate
    pip install -r requirements.txt

    Za Windows uporabite naslednje ukaze za ustvarjanje in aktiviranje vašega virtualnega okolja:

    python3 -m venv venv
    venv\Scripts\activate.bat
  4. Dodajte naslednjo kodo v datoteko 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)

Pojasnimo to kodo:

  • Najprej uvozimo knjižnice, ki jih potrebujemo, vključno s knjižnico OpenAI, knjižnico dotenv, knjižnico requests in knjižnico Pillow.

    import openai
    import os
    import requests
    from PIL import Image
    import dotenv
  • Nato naložimo okoljske spremenljivke iz datoteke .env.

    # import dotenv
    dotenv.load_dotenv()
  • Nato konfiguriramo odjemalca storitve 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"
        )
  • Nato generiramo sliko:

    # 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']
                        )

    Zgornja koda vrne JSON objekt, ki vsebuje URL generirane slike. URL lahko uporabimo za prenos slike in shranjevanje v datoteko.

  • Na koncu odpremo sliko in jo prikažemo s standardnim pregledovalnikom slik:

    image = Image.open(image_path)
    image.show()

Več podrobnosti o generiranju slike

Poglejmo si podrobneje kodo, ki generira sliko:

  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 je besedilni poziv, ki se uporablja za generiranje slike. V tem primeru uporabljamo poziv "Zajček na konju, drži liziko, na meglenem travniku, kjer rastejo narcise".
  • size je velikost generirane slike. V tem primeru generiramo sliko velikosti 1024x1024 pikslov.
  • n je število generiranih slik. V tem primeru generiramo dve sliki.
  • temperature je parameter, ki nadzoruje naključnost izhoda generativnega AI modela. Temperatura je vrednost med 0 in 1, kjer 0 pomeni, da je izhod determinističen, 1 pa pomeni, da je izhod naključen. Privzeta vrednost je 0,7.

Obstajajo še druge stvari, ki jih lahko počnete s slikami, o katerih bomo govorili v naslednjem razdelku.

Dodatne zmogljivosti generiranja slik

Videli ste, kako smo lahko generirali sliko z nekaj vrsticami kode v Pythonu. Vendar pa obstajajo še druge stvari, ki jih lahko počnete s slikami.

Lahko naredite tudi naslednje:

  • Urejanje slik. Z zagotavljanjem obstoječe slike, maske in poziva lahko spremenite sliko. Na primer, lahko dodate nekaj na določen del slike. Predstavljajte si našo sliko zajčka, lahko dodate klobuk zajčku. To storite tako, da zagotovite sliko, masko (ki identificira del območja za spremembo) in besedilni poziv, ki pove, kaj je treba storiti.

Opomba: to ni podprto v DALL-E 3.

Tukaj je primer z uporabo 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

Osnovna slika bi vsebovala le salon z bazenom, končna slika pa bi imela flaminga:

  • Ustvarjanje različic. Ideja je, da vzamete obstoječo sliko in zahtevate, da se ustvarijo različice. Za ustvarjanje različice zagotovite sliko in besedilni poziv ter kodo, kot je prikazano:

    response = openai.Image.create_variation(
      image=open("bunny-lollipop.png", "rb"),
      n=1,
      size="1024x1024"
    )
    image_url = response['data'][0]['url']

    Opomba: to je podprto samo na OpenAI.

Temperatura

Temperatura je parameter, ki nadzoruje naključnost izhoda generativnega AI modela. Temperatura je vrednost med 0 in 1, kjer 0 pomeni, da je izhod determinističen, 1 pa pomeni, da je izhod naključen. Privzeta vrednost je 0,7.

Poglejmo primer, kako deluje temperatura, tako da dvakrat zaženemo ta poziv:

Poziv: "Zajček na konju, drži liziko, na meglenem travniku, kjer rastejo narcise"

Zajček na konju, drži liziko, različica 1

Zdaj zaženimo isti poziv še enkrat, da vidimo, da ne bomo dvakrat dobili iste slike:

Generirana slika zajčka na konju

Kot lahko vidite, so slike podobne, vendar niso enake. Poskusimo spremeniti vrednost temperature na 0,1 in poglejmo, kaj se zgodi:

 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
    )

Spreminjanje temperature

Poskusimo narediti odziv bolj determinističen. Opazili smo, da sta na prvi sliki zajček, na drugi pa konj, zato se slike precej razlikujejo.

Spremenimo torej našo kodo in nastavimo temperaturo na 0, kot sledi:

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
    )

Ko zaženete to kodo, dobite ti dve sliki:

  • Temperatura 0, v1
  • Temperatura 0, v2

Tukaj lahko jasno vidite, kako se slike bolj podobajo ena drugi.

Kako določiti meje za vašo aplikacijo z metapozivi

Z našo predstavitvijo lahko že generiramo slike za naše stranke. Vendar pa moramo ustvariti nekaj meja za našo aplikacijo.

Na primer, ne želimo generirati slik, ki niso primerne za delo ali niso primerne za otroke.

To lahko storimo z metapozivi. Metapozivi so besedilni pozivi, ki se uporabljajo za nadzor izhoda generativnega AI modela. Na primer, metapozive lahko uporabimo za nadzor izhoda in zagotovimo, da so generirane slike primerne za delo ali primerne za otroke.

Kako deluje?

Kako torej delujejo metapozivi?

Metapozivi so besedilni pozivi, ki se uporabljajo za nadzor izhoda generativnega AI modela. Postavljeni so pred besedilni poziv in se uporabljajo za nadzor izhoda modela ter so vgrajeni v aplikacije za nadzor izhoda modela. Združujejo vhodni poziv in metapoziv v en sam besedilni poziv.

En primer metapoziva bi bil naslednji:

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)

Zdaj pa poglejmo, kako lahko uporabimo metapozive v naši predstavitvi.

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

Iz zgornjega poziva lahko vidite, kako vse generirane slike upoštevajo metapoziv.

Naloga - omogočimo študentom

Na začetku te lekcije smo predstavili Edu4All. Zdaj je čas, da omogočimo študentom generiranje slik za njihove naloge.

Študenti bodo ustvarjali slike za svoje naloge, ki vsebujejo spomenike, kakšni spomeniki bodo, je odvisno od njih. Študenti so pozvani, da uporabijo svojo ustvarjalnost pri tej nalogi in postavijo te spomenike v različne kontekste.

Rešitev

Tukaj je ena možna rešitev:

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)

Odlično delo! Nadaljujte z učenjem

Po zaključku te lekcije si oglejte našo zbirko učenja o generativni umetni inteligenci, da še naprej nadgrajujete svoje znanje o generativni umetni inteligenci!

Pojdite na Lekcijo 10, kjer bomo raziskali, kako graditi AI aplikacije z malo kode


Omejitev odgovornosti:
Ta dokument je bil preveden z uporabo storitve za prevajanje z umetno inteligenco Co-op Translator. Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatski prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne odgovarjamo za morebitne nesporazume ali napačne razlage, ki bi nastale zaradi uporabe tega prevoda.