Skip to content

Latest commit

 

History

History
487 lines (333 loc) · 23.5 KB

File metadata and controls

487 lines (333 loc) · 23.5 KB

Xây dựng ứng dụng tạo hình ảnh

Xây dựng ứng dụng tạo hình ảnh

LLM không chỉ dừng lại ở việc tạo văn bản. Chúng cũng có thể tạo hình ảnh từ mô tả bằng văn bản. Việc sử dụng hình ảnh như một phương thức có thể rất hữu ích trong nhiều lĩnh vực như công nghệ y tế, kiến trúc, du lịch, phát triển trò chơi và nhiều lĩnh vực khác. Trong chương này, chúng ta sẽ tìm hiểu về hai mô hình tạo hình ảnh phổ biến nhất, DALL-E và Midjourney.

Giới thiệu

Trong bài học này, chúng ta sẽ đề cập đến:

  • Tạo hình ảnh và lý do tại sao nó hữu ích.
  • DALL-E và Midjourney, chúng là gì và cách chúng hoạt động.
  • Cách xây dựng một ứng dụng tạo hình ảnh.

Mục tiêu học tập

Sau khi hoàn thành bài học này, bạn sẽ có thể:

  • Xây dựng một ứng dụng tạo hình ảnh.
  • Đặt giới hạn cho ứng dụng của bạn bằng các meta prompt.
  • Làm việc với DALL-E và Midjourney.

Tại sao xây dựng ứng dụng tạo hình ảnh?

Ứng dụng tạo hình ảnh là một cách tuyệt vời để khám phá khả năng của Generative AI. Chúng có thể được sử dụng cho, ví dụ:

  • Chỉnh sửa và tổng hợp hình ảnh. Bạn có thể tạo hình ảnh cho nhiều trường hợp sử dụng, chẳng hạn như chỉnh sửa hình ảnh và tổng hợp hình ảnh.

  • Áp dụng vào nhiều ngành công nghiệp. Chúng cũng có thể được sử dụng để tạo hình ảnh cho nhiều ngành công nghiệp như công nghệ y tế, du lịch, phát triển trò chơi và nhiều lĩnh vực khác.

Kịch bản: Edu4All

Trong bài học này, chúng ta sẽ tiếp tục làm việc với startup Edu4All. Các học sinh sẽ tạo hình ảnh cho bài tập của họ, hình ảnh cụ thể là gì sẽ do học sinh quyết định, nhưng có thể là minh họa cho câu chuyện cổ tích của riêng họ, tạo nhân vật mới cho câu chuyện hoặc giúp họ hình dung ý tưởng và khái niệm của mình.

Dưới đây là ví dụ về những gì học sinh của Edu4All có thể tạo ra nếu họ đang học về các công trình kiến trúc:

Startup Edu4All, lớp học về các công trình kiến trúc, Tháp Eiffel

sử dụng một prompt như:

"Chó bên cạnh Tháp Eiffel trong ánh sáng mặt trời buổi sáng sớm"

DALL-E và Midjourney là gì?

DALL-EMidjourney là hai mô hình tạo hình ảnh phổ biến nhất, cho phép bạn sử dụng các prompt để tạo hình ảnh.

DALL-E

Hãy bắt đầu với DALL-E, một mô hình Generative AI tạo hình ảnh từ mô tả bằng văn bản.

DALL-E là sự kết hợp của hai mô hình, CLIP và diffused attention.

  • CLIP, là một mô hình tạo embeddings, tức là các biểu diễn số của dữ liệu, từ hình ảnh và văn bản.

  • Diffused attention, là một mô hình tạo hình ảnh từ embeddings. DALL-E được huấn luyện trên một tập dữ liệu gồm hình ảnh và văn bản và có thể được sử dụng để tạo hình ảnh từ mô tả bằng văn bản. Ví dụ, DALL-E có thể được sử dụng để tạo hình ảnh của một con mèo đội mũ, hoặc một con chó với kiểu tóc mohawk.

Midjourney

Midjourney hoạt động tương tự như DALL-E, nó tạo hình ảnh từ các prompt bằng văn bản. Midjourney cũng có thể được sử dụng để tạo hình ảnh với các prompt như “một con mèo đội mũ”, hoặc “một con chó với kiểu tóc mohawk”.

Hình ảnh được tạo bởi Midjourney, chim bồ câu cơ khí Hình ảnh từ Wikipedia, được tạo bởi Midjourney

DALL-E và Midjourney hoạt động như thế nào?

Đầu tiên, DALL-E. DALL-E là một mô hình Generative AI dựa trên kiến trúc transformer với một autoregressive transformer.

Một autoregressive transformer định nghĩa cách một mô hình tạo hình ảnh từ mô tả bằng văn bản, nó tạo từng pixel một, sau đó sử dụng các pixel đã tạo để tạo pixel tiếp theo. Quá trình này đi qua nhiều lớp trong mạng neural, cho đến khi hình ảnh hoàn chỉnh.

Với quy trình này, DALL-E kiểm soát các thuộc tính, đối tượng, đặc điểm và nhiều yếu tố khác trong hình ảnh mà nó tạo ra. Tuy nhiên, DALL-E 2 và 3 có khả năng kiểm soát hình ảnh tạo ra tốt hơn.

Xây dựng ứng dụng tạo hình ảnh đầu tiên của bạn

Vậy cần những gì để xây dựng một ứng dụng tạo hình ảnh? Bạn cần các thư viện sau:

  • python-dotenv, rất khuyến khích sử dụng thư viện này để giữ các thông tin bí mật trong tệp .env tránh xa mã nguồn.
  • openai, thư viện này sẽ được sử dụng để tương tác với API của OpenAI.
  • pillow, để làm việc với hình ảnh trong Python.
  • requests, để hỗ trợ thực hiện các yêu cầu HTTP.

Tạo và triển khai mô hình Azure OpenAI

Nếu chưa thực hiện, hãy làm theo hướng dẫn trên trang Microsoft Learn để tạo tài nguyên và mô hình Azure OpenAI. Chọn DALL-E 3 làm mô hình.

Tạo ứng dụng

  1. Tạo một tệp .env với nội dung sau:

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

    Tìm thông tin này trong Azure OpenAI Foundry Portal cho tài nguyên của bạn trong phần "Deployments".

  2. Thu thập các thư viện trên vào một tệp gọi là requirements.txt như sau:

    python-dotenv
    openai
    pillow
    requests
    
  3. Tiếp theo, tạo môi trường ảo và cài đặt các thư viện:

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

    Đối với Windows, sử dụng các lệnh sau để tạo và kích hoạt môi trường ảo:

    python3 -m venv venv
    venv\Scripts\activate.bat
  4. Thêm mã sau vào tệp gọi là 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)

Giải thích mã này:

  • Đầu tiên, chúng ta nhập các thư viện cần thiết, bao gồm thư viện OpenAI, thư viện dotenv, thư viện requests và thư viện Pillow.

    import openai
    import os
    import requests
    from PIL import Image
    import dotenv
  • Tiếp theo, chúng ta tải các biến môi trường từ tệp .env.

    # import dotenv
    dotenv.load_dotenv()
  • Sau đó, chúng ta cấu hình client dịch vụ 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"
        )
  • Tiếp theo, chúng ta tạo hình ảnh:

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

    Mã trên trả về một đối tượng JSON chứa URL của hình ảnh được tạo. Chúng ta có thể sử dụng URL để tải hình ảnh và lưu vào tệp.

  • Cuối cùng, chúng ta mở hình ảnh và sử dụng trình xem hình ảnh tiêu chuẩn để hiển thị nó:

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

Chi tiết hơn về việc tạo hình ảnh

Hãy xem mã tạo hình ảnh chi tiết hơn:

  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, là prompt bằng văn bản được sử dụng để tạo hình ảnh. Trong trường hợp này, chúng ta sử dụng prompt "Thỏ trên lưng ngựa, cầm kẹo mút, trên đồng cỏ sương mù nơi mọc hoa thủy tiên".
  • size, là kích thước của hình ảnh được tạo. Trong trường hợp này, chúng ta tạo hình ảnh có kích thước 1024x1024 pixel.
  • n, là số lượng hình ảnh được tạo. Trong trường hợp này, chúng ta tạo hai hình ảnh.
  • temperature, là tham số kiểm soát độ ngẫu nhiên của đầu ra của mô hình Generative AI. Giá trị temperature nằm trong khoảng từ 0 đến 1, trong đó 0 nghĩa là đầu ra mang tính xác định và 1 nghĩa là đầu ra ngẫu nhiên. Giá trị mặc định là 0.7.

Có nhiều điều bạn có thể làm với hình ảnh mà chúng ta sẽ đề cập trong phần tiếp theo.

Các khả năng bổ sung của việc tạo hình ảnh

Bạn đã thấy cách chúng ta có thể tạo hình ảnh chỉ với vài dòng mã trong Python. Tuy nhiên, còn nhiều điều bạn có thể làm với hình ảnh.

Bạn cũng có thể thực hiện các điều sau:

  • Chỉnh sửa hình ảnh. Bằng cách cung cấp một hình ảnh hiện có, một mặt nạ và một prompt, bạn có thể thay đổi hình ảnh. Ví dụ, bạn có thể thêm một vật gì đó vào một phần của hình ảnh. Hãy tưởng tượng hình ảnh thỏ của chúng ta, bạn có thể thêm một chiếc mũ cho thỏ. Cách thực hiện là cung cấp hình ảnh, một mặt nạ (xác định phần khu vực cần thay đổi) và một prompt bằng văn bản để nói điều gì cần làm.

Lưu ý: điều này không được hỗ trợ trong DALL-E 3.

Dưới đây là một ví dụ sử dụng 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

Hình ảnh gốc chỉ chứa phòng khách với hồ bơi nhưng hình ảnh cuối cùng sẽ có thêm một con chim hồng hạc:

  • Tạo các biến thể. Ý tưởng là bạn lấy một hình ảnh hiện có và yêu cầu tạo các biến thể. Để tạo một biến thể, bạn cung cấp một hình ảnh và một prompt bằng văn bản và mã như sau:

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

    Lưu ý, điều này chỉ được hỗ trợ trên OpenAI.

Temperature

Temperature là tham số kiểm soát độ ngẫu nhiên của đầu ra của mô hình Generative AI. Giá trị temperature nằm trong khoảng từ 0 đến 1, trong đó 0 nghĩa là đầu ra mang tính xác định và 1 nghĩa là đầu ra ngẫu nhiên. Giá trị mặc định là 0.7.

Hãy xem một ví dụ về cách temperature hoạt động, bằng cách chạy prompt này hai lần:

Prompt: "Thỏ trên lưng ngựa, cầm kẹo mút, trên đồng cỏ sương mù nơi mọc hoa thủy tiên"

Thỏ trên lưng ngựa cầm kẹo mút, phiên bản 1

Bây giờ hãy chạy lại prompt đó để xem rằng chúng ta sẽ không nhận được cùng một hình ảnh hai lần:

Hình ảnh được tạo của thỏ trên lưng ngựa

Như bạn thấy, các hình ảnh tương tự nhau, nhưng không giống hệt. Hãy thử thay đổi giá trị temperature thành 0.1 và xem điều gì xảy ra:

 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
    )

Thay đổi temperature

Vậy hãy thử làm cho đầu ra mang tính xác định hơn. Chúng ta có thể quan sát từ hai hình ảnh đã tạo rằng trong hình ảnh đầu tiên, có một con thỏ và trong hình ảnh thứ hai, có một con ngựa, vì vậy các hình ảnh khác nhau khá nhiều.

Do đó, hãy thay đổi mã của chúng ta và đặt temperature thành 0, như sau:

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
    )

Bây giờ khi bạn chạy mã này, bạn sẽ nhận được hai hình ảnh sau:

  • Temperature 0, v1
  • Temperature 0, v2

Ở đây bạn có thể thấy rõ ràng rằng các hình ảnh giống nhau hơn.

Cách đặt giới hạn cho ứng dụng của bạn với metaprompt

Với demo của chúng ta, chúng ta đã có thể tạo hình ảnh cho khách hàng. Tuy nhiên, chúng ta cần tạo một số giới hạn cho ứng dụng của mình.

Ví dụ, chúng ta không muốn tạo hình ảnh không phù hợp với môi trường làm việc hoặc không phù hợp với trẻ em.

Chúng ta có thể làm điều này với metaprompt. Metaprompt là các prompt bằng văn bản được sử dụng để kiểm soát đầu ra của mô hình Generative AI. Ví dụ, chúng ta có thể sử dụng metaprompt để kiểm soát đầu ra và đảm bảo rằng các hình ảnh được tạo phù hợp với môi trường làm việc hoặc phù hợp với trẻ em.

Nó hoạt động như thế nào?

Vậy metaprompt hoạt động như thế nào?

Metaprompt là các prompt bằng văn bản được sử dụng để kiểm soát đầu ra của mô hình Generative AI, chúng được đặt trước prompt bằng văn bản và được sử dụng để kiểm soát đầu ra của mô hình và được nhúng vào ứng dụng để kiểm soát đầu ra của mô hình. Kết hợp đầu vào của prompt và đầu vào của metaprompt trong một prompt bằng văn bản duy nhất.

Một ví dụ về metaprompt sẽ là:

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)

Bây giờ, hãy xem cách chúng ta có thể sử dụng metaprompt trong demo của mình.

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

Từ prompt trên, bạn có thể thấy cách tất cả các hình ảnh được tạo đều xem xét metaprompt.

Bài tập - hãy hỗ trợ học sinh

Chúng ta đã giới thiệu Edu4All ở đầu bài học này. Bây giờ là lúc hỗ trợ học sinh tạo hình ảnh cho bài tập của họ.

Học sinh sẽ tạo hình ảnh cho bài tập của họ liên quan đến các công trình kiến trúc, cụ thể là công trình nào sẽ do học sinh quyết định. Học sinh được yêu cầu sử dụng sự sáng tạo của mình trong nhiệm vụ này để đặt các công trình kiến trúc này trong các bối cảnh khác nhau.

Giải pháp

Dưới đây là một giải pháp khả thi:

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)

Làm tốt lắm! Tiếp tục học hỏi

Sau khi hoàn thành bài học này, hãy xem bộ sưu tập Học về AI Tạo sinh để tiếp tục nâng cao kiến thức của bạn về AI Tạo sinh!

Hãy chuyển sang Bài học 10, nơi chúng ta sẽ tìm hiểu cách xây dựng ứng dụng AI với mã thấp


Tuyên bố miễn trừ trách nhiệm:
Tài liệu này đã được dịch bằng dịch vụ dịch thuật AI Co-op Translator. Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng các bản dịch tự động có thể chứa lỗi hoặc không chính xác. Tài liệu gốc bằng ngôn ngữ bản địa nên được coi là nguồn thông tin chính thức. Đối với các thông tin quan trọng, khuyến nghị sử dụng dịch vụ dịch thuật chuyên nghiệp bởi con người. Chúng tôi không chịu trách nhiệm cho bất kỳ sự hiểu lầm hoặc diễn giải sai nào phát sinh từ việc sử dụng bản dịch này.