Skip to content

Latest commit

 

History

History
489 lines (334 loc) · 20.5 KB

File metadata and controls

489 lines (334 loc) · 20.5 KB

Membina Aplikasi Penjanaan Imej

Membina Aplikasi Penjanaan Imej

LLM bukan hanya untuk penjanaan teks. Ia juga boleh digunakan untuk menjana imej daripada deskripsi teks. Mempunyai imej sebagai satu modaliti boleh sangat berguna dalam pelbagai bidang seperti MedTech, seni bina, pelancongan, pembangunan permainan dan banyak lagi. Dalam bab ini, kita akan melihat dua model penjanaan imej yang paling popular, DALL-E dan Midjourney.

Pengenalan

Dalam pelajaran ini, kita akan membincangkan:

  • Penjanaan imej dan mengapa ia berguna.
  • DALL-E dan Midjourney, apa itu dan bagaimana ia berfungsi.
  • Bagaimana anda boleh membina aplikasi penjanaan imej.

Matlamat Pembelajaran

Selepas menyelesaikan pelajaran ini, anda akan dapat:

  • Membina aplikasi penjanaan imej.
  • Menentukan sempadan untuk aplikasi anda dengan meta prompt.
  • Bekerja dengan DALL-E dan Midjourney.

Mengapa membina aplikasi penjanaan imej?

Aplikasi penjanaan imej adalah cara yang hebat untuk meneroka keupayaan AI Generatif. Ia boleh digunakan untuk, sebagai contoh:

  • Penyuntingan dan sintesis imej. Anda boleh menjana imej untuk pelbagai kegunaan seperti penyuntingan imej dan sintesis imej.

  • Digunakan dalam pelbagai industri. Ia juga boleh digunakan untuk menjana imej untuk pelbagai industri seperti MedTech, Pelancongan, Pembangunan Permainan dan banyak lagi.

Senario: Edu4All

Sebagai sebahagian daripada pelajaran ini, kita akan terus bekerja dengan startup kita, Edu4All. Pelajar akan mencipta imej untuk penilaian mereka, jenis imej yang dihasilkan bergantung kepada pelajar, tetapi mereka boleh membuat ilustrasi untuk cerita dongeng mereka sendiri atau mencipta watak baru untuk cerita mereka atau membantu mereka menggambarkan idea dan konsep mereka.

Berikut adalah contoh apa yang pelajar Edu4All boleh hasilkan jika mereka sedang belajar tentang monumen:

Startup Edu4All, kelas tentang monumen, Menara Eiffel

menggunakan prompt seperti

"Anjing di sebelah Menara Eiffel pada waktu pagi yang cerah"

Apa itu DALL-E dan Midjourney?

DALL-E dan Midjourney adalah dua model penjanaan imej yang paling popular, mereka membolehkan anda menggunakan prompt untuk menjana imej.

DALL-E

Mari kita mulakan dengan DALL-E, yang merupakan model AI Generatif yang menjana imej daripada deskripsi teks.

DALL-E adalah gabungan dua model, CLIP dan perhatian tersebar.

  • CLIP, adalah model yang menjana embedding, iaitu representasi data secara numerik, daripada imej dan teks.

  • Perhatian tersebar, adalah model yang menjana imej daripada embedding. DALL-E dilatih menggunakan dataset imej dan teks dan boleh digunakan untuk menjana imej daripada deskripsi teks. Sebagai contoh, DALL-E boleh digunakan untuk menjana imej kucing memakai topi, atau anjing dengan gaya rambut mohawk.

Midjourney

Midjourney berfungsi dengan cara yang sama seperti DALL-E, ia menjana imej daripada prompt teks. Midjourney juga boleh digunakan untuk menjana imej menggunakan prompt seperti "kucing memakai topi", atau "anjing dengan gaya rambut mohawk".

Imej yang dijana oleh Midjourney, burung merpati mekanikal Kredit imej Wikipedia, imej dijana oleh Midjourney

Bagaimana DALL-E dan Midjourney Berfungsi

Pertama, DALL-E. DALL-E adalah model AI Generatif berdasarkan seni bina transformer dengan transformer autoregresif.

Transformer autoregresif menentukan bagaimana model menjana imej daripada deskripsi teks, ia menjana satu piksel pada satu masa, dan kemudian menggunakan piksel yang dijana untuk menjana piksel seterusnya. Melalui beberapa lapisan dalam rangkaian neural, sehingga imej selesai.

Dengan proses ini, DALL-E mengawal atribut, objek, ciri, dan banyak lagi dalam imej yang dijana. Walau bagaimanapun, DALL-E 2 dan 3 mempunyai lebih banyak kawalan ke atas imej yang dijana.

Membina aplikasi penjanaan imej pertama anda

Jadi, apa yang diperlukan untuk membina aplikasi penjanaan imej? Anda memerlukan perpustakaan berikut:

  • python-dotenv, sangat disarankan untuk menggunakan perpustakaan ini untuk menyimpan rahsia anda dalam fail .env jauh daripada kod.
  • openai, perpustakaan ini adalah apa yang anda akan gunakan untuk berinteraksi dengan API OpenAI.
  • pillow, untuk bekerja dengan imej dalam Python.
  • requests, untuk membantu anda membuat permintaan HTTP.

Cipta dan terapkan model Azure OpenAI

Jika belum dilakukan, ikuti arahan di halaman Microsoft Learn untuk mencipta sumber dan model Azure OpenAI. Pilih DALL-E 3 sebagai model.

Cipta aplikasi

  1. Cipta fail .env dengan kandungan berikut:

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

    Cari maklumat ini di Portal Azure OpenAI Foundry untuk sumber anda di bahagian "Deployments".

  2. Kumpulkan perpustakaan di atas dalam fail bernama requirements.txt seperti berikut:

    python-dotenv
    openai
    pillow
    requests
    
  3. Seterusnya, cipta persekitaran maya dan pasang perpustakaan:

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

    Untuk Windows, gunakan arahan berikut untuk mencipta dan mengaktifkan persekitaran maya anda:

    python3 -m venv venv
    venv\Scripts\activate.bat
  4. Tambahkan kod berikut dalam fail bernama 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)

Mari kita jelaskan kod ini:

  • Pertama, kita import perpustakaan yang kita perlukan, termasuk perpustakaan OpenAI, perpustakaan dotenv, perpustakaan requests, dan perpustakaan Pillow.

    import openai
    import os
    import requests
    from PIL import Image
    import dotenv
  • Seterusnya, kita muatkan pembolehubah persekitaran daripada fail .env.

    # import dotenv
    dotenv.load_dotenv()
  • Selepas itu, kita konfigurasikan klien perkhidmatan 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"
        )
  • Seterusnya, kita menjana imej:

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

    Kod di atas memberikan respons dengan objek JSON yang mengandungi URL imej yang dijana. Kita boleh menggunakan URL untuk memuat turun imej dan menyimpannya ke fail.

  • Akhir sekali, kita buka imej dan gunakan penonton imej standard untuk memaparkannya:

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

Maklumat lanjut tentang penjanaan imej

Mari kita lihat kod yang menjana imej dengan lebih terperinci:

  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, adalah teks prompt yang digunakan untuk menjana imej. Dalam kes ini, kita menggunakan prompt "Arnab di atas kuda, memegang lolipop, di padang berkabus di mana tumbuh bunga daffodil".
  • size, adalah saiz imej yang dijana. Dalam kes ini, kita menjana imej bersaiz 1024x1024 piksel.
  • n, adalah bilangan imej yang dijana. Dalam kes ini, kita menjana dua imej.
  • temperature, adalah parameter yang mengawal kebarangkalian output model AI Generatif. Nilai temperature adalah antara 0 dan 1 di mana 0 bermaksud output adalah deterministik dan 1 bermaksud output adalah rawak. Nilai lalai adalah 0.7.

Terdapat lebih banyak perkara yang boleh anda lakukan dengan imej yang akan kita bincangkan dalam bahagian seterusnya.

Keupayaan tambahan penjanaan imej

Anda telah melihat bagaimana kita dapat menjana imej menggunakan beberapa baris kod dalam Python. Walau bagaimanapun, terdapat lebih banyak perkara yang boleh anda lakukan dengan imej.

Anda juga boleh melakukan perkara berikut:

  • Melakukan penyuntingan. Dengan memberikan imej sedia ada, topeng dan prompt, anda boleh mengubah imej. Sebagai contoh, anda boleh menambah sesuatu pada bahagian imej. Bayangkan imej arnab kita, anda boleh menambah topi pada arnab. Cara anda melakukannya adalah dengan memberikan imej, topeng (mengenal pasti bahagian kawasan untuk perubahan) dan prompt teks untuk mengatakan apa yang perlu dilakukan.

Nota: ini tidak disokong dalam DALL-E 3.

Berikut adalah contoh menggunakan 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

Imej asas hanya akan mengandungi ruang santai dengan kolam tetapi imej akhir akan mempunyai flamingo:

  • Cipta variasi. Ideanya adalah anda mengambil imej sedia ada dan meminta variasi dicipta. Untuk mencipta variasi, anda memberikan imej dan prompt teks serta kod seperti berikut:

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

    Nota, ini hanya disokong pada OpenAI

Temperature

Temperature adalah parameter yang mengawal kebarangkalian output model AI Generatif. Nilai temperature adalah antara 0 dan 1 di mana 0 bermaksud output adalah deterministik dan 1 bermaksud output adalah rawak. Nilai lalai adalah 0.7.

Mari kita lihat contoh bagaimana temperature berfungsi, dengan menjalankan prompt ini dua kali:

Prompt : "Arnab di atas kuda, memegang lolipop, di padang berkabus di mana tumbuh bunga daffodil"

Arnab di atas kuda memegang lolipop, versi 1

Sekarang mari kita jalankan prompt yang sama untuk melihat bahawa kita tidak akan mendapat imej yang sama dua kali:

Imej dijana arnab di atas kuda

Seperti yang anda lihat, imej-imej itu serupa, tetapi tidak sama. Mari cuba ubah nilai temperature kepada 0.1 dan lihat apa yang berlaku:

 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
    )

Mengubah temperature

Jadi mari kita cuba membuat respons lebih deterministik. Kita dapat melihat daripada dua imej yang kita hasilkan bahawa dalam imej pertama, terdapat arnab dan dalam imej kedua, terdapat kuda, jadi imej-imej itu sangat berbeza.

Oleh itu, mari kita ubah kod kita dan tetapkan temperature kepada 0, seperti berikut:

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
    )

Sekarang apabila anda menjalankan kod ini, anda akan mendapat dua imej ini:

  • Temperature 0, v1
  • Temperature 0 , v2

Di sini anda dapat melihat dengan jelas bagaimana imej-imej itu lebih menyerupai satu sama lain.

Bagaimana untuk menentukan sempadan untuk aplikasi anda dengan metaprompt

Dengan demo kita, kita sudah boleh menjana imej untuk pelanggan kita. Walau bagaimanapun, kita perlu mencipta beberapa sempadan untuk aplikasi kita.

Sebagai contoh, kita tidak mahu menjana imej yang tidak sesuai untuk kerja, atau yang tidak sesuai untuk kanak-kanak.

Kita boleh melakukan ini dengan metaprompt. Metaprompt adalah teks prompt yang digunakan untuk mengawal output model AI Generatif. Sebagai contoh, kita boleh menggunakan metaprompt untuk mengawal output, dan memastikan imej yang dijana sesuai untuk kerja, atau sesuai untuk kanak-kanak.

Bagaimana ia berfungsi?

Sekarang, bagaimana metaprompt berfungsi?

Metaprompt adalah teks prompt yang digunakan untuk mengawal output model AI Generatif, ia diletakkan sebelum teks prompt, dan digunakan untuk mengawal output model serta disematkan dalam aplikasi untuk mengawal output model. Menggabungkan input prompt dan input metaprompt dalam satu teks prompt.

Satu contoh metaprompt adalah seperti berikut:

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)

Sekarang, mari kita lihat bagaimana kita boleh menggunakan metaprompt dalam demo kita.

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

Daripada prompt di atas, anda dapat melihat bagaimana semua imej yang dihasilkan mengambil kira metaprompt.

Tugasan - mari bantu pelajar

Kami memperkenalkan Edu4All pada permulaan pelajaran ini. Sekarang tiba masanya untuk membantu pelajar menjana imej untuk penilaian mereka.

Pelajar akan mencipta imej untuk penilaian mereka yang mengandungi monumen, jenis monumen yang dihasilkan bergantung kepada pelajar. Pelajar diminta menggunakan kreativiti mereka dalam tugasan ini untuk meletakkan monumen ini dalam konteks yang berbeza.

Penyelesaian

Berikut adalah satu penyelesaian yang mungkin:

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)

Kerja Hebat! Teruskan Pembelajaran Anda

Selepas menyelesaikan pelajaran ini, lihat koleksi Pembelajaran AI Generatif kami untuk terus meningkatkan pengetahuan anda tentang AI Generatif!

Pergi ke Pelajaran 10 di mana kita akan melihat cara membina aplikasi AI dengan kod rendah


Penafian:
Dokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI Co-op Translator. Walaupun kami berusaha untuk ketepatan, sila ambil perhatian bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat penting, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.