Diffusers documentation
Stable unCLIP
Stable unCLIP
تُعد نقاط التثبيت (checkpoints) الخاصة بـ Stable unCLIP مُعدَّلة من نقاط تثبيت Stable Diffusion 2.1 لتعمل مشروطةً على تضمينات صور CLIP. لا يزال Stable unCLIP يعمل مشروطًا على تضمينات النص. نظرًا لوجود شرطين منفصلين، يمكن استخدام stable unCLIP لتوليد تنويعات للصور بإرشاد النص. وعند دمجه مع نموذج unCLIP المسبق (prior)، يمكن استخدامه أيضًا لتوليد الصور من النص بالكامل.
ملخص الورقة البحثية هو:
تبيّن أن النماذج التباينية مثل CLIP تتعلم تمثيلات قوية للصور تلتقط كلًا من الدلالات والأسلوب. وللاستفادة من هذه التمثيلات في توليد الصور، نقترح نموذجًا من مرحلتين: نموذج مسبق (prior) يولّد تمثيل صورة CLIP بناءً على وصف نصي، ومفكّك (decoder) يولّد صورة مشروطة على تمثيل الصورة. نُظهر أن توليد تمثيلات الصور بشكل صريح يحسّن تنوّع الصور مع خسارة ضئيلة في الواقعية الضوئية ومماثلة الوصف. كما يمكن لمفكّكاتنا المشروطة على تمثيلات الصور أن تنتج متغيرات لصورة تحافظ على دلالاتها وأسلوبها معًا، مع تغيير التفاصيل غير الجوهرية الغائبة عن تمثيل الصورة. علاوة على ذلك، يتيح الفضاء المضمّن المشترك لـ CLIP عمليات تعديل للصور موجّهة باللغة بطريقة صفرية التمثيل (zero-shot). نستخدم نماذج الانتشار (diffusion models) للمفكّك، ونجرّب كلًا من النماذج الذاتية التوليد (autoregressive) ونماذج الانتشار للنموذج المسبق، لنجد أن الأخيرة أكثر كفاءة من حيث الحسابات وتنتج عينات بجودة أعلى.
نصائح
يستقبل Stable unCLIP noise_level كمدخل أثناء الاستدلال، وهو يحدد مقدار الضوضاء المضافة إلى تضمينات الصور. يؤدي ارتفاع قيمة noise_level إلى زيادة التباين في الصور النهائية بعد إزالة الضوضاء. افتراضيًا، لا نضيف أي ضوضاء إضافية إلى تضمينات الصور (noise_level = 0).
توليد الصور من النص
يمكن الاستفادة من Stable unCLIP لتوليد الصور من النص عن طريق دمجه مع نموذج المسبق الخاص بنسخة DALL-E 2 مفتوحة المصدر من KakaoBrain Karlo:
import torch
from diffusers import UnCLIPScheduler, DDPMScheduler, StableUnCLIPPipeline
from diffusers.models import PriorTransformer
from transformers import CLIPTokenizer, CLIPTextModelWithProjection
prior_model_id = "kakaobrain/karlo-v1-alpha"
data_type = torch.float16
prior = PriorTransformer.from_pretrained(prior_model_id, subfolder="prior", dtype=data_type)
prior_text_model_id = "openai/clip-vit-large-patch14"
prior_tokenizer = CLIPTokenizer.from_pretrained(prior_text_model_id)
prior_text_model = CLIPTextModelWithProjection.from_pretrained(prior_text_model_id, dtype=data_type)
prior_scheduler = UnCLIPScheduler.from_pretrained(prior_model_id, subfolder="prior_scheduler")
prior_scheduler = DDPMScheduler.from_config(prior_scheduler.config)
stable_unclip_model_id = "stabilityai/stable-diffusion-2-1-unclip-small"
pipe = StableUnCLIPPipeline.from_pretrained(
stable_unclip_model_id,
dtype=data_type,
variant="fp16",
prior_tokenizer=prior_tokenizer,
prior_text_encoder=prior_text_model,
prior=prior,
prior_scheduler=prior_scheduler,
)
pipe = pipe.to("cuda") # or "mps", "xpu", "cpu"
wave_prompt = "dramatic wave, the Oceans roar, Strong wave spiral across the oceans as the waves unfurl into roaring crests; perfect wave form; perfect wave shape; dramatic wave shape; wave shape unbelievable; wave; wave shape spectacular"
image = pipe(prompt=wave_prompt).images[0]
imageنستخدم
stabilityai/stable-diffusion-2-1-unclip-smallلتحويل النص إلى صورة لأنه تم تدريبه على تضمين CLIP ViT-L/14، وهو نفسه التضمين المستخدم في نموذج Karlo السابق. أما stabilityai/stable-diffusion-2-1-unclip فقد تم تدريبه على OpenCLIP ViT-H، لذا لا نوصي باستخدامه.
توليد تنويعات من صورة إلى صورة بتوجيه نصي
from diffusers import StableUnCLIPImg2ImgPipeline
from diffusers.utils import load_image
import torch
pipe = StableUnCLIPImg2ImgPipeline.from_pretrained(
"stabilityai/stable-diffusion-2-1-unclip", dtype=torch.float16, variation="fp16"
)
pipe = pipe.to("cuda") # or "mps", "xpu", "cpu"
url = "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/stable_unclip/tarsila_do_amaral.png"
init_image = load_image(url)
images = pipe(init_image).images
images[0].save("variation_image.png")اختياريًا، يمكنك أيضًا تمرير موجه إلى pipe على النحو التالي:
prompt = "A fantasy landscape, trending on artstation"
image = pipe(init_image, prompt=prompt).images[0]
imageتأكد من الاطلاع على دليل المجدولين لمعرفة كيفية استكشاف التوازن بين سرعة المجدول وجودة النتائج، واطّلع على قسم إعادة استخدام المكونات عبر خطوط الأنابيب لمعرفة كيفية تحميل نفس المكونات بكفاءة في خطوط أنابيب متعددة.
StableUnCLIPPipeline
فئة diffusers.StableUnCLIPPipeline
< source >( prior_tokenizer: CLIPTokenizerprior_text_encoder: CLIPTextModelWithProjectionprior: PriorTransformerprior_scheduler: KarrasDiffusionSchedulersimage_normalizer: StableUnCLIPImageNormalizerimage_noising_scheduler: KarrasDiffusionSchedulerstokenizer: CLIPTokenizertext_encoder: CLIPTextModelunet: UNet2DConditionModelscheduler: KarrasDiffusionSchedulersvae: AutoencoderKL )
المعاملات
- prior_tokenizer (
CLIPTokenizer) — ACLIPTokenizer. - prior_text_encoder (
CLIPTextModelWithProjection) — مُشفِّر نصوصCLIPTextModelWithProjectionمجمّد. - prior (PriorTransformer) — النموذج السابق القياسي في unCLIP لتقريب تضمين الصورة من تضمين النص.
- prior_scheduler (
KarrasDiffusionSchedulers) — المجدول المستخدم في عملية إزالة الضوضاء المسبقة. - image_normalizer (
StableUnCLIPImageNormalizer) — يُستخدم لتطبيع تمثيلات الصور المتوقعة قبل تطبيق الضوضاء، وإلغاء تطبيع تمثيلات الصور بعد تطبيق الضوضاء. - image_noising_scheduler (
KarrasDiffusionSchedulers) — جدول الضوضاء لإضافة الضوضاء إلى تمثيلات الصورة المتوقعة. يُحدَّد مقدار الضوضاء المضافة بواسطةnoise_level. - tokenizer (
CLIPTokenizer) — ACLIPTokenizer. - text_encoder (
CLIPTextModel) — مُشفِّر نصوصCLIPTextModelمجمّد. - unet (UNet2DConditionModel) — نموذج UNet2DConditionModel لإزالة الضوضاء من الكامنات المُرمّزة للصورة.
- scheduler (
KarrasDiffusionSchedulers) — مجدول يُستخدم بالاقتران معunetلإزالة الضوضاء من كامنات الصورة المُرمّزة. - vae (AutoencoderKL) — نموذج الترميز التبايني التلقائي (VAE) لتشفير وفك تشفير الصور إلى تمثيلات كامنة ومنها.
خط أنابيب لتوليد الصور من النص باستخدام stable unCLIP.
يرث هذا النموذج من DiffusionPipeline. راجع توثيق الفئة الأصلية لمعرفة الطرق العامة المُنفَّذة لجميع خطوط الأنابيب (التنزيل، الحفظ، التشغيل على جهاز معين، إلخ).
تورث خط الأنابيب أيضًا طرق التحميل التالية:
- load_textual_inversion() لتحميل تضمينات الانعكاس النصي
- load_lora_weights() لتحميل أوزان LoRA
- save_lora_weights() لحفظ أوزان LoRA
__call__
< source >( prompt: str | list[str] | None = Noneheight: int | None = Nonewidth: int | None = Nonenum_inference_steps: int = 20guidance_scale: float = 10.0negative_prompt: str | list[str] | None = Nonenum_images_per_prompt: int | None = 1eta: float = 0.0generator: typing.Optional[torch.Generator] = Nonelatents: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Noneoutput_type: str | None = 'pil'return_dict: bool = Truecallback: typing.Optional[typing.Callable[[int, int, torch.Tensor], NoneType]] = Nonecallback_steps: int = 1cross_attention_kwargs: dict[str, typing.Any] | None = Nonenoise_level: int = 0prior_num_inference_steps: int = 25prior_guidance_scale: float = 4.0prior_latents: typing.Optional[torch.Tensor] = Noneclip_skip: int | None = None ) → ImagePipelineOutput or tuple
المعاملات
- prompt (
strأوlist[str]، اختياري) — الموجّه أو الموجّهات التي تُوجّه توليد الصورة. إذا لم يُعرَّف، يجب عليك تمريرprompt_embeds. - height (
int، اختياري، القيمة الافتراضية هيself.unet.config.sample_size * self.vae_scale_factor) — ارتفاع الصورة المولّدة بالبكسل. - width (
int، اختياري، القيمة الافتراضيةself.unet.config.sample_size * self.vae_scale_factor) — عرض الصورة المولدة بالبكسل. - num_inference_steps (
int، اختياري، القيمة الافتراضية 20) — عدد خطوات إزالة الضوضاء. تؤدي زيادة عدد خطوات إزالة الضوضاء عادةً إلى صورة بجودة أعلى على حساب بطء الاستدلال. - guidance_scale (
float, اختياري، القيمة الافتراضية 10.0) — تشجع قيمة أعلى لمقياس التوجيه النموذج على توليد صور مرتبطة ارتباطًا وثيقًا بنصpromptعلى حساب انخفاض جودة الصورة. يتم تفعيل مقياس التوجيه عندما يكونguidance_scale > 1. - negative_prompt (
strأوlist[str]، اختياري) — الموجّه أو الموجّهات التي توجّه ما يجب عدم تضمينه في توليد الصورة. إذا لم يُعرَّف، يجب عليك تمريرnegative_prompt_embedsبدلاً من ذلك. يتم تجاهله عند عدم استخدام التوجيه (guidance_scale < 1). - num_images_per_prompt (
int، اختياري، القيمة الافتراضية 1) — عدد الصور التي سيتم توليدها لكل موجه. - eta (
float، اختياري، القيمة الافتراضية 0.0) — يتوافق مع المعامل eta (η) من ورقة DDIM. ينطبق فقط على DDIMScheduler، ويُتجاهل في المجدولين الآخرين. - generator (
torch.Generatorأوlist[torch.Generator]، اختياري) —torch.Generatorلجعل التوليد حتميًا. - latents (
torch.Tensor، اختياري) — كائنات latents ضجيجية مُولّدة مسبقًا، مُستخرجة من توزيع غاوسي، تُستخدم كمدخلات لتوليد الصور. يمكن استخدامها لتعديل نفس التوليد باستخدام أوامر مختلفة. إذا لم تُقدَّم، يتم توليد كائن latents عن طريق الاستخراج باستخدامgeneratorالعشوائي المُقدَّم. - prompt_embeds (
torch.Tensor، اختياري) — تضمينات نصية مُولَّدة مسبقًا. يمكن استخدامها لتعديل مدخلات النص بسهولة (مثل وزن الموجهات). إذا لم تُقدَّم، يتم توليد التضمينات النصية من معامل الإدخالprompt. - negative_prompt_embeds (
torch.Tensor، اختياري) — تضمينات نصية سلبية مُولّدة مسبقًا. يمكن استخدامها لتعديل مدخلات النص بسهولة (وزن الموجه). إذا لم تُقدَّم، يتم توليدnegative_prompt_embedsمن معامل الإدخالnegative_prompt. - output_type (
str، اختياري، الافتراضي"pil") — صيغة مخرجات الصورة المولّدة. اختر بينPIL.Imageأوnp.array. - return_dict (
bool، اختياري، القيمة الافتراضيةTrue) — ما إذا كان يجب إرجاع ImagePipelineOutput بدلاً من tuple عادي. - callback (
Callable، اختياري) — دالة تُستدعى كلcallback_stepsخطوات أثناء الاستدلال. تُستدعى الدالة مع الحجج التالية:callback(step: int, timestep: int, latents: torch.Tensor). - callback_steps (
int، اختياري، القيمة الافتراضية 1) — التردد الذي تُستدعى به دالةcallback. إذا لم يُحدد، تُستدعى الدالة في كل خطوة. - cross_attention_kwargs (
dict، اختياري) — قاموس kwargs يُمرَّر إلىAttentionProcessorكما هو معرَّف فيself.processorإذا تمَّ تحديده. - noise_level (
int، اختياري، القيمة الافتراضية0) — كمية الضوضاء المضافة إلى تمثيلات الصورة. كلما زادت قيمةnoise_level، زادت التباين في الصور النهائية بعد إزالة الضوضاء. راجع StableUnCLIPPipeline.noise_image_embeddings() لمزيد من التفاصيل. - prior_num_inference_steps (
int، اختياري، القيمة الافتراضية 25) — عدد خطوات إزالة الضوضاء في عملية إزالة الضوضاء المسبقة. تؤدي زيادة عدد خطوات إزالة الضوضاء عادةً إلى صورة ذات جودة أعلى على حساب بطء الاستدلال. - prior_guidance_scale (
float، اختياري، القيمة الافتراضية 4.0) — تشجيع قيمة أعلى لمقياس التوجيه النموذج على توليد صور مرتبطة ارتباطًا وثيقًا بنصpromptعلى حساب انخفاض جودة الصورة. يتم تفعيل مقياس التوجيه عندما يكونguidance_scale > 1. - prior_latents (
torch.Tensor، اختياري) — كعوب ضوضائية مُولّدة مسبقًا ومُسحوبة من توزيع غاوسي، تُستخدم كمدخلات لتوليد تضمين الصورة في عملية إزالة الضوضاء المسبقة. يمكن استخدامها لتعديل نفس التوليد باستخدام أوامر مختلفة. إذا لم تُوفَّر، يتم توليد كعوب من خلال السحب باستخدامgeneratorالعشوائي المُقدَّم. - clip_skip (
int, اختياري) — عدد الطبقات التي سيتم تجاوزها من CLIP أثناء حساب تمثيلات الموجه. القيمة 1 تعني أنه سيتم استخدام مخرجات الطبقة قبل الأخيرة لحساب تمثيلات الموجه.
يعيد
ImagePipelineOutput أو tuple
~ pipeline_utils.ImagePipelineOutput إذا كان return_dict هو True، وإلا فسيكون tuple. عند إرجاع tuple، يكون العنصر الأول قائمة تحتوي على الصور المولّدة.
دالة الاستدعاء call لخط الأنابيب pipeline الخاص بالتوليد.
أمثلة:
>>> import torch
>>> from diffusers import StableUnCLIPPipeline
>>> pipe = StableUnCLIPPipeline.from_pretrained(
... "fusing/stable-unclip-2-1-l", torch_dtype=torch.float16
... ) # TODO update model path
>>> pipe = pipe.to("cuda")
>>> prompt = "a photo of an astronaut riding a horse on mars"
>>> images = pipe(prompt).images
>>> images[0].save("astronaut_horse.png")enable_attention_slicing
< source >( slice_size: str | int = 'auto' )
المعاملات
- slice_size (
strأوint، اختياري، القيمة الافتراضية"auto") — عندما تكون القيمة"auto"، يتم تقسيم المدخلات إلى رؤوس الانتباه إلى نصفين، بحيث يُحسب الانتباه في خطوتين. أما إذا كانت"max"، فسيتم توفير أقصى قدر من الذاكرة من خلال تشغيل شريحة واحدة في كل مرة. وإذا تم تقديم رقم، يتم استخدام عدد من الشرائح يساويattention_head_dim // slice_size. في هذه الحالة، يجب أن يكونattention_head_dimمضاعفًا لـslice_size.
تفعيل حساب الانتباه المقطّع. عند تفعيل هذا الخيار، يقسم وحدة الانتباه المصفوفة المدخلة إلى شرائح لحساب الانتباه على عدة خطوات. في حالة وجود أكثر من رأس انتباه، يتم تنفيذ الحساب بشكل تسلسلي على كل رأس. وهذا مفيد لتوفير بعض الذاكرة مقابل انخفاض طفيف في السرعة.
> ⚠️ لا تفعّل تقطيع الانتباه إذا كنت تستخدم بالفعل
scaled_dot_product_attention(SDPA) من PyTorch > 2.0 أو xFormers. فحسابات الانتباه هذه فعّالة جداً من حيث الذاكرة، لذا لن تحتاج إلى تفعيل > هذه الوظيفة. إذا فعّلت تقطيع الانتباه مع SDPA أو xFormers، فقد يؤدي ذلك إلى تباطؤ كبير!
أمثلة:
>>> import torch
>>> from diffusers import StableDiffusionPipeline
>>> pipe = StableDiffusionPipeline.from_pretrained(
... "stable-diffusion-v1-5/stable-diffusion-v1-5",
... dtype=torch.float16,
... use_safetensors=True,
... )
>>> prompt = "a photo of an astronaut riding a horse on mars"
>>> pipe.enable_attention_slicing()
>>> image = pipe(prompt).images[0]تعطيل حساب الانتباه المقطّع. إذا كان enable_attention_slicing قد تم استدعاؤه سابقًا، يتم حساب الانتباه في خطوة واحدة.
enable_xformers_memory_efficient_attention
< source >( attention_op: typing.Optional[typing.Callable] = None )
المعاملات
- attention_op (
Callable، اختياري) — تجاوز المشغّل الافتراضيNoneلاستخدامه كحجةopفي دالةmemory_efficient_attention()الخاصة بـ xFormers.
تفعيل الانتباه الموفّر للذاكرة من xFormers. عند تفعيل هذا الخيار، يجب أن تلاحظ انخفاضًا في استخدام ذاكرة وحدة معالجة الرسوميات (GPU) وتسريعًا محتملًا أثناء الاستدلال. لا يُضمن التسريع أثناء التدريب.
> ⚠️ عند تفعيل كل من الانتباه الموفّر للذاكرة والانتباه المقطّع، فإنّ الانتباه الموفّر للذاكرة يحظى بالأولوية.
أمثلة:
>>> import torch
>>> from diffusers import DiffusionPipeline
>>> from xformers.ops import MemoryEfficientAttentionFlashAttentionOp
>>> pipe = DiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-2-1", dtype=torch.float16)
>>> pipe = pipe.to("cuda")
>>> pipe.enable_xformers_memory_efficient_attention(attention_op=MemoryEfficientAttentionFlashAttentionOp)
>>> # Workaround for not accepting attention shape using VAE for Flash Attention
>>> pipe.vae.enable_xformers_memory_efficient_attention(attention_op=None)تعطيل الانتباه الموفّر للذاكرة من xFormers.
encode_prompt
< source >( promptdevicenum_images_per_promptdo_classifier_free_guidancenegative_prompt = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Nonelora_scale: float | None = Noneclip_skip: int | None = None )
المعاملات
- prompt (
strأوlist[str]، اختياري) — الموجّه الذي سيتم ترميزه - device — (
torch.device): جهاز torch - num_images_per_prompt (
int) — عدد الصور التي يجب توليدها لكل موجه - do_classifier_free_guidance (
bool) — ما إذا كان سيتم استخدام classifier free guidance أم لا - negative_prompt (
strأوlist[str]، اختياري) — الموجّه أو الموجّهات التي لا ينبغي استخدامها لتوجيه توليد الصورة. إذا لم يُعرَّف، يجب تمريرnegative_prompt_embedsبدلاً من ذلك. يتم تجاهله عند عدم استخدام التوجيه (أي يتم تجاهله إذا كانguidance_scaleأقل من1). - prompt_embeds (
torch.Tensor، اختياري) — تضمينات نصية مُولَّدة مسبقًا. يمكن استخدامها لتعديل مدخلات النص بسهولة، مثلًا وزن الموجه. إذا لم تُقدَّم، فسيتم توليد تضمينات النص من معامل الإدخالprompt. - negative_prompt_embeds (
torch.Tensor، اختياري) — تضمينات نصية سلبية مُولّدة مسبقًا. يمكن استخدامها لتعديل مدخلات النص بسهولة، مثلًا وزن الموجه. إذا لم تُقدَّم، فسيتم توليد negative_prompt_embeds من معامل الإدخالnegative_prompt. - lora_scale (
float، اختياري) — مقياس LoRA سيُطبَّق على جميع طبقات LoRA في مُشفِّر النص إذا كانت طبقات LoRA محمَّلة. - clip_skip (
int, اختياري) — عدد الطبقات التي سيتم تجاوزها من CLIP أثناء حساب تمثيلات الموجه. القيمة 1 تعني أنه سيتم استخدام مخرجات الطبقة قبل الأخيرة لحساب تمثيلات الموجه.
يقوم بتشفير الموجه إلى حالات مخفية لمشفّر النص.
noise_image_embeddings
< source >( image_embeds: Tensornoise_level: intnoise: typing.Optional[torch.Tensor] = Nonegenerator: typing.Optional[torch.Generator] = None )
أضف ضوضاء إلى تمثيلات الصور. يتم التحكم في كمية الضوضاء عبر مدخل noise_level. يؤدي ارتفاع قيمة noise_level إلى زيادة التباين في الصور النهائية بعد إزالة الضوضاء.
يُطبَّق الضوضاء بطريقتين:
- يُطبَّق جدول الضوضاء مباشرةً على التضمينات.
- يُضاف متجه من التضمينات الزمنية الجيبية إلى المخرجات.
في الحالتين، يتم التحكم في كمية الضوضاء بواسطة noise_level نفسه.
تُطبَّق عملية تطبيع على التضمينات قبل تطبيق الضوضاء، ثم تُزال عملية التطبيع بعد تطبيق الضوضاء.
StableUnCLIPImg2ImgPipeline
فئة diffusers.StableUnCLIPImg2ImgPipeline
< source >( feature_extractor: CLIPImageProcessorPilimage_encoder: CLIPVisionModelWithProjectionimage_normalizer: StableUnCLIPImageNormalizerimage_noising_scheduler: KarrasDiffusionSchedulerstokenizer: CLIPTokenizertext_encoder: CLIPTextModelunet: UNet2DConditionModelscheduler: KarrasDiffusionSchedulersvae: AutoencoderKL )
المعاملات
- feature_extractor (
CLIPImageProcessor) — مستخرج الميزات لمعالجة الصور قبل الترميز. - image_encoder (
CLIPVisionModelWithProjection) — نموذج رؤية CLIP لتشفير الصور. - image_normalizer (
StableUnCLIPImageNormalizer) — يُستخدم لتطبيع تمثيلات الصور المتوقعة قبل تطبيق الضوضاء، وإلغاء تطبيع تمثيلات الصور بعد تطبيق الضوضاء. - image_noising_scheduler (
KarrasDiffusionSchedulers) — جدول الضوضاء لإضافة الضوضاء إلى تمثيلات الصورة المتوقعة. يُحدَّد مقدار الضوضاء المضافة بواسطةnoise_level. - tokenizer (
~transformers.CLIPTokenizer) — A [~transformers.CLIPTokenizer)]. - text_encoder (CLIPTextModel) — مُشفِّر نصوص CLIPTextModel مجمّد.
- unet (UNet2DConditionModel) — نموذج UNet2DConditionModel لإزالة الضوضاء من الكامنات المُرمّزة للصورة.
- scheduler (
KarrasDiffusionSchedulers) — مجدول يُستخدم بالاقتران معunetلإزالة الضوضاء من كامنات الصورة المُرمّزة. - vae (AutoencoderKL) — نموذج الترميز التبايني التلقائي (VAE) لتشفير وفك تشفير الصور إلى تمثيلات كامنة ومنها.
خط أنابيب لتوليد الصور من الصور باستخدام التوجيه النصي عبر stable unCLIP.
يرث هذا النموذج من DiffusionPipeline. راجع توثيق الفئة الأصلية لمعرفة الطرق العامة المُنفَّذة لجميع خطوط الأنابيب (التنزيل، الحفظ، التشغيل على جهاز معين، إلخ).
تورث خط الأنابيب أيضًا طرق التحميل التالية:
- load_textual_inversion() لتحميل تضمينات الانعكاس النصي
- load_lora_weights() لتحميل أوزان LoRA
- save_lora_weights() لحفظ أوزان LoRA
__call__
< source >( image: typing.Union[torch.Tensor, PIL.Image.Image] = Noneprompt: str | list[str] = Noneheight: int | None = Nonewidth: int | None = Nonenum_inference_steps: int = 20guidance_scale: float = 10negative_prompt: str | list[str] | None = Nonenum_images_per_prompt: int | None = 1eta: float = 0.0generator: typing.Optional[torch.Generator] = Nonelatents: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Noneoutput_type: str | None = 'pil'return_dict: bool = Truecallback: typing.Optional[typing.Callable[[int, int, torch.Tensor], NoneType]] = Nonecallback_steps: int = 1cross_attention_kwargs: dict[str, typing.Any] | None = Nonenoise_level: int = 0image_embeds: typing.Optional[torch.Tensor] = Noneclip_skip: int | None = None ) → ImagePipelineOutput or tuple
المعاملات
- prompt (
strأوlist[str]، اختياري) — الموجّه أو الموجّهات التي تُوجّه توليد الصورة. إذا لم يُعرَّف، فسيتم استخدامprompt_embedsأو يتم تهيئة prompt إلى"". - image (
torch.TensororPIL.Image.Image) —Imageor tensor representing an image batch. The image is encoded to its CLIP embedding which theunetis conditioned on. The image is not encoded by thevaeand then used as the latents in the denoising process like it is in the standard Stable Diffusion text-guided image variation process. - height (
int، اختياري، القيمة الافتراضية هيself.unet.config.sample_size * self.vae_scale_factor) — ارتفاع الصورة المولّدة بالبكسل. - width (
int، اختياري، القيمة الافتراضيةself.unet.config.sample_size * self.vae_scale_factor) — عرض الصورة المولدة بالبكسل. - num_inference_steps (
int، اختياري، القيمة الافتراضية 20) — عدد خطوات إزالة الضوضاء. تؤدي زيادة عدد خطوات إزالة الضوضاء عادةً إلى صورة بجودة أعلى على حساب بطء الاستدلال. - guidance_scale (
float, اختياري، القيمة الافتراضية 10.0) — تشجع قيمة أعلى لمقياس التوجيه النموذج على توليد صور مرتبطة ارتباطًا وثيقًا بنصpromptعلى حساب انخفاض جودة الصورة. يتم تفعيل مقياس التوجيه عندما يكونguidance_scale > 1. - negative_prompt (
strأوlist[str]، اختياري) — الموجّه أو الموجّهات التي توجّه ما يجب عدم تضمينه في توليد الصورة. إذا لم يُعرَّف، يجب عليك تمريرnegative_prompt_embedsبدلاً من ذلك. يتم تجاهله عند عدم استخدام التوجيه (guidance_scale < 1). - num_images_per_prompt (
int، اختياري، القيمة الافتراضية 1) — عدد الصور التي سيتم توليدها لكل موجه. - eta (
float، اختياري، القيمة الافتراضية 0.0) — يتوافق مع المعامل eta (η) من ورقة DDIM. ينطبق فقط على DDIMScheduler، ويُتجاهل في المجدولين الآخرين. - generator (
torch.Generatorأوlist[torch.Generator]، اختياري) —torch.Generatorلجعل التوليد حتميًا. - latents (
torch.Tensor، اختياري) — كائنات latents ضجيجية مُولّدة مسبقًا، مُستخرجة من توزيع غاوسي، تُستخدم كمدخلات لتوليد الصور. يمكن استخدامها لتعديل نفس التوليد باستخدام أوامر مختلفة. إذا لم تُقدَّم، يتم توليد كائن latents عن طريق الاستخراج باستخدامgeneratorالعشوائي المُقدَّم. - prompt_embeds (
torch.Tensor، اختياري) — تضمينات نصية مُولَّدة مسبقًا. يمكن استخدامها لتعديل مدخلات النص بسهولة (مثل وزن الموجهات). إذا لم تُقدَّم، يتم توليد التضمينات النصية من معامل الإدخالprompt. - negative_prompt_embeds (
torch.Tensor، اختياري) — تضمينات نصية سلبية مُولّدة مسبقًا. يمكن استخدامها لتعديل مدخلات النص بسهولة (وزن الموجه). إذا لم تُقدَّم، يتم توليدnegative_prompt_embedsمن معامل الإدخالnegative_prompt. - output_type (
str، اختياري، الافتراضي"pil") — صيغة مخرجات الصورة المولّدة. اختر بينPIL.Imageأوnp.array. - return_dict (
bool، اختياري، القيمة الافتراضيةTrue) — ما إذا كان يجب إرجاع ImagePipelineOutput بدلاً من tuple عادي. - callback (
Callable، اختياري) — دالة تُستدعى كلcallback_stepsخطوات أثناء الاستدلال. تُستدعى الدالة مع الحجج التالية:callback(step: int, timestep: int, latents: torch.Tensor). - callback_steps (
int، اختياري، القيمة الافتراضية 1) — التردد الذي تُستدعى به دالةcallback. إذا لم يُحدد، تُستدعى الدالة في كل خطوة. - cross_attention_kwargs (
dict، اختياري) — قاموس kwargs يُمرَّر إلىAttentionProcessorكما هو معرَّف فيself.processorإذا تمَّ تحديده. - noise_level (
int، اختياري، القيمة الافتراضية0) — كمية الضوضاء المضافة إلى تمثيلات الصورة. كلما زادت قيمةnoise_level، زادت التباين في الصور النهائية بعد إزالة الضوضاء. راجع StableUnCLIPPipeline.noise_image_embeddings() لمزيد من التفاصيل. - image_embeds (
torch.Tensor، اختياري) — تضمينات CLIP مُولّدة مسبقًا لتوجيهunetبناءً عليها. لا تُستخدم هذه الكمونيات في عملية إزالة الضوضاء. إذا كنت ترغب في تقديم كمونيات مُولّدة مسبقًا، فمررها إلى__call__كـlatents. - clip_skip (
int, اختياري) — عدد الطبقات التي سيتم تجاوزها من CLIP أثناء حساب تمثيلات الموجه. القيمة 1 تعني أنه سيتم استخدام مخرجات الطبقة قبل الأخيرة لحساب تمثيلات الموجه.
يعيد
ImagePipelineOutput أو tuple
~ pipeline_utils.ImagePipelineOutput إذا كان return_dict هو True، وإلا فسيكون tuple. عند إرجاع tuple، يكون العنصر الأول قائمة تحتوي على الصور المولّدة.
دالة الاستدعاء call لخط الأنابيب pipeline الخاص بالتوليد.
أمثلة:
>>> import requests
>>> import torch
>>> from PIL import Image
>>> from io import BytesIO
>>> from diffusers import StableUnCLIPImg2ImgPipeline
>>> pipe = StableUnCLIPImg2ImgPipeline.from_pretrained(
... "stabilityai/stable-diffusion-2-1-unclip-small", torch_dtype=torch.float16
... )
>>> pipe = pipe.to("cuda")
>>> url = "https://raw.githubusercontent.com/CompVis/stable-diffusion/main/assets/stable-samples/img2img/sketch-mountains-input.jpg"
>>> response = requests.get(url)
>>> init_image = Image.open(BytesIO(response.content)).convert("RGB")
>>> init_image = init_image.resize((768, 512))
>>> prompt = "A fantasy landscape, trending on artstation"
>>> images = pipe(init_image, prompt).images
>>> images[0].save("fantasy_landscape.png")enable_attention_slicing
< source >( slice_size: str | int = 'auto' )
المعاملات
- slice_size (
strأوint، اختياري، القيمة الافتراضية"auto") — عندما تكون القيمة"auto"، يتم تقسيم المدخلات إلى رؤوس الانتباه إلى نصفين، بحيث يُحسب الانتباه في خطوتين. أما إذا كانت"max"، فسيتم توفير أقصى قدر من الذاكرة من خلال تشغيل شريحة واحدة في كل مرة. وإذا تم تقديم رقم، يتم استخدام عدد من الشرائح يساويattention_head_dim // slice_size. في هذه الحالة، يجب أن يكونattention_head_dimمضاعفًا لـslice_size.
تفعيل حساب الانتباه المقطّع. عند تفعيل هذا الخيار، يقسم وحدة الانتباه المصفوفة المدخلة إلى شرائح لحساب الانتباه على عدة خطوات. في حالة وجود أكثر من رأس انتباه، يتم تنفيذ الحساب بشكل تسلسلي على كل رأس. وهذا مفيد لتوفير بعض الذاكرة مقابل انخفاض طفيف في السرعة.
> ⚠️ لا تفعّل تقطيع الانتباه إذا كنت تستخدم بالفعل
scaled_dot_product_attention(SDPA) من PyTorch > 2.0 أو xFormers. فحسابات الانتباه هذه فعّالة جداً من حيث الذاكرة، لذا لن تحتاج إلى تفعيل > هذه الوظيفة. إذا فعّلت تقطيع الانتباه مع SDPA أو xFormers، فقد يؤدي ذلك إلى تباطؤ كبير!
أمثلة:
>>> import torch
>>> from diffusers import StableDiffusionPipeline
>>> pipe = StableDiffusionPipeline.from_pretrained(
... "stable-diffusion-v1-5/stable-diffusion-v1-5",
... dtype=torch.float16,
... use_safetensors=True,
... )
>>> prompt = "a photo of an astronaut riding a horse on mars"
>>> pipe.enable_attention_slicing()
>>> image = pipe(prompt).images[0]تعطيل حساب الانتباه المقطّع. إذا كان enable_attention_slicing قد تم استدعاؤه سابقًا، يتم حساب الانتباه في خطوة واحدة.
enable_xformers_memory_efficient_attention
< source >( attention_op: typing.Optional[typing.Callable] = None )
المعاملات
- attention_op (
Callable، اختياري) — تجاوز المشغّل الافتراضيNoneلاستخدامه كحجةopفي دالةmemory_efficient_attention()الخاصة بـ xFormers.
تفعيل الانتباه الموفّر للذاكرة من xFormers. عند تفعيل هذا الخيار، يجب أن تلاحظ انخفاضًا في استخدام ذاكرة وحدة معالجة الرسوميات (GPU) وتسريعًا محتملًا أثناء الاستدلال. لا يُضمن التسريع أثناء التدريب.
> ⚠️ عند تفعيل كل من الانتباه الموفّر للذاكرة والانتباه المقطّع، فإنّ الانتباه الموفّر للذاكرة يحظى بالأولوية.
أمثلة:
>>> import torch
>>> from diffusers import DiffusionPipeline
>>> from xformers.ops import MemoryEfficientAttentionFlashAttentionOp
>>> pipe = DiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-2-1", dtype=torch.float16)
>>> pipe = pipe.to("cuda")
>>> pipe.enable_xformers_memory_efficient_attention(attention_op=MemoryEfficientAttentionFlashAttentionOp)
>>> # Workaround for not accepting attention shape using VAE for Flash Attention
>>> pipe.vae.enable_xformers_memory_efficient_attention(attention_op=None)تعطيل الانتباه الموفّر للذاكرة من xFormers.
encode_prompt
< source >( promptdevicenum_images_per_promptdo_classifier_free_guidancenegative_prompt = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Nonelora_scale: float | None = Noneclip_skip: int | None = None )
المعاملات
- prompt (
strأوlist[str]، اختياري) — الموجّه الذي سيتم ترميزه - device — (
torch.device): جهاز torch - num_images_per_prompt (
int) — عدد الصور التي يجب توليدها لكل موجه - do_classifier_free_guidance (
bool) — ما إذا كان سيتم استخدام classifier free guidance أم لا - negative_prompt (
strأوlist[str]، اختياري) — الموجّه أو الموجّهات التي لا ينبغي استخدامها لتوجيه توليد الصورة. إذا لم يُعرَّف، يجب تمريرnegative_prompt_embedsبدلاً من ذلك. يتم تجاهله عند عدم استخدام التوجيه (أي يتم تجاهله إذا كانguidance_scaleأقل من1). - prompt_embeds (
torch.Tensor، اختياري) — تضمينات نصية مُولَّدة مسبقًا. يمكن استخدامها لتعديل مدخلات النص بسهولة، مثلًا وزن الموجه. إذا لم تُقدَّم، فسيتم توليد تضمينات النص من معامل الإدخالprompt. - negative_prompt_embeds (
torch.Tensor، اختياري) — تضمينات نصية سلبية مُولّدة مسبقًا. يمكن استخدامها لتعديل مدخلات النص بسهولة، مثلًا وزن الموجه. إذا لم تُقدَّم، فسيتم توليد negative_prompt_embeds من معامل الإدخالnegative_prompt. - lora_scale (
float، اختياري) — مقياس LoRA سيُطبَّق على جميع طبقات LoRA في مُشفِّر النص إذا كانت طبقات LoRA محمَّلة. - clip_skip (
int, اختياري) — عدد الطبقات التي سيتم تجاوزها من CLIP أثناء حساب تمثيلات الموجه. القيمة 1 تعني أنه سيتم استخدام مخرجات الطبقة قبل الأخيرة لحساب تمثيلات الموجه.
يقوم بتشفير الموجه إلى حالات مخفية لمشفّر النص.
noise_image_embeddings
< source >( image_embeds: Tensornoise_level: intnoise: typing.Optional[torch.Tensor] = Nonegenerator: typing.Optional[torch.Generator] = None )
أضف ضوضاء إلى تمثيلات الصور. يتم التحكم في كمية الضوضاء عبر مدخل noise_level. يؤدي ارتفاع قيمة noise_level إلى زيادة التباين في الصور النهائية بعد إزالة الضوضاء.
يُطبَّق الضوضاء بطريقتين:
- يُطبَّق جدول الضوضاء مباشرةً على التضمينات.
- يُضاف متجه من التضمينات الزمنية الجيبية إلى المخرجات.
في الحالتين، يتم التحكم في كمية الضوضاء بواسطة noise_level نفسه.
تُطبَّق عملية تطبيع على التضمينات قبل تطبيق الضوضاء، ثم تُزال عملية التطبيع بعد تطبيق الضوضاء.
ImagePipelineOutput
فئة diffusers.ImagePipelineOutput
< source >( images: list[PIL.Image.Image] | numpy.ndarray )
فئة الإخراج لخطوط أنابيب الصور.