Skip to content

Latest commit

 

History

History
487 lines (333 loc) · 24.5 KB

File metadata and controls

487 lines (333 loc) · 24.5 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، هو نموذج يقوم بإنشاء تمثيلات رقمية للبيانات من الصور والنصوص.

  • Diffused attention، هو نموذج يقوم بتوليد الصور من التمثيلات الرقمية. يتم تدريب 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، هذه المكتبة هي ما ستستخدمه للتفاعل مع واجهة برمجة التطبيقات الخاصة بـ 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 لموردك في قسم "النشر".

  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 للصورة المولدة. يمكننا استخدام الرابط لتحميل الصورة وحفظها في ملف.

  • أخيرًا، نقوم بفتح الصورة واستخدام عارض الصور القياسي لعرضها:

    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.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.7.

لنلقِ نظرة على مثال يوضح كيفية عمل درجة الحرارة، من خلال تشغيل هذا البرومبت مرتين:

برومبت: "أرنب على حصان، يحمل مصاصة، في مرج ضبابي حيث تنمو النرجس"

أرنب على حصان يحمل مصاصة، النسخة الأولى

الآن دعنا نشغل نفس البرومبت مرة أخرى لنرى أننا لن نحصل على نفس الصورة مرتين:

صورة مولدة لأرنب على حصان

كما ترى، الصور متشابهة، لكنها ليست متطابقة. دعنا نحاول تغيير قيمة درجة الحرارة إلى 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، النسخة الأولى
  • درجة الحرارة 0، النسخة الثانية

هنا يمكنك أن ترى بوضوح كيف تتشابه الصور أكثر.

كيفية تحديد حدود لتطبيقك باستخدام الميتا برومبتس

مع العرض التوضيحي الخاص بنا، يمكننا بالفعل توليد الصور لعملائنا. ومع ذلك، نحتاج إلى إنشاء بعض الحدود لتطبيقنا.

على سبيل المثال، لا نريد توليد صور غير مناسبة للعمل أو غير ملائمة للأطفال.

يمكننا القيام بذلك باستخدام الميتا برومبتس. الميتا برومبتس هي برومبتس نصية تُستخدم للتحكم في مخرجات نموذج الذكاء الاصطناعي التوليدي. على سبيل المثال، يمكننا استخدام الميتا برومبتس للتحكم في المخرجات، وضمان أن الصور المولدة مناسبة للعمل أو ملائمة للأطفال.

كيف تعمل؟

الآن، كيف تعمل الميتا برومبتس؟

الميتا برومبتس هي برومبتس نصية تُستخدم للتحكم في مخرجات نموذج الذكاء الاصطناعي التوليدي، يتم وضعها قبل البرومبت النصي، وتُستخدم للتحكم في مخرجات النموذج وتضمينها في التطبيقات للتحكم في مخرجات النموذج. يتم دمج إدخال البرومبت وإدخال الميتا برومبت في برومبت نصي واحد.

مثال على ميتا برومبت سيكون كالتالي:

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)

عمل رائع! واصل تعلمك

بعد إكمال هذا الدرس، تحقق من مجموعة تعلم الذكاء الاصطناعي التوليدي لمواصلة تطوير معرفتك بالذكاء الاصطناعي التوليدي!

انتقل إلى الدرس 10 حيث سنستعرض كيفية بناء تطبيقات الذكاء الاصطناعي باستخدام البرمجة منخفضة الكود


إخلاء المسؤولية:
تم ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي Co-op Translator. بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي. للحصول على معلومات حاسمة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.