Skip to content

Latest commit

 

History

History
489 lines (334 loc) · 20.3 KB

File metadata and controls

489 lines (334 loc) · 20.3 KB

Bygge applikasjoner for bildegenerering

Bygge applikasjoner for bildegenerering

LLM-er handler om mer enn bare tekstgenerering. Det er også mulig å generere bilder fra tekstbeskrivelser. Å ha bilder som en modalitet kan være svært nyttig i en rekke områder som MedTech, arkitektur, turisme, spillutvikling og mer. I dette kapittelet skal vi se nærmere på de to mest populære modellene for bildegenerering, DALL-E og Midjourney.

Introduksjon

I denne leksjonen skal vi dekke:

  • Bildegenerering og hvorfor det er nyttig.
  • DALL-E og Midjourney, hva de er og hvordan de fungerer.
  • Hvordan du kan bygge en applikasjon for bildegenerering.

Læringsmål

Etter å ha fullført denne leksjonen, vil du kunne:

  • Bygge en applikasjon for bildegenerering.
  • Definere grenser for applikasjonen din med metaprompter.
  • Arbeide med DALL-E og Midjourney.

Hvorfor bygge en applikasjon for bildegenerering?

Applikasjoner for bildegenerering er en flott måte å utforske mulighetene med Generativ AI. De kan brukes til for eksempel:

  • Bilderedigering og syntese. Du kan generere bilder for en rekke bruksområder, som bilderedigering og bildesyntese.

  • Anvendelse i ulike industrier. De kan også brukes til å generere bilder for en rekke industrier som MedTech, turisme, spillutvikling og mer.

Scenario: Edu4All

Som en del av denne leksjonen, skal vi fortsette å jobbe med vår oppstart, Edu4All. Studentene skal lage bilder til sine oppgaver, hva slags bilder er opp til studentene, men de kan for eksempel lage illustrasjoner til sitt eget eventyr, skape en ny karakter til historien sin eller hjelpe dem med å visualisere ideer og konsepter.

Her er et eksempel på hva Edu4Alls studenter kan generere hvis de jobber i klassen med monumenter:

Edu4All oppstart, klasse om monumenter, Eiffeltårnet

ved å bruke en prompt som

"Hund ved siden av Eiffeltårnet i tidlig morgensol"

Hva er DALL-E og Midjourney?

DALL-E og Midjourney er to av de mest populære modellene for bildegenerering. De lar deg bruke tekstprompter til å generere bilder.

DALL-E

La oss starte med DALL-E, som er en Generativ AI-modell som genererer bilder fra tekstbeskrivelser.

DALL-E er en kombinasjon av to modeller, CLIP og diffused attention.

  • CLIP, er en modell som genererer embeddings, som er numeriske representasjoner av data, fra bilder og tekst.

  • Diffused attention, er en modell som genererer bilder fra embeddings. DALL-E er trent på et datasett av bilder og tekst og kan brukes til å generere bilder fra tekstbeskrivelser. For eksempel kan DALL-E brukes til å generere bilder av en katt med hatt, eller en hund med mohawk.

Midjourney

Midjourney fungerer på en lignende måte som DALL-E; det genererer bilder fra tekstprompter. Midjourney kan også brukes til å generere bilder ved hjelp av prompter som "en katt med hatt" eller "en hund med mohawk".

Bilde generert av Midjourney, mekanisk due Bildekreditt Wikipedia, bilde generert av Midjourney

Hvordan fungerer DALL-E og Midjourney?

Først, DALL-E. DALL-E er en Generativ AI-modell basert på transformatorarkitekturen med en autoregressiv transformator.

En autoregressiv transformator definerer hvordan en modell genererer bilder fra tekstbeskrivelser. Den genererer én piksel om gangen, og bruker deretter de genererte pikslene til å generere neste piksel. Dette skjer gjennom flere lag i et nevralt nettverk, til bildet er fullført.

Med denne prosessen kontrollerer DALL-E attributter, objekter, egenskaper og mer i bildet det genererer. DALL-E 2 og 3 har imidlertid mer kontroll over det genererte bildet.

Bygge din første applikasjon for bildegenerering

Så hva kreves for å bygge en applikasjon for bildegenerering? Du trenger følgende biblioteker:

  • python-dotenv, det anbefales sterkt å bruke dette biblioteket for å holde hemmeligheter i en .env-fil borte fra koden.
  • openai, dette biblioteket brukes til å interagere med OpenAI API.
  • pillow, for å arbeide med bilder i Python.
  • requests, for å hjelpe deg med å gjøre HTTP-forespørsler.

Opprett og deploy en Azure OpenAI-modell

Hvis det ikke allerede er gjort, følg instruksjonene på Microsoft Learn-siden for å opprette en Azure OpenAI-ressurs og modell. Velg DALL-E 3 som modell.

Opprett appen

  1. Opprett en fil .env med følgende innhold:

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

    Finn denne informasjonen i Azure OpenAI Foundry Portal for ressursen din i "Deployments"-seksjonen.

  2. Samle de ovennevnte bibliotekene i en fil kalt requirements.txt slik:

    python-dotenv
    openai
    pillow
    requests
    
  3. Deretter opprett et virtuelt miljø og installer bibliotekene:

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

    For Windows, bruk følgende kommandoer for å opprette og aktivere ditt virtuelle miljø:

    python3 -m venv venv
    venv\Scripts\activate.bat
  4. Legg til følgende kode i en fil kalt 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)

La oss forklare denne koden:

  • Først importerer vi bibliotekene vi trenger, inkludert OpenAI-biblioteket, dotenv-biblioteket, requests-biblioteket og Pillow-biblioteket.

    import openai
    import os
    import requests
    from PIL import Image
    import dotenv
  • Deretter laster vi miljøvariablene fra .env-filen.

    # import dotenv
    dotenv.load_dotenv()
  • Etter det konfigurerer vi Azure OpenAI serviceklienten.

    # 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"
        )
  • Deretter genererer vi bildet:

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

    Koden ovenfor svarer med et JSON-objekt som inneholder URL-en til det genererte bildet. Vi kan bruke URL-en til å laste ned bildet og lagre det i en fil.

  • Til slutt åpner vi bildet og bruker standard bildeviser for å vise det:

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

Flere detaljer om bildegenerering

La oss se nærmere på koden som genererer bildet:

  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, er tekstprompten som brukes til å generere bildet. I dette tilfellet bruker vi prompten "Kanin på hest, holder en kjærlighet, på en tåket eng hvor det vokser påskeliljer".
  • size, er størrelsen på bildet som genereres. I dette tilfellet genererer vi et bilde som er 1024x1024 piksler.
  • n, er antallet bilder som genereres. I dette tilfellet genererer vi to bilder.
  • temperature, er en parameter som kontrollerer tilfeldigheten i output fra en Generativ AI-modell. Temperaturen er en verdi mellom 0 og 1 hvor 0 betyr at output er deterministisk og 1 betyr at output er tilfeldig. Standardverdien er 0.7.

Det er flere ting du kan gjøre med bilder som vi vil dekke i neste seksjon.

Ytterligere funksjoner for bildegenerering

Så langt har du sett hvordan vi kunne generere et bilde med noen få linjer i Python. Det er imidlertid flere ting du kan gjøre med bilder.

Du kan også gjøre følgende:

  • Utføre redigeringer. Ved å gi et eksisterende bilde en maske og en prompt, kan du endre et bilde. For eksempel kan du legge til noe på en del av et bilde. Tenk deg vårt kaninbilde; du kan legge til en hatt på kaninen. Hvordan du ville gjort det er ved å gi bildet, en maske (identifisere området for endringen) og en tekstprompt som sier hva som skal gjøres.

Merk: dette støttes ikke i DALL-E 3.

Her er et eksempel ved bruk av 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

Grunnbildet ville bare inneholde loungen med basseng, men det endelige bildet ville ha en flamingo:

  • Skape variasjoner. Ideen er at du tar et eksisterende bilde og ber om at variasjoner opprettes. For å lage en variasjon, gir du et bilde og en tekstprompt og kode som dette:

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

    Merk, dette støttes kun på OpenAI.

Temperatur

Temperatur er en parameter som kontrollerer tilfeldigheten i output fra en Generativ AI-modell. Temperaturen er en verdi mellom 0 og 1 hvor 0 betyr at output er deterministisk og 1 betyr at output er tilfeldig. Standardverdien er 0.7.

La oss se på et eksempel på hvordan temperatur fungerer, ved å kjøre denne prompten to ganger:

Prompt: "Kanin på hest, holder en kjærlighet, på en tåket eng hvor det vokser påskeliljer"

Kanin på hest som holder en kjærlighet, versjon 1

La oss nå kjøre den samme prompten igjen for å se at vi ikke får det samme bildet to ganger:

Generert bilde av kanin på hest

Som du kan se, er bildene like, men ikke identiske. La oss prøve å endre temperaturverdien til 0.1 og se hva som skjer:

 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
    )

Endre temperaturen

La oss prøve å gjøre responsen mer deterministisk. Vi kunne observere fra de to bildene vi genererte at i det første bildet er det en kanin, og i det andre bildet er det en hest, så bildene varierer sterkt.

La oss derfor endre koden vår og sette temperaturen til 0, slik:

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
    )

Når du kjører denne koden, får du disse to bildene:

  • Temperatur 0, v1
  • Temperatur 0, v2

Her kan du tydelig se hvordan bildene ligner hverandre mer.

Hvordan definere grenser for applikasjonen din med metaprompter

Med vår demo kan vi allerede generere bilder for våre kunder. Imidlertid må vi opprette noen grenser for applikasjonen vår.

For eksempel ønsker vi ikke å generere bilder som ikke er egnet for arbeid, eller som ikke er passende for barn.

Vi kan gjøre dette med metaprompter. Metaprompter er tekstprompter som brukes til å kontrollere output fra en Generativ AI-modell. For eksempel kan vi bruke metaprompter til å kontrollere output og sikre at de genererte bildene er egnet for arbeid eller passende for barn.

Hvordan fungerer det?

Hvordan fungerer metaprompter?

Metaprompter er tekstprompter som brukes til å kontrollere output fra en Generativ AI-modell. De plasseres før tekstprompten og brukes til å kontrollere modellens output og integreres i applikasjoner for å kontrollere modellens output. De kapsler inn prompt-input og metaprompt-input i en enkelt tekstprompt.

Et eksempel på en metaprompt kan være følgende:

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)

La oss nå se hvordan vi kan bruke metaprompter i vår demo.

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

Fra prompten ovenfor kan du se hvordan alle bilder som opprettes tar hensyn til metaprompten.

Oppgave - la oss aktivere studentene

Vi introduserte Edu4All i begynnelsen av denne leksjonen. Nå er det på tide å aktivere studentene til å generere bilder for sine oppgaver.

Studentene skal lage bilder for sine oppgaver som inneholder monumenter, hvilke monumenter er opp til studentene. Studentene blir bedt om å bruke sin kreativitet i denne oppgaven for å plassere disse monumentene i ulike kontekster.

Løsning

Her er en mulig løsning:

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)

Flott arbeid! Fortsett læringen din

Etter å ha fullført denne leksjonen, sjekk ut vår Generative AI Learning-samling for å fortsette å utvikle kunnskapen din om Generativ AI!

Gå videre til Leksjon 10, hvor vi skal se på hvordan man bygger AI-applikasjoner med lavkode


Ansvarsfraskrivelse:
Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten Co-op Translator. Selv om vi tilstreber nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen.