Skip to content

Latest commit

 

History

History
480 lines (325 loc) · 19.5 KB

File metadata and controls

480 lines (325 loc) · 19.5 KB

Izrada aplikacija za generiranje slika

Izrada aplikacija za generiranje slika

LLM-ovi nisu ograničeni samo na generiranje teksta. Također je moguće generirati slike iz tekstualnih opisa. Imati slike kao modalitet može biti izuzetno korisno u brojnim područjima poput medicinske tehnologije, arhitekture, turizma, razvoja igara i više. U ovom poglavlju ćemo istražiti dva najpopularnija modela za generiranje slika, DALL-E i Midjourney.

Uvod

U ovoj lekciji obradit ćemo:

  • Generiranje slika i zašto je korisno.
  • DALL-E i Midjourney, što su i kako funkcioniraju.
  • Kako izraditi aplikaciju za generiranje slika.

Ciljevi učenja

Nakon završetka ove lekcije, moći ćete:

  • Izraditi aplikaciju za generiranje slika.
  • Definirati granice za svoju aplikaciju pomoću meta prompta.
  • Raditi s DALL-E i Midjourney.

Zašto izraditi aplikaciju za generiranje slika?

Aplikacije za generiranje slika odličan su način za istraživanje mogućnosti generativne umjetne inteligencije. Mogu se koristiti, na primjer:

  • Uređivanje i sinteza slika. Možete generirati slike za razne primjene, poput uređivanja slika i sinteze slika.

  • Primjena u raznim industrijama. Također se mogu koristiti za generiranje slika za razne industrije poput medicinske tehnologije, turizma, razvoja igara i više.

Scenarij: Edu4All

Kao dio ove lekcije, nastavit ćemo raditi s našim startupom, Edu4All. Studenti će kreirati slike za svoje zadatke, točno koje slike ovisi o studentima, ali to mogu biti ilustracije za njihovu vlastitu bajku, kreiranje novog lika za njihovu priču ili im pomoći vizualizirati njihove ideje i koncepte.

Evo što bi studenti Edu4All-a mogli generirati, na primjer, ako rade u razredu na spomenicima:

Startup Edu4All, razred o spomenicima, Eiffelov toranj

koristeći prompt poput

"Pas pored Eiffelovog tornja u jutarnjem svjetlu"

Što su DALL-E i Midjourney?

DALL-E i Midjourney dva su najpopularnija modela za generiranje slika, omogućuju vam korištenje prompta za generiranje slika.

DALL-E

Počnimo s DALL-E, koji je generativni AI model koji generira slike iz tekstualnih opisa.

DALL-E je kombinacija dva modela, CLIP i difuzne pažnje.

  • CLIP, je model koji generira ugrađene podatke, numeričke reprezentacije podataka, iz slika i teksta.

  • Difuzna pažnja, je model koji generira slike iz ugrađenih podataka. DALL-E je treniran na skupu podataka slika i teksta i može se koristiti za generiranje slika iz tekstualnih opisa. Na primjer, DALL-E se može koristiti za generiranje slika mačke s kapom ili psa s irokezom.

Midjourney

Midjourney radi na sličan način kao DALL-E, generira slike iz tekstualnih prompta. Midjourney se također može koristiti za generiranje slika koristeći prompte poput "mačka s kapom" ili "pas s irokezom".

Slika generirana pomoću Midjourney, mehanička golubica Autor slike Wikipedia, slika generirana pomoću Midjourney

Kako funkcioniraju DALL-E i Midjourney

Prvo, DALL-E. DALL-E je generativni AI model temeljen na arhitekturi transformatora s autoregresivnim transformatorom.

Autoregresivni transformator definira kako model generira slike iz tekstualnih opisa, generira jedan piksel po piksel, a zatim koristi generirane piksele za generiranje sljedećeg piksela. Prolazi kroz više slojeva u neuronskoj mreži dok slika ne bude dovršena.

Ovim procesom DALL-E kontrolira atribute, objekte, karakteristike i više u slici koju generira. Međutim, DALL-E 2 i 3 imaju veću kontrolu nad generiranom slikom.

Izrada vaše prve aplikacije za generiranje slika

Što je potrebno za izradu aplikacije za generiranje slika? Potrebne su vam sljedeće biblioteke:

  • python-dotenv, preporučuje se korištenje ove biblioteke za čuvanje vaših tajni u datoteci .env odvojeno od koda.
  • openai, ova biblioteka koristi se za interakciju s OpenAI API-jem.
  • pillow, za rad sa slikama u Pythonu.
  • requests, za pomoć pri slanju HTTP zahtjeva.

Kreiranje i implementacija Azure OpenAI modela

Ako to već niste učinili, slijedite upute na stranici Microsoft Learn za kreiranje Azure OpenAI resursa i modela. Odaberite DALL-E 3 kao model.

Kreiranje aplikacije

  1. Kreirajte datoteku .env sa sljedećim sadržajem:

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

    Ove informacije pronađite u Azure OpenAI Foundry portalu za vaš resurs u odjeljku "Deployments".

  2. Prikupite gore navedene biblioteke u datoteci pod nazivom requirements.txt na sljedeći način:

    python-dotenv
    openai
    pillow
    requests
    
  3. Zatim kreirajte virtualno okruženje i instalirajte biblioteke:

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

    Za Windows, koristite sljedeće naredbe za kreiranje i aktivaciju vašeg virtualnog okruženja:

    python3 -m venv venv
    venv\Scripts\activate.bat
  4. Dodajte sljedeći kod u datoteku pod nazivom 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)

Objašnjenje koda:

  • Prvo, uvozimo potrebne biblioteke, uključujući OpenAI biblioteku, dotenv biblioteku, requests biblioteku i Pillow biblioteku.

    import openai
    import os
    import requests
    from PIL import Image
    import dotenv
  • Zatim učitavamo varijable okruženja iz datoteke .env.

    # import dotenv
    dotenv.load_dotenv()
  • Nakon toga konfiguriramo klijenta za Azure OpenAI uslugu.

    # 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"
        )
  • Zatim generiramo sliku:

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

    Gornji kod vraća JSON objekt koji sadrži URL generirane slike. Možemo koristiti URL za preuzimanje slike i spremanje u datoteku.

  • Na kraju, otvaramo sliku i koristimo standardni preglednik slika za prikaz:

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

Više detalja o generiranju slike

Pogledajmo kod koji generira sliku detaljnije:

  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 tekstualni prompt koji se koristi za generiranje slike. U ovom slučaju, koristimo prompt "Zec na konju, drži lizalicu, na maglovitoj livadi gdje rastu narcisi".
  • size, je veličina generirane slike. U ovom slučaju, generiramo sliku veličine 1024x1024 piksela.
  • n, je broj generiranih slika. U ovom slučaju, generiramo dvije slike.
  • temperature, je parametar koji kontrolira nasumičnost izlaza generativnog AI modela. Vrijednost temperature je između 0 i 1, gdje 0 znači da je izlaz deterministički, a 1 znači da je izlaz nasumičan. Zadana vrijednost je 0.7.

Postoje još mnoge stvari koje možete raditi sa slikama, a o tome ćemo govoriti u sljedećem dijelu.

Dodatne mogućnosti generiranja slika

Do sada ste vidjeli kako smo uspjeli generirati sliku koristeći nekoliko linija koda u Pythonu. Međutim, postoje još mnoge stvari koje možete raditi sa slikama.

Također možete učiniti sljedeće:

  • Izvršiti izmjene. Pružanjem postojeće slike, maske i prompta, možete izmijeniti sliku. Na primjer, možete dodati nešto na dio slike. Zamislite našu sliku zeca, možete dodati šešir zecu. Kako biste to učinili, trebate pružiti sliku, masku (koja identificira dio područja za promjenu) i tekstualni prompt koji opisuje što treba učiniti.

Napomena: ovo nije podržano u DALL-E 3.

Evo primjera korištenja 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 sadržavala samo salon s bazenom, ali konačna slika bi imala flaminga:

  • Kreirati varijacije. Ideja je da uzmete postojeću sliku i zatražite da se kreiraju varijacije. Za kreiranje varijacije, pružate sliku i tekstualni prompt te kod poput ovog:

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

    Napomena, ovo je podržano samo na OpenAI

Temperatura

Temperatura je parametar koji kontrolira nasumičnost izlaza generativnog AI modela. Vrijednost temperature je između 0 i 1, gdje 0 znači da je izlaz deterministički, a 1 znači da je izlaz nasumičan. Zadana vrijednost je 0.7.

Pogledajmo primjer kako temperatura funkcionira, pokretanjem ovog prompta dva puta:

Prompt : "Zec na konju, drži lizalicu, na maglovitoj livadi gdje rastu narcisi"

Zec na konju drži lizalicu, verzija 1

Sada pokrenimo isti prompt ponovno da vidimo da nećemo dobiti istu sliku dva puta:

Generirana slika zeca na konju

Kao što možete vidjeti, slike su slične, ali nisu iste. Pokušajmo promijeniti vrijednost temperature na 0.1 i vidjeti što će se dogoditi:

 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
    )

Promjena temperature

Pokušajmo učiniti odgovor više determinističkim. Mogli smo primijetiti iz dvije generirane slike da na prvoj slici postoji zec, a na drugoj slici konj, pa se slike značajno razlikuju.

Stoga promijenimo naš kod i postavimo temperaturu na 0, ovako:

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
    )

Sada kada pokrenete ovaj kod, dobit ćete ove dvije slike:

  • Temperatura 0, v1
  • Temperatura 0 , v2

Ovdje jasno možete vidjeti kako se slike više međusobno podudaraju.

Kako definirati granice za svoju aplikaciju pomoću meta prompta

S našim demo primjerom već možemo generirati slike za naše klijente. Međutim, trebamo postaviti neke granice za našu aplikaciju.

Na primjer, ne želimo generirati slike koje nisu prikladne za radno okruženje ili koje nisu primjerene za djecu.

To možemo učiniti pomoću meta prompta. Meta prompti su tekstualni prompti koji se koriste za kontrolu izlaza generativnog AI modela. Na primjer, možemo koristiti meta prompte za kontrolu izlaza i osigurati da generirane slike budu prikladne za radno okruženje ili za djecu.

Kako to funkcionira?

Kako funkcioniraju meta prompti?

Meta prompti su tekstualni prompti koji se koriste za kontrolu izlaza generativnog AI modela, postavljaju se prije tekstualnog prompta i koriste se za kontrolu izlaza modela te se ugrađuju u aplikacije kako bi kontrolirali izlaz modela. Kombiniraju unos prompta i unos meta prompta u jedan tekstualni prompt.

Jedan primjer meta prompta bio bi sljedeći:

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)

Sada, pogledajmo kako možemo koristiti meta prompt u našem demo primjeru.

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 gornjeg prompta možete vidjeti kako sve generirane slike uzimaju u obzir meta prompt.

Zadatak - omogućimo studentima

Na početku ove lekcije predstavili smo Edu4All. Sada je vrijeme da omogućimo studentima generiranje slika za njihove zadatke.

Studenti će kreirati slike za svoje zadatke koji uključuju spomenike, točno koji spomenici ovisi o studentima. Od studenata se traži da koriste svoju kreativnost u ovom zadatku kako bi smjestili te spomenike u različite kontekste.

Rješenje

Evo jednog mogućeg rješenja:

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)

Sjajan posao! Nastavite učiti

Nakon što završite ovu lekciju, pogledajte našu kolekciju za učenje o generativnoj AI kako biste nastavili unapređivati svoje znanje o generativnoj AI!

Prijeđite na Lekciju 10 gdje ćemo istražiti kako izraditi AI aplikacije s malo koda


Izjava o odricanju odgovornosti:
Ovaj dokument je preveden pomoću AI usluge za prevođenje Co-op Translator. Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane ljudskog prevoditelja. Ne preuzimamo odgovornost za nesporazume ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda.