Skip to content

Latest commit

 

History

History
488 lines (334 loc) · 23.3 KB

File metadata and controls

488 lines (334 loc) · 23.3 KB

בניית יישומים ליצירת תמונות

בניית יישומים ליצירת תמונות

יש הרבה יותר ל-LLMs מאשר יצירת טקסט. ניתן גם ליצור תמונות מתיאורים טקסטואליים. שימוש בתמונות כמודל יכול להיות מאוד שימושי בתחומים רבים כמו טכנולוגיה רפואית, אדריכלות, תיירות, פיתוח משחקים ועוד. בפרק זה, נבחן את שני המודלים הפופולריים ביותר ליצירת תמונות, DALL-E ו-Midjourney.

הקדמה

בשיעור זה, נעסוק ב:

  • יצירת תמונות ולמה זה שימושי.
  • DALL-E ו-Midjourney, מה הם ואיך הם עובדים.
  • איך לבנות יישום ליצירת תמונות.

מטרות למידה

לאחר סיום השיעור, תוכלו:

  • לבנות יישום ליצירת תמונות.
  • להגדיר גבולות ליישום שלכם באמצעות מטה-פרומפטים.
  • לעבוד עם DALL-E ו-Midjourney.

למה לבנות יישום ליצירת תמונות?

יישומים ליצירת תמונות הם דרך מצוינת לחקור את היכולות של בינה מלאכותית יוצרת. ניתן להשתמש בהם, לדוגמה:

  • עריכת תמונות וסינתזה. ניתן ליצור תמונות למגוון שימושים, כמו עריכת תמונות וסינתזה של תמונות.

  • יישום בתעשיות שונות. ניתן גם להשתמש בהם ליצירת תמונות עבור מגוון תעשיות כמו טכנולוגיה רפואית, תיירות, פיתוח משחקים ועוד.

תרחיש: Edu4All

כחלק מהשיעור הזה, נמשיך לעבוד עם הסטארטאפ שלנו, Edu4All. התלמידים ייצרו תמונות עבור ההערכות שלהם, בדיוק אילו תמונות זה תלוי בהם, אבל הם יכולים להיות איורים לאגדה שלהם, יצירת דמות חדשה לסיפור שלהם או לעזור להם לדמיין את הרעיונות והקונספטים שלהם.

הנה דוגמה למה שהתלמידים של Edu4All יכולים ליצור אם הם עובדים בכיתה על מונומנטים:

סטארטאפ Edu4All, כיתה על מונומנטים, מגדל אייפל

באמצעות פרומפט כמו:

"כלב ליד מגדל אייפל באור שמש מוקדם של הבוקר"

מה זה DALL-E ו-Midjourney?

DALL-E ו-Midjourney הם שניים מהמודלים הפופולריים ביותר ליצירת תמונות, הם מאפשרים להשתמש בפרומפטים ליצירת תמונות.

DALL-E

נתחיל עם DALL-E, שהוא מודל בינה מלאכותית יוצרת שמייצר תמונות מתיאורים טקסטואליים.

DALL-E הוא שילוב של שני מודלים, CLIP ו-diffused attention.

  • CLIP, הוא מודל שמייצר embeddings, שהם ייצוגים מספריים של נתונים, מתמונות וטקסט.

  • Diffused attention, הוא מודל שמייצר תמונות מ-embeddings. DALL-E מאומן על מאגר נתונים של תמונות וטקסט וניתן להשתמש בו ליצירת תמונות מתיאורים טקסטואליים. לדוגמה, ניתן להשתמש ב-DALL-E ליצירת תמונות של חתול עם כובע, או כלב עם מוהוק.

Midjourney

Midjourney עובד בצורה דומה ל-DALL-E, הוא מייצר תמונות מפרומפטים טקסטואליים. Midjourney, יכול גם לשמש ליצירת תמונות באמצעות פרומפטים כמו "חתול עם כובע", או "כלב עם מוהוק".

תמונה שנוצרה על ידי Midjourney, יונה מכנית קרדיט תמונה ויקיפדיה, תמונה שנוצרה על ידי Midjourney

איך DALL-E ו-Midjourney עובדים

ראשית, DALL-E. DALL-E הוא מודל בינה מלאכותית יוצרת המבוסס על ארכיטקטורת טרנספורמר עם טרנספורמר אוטורגרסיבי.

טרנספורמר אוטורגרסיבי מגדיר איך מודל מייצר תמונות מתיאורים טקסטואליים, הוא מייצר פיקסל אחד בכל פעם, ואז משתמש בפיקסלים שנוצרו כדי לייצר את הפיקסל הבא. עובר דרך שכבות רבות ברשת עצבית, עד שהתמונה מושלמת.

בתהליך זה, DALL-E שולט בתכונות, אובייקטים, מאפיינים ועוד בתמונה שהוא מייצר. עם זאת, ל-DALL-E 2 ו-3 יש יותר שליטה על התמונה שנוצרת.

בניית יישום ראשון ליצירת תמונות

אז מה נדרש כדי לבנות יישום ליצירת תמונות? תצטרכו את הספריות הבאות:

  • python-dotenv, מומלץ מאוד להשתמש בספרייה זו כדי לשמור את הסודות שלכם בקובץ .env הרחק מהקוד.
  • openai, ספרייה זו תשמש אתכם כדי לתקשר עם ה-API של OpenAI.
  • pillow, לעבודה עם תמונות ב-Python.
  • requests, כדי לעזור לכם לבצע בקשות HTTP.

יצירת והפעלת מודל Azure OpenAI

אם עדיין לא עשיתם זאת, עקבו אחר ההוראות בעמוד Microsoft Learn
כדי ליצור משאב ומודל Azure OpenAI. בחרו ב-DALL-E 3 כמודל.

יצירת היישום

  1. צרו קובץ .env עם התוכן הבא:

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

    מצאו את המידע הזה בפורטל Azure OpenAI Foundry עבור המשאב שלכם בסעיף "Deployments".

  2. אספו את הספריות הנ"ל בקובץ בשם requirements.txt כך:

    python-dotenv
    openai
    pillow
    requests
    
  3. לאחר מכן, צרו סביבה וירטואלית והתקינו את הספריות:

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

    עבור Windows, השתמשו בפקודות הבאות כדי ליצור ולהפעיל את הסביבה הווירטואלית:

    python3 -m venv venv
    venv\Scripts\activate.bat
  4. הוסיפו את הקוד הבא בקובץ בשם 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)

הסבר על הקוד:

  • ראשית, אנו מייבאים את הספריות הדרושות לנו, כולל ספריית OpenAI, ספריית dotenv, ספריית requests וספריית Pillow.

    import openai
    import os
    import requests
    from PIL import Image
    import dotenv
  • לאחר מכן, אנו טוענים את משתני הסביבה מקובץ .env.

    # import dotenv
    dotenv.load_dotenv()
  • לאחר מכן, אנו מגדירים את לקוח שירות 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"
        )
  • לאחר מכן, אנו מייצרים את התמונה:

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

    הקוד הנ"ל מגיב עם אובייקט JSON שמכיל את כתובת ה-URL של התמונה שנוצרה. ניתן להשתמש בכתובת ה-URL כדי להוריד את התמונה ולשמור אותה בקובץ.

  • לבסוף, אנו פותחים את התמונה ומשתמשים בצופה התמונות הסטנדרטי כדי להציג אותה:

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

פרטים נוספים על יצירת התמונה

בואו נבחן את הקוד שמייצר את התמונה בפירוט:

  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, הוא הפרומפט הטקסטואלי שמשמש ליצירת התמונה. במקרה זה, אנו משתמשים בפרומפט "ארנב על סוס, מחזיק סוכרייה על מקל, בשדה ערפילי שבו גדלים נרקיסים".
  • size, הוא גודל התמונה שנוצרת. במקרה זה, אנו מייצרים תמונה בגודל 1024x1024 פיקסלים.
  • n, הוא מספר התמונות שנוצרות. במקרה זה, אנו מייצרים שתי תמונות.
  • temperature, הוא פרמטר ששולט באקראיות של הפלט של מודל הבינה המלאכותית היוצרת. הטמפרטורה היא ערך בין 0 ל-1 כאשר 0 אומר שהפלט דטרמיניסטי ו-1 אומר שהפלט אקראי. הערך ברירת המחדל הוא 0.7.

יש עוד דברים שניתן לעשות עם תמונות שנכסה בסעיף הבא.

יכולות נוספות של יצירת תמונות

ראיתם עד כה איך הצלחנו ליצור תמונה באמצעות כמה שורות קוד ב-Python. עם זאת, יש עוד דברים שניתן לעשות עם תמונות.

ניתן גם לעשות את הדברים הבאים:

  • לבצע עריכות. על ידי מתן תמונה קיימת, מסכה ופרומפט, ניתן לשנות תמונה. לדוגמה, ניתן להוסיף משהו לחלק מסוים בתמונה. דמיינו את תמונת הארנב שלנו, ניתן להוסיף כובע לארנב. איך עושים זאת? על ידי מתן התמונה, מסכה (שזיהתה את החלק של האזור לשינוי) ופרומפט טקסטואלי שאומר מה צריך להיעשות.

הערה: זה לא נתמך ב-DALL-E 3.

הנה דוגמה באמצעות 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

התמונה הבסיסית תכיל רק את הטרקלין עם הבריכה אבל התמונה הסופית תכלול פלמינגו:

  • יצירת וריאציות. הרעיון הוא לקחת תמונה קיימת ולבקש שייצרו וריאציות שלה. כדי ליצור וריאציה, מספקים תמונה ופרומפט טקסטואלי וקוד כמו כך:

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

    הערה, זה נתמך רק ב-OpenAI.

טמפרטורה

טמפרטורה היא פרמטר ששולט באקראיות של הפלט של מודל בינה מלאכותית יוצרת. הטמפרטורה היא ערך בין 0 ל-1 כאשר 0 אומר שהפלט דטרמיניסטי ו-1 אומר שהפלט אקראי. הערך ברירת המחדל הוא 0.7.

בואו נבחן דוגמה איך הטמפרטורה עובדת, על ידי הרצת הפרומפט הזה פעמיים:

פרומפט: "ארנב על סוס, מחזיק סוכרייה על מקל, בשדה ערפילי שבו גדלים נרקיסים"

ארנב על סוס מחזיק סוכרייה על מקל, גרסה 1

עכשיו נריץ את אותו פרומפט שוב כדי לראות שלא נקבל את אותה תמונה פעמיים:

תמונה שנוצרה של ארנב על סוס

כפי שאתם רואים, התמונות דומות, אבל לא זהות. בואו ננסה לשנות את ערך הטמפרטורה ל-0.1 ונראה מה קורה:

 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
    )

שינוי הטמפרטורה

אז בואו ננסה להפוך את התגובה ליותר דטרמיניסטית. ניתן לראות מהשתי התמונות שיצרנו שבתמונה הראשונה יש ארנב ובתמונה השנייה יש סוס, כך שהתמונות משתנות מאוד.

לכן נשנה את הקוד שלנו ונגדיר את הטמפרטורה ל-0, כך:

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
    )

עכשיו כשמריצים את הקוד הזה, מקבלים את שתי התמונות הבאות:

  • טמפרטורה 0, גרסה 1
  • טמפרטורה 0, גרסה 2

כאן ניתן לראות בבירור איך התמונות דומות יותר זו לזו.

איך להגדיר גבולות ליישום שלכם עם מטה-פרומפטים

עם הדמו שלנו, אנחנו כבר יכולים ליצור תמונות עבור הלקוחות שלנו. עם זאת, אנחנו צריכים להגדיר כמה גבולות ליישום שלנו.

לדוגמה, אנחנו לא רוצים ליצור תמונות שאינן מתאימות לעבודה, או שאינן מתאימות לילדים.

ניתן לעשות זאת עם מטה-פרומפטים. מטה-פרומפטים הם פרומפטים טקסטואליים שמשמשים לשליטה בפלט של מודל בינה מלאכותית יוצרת. לדוגמה, ניתן להשתמש במטה-פרומפטים כדי לשלוט בפלט, ולהבטיח שהתמונות שנוצרות יהיו מתאימות לעבודה, או מתאימות לילדים.

איך זה עובד?

אז איך מטה-פרומפטים עובדים?

מטה-פרומפטים הם פרומפטים טקסטואליים שמשמשים לשליטה בפלט של מודל בינה מלאכותית יוצרת, הם ממוקמים לפני הפרומפט הטקסטואלי, ומשמשים לשליטה בפלט של המודל ומשולבים ביישומים כדי לשלוט בפלט של המודל. הם מאחדים את קלט הפרומפט ואת קלט המטה-פרומפט בפרומפט טקסטואלי אחד.

דוגמה אחת למטה-פרומפט תהיה הבאה:

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)

עכשיו, בואו נראה איך ניתן להשתמש במטה-פרומפטים בדמו שלנו.

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

מהפרומפט הנ"ל, ניתן לראות איך כל התמונות שנוצרות מתחשבות במטה-פרומפט.

משימה - בואו נאפשר לתלמידים

הצגנו את Edu4All בתחילת השיעור הזה. עכשיו הגיע הזמן לאפשר לתלמידים ליצור תמונות עבור ההערכות שלהם.

התלמידים ייצרו תמונות עבור ההערכות שלהם המכילות מונומנטים, בדיוק אילו מונומנטים זה תלוי בתלמידים. התלמידים מתבקשים להשתמש ביצירתיות שלהם במשימה זו כדי למקם את המונומנטים הללו בהקשרים שונים.

פתרון

הנה פתרון אפשרי:

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)

עבודה נהדרת! המשיכו ללמוד

לאחר שסיימתם את השיעור הזה, בדקו את אוסף הלמידה של AI גנרטיבי כדי להמשיך לשפר את הידע שלכם ב-AI גנרטיבי!

עברו לשיעור 10 שבו נבחן כיצד לבנות יישומי AI עם קוד נמוך


הצהרת אחריות:
מסמך זה תורגם באמצעות שירות תרגום AI Co-op Translator. למרות שאנו שואפים לדיוק, יש להיות מודעים לכך שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי אנושי. אנו לא נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.