Diffusers documentation

النص إلى صورة

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

النص إلى صورة

عندما تفكر في نماذج الانتشار، يكون توليد الصور من النص عادةً من أوائل الأمور التي تخطر ببالك. يولّد توليد الصور من النص صورةً من وصف نصي (على سبيل المثال، “رائد فضاء في غابة، لوحة ألوان باردة، ألوان خافتة، مفصّل، 8k”) وهو ما يُعرف أيضًا بـ الموجّه.

من منظور عالٍ جداً، يستقبل نموذج الانتشار (Diffusion) موجهاً (prompt) وبعض الضوضاء الأولية العشوائية، ثم يزيل الضوضاء بشكل تكراري لبناء صورة. يتم توجيه عملية إزالة الضوضاء بواسطة الموجه، وبعد انتهاء عملية إزالة الضوضاء بعدد محدد مسبقاً من خطوات الزمن، يتم فك ترميز تمثيل الصورة إلى صورة.

اقرأ منشور المدونة كيف يعمل Stable Diffusion؟ لمعرفة المزيد حول كيفية عمل نموذج الانتشار الكامن.

يمكنك توليد الصور من وصف في 🤗 Diffusers بخطوتين:

  1. حمّل نقطة تفتيش إلى فئة AutoPipelineForText2Image، والتي تكشف تلقائيًا عن فئة خط الأنابيب المناسبة للاستخدام بناءً على نقطة التفتيش:
from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
	"stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16, variant="fp16"
).to("cuda")  # or "mps", "xpu", "cpu"
  1. مرّر موجهًا إلى خط الأنابيب لتوليد صورة:
image = pipeline(
	"stained glass of darth vader, backlight, centered composition, masterpiece, photorealistic, 8k"
).images[0]
image

النماذج الشائعة

أكثر نماذج النص إلى صورة شيوعًا هي Stable Diffusion v1.5 وStable Diffusion XL (SDXL) وKandinsky 2.2. كما توجد نماذج ControlNet أو محوِّلات (adapters) يمكن استخدامها مع نماذج النص إلى صورة للحصول على تحكم أكثر مباشرة في توليد الصور. تختلف النتائج التي تنتجها كل نموذج اختلافًا طفيفًا بسبب اختلاف البنية المعمارية وعملية التدريب، لكن بغض النظر عن النموذج الذي تختاره، فإن طريقة استخدامه متشابهة إلى حد كبير. دعونا نستخدم نفس الأمر النصي (prompt) لكل نموذج ونقارن نتائجها.

Stable Diffusion v1.5

Stable Diffusion v1.5 هو نموذج انتشار كامن (latent diffusion model) تم تهيئته من Stable Diffusion v1-4، وخضع لضبط دقيق (finetuning) على مدى 595 ألف خطوة باستخدام صور بأبعاد 512x512 من مجموعة بيانات LAION-Aesthetics V2. يمكنك استخدام هذا النموذج على النحو التالي:

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
	"stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16, variant="fp16"
).to("cuda")  # or "mps", "xpu", "cpu"
generator = torch.Generator("cuda").manual_seed(31)
image = pipeline("Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", generator=generator).images[0]
image

Stable Diffusion XL

SDXL هو نسخة أكبر بكثير من نماذج Stable Diffusion السابقة، ويتضمن عملية نموذج من مرحلتين تضيف تفاصيل أكثر إلى الصورة. كما يتضمن بعض التشكيلات الدقيقة الإضافية لتوليد صور عالية الجودة بمواضيع مركزية. اطّلع على دليل SDXL الأكثر شمولاً لمعرفة المزيد حول كيفية استخدامه. بشكل عام، يمكنك استخدام SDXL على النحو التالي:

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", dtype=torch.float16, variant="fp16"
).to("cuda")  # or "mps", "xpu", "cpu"
generator = torch.Generator("cuda").manual_seed(31)
image = pipeline("Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", generator=generator).images[0]
image

Kandinsky 2.2

تختلف نموذج Kandinsky إلى حد ما عن نماذج Stable Diffusion لأنه يستخدم أيضًا نموذجًا مسبقًا للصور لإنشاء تمثيلات تُستخدم لتحسين محاذاة النص والصور في نموذج الانتشار.

أسهل طريقة لاستخدام Kandinsky 2.2 هي:

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
	"kandinsky-community/kandinsky-2-2-decoder", dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
generator = torch.Generator("cuda").manual_seed(31)
image = pipeline("Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", generator=generator).images[0]
image

ControlNet

نماذج ControlNet هي نماذج مساعدة أو محوِّلات (adapters) تُخضع لضبط دقيق فوق نماذج النص إلى صورة، مثل Stable Diffusion v1.5. استخدام نماذج ControlNet بالتزامن مع نماذج النص إلى صورة يوفر خيارات متنوعة للتحكم الأكثر وضوحًا في كيفية توليد الصورة. باستخدام ControlNet، تُضيف صورة إدخال إضافية كشرط (conditioning) للنموذج. على سبيل المثال، إذا قمت بتوفير صورة لوضعية بشري (عادةً ما تُمثل بعدة نقاط رئيسية متصلة لتشكل هيكلًا) كإدخال شرط، فإن النموذج يولّد صورة تتبع وضعية الصورة. اطّلع على دليل ControlNet الأكثر تفصيلًا لمعرفة المزيد حول مدخلات الشرط الأخرى وكيفية استخدامها.

في هذا المثال، سنشترط نموذج ControlNet بصورة تقدير وضعية الإنسان. حمّل نموذج ControlNet المُدرَّب مسبقًا على تقديرات وضعية الإنسان:

from diffusers import ControlNetModel, AutoPipelineForText2Image
from diffusers.utils import load_image
import torch

controlnet = ControlNetModel.from_pretrained(
	"lllyasviel/control_v11p_sd15_openpose", dtype=torch.float16, variant="fp16"
).to("cuda")  # or "mps", "xpu", "cpu"
pose_image = load_image("https://huggingface.co/lllyasviel/control_v11p_sd15_openpose/resolve/main/images/control.png")

مرّر controlnet إلى AutoPipelineForText2Image، وفّر الأمر النصي وصورة تقدير الوضعية:

pipeline = AutoPipelineForText2Image.from_pretrained(
	"stable-diffusion-v1-5/stable-diffusion-v1-5", controlnet=controlnet, dtype=torch.float16, variant="fp16"
).to("cuda")  # or "mps", "xpu", "cpu"
generator = torch.Generator("cuda").manual_seed(31)
image = pipeline("Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", image=pose_image, generator=generator).images[0]
image
Stable Diffusion v1.5
Stable Diffusion XL
Kandinsky 2.2
ControlNet (شرط وضعية الجسم)

إعداد معلمات خط الأنابيب

هناك عدد من المعاملات التي يمكن ضبطها في خط المعالجة (pipeline) والتي تؤثر على كيفية توليد الصورة. يمكنك تغيير حجم الصورة الناتجة، وتحديد موجه سلبي (negative prompt) لتحسين جودة الصورة، وغير ذلك. تتناول هذه القسم بالتفصيل كيفية استخدام هذه المعاملات.

الارتفاع والعرض

يتحكم معاملَا height وwidth في ارتفاع وعرض (بالبكسل) الصورة المولَّدة. افتراضيًا، يُخرج نموذج Stable Diffusion v1.5 صورًا بأبعاد 512x512، لكن يمكنك تغيير ذلك إلى أي حجم يكون مضاعفًا للرقم 8. على سبيل المثال، لإنشاء صورة مستطيلة:

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
	"stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16, variant="fp16"
).to("cuda")  # or "mps", "xpu", "cpu"
image = pipeline(
	"Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", height=768, width=512
).images[0]
image

قد تكون أحجام الصور الافتراضية مختلفة في النماذج الأخرى اعتمادًا على أحجام الصور في مجموعة بيانات التدريب. على سبيل المثال، حجم الصورة الافتراضي لـ SDXL هو 1024x1024، وقد يؤدي استخدام قيم أدنى لـ height وwidth إلى الحصول على صور بجودة أقل. تأكد من الرجوع إلى مرجع واجهة برمجة التطبيقات الخاص بالنموذج أولًا!

مقياس التوجيه

يؤثر معامل guidance_scale على مدى تأثير الأمر النصي على توليد الصورة. تمنح القيمة المنخفضة النموذج “إبداعية” لتوليد صور ذات علاقة أضعف بالأمر النصي. تدفع القيم الأعلى لـguidance_scale النموذج إلى اتباع الأمر النصي بشكل أدق، وإذا كانت هذه القيمة مرتفعة جداً، فقد تلاحظ بعض الشوائب في الصورة المولّدة.

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
	"stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
image = pipeline(
	"Astronaut in a jungle, cold color palette, muted colors, detailed, 8k", guidance_scale=3.5
).images[0]
image
guidance_scale = 2.5
guidance_scale = 7.5
guidance_scale = 10.5

الموجّه السلبي

وكما يوجّه المُوجِّه (prompt) عملية التوليد، فإن الموجِّه السلبي يوجّه النموذج بعيدًا عن العناصر التي لا ترغب في توليدها. يُستخدم هذا الشائع لتحسين جودة الصورة بشكل عام من خلال إزالة السمات الضعيفة أو الرديئة في الصورة، مثل "دقة منخفضة" أو "تفاصيل رديئة". كما يمكنك استخدام الموجِّه السلبي لإزالة أو تعديل محتوى الصورة أو أسلوبها.

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
	"stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
image = pipeline(
	prompt="Astronaut in a jungle, cold color palette, muted colors, detailed, 8k",
	negative_prompt="ugly, deformed, disfigured, poor details, bad anatomy",
).images[0]
image
negative_prompt = "قبي، مشوّه، مشوّه الملامح، تفاصيل رديئة، تشريح سيء"
negative_prompt = "astronaut"

مولّد

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

يمكنك تعيين بذرة وGenerator كما هو موضح أدناه. يجب أن يؤدي إنشاء صورة باستخدام Generator إلى إرجاع نفس النتيجة في كل مرة بدلاً من توليد صورة جديدة بشكل عشوائي.

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
	"stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
generator = torch.Generator(device="cuda").manual_seed(30)
image = pipeline(
	"Astronaut in a jungle, cold color palette, muted colors, detailed, 8k",
	generator=generator,
).images[0]
image

التحكم في توليد الصور

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

وزن الأوامر

تُعدّ ترويسة الوزن (Prompt weighting) تقنية لزيادة أو تقليل أهمية المفاهيم في الترويسة (prompt) من أجل إبراز أو تقليل ميزات معينة في الصورة. ننصحك باستخدام مكتبة Compel لمساعدتك في توليد تمثيلات الترويسة الموزونة (weighted prompt embeddings).

تعلّم كيفية إنشاء تضمينات الموجه في دليل وزن الموجه. يركّز هذا المثال على كيفية استخدام تضمينات الموجه في خطّ الأنابيب.

بمجرد إنشاء التضمينات، يمكنك تمريرها إلى معامل prompt_embeds (وnegative_prompt_embeds إذا كنت تستخدم موجهًا سلبيًا) في خط الأنابيب.

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
	"stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
image = pipeline(
	prompt_embeds=prompt_embeds, # generated from Compel
	negative_prompt_embeds=negative_prompt_embeds, # generated from Compel
).images[0]

ControlNet

كما رأيت في قسم ControlNet، توفر هذه النماذج طريقة أكثر مرونة ودقة لتوليد الصور من خلال دمج مدخل صورة شرطية إضافية. يتم تدريب كل نموذج ControlNet مسبقًا على نوع معين من الصور الشرطية لتوليد صور جديدة تشبهها. على سبيل المثال، إذا أخذت نموذج ControlNet تم تدريبه مسبقًا على خرائط العمق، يمكنك تقديم خريطة عمق كنموذج مدخل شرطي وسيتولّد صورة تحافظ على المعلومات المكانية الموجودة فيها. هذا أسرع وأسهل من تحديد معلومات العمق في الأمر النصي. بل يمكنك حتى دمج مدخلات شرطية متعددة باستخدام Multi-ControlNet!

تتوفر أنواع عديدة من مدخلات التكييف التي يمكنك استخدامها، ويدعم 🤗 Diffusers تقنية ControlNet لنماذج Stable Diffusion وSDXL. اطّلع على دليل ControlNet الأكثر شمولاً لمعرفة كيفية استخدام هذه النماذج.

تحسين

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

يدعم PyTorch 2.0 أيضاً آلية انتباه أكثر كفاءة في استخدام الذاكرة تُسمى الانتباه النقطي المُقاس وتُفعَّل تلقائياً إذا كنت تستخدم PyTorch 2.0. يمكنك دمج هذا مع torch.compile لتسريع كودك بشكل أكبر:

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16, variant="fp16").to("cuda")  # or "mps", "xpu", "cpu"
pipeline.unet = torch.compile(pipeline.unet, mode="reduce-overhead", fullgraph=True)

لمزيد من النصائح حول كيفية تحسين كودك لتوفير الذاكرة وتسريع الاستدلال، اقرأ دليلي Accelerate inference وReduce memory usage.

Update on GitHub