Skip to content

Latest commit

 

History

History
477 lines (323 loc) · 18.8 KB

File metadata and controls

477 lines (323 loc) · 18.8 KB

Izrada aplikacija za generiranje slika

Izrada aplikacija za generiranje slika

LLM modeli nisu samo za generiranje teksta. Također je moguće generirati slike na temelju tekstualnih opisa. Korištenje slika kao modaliteta može biti izuzetno korisno u mnogim područjima poput MedTecha, arhitekture, turizma, razvoja igara i drugih. U ovom poglavlju upoznat ćemo se s 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 svoje aplikacije pomoću meta promptova.
  • 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 AI. Mogu se koristiti, na primjer, za:

  • Uređivanje i sintezu slika. Možete generirati slike za različite primjene, poput uređivanja i sinteze slika.

  • Primjenu u raznim industrijama. Također se mogu koristiti za generiranje slika u industrijama poput Medtecha, turizma, razvoja igara i drugih.

Scenarij: Edu4All

Kao dio ove lekcije nastavljamo raditi sa startupom Edu4All. Studenti će stvarati slike za svoje zadatke, a što će točno biti na slikama ovisi o njima – mogu to biti ilustracije za vlastitu bajku, novi lik za priču ili pomoć u vizualizaciji njihovih ideja i koncepata.

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

Edu4All startup, razred o spomenicima, Eiffelov toranj

koristeći prompt poput

"Pas pored Eiffelovog tornja u ranom jutarnjem svjetlu"

Što su DALL-E i Midjourney?

DALL-E i Midjourney su dva najpopularnija modela za generiranje slika, koji vam omogućuju da pomoću promptova generirate slike.

DALL-E

Počnimo s DALL-E, Generativnim AI modelom koji generira slike na temelju tekstualnih opisa.

DALL-E je kombinacija dva modela, CLIP i diffused attention.

  • CLIP je model koji generira embeddings, numeričke prikaze podataka, iz slika i teksta.

  • Diffused attention je model koji generira slike iz embeddingsa. DALL-E je treniran na skupu podataka slika i teksta te se može koristiti za generiranje slika na temelju tekstualnih opisa. Na primjer, DALL-E može generirati slike mačke s kapom ili psa s mohawkom.

Midjourney

Midjourney radi na sličan način kao DALL-E, generira slike na temelju tekstualnih promptova. Midjourney također može generirati slike koristeći promptove poput “mačka s kapom” ili “pas s mohawkom”.

Slika generirana pomoću Midjourney, mehanički golub Slika: Wikipedia, generirano pomoću Midjourney

Kako DALL-E i Midjourney funkcioniraju

Prvo, DALL-E. DALL-E je Generativni AI model baziran na transformer arhitekturi s autoregresivnim transformerom.

Autoregresivni transformer definira kako model generira slike iz tekstualnih opisa – generira jedan piksel po piksel, a zatim koristi već generirane piksele za generiranje sljedećeg. Prolazi kroz više slojeva u neuronskoj mreži dok slika nije kompletna.

Ovim procesom DALL-E kontrolira atribute, objekte, karakteristike i druge detalje u generiranoj slici. Međutim, DALL-E 2 i 3 imaju veću kontrolu nad generiranom slikom.

Izrada prve aplikacije za generiranje slika

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

  • python-dotenv, preporučuje se za pohranu tajni u .env datoteku, odvojeno od koda.
  • openai, biblioteka za interakciju s OpenAI API-jem.
  • pillow, za rad sa slikama u Pythonu.
  • requests, za slanje HTTP zahtjeva.
  1. Kreirajte datoteku .env sa sljedećim sadržajem:

    AZURE_OPENAI_ENDPOINT=<your endpoint>
    AZURE_OPENAI_API_KEY=<your key>
    

    Ove podatke pronađite u Azure Portalu za svoj resurs u odjeljku "Keys and Endpoint".

  2. Nabrojite potrebne biblioteke u datoteci requirements.txt ovako:

    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 virtualnog okruženja:

    python3 -m venv venv
    venv\Scripts\activate.bat
  4. Dodajte sljedeći kod u datoteku nazvanu app.py:

    import openai
    import os
    import requests
    from PIL import Image
    import dotenv
    
    # import dotenv
    dotenv.load_dotenv()
    
    # Get endpoint and key from environment variables
    openai.api_base = os.environ['AZURE_OPENAI_ENDPOINT']
    openai.api_key = os.environ['AZURE_OPENAI_API_KEY']
    
    # Assign the API version (DALL-E is currently supported for the 2023-06-01-preview API version only)
    openai.api_version = '2023-06-01-preview'
    openai.api_type = 'azure'
    
    
    try:
        # Create an image by using the image generation API
        generation_response = openai.Image.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,
        )
        # 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)

Objasnimo ovaj kod:

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

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

    # import dotenv
    dotenv.load_dotenv()
  • Nakon toga postavljamo endpoint, ključ za OpenAI API, verziju i tip.

    # Get endpoint and key from environment variables
    openai.api_base = os.environ['AZURE_OPENAI_ENDPOINT']
    openai.api_key = os.environ['AZURE_OPENAI_API_KEY']
    
    # add version and type, Azure specific
    openai.api_version = '2023-06-01-preview'
    openai.api_type = 'azure'
  • Sljedeće, generiramo sliku:

    # Create an image by using the image generation API
    generation_response = openai.Image.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,
    )

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

  • Na kraju, otvaramo sliku i prikazujemo je u standardnom pregledniku slika:

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

Detaljnije o generiranju slike

Pogledajmo detaljnije kod koji generira sliku:

generation_response = openai.Image.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,
    )
  • 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. Ovdje generiramo sliku dimenzija 1024x1024 piksela.
  • n je broj generiranih slika. Ovdje generiramo dvije slike.
  • temperature je parametar koji kontrolira nasumičnost izlaza Generativnog AI modela. Vrijednost je između 0 i 1, gdje 0 znači deterministički izlaz, a 1 nasumični. Zadana vrijednost je 0.7.

Postoje i druge mogućnosti rada sa slikama koje ćemo obraditi u sljedećem dijelu.

Dodatne mogućnosti generiranja slika

Do sada ste vidjeli kako generirati sliku s nekoliko redaka Pythona. No, postoji još toga što možete raditi sa slikama.

Također možete:

  • Izvršavati izmjene. Pružajući postojeću sliku, masku i prompt, možete mijenjati sliku. Na primjer, možete dodati nešto na dio slike. Zamislite našu sliku sa zecom – možete mu dodati šešir. To se radi tako da se dostavi slika, maska (koja označava dio slike za promjenu) i tekstualni prompt koji opisuje što treba napraviti.

    response = openai.Image.create_edit(
      image=open("base_image.png", "rb"),
      mask=open("mask.png", "rb"),
      prompt="An image of a rabbit with a hat on its head.",
      n=1,
      size="1024x1024"
    )
    image_url = response['data'][0]['url']

    Osnovna slika sadrži samo zeca, a konačna slika će imati šešir na zecu.

  • Kreirati varijacije. Ideja je da uzmete postojeću sliku i zatražite da se naprave varijacije. Za to se dostavlja slika i tekstualni prompt, te se koristi 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 platformi

Temperature

Temperature je parametar koji kontrolira nasumičnost izlaza Generativnog AI modela. Vrijednost je između 0 i 1, gdje 0 znači deterministički izlaz, a 1 nasumični. Zadana vrijednost je 0.7.

Pogledajmo primjer kako temperature 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 još jednom da vidimo da nećemo dobiti istu sliku dva puta:

Generirana slika zeca na konju

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

 generation_response = openai.Image.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 sada učiniti odgovor determinističnijim. Primijetili smo da na prvoj slici imamo zeca, a na drugoj konja, pa se slike znatno razlikuju.

Stoga ćemo promijeniti kod i postaviti temperature na 0, ovako:

generation_response = openai.Image.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
    )

Kad pokrenete ovaj kod, dobit ćete ove dvije slike:

  • Temperature 0, v1
  • Temperature 0, v2

Ovdje jasno vidite da se slike međusobno više podudaraju.

Kako definirati granice za svoju aplikaciju pomoću metapromptova

U našem demo primjeru već možemo generirati slike za naše korisnike. Međutim, potrebno je postaviti neke granice za aplikaciju.

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

To možemo postići pomoću metapromptova. Metapromptovi su tekstualni promptovi koji se koriste za kontrolu izlaza Generativnog AI modela. Na primjer, možemo koristiti metapromptove da osiguramo da generirane slike budu sigurne za rad i prikladne za djecu.

Kako to funkcionira?

Kako metapromptovi rade?

Metapromptovi su tekstualni promptovi koji se koriste za kontrolu izlaza Generativnog AI modela, postavljaju se prije glavnog prompta i ugrađuju u aplikacije kako bi kontrolirali izlaz modela. Time se ulazni prompt i metaprompt kombiniraju u jedan tekstualni prompt.

Primjer metaprompta 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 metapromptove 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 vidite kako sve generirane slike uzimaju u obzir metaprompt.

Zadatak - omogućimo studentima

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

Studenti će stvarati slike za svoje zadatke koje sadrže spomenike, a točno koji spomenici su na njima ovisi o studentima. Traži se da koriste svoju kreativnost i smjeste 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

# import dotenv
dotenv.load_dotenv()

# Get endpoint and key from environment variables
openai.api_base = "<replace with endpoint>"
openai.api_key = "<replace with api key>"

# Assign the API version (DALL-E is currently supported for the 2023-06-01-preview API version only)
openai.api_version = '2023-06-01-preview'
openai.api_type = 'azure'

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 = openai.Image.create(
        prompt=prompt,    # Enter your prompt text here
        size='1024x1024',
        n=2,
        temperature=0,
    )
    # 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)

Odličan posao! Nastavite s učenjem

Nakon završetka ove lekcije, pogledajte našu kolekciju za učenje Generativne AI i nastavite usavršavati svoje znanje o Generativnoj AI!

Krenite na Lekciju 10 gdje ćemo pogledati kako izraditi AI aplikacije s low-code pristupom

Odricanje od odgovornosti:
Ovaj dokument je preveden korištenjem AI usluge za prevođenje Co-op Translator. Iako težimo točnosti, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za kritične informacije preporučuje se profesionalni ljudski prijevod. Ne snosimo odgovornost za bilo kakva nesporazuma ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda.