Skip to content

Latest commit

 

History

History
480 lines (325 loc) · 20.6 KB

File metadata and controls

480 lines (325 loc) · 20.6 KB

Construirea aplicațiilor de generare de imagini

Construirea aplicațiilor de generare de imagini

LLM-urile nu se limitează doar la generarea de text. Este posibil să generăm imagini din descrieri textuale. Având imagini ca modalitate poate fi extrem de util în diverse domenii, cum ar fi MedTech, arhitectură, turism, dezvoltare de jocuri și altele. În acest capitol, vom analiza cele mai populare modele de generare de imagini, DALL-E și Midjourney.

Introducere

În această lecție, vom acoperi:

  • Generarea de imagini și de ce este utilă.
  • DALL-E și Midjourney, ce sunt și cum funcționează.
  • Cum să construiești o aplicație de generare de imagini.

Obiective de învățare

După finalizarea acestei lecții, vei putea:

  • Să construiești o aplicație de generare de imagini.
  • Să definești limite pentru aplicația ta folosind meta-prompturi.
  • Să lucrezi cu DALL-E și Midjourney.

De ce să construiești o aplicație de generare de imagini?

Aplicațiile de generare de imagini sunt o modalitate excelentă de a explora capacitățile AI generativă. Ele pot fi utilizate, de exemplu:

  • Editare și sinteză de imagini. Poți genera imagini pentru diverse utilizări, cum ar fi editarea și sinteza de imagini.

  • Aplicabilitate în diverse industrii. Ele pot fi utilizate pentru a genera imagini pentru diverse industrii, cum ar fi MedTech, turism, dezvoltare de jocuri și altele.

Scenariu: Edu4All

Ca parte a acestei lecții, vom continua să lucrăm cu startup-ul nostru, Edu4All. Studenții vor crea imagini pentru evaluările lor, exact ce imagini vor crea depinde de ei, dar ar putea fi ilustrații pentru propriul basm, crearea unui nou personaj pentru povestea lor sau ajutarea lor să vizualizeze ideile și conceptele.

Iată ce ar putea genera studenții Edu4All, de exemplu, dacă lucrează în clasă la monumente:

Startup Edu4All, clasă despre monumente, Turnul Eiffel

folosind un prompt precum

"Câine lângă Turnul Eiffel în lumina dimineții"

Ce sunt DALL-E și Midjourney?

DALL-E și Midjourney sunt două dintre cele mai populare modele de generare de imagini, care permit utilizarea prompturilor pentru a genera imagini.

DALL-E

Să începem cu DALL-E, care este un model AI generativ ce generează imagini din descrieri textuale.

DALL-E este o combinație de două modele, CLIP și atenție difuză.

  • CLIP, este un model care generează embeddings, reprezentări numerice ale datelor, din imagini și text.

  • Atenție difuză, este un model care generează imagini din embeddings. DALL-E este antrenat pe un set de date de imagini și text și poate fi utilizat pentru a genera imagini din descrieri textuale. De exemplu, DALL-E poate fi utilizat pentru a genera imagini cu o pisică într-o pălărie sau un câine cu creastă.

Midjourney

Midjourney funcționează într-un mod similar cu DALL-E, generând imagini din prompturi textuale. Midjourney poate fi utilizat pentru a genera imagini folosind prompturi precum „o pisică într-o pălărie” sau „un câine cu creastă”.

Imagine generată de Midjourney, porumbel mecanic Credit imagine Wikipedia, imagine generată de Midjourney

Cum funcționează DALL-E și Midjourney

Mai întâi, DALL-E. DALL-E este un model AI generativ bazat pe arhitectura transformer cu un transformer autoregresiv.

Un transformer autoregresiv definește modul în care un model generează imagini din descrieri textuale, generând un pixel la un moment dat, apoi folosind pixelii generați pentru a genera următorul pixel. Trecând prin mai multe straturi într-o rețea neurală, până când imaginea este completă.

Prin acest proces, DALL-E controlează atributele, obiectele, caracteristicile și altele în imaginea pe care o generează. Totuși, DALL-E 2 și 3 oferă mai mult control asupra imaginii generate.

Construirea primei tale aplicații de generare de imagini

Ce este necesar pentru a construi o aplicație de generare de imagini? Ai nevoie de următoarele biblioteci:

  • python-dotenv, este recomandat să folosești această bibliotecă pentru a păstra secretele într-un fișier .env separat de cod.
  • openai, această bibliotecă este utilizată pentru a interacționa cu API-ul OpenAI.
  • pillow, pentru a lucra cu imagini în Python.
  • requests, pentru a te ajuta să faci cereri HTTP.

Crearea și implementarea unui model Azure OpenAI

Dacă nu ai făcut deja acest lucru, urmează instrucțiunile de pe pagina Microsoft Learn pentru a crea o resursă și un model Azure OpenAI. Selectează DALL-E 3 ca model.

Crearea aplicației

  1. Creează un fișier .env cu următorul conținut:

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

    Localizează aceste informații în portalul Azure OpenAI Foundry pentru resursa ta în secțiunea "Deployments".

  2. Colectează bibliotecile de mai sus într-un fișier numit requirements.txt astfel:

    python-dotenv
    openai
    pillow
    requests
    
  3. Apoi, creează un mediu virtual și instalează bibliotecile:

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

    Pentru Windows, folosește următoarele comenzi pentru a crea și activa mediul virtual:

    python3 -m venv venv
    venv\Scripts\activate.bat
  4. Adaugă următorul cod într-un fișier numit 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)

Să explicăm acest cod:

  • Mai întâi, importăm bibliotecile necesare, inclusiv biblioteca OpenAI, biblioteca dotenv, biblioteca requests și biblioteca Pillow.

    import openai
    import os
    import requests
    from PIL import Image
    import dotenv
  • Apoi, încărcăm variabilele de mediu din fișierul .env.

    # import dotenv
    dotenv.load_dotenv()
  • După aceea, configurăm clientul serviciului 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"
        )
  • Apoi, generăm imaginea:

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

    Codul de mai sus răspunde cu un obiect JSON care conține URL-ul imaginii generate. Putem folosi URL-ul pentru a descărca imaginea și a o salva într-un fișier.

  • În final, deschidem imaginea și folosim vizualizatorul standard de imagini pentru a o afișa:

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

Mai multe detalii despre generarea imaginii

Să analizăm codul care generează imaginea în detaliu:

  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, este promptul text utilizat pentru a genera imaginea. În acest caz, folosim promptul "Iepure pe cal, ținând o acadea, pe o pajiște cețoasă unde cresc narcise".
  • size, este dimensiunea imaginii generate. În acest caz, generăm o imagine de 1024x1024 pixeli.
  • n, este numărul de imagini generate. În acest caz, generăm două imagini.
  • temperature, este un parametru care controlează aleatorietatea rezultatului unui model AI generativ. Temperatura este o valoare între 0 și 1, unde 0 înseamnă că rezultatul este determinist și 1 înseamnă că rezultatul este aleatoriu. Valoarea implicită este 0.7.

Există mai multe lucruri pe care le poți face cu imaginile, pe care le vom acoperi în secțiunea următoare.

Capacități suplimentare ale generării de imagini

Ai văzut până acum cum am reușit să generăm o imagine folosind câteva linii de cod în Python. Totuși, există mai multe lucruri pe care le poți face cu imaginile.

De asemenea, poți face următoarele:

  • Editări. Prin furnizarea unei imagini existente, a unei măști și a unui prompt, poți modifica o imagine. De exemplu, poți adăuga ceva într-o porțiune a imaginii. Imaginează-ți imaginea noastră cu iepurele, poți adăuga o pălărie iepurelui. Cum poți face acest lucru este prin furnizarea imaginii, a unei măști (identificând partea zonei pentru modificare) și a unui prompt text pentru a specifica ce ar trebui făcut.

Notă: acest lucru nu este suportat în DALL-E 3.

Iată un exemplu folosind 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

Imaginea de bază ar conține doar lounge-ul cu piscină, dar imaginea finală ar avea un flamingo:

  • Crearea de variații. Ideea este că iei o imagine existentă și ceri să fie create variații. Pentru a crea o variație, furnizezi o imagine și un prompt text și codul astfel:

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

    Notă, acest lucru este suportat doar pe OpenAI.

Temperatura

Temperatura este un parametru care controlează aleatorietatea rezultatului unui model AI generativ. Temperatura este o valoare între 0 și 1, unde 0 înseamnă că rezultatul este determinist și 1 înseamnă că rezultatul este aleatoriu. Valoarea implicită este 0.7.

Să analizăm un exemplu despre cum funcționează temperatura, rulând acest prompt de două ori:

Prompt : "Iepure pe cal, ținând o acadea, pe o pajiște cețoasă unde cresc narcise"

Iepure pe cal ținând o acadea, versiunea 1

Acum să rulăm același prompt doar pentru a vedea că nu vom obține aceeași imagine de două ori:

Imagine generată cu iepure pe cal

După cum poți vedea, imaginile sunt similare, dar nu identice. Să încercăm să schimbăm valoarea temperaturii la 0.1 și să vedem ce se întâmplă:

 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
    )

Schimbarea temperaturii

Așadar, să încercăm să facem răspunsul mai determinist. Am putea observa din cele două imagini generate că în prima imagine există un iepure și în a doua imagine există un cal, deci imaginile variază foarte mult.

Să schimbăm, așadar, codul nostru și să setăm temperatura la 0, astfel:

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
    )

Acum, când rulezi acest cod, obții aceste două imagini:

  • Temperatura 0, v1
  • Temperatura 0 , v2

Aici poți vedea clar cum imaginile se aseamănă mai mult.

Cum să definești limite pentru aplicația ta cu meta-prompturi

Cu demo-ul nostru, putem deja genera imagini pentru clienții noștri. Totuși, trebuie să creăm câteva limite pentru aplicația noastră.

De exemplu, nu dorim să generăm imagini care nu sunt potrivite pentru muncă sau care nu sunt adecvate pentru copii.

Putem face acest lucru cu meta-prompturi. Meta-prompturile sunt prompturi text utilizate pentru a controla rezultatul unui model AI generativ. De exemplu, putem folosi meta-prompturi pentru a controla rezultatul și a ne asigura că imaginile generate sunt potrivite pentru muncă sau adecvate pentru copii.

Cum funcționează?

Acum, cum funcționează meta-prompturile?

Meta-prompturile sunt prompturi text utilizate pentru a controla rezultatul unui model AI generativ, ele sunt poziționate înaintea promptului text și sunt utilizate pentru a controla rezultatul modelului și sunt încorporate în aplicații pentru a controla rezultatul modelului. Înglobând inputul promptului și inputul meta-promptului într-un singur prompt text.

Un exemplu de meta-prompt ar fi următorul:

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)

Acum, să vedem cum putem folosi meta-prompturi în demo-ul nostru.

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

Din promptul de mai sus, poți vedea cum toate imaginile create iau în considerare meta-promptul.

Sarcină - să îi ajutăm pe studenți

Am introdus Edu4All la începutul acestei lecții. Acum este momentul să îi ajutăm pe studenți să genereze imagini pentru evaluările lor.

Studenții vor crea imagini pentru evaluările lor care conțin monumente, exact ce monumente vor alege depinde de studenți. Studenții sunt rugați să își folosească creativitatea în această sarcină pentru a plasa aceste monumente în contexte diferite.

Soluție

Iată o posibilă soluție:

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)

Lucru Grozav! Continuă să înveți

După ce ai finalizat această lecție, consultă colecția noastră de învățare despre AI generativă pentru a continua să îți îmbunătățești cunoștințele despre AI generativă!

Mergi la Lecția 10, unde vom explora cum să construim aplicații AI cu cod redus


Declinare de responsabilitate:
Acest document a fost tradus folosind serviciul de traducere AI Co-op Translator. Deși ne străduim să asigurăm acuratețea, vă rugăm să fiți conștienți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa natală ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de oameni. Nu ne asumăm responsabilitatea pentru eventualele neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri.