Diffusers documentation
ControlNet مع Flux.1
ControlNet مع Flux.1
FluxControlNetPipeline هو تطبيق لـ ControlNet مخصص لنموذج Flux.1.
تم تقديم ControlNet في Adding Conditional Control to Text-to-Image Diffusion Models بواسطة Lvmin Zhang وAnyi Rao وManeesh Agrawala.
باستخدام نموذج ControlNet، يمكنك تقديم صورة تحكم إضافية لتكييف وتوجيه عملية توليد Stable Diffusion. على سبيل المثال، إذا قدمت خريطة عمق، فإن نموذج ControlNet يولّد صورة تحافظ على المعلومات المكانية المستمدة من خريطة العمق. وهي طريقة أكثر مرونة ودقة للتحكم في عملية توليد الصور.
ملخص الورقة البحثية هو:
نقدّم ControlNet، وهو معمارية شبكة عصبية لإضافة ضوابط شرطيّة مكانية إلى نماذج الانتشار النصّية-إلى-صورة الكبيرة المُدرَّبة مسبقًا. تقوم ControlNet بقفل نماذج الانتشار الكبيرة الجاهزة للإنتاج، وتعيد استخدام طبقات الترميز العميقة والقوية المُدرَّبة مسبقًا على مليارات الصور كهيكل أساسي قوي لتعلّم مجموعة متنوعة من الضوابط الشرطيّة. يتم ربط المعمارية العصبية بـ«التحويلات الصفرية» (طبقات تحويل مُهيّأة إلى الصفر) التي تُنمّي المعاملات تدريجيًا من الصفر وتضمن عدم تأثير أي ضوضاء ضارة على الضبط الدقيق. اختبرنا ضوابط شرطيّة متنوعة، مثل الحواف، والعمق، والتجزئة، ووضع الجسم البشري، وغيرها، باستخدام Stable Diffusion، باستخدام شرط واحد أو عدة شروط، مع وجود موجهات نصية أو بدونها. نُظهر أنّ تدريب نماذج ControlNet متين مع مجموعات البيانات الصغيرة (<50k) والكبيرة (>1m). تُظهر النتائج الواسعة أنّ ControlNet قد يسهّل تطبيقات أوسع للتحكم في نماذج انتشار الصور.
تم تنفيذ كود controlnet هذا بواسطة فريق InstantX. يمكنك العثور على نقاط التفتيش المدربة مسبقًا لـ Flux-ControlNet في الجدول أدناه:
| نوع ControlNet | المطوّر | رابط |
|---|---|---|
| Canny | فريق InstantX | رابط |
| العمق | فريق InstantX | رابط |
| اتحاد | فريق InstantX | رابط |
تُدعَم شبكات ControlNet من XLabs أيضًا، وقد ساهم بها فريق XLabs.
| نوع ControlNet | المطوّر | رابط |
|---|---|---|
| Canny | فريق XLabs | رابط |
| العمق | فريق XLabs | رابط |
| HED | فريق XLabs | رابط |
تأكد من الاطلاع على دليل المجدولين لمعرفة كيفية استكشاف التوازن بين سرعة المجدول وجودة النتائج، واطّلع على قسم إعادة استخدام المكونات عبر خطوط الأنابيب لمعرفة كيفية تحميل نفس المكونات بكفاءة في خطوط أنابيب متعددة.
FluxControlNetPipeline
فئة diffusers.FluxControlNetPipeline
< source >( scheduler: FlowMatchEulerDiscreteSchedulervae: AutoencoderKLtext_encoder: CLIPTextModeltokenizer: CLIPTokenizertext_encoder_2: T5EncoderModeltokenizer_2: T5Tokenizertransformer: FluxTransformer2DModelcontrolnet: diffusers.models.controlnets.controlnet_flux.FluxControlNetModel | list[diffusers.models.controlnets.controlnet_flux.FluxControlNetModel] | tuple[diffusers.models.controlnets.controlnet_flux.FluxControlNetModel] | diffusers.models.controlnets.controlnet_flux.FluxMultiControlNetModelimage_encoder: CLIPVisionModelWithProjection = Nonefeature_extractor: CLIPImageProcessorPil = None )
المعاملات
- transformer (FluxTransformer2DModel) — بنية Transformer الشرطية (MMDiT) لإزالة الضوضاء من كامنات الصورة المُرمّزة.
- scheduler (FlowMatchEulerDiscreteScheduler) —
جدول زمني يُستخدم بالاقتران مع
transformerلإزالة الضوضاء من كائنات الصورة المُرمّزة. - vae (AutoencoderKL) — نموذج الترميز التبايني التلقائي (VAE) لتشفير وفك تشفير الصور إلى تمثيلات كامنة ومنها.
- text_encoder (
CLIPTextModel) — CLIP، وتحديداً التنوع clip-vit-large-patch14. - text_encoder_2 (
T5EncoderModel) — T5، وتحديداً النسخة google/t5-v1_1-xxl. - tokenizer (
CLIPTokenizer) — مقسّم من الفئة CLIPTokenizer. - tokenizer_2 (
T5TokenizerFast) — المُرمِّز الثاني من الفئة T5TokenizerFast.
خط أنابيب Flux لتوليد الصور من النص.
مرجع: https://blackforestlabs.ai/announcing-black-forest-labs/
__call__
< source >( prompt: str | list[str] = Noneprompt_2: str | list[str] | None = Nonenegative_prompt: str | list[str] = Nonenegative_prompt_2: str | list[str] | None = Nonetrue_cfg_scale: float = 1.0height: int | None = Nonewidth: int | None = Nonenum_inference_steps: int = 28sigmas: list[float] | None = Noneguidance_scale: float = 7.0control_guidance_start: float | list[float] = 0.0control_guidance_end: float | list[float] = 1.0control_image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]] = Nonecontrol_mode: int | list[int] | None = Nonecontrolnet_conditioning_scale: float | list[float] = 1.0num_images_per_prompt: int | None = 1generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.FloatTensor] = Noneprompt_embeds: typing.Optional[torch.FloatTensor] = Nonepooled_prompt_embeds: typing.Optional[torch.FloatTensor] = Noneip_adapter_image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor], NoneType] = Noneip_adapter_image_embeds: list[torch.Tensor] | None = Nonenegative_ip_adapter_image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor], NoneType] = Nonenegative_ip_adapter_image_embeds: list[torch.Tensor] | None = Nonenegative_prompt_embeds: typing.Optional[torch.FloatTensor] = Nonenegative_pooled_prompt_embeds: typing.Optional[torch.FloatTensor] = Noneoutput_type: str | None = 'pil'return_dict: bool = Truejoint_attention_kwargs: dict[str, typing.Any] | None = Nonecallback_on_step_end: typing.Optional[typing.Callable[[int, int], NoneType]] = Nonecallback_on_step_end_tensor_inputs: list[str] = ['latents']max_sequence_length: int = 512 ) → ~pipelines.flux.FluxPipelineOutput or tuple
المعاملات
- prompt (
strأوlist[str]، اختياري) — الموجّه أو الموجّهات التي توجّه توليد الصورة. إذا لم يُعرَّف، يجب تمريرprompt_embedsبدلاً من ذلك. - prompt_2 (
strأوlist[str]، اختياري) — الموجّه أو الموجّهات المرسل إلىtokenizer_2وtext_encoder_2. إذا لم يُعرَّف، فسيتم استخدامpromptبدلاً منه - negative_prompt (
strأوlist[str]، اختياري) — الموجّه أو الموجّهات التي لا ينبغي استخدامها لتوجيه توليد الصورة. إذا لم يُعرَّف، يجب تمريرnegative_prompt_embedsبدلاً من ذلك. يتم تجاهله عند عدم استخدام التوجيه (أي يتم تجاهله إذا لم يكنtrue_cfg_scaleأكبر من1). - negative_prompt_2 (
strأوlist[str]، اختياري) — الموجّه أو الموجّهات التي لا ينبغي توجيه توليد الصورة إليها، والتي تُرسل إلىtokenizer_2وtext_encoder_2. إذا لم يُعرَّف، يُستخدمnegative_promptفي جميع مُشفّرات النص. - true_cfg_scale (
float، اختياري، القيمة الافتراضية 1.0) — يتم تفعيل التوجيه الحر من التصنيف (مقياس التوجيه) الحقيقي عندما يكونtrue_cfg_scale> 1 و يتم توفيرnegative_prompt. - height (
int، اختياري، القيمة الافتراضية هي self.unet.config.sample_size * self.vae_scale_factor) — ارتفاع الصورة المولّدة بالبكسلات. يتم ضبطه على 1024 افتراضيًا للحصول على أفضل النتائج. - width (
int، اختياري، القيمة الافتراضية هي self.unet.config.sample_size * self.vae_scale_factor) — عرض الصورة المولدة بالبكسلات. يتم ضبطه على 1024 افتراضيًا للحصول على أفضل النتائج. - num_inference_steps (
int، اختياري، القيمة الافتراضية 50) — عدد خطوات إزالة الضوضاء. تؤدي زيادة عدد خطوات إزالة الضوضاء عادةً إلى صورة بجودة أعلى على حساب بطء الاستدلال. - sigmas (
list[float]، اختياري) — قيم sigmas مخصصة لاستخدامها في عملية إزالة الضوضاء مع المجدولين الذين يدعمون معاملsigmasفي طريقةset_timestepsالخاصة بهم. إذا لم يُعرَّف، فسيتم استخدام السلوك الافتراضي عند تمريرnum_inference_steps. - guidance_scale (
float، اختياري، القيمة الافتراضية 7.0) — مقياس التوجيه كما هو مُعرَّف في Classifier-Free Diffusion Guidance. يُعرَّفguidance_scaleعلى أنهwمن المعادلة 2 في Imagen Paper. يتم تفعيل مقياس التوجيه عن طريق تعيينguidance_scale > 1. يشجع مقياس التوجيه الأعلى على توليد صور مرتبطة ارتباطًا وثيقًا بـpromptالنصي، وعادةً على حساب انخفاض جودة الصورة. - control_guidance_start (
floatأوlist[float]، اختياري، القيمة الافتراضية 0.0) — النسبة المئوية من إجمالي الخطوات التي يبدأ عندها ControlNet في التطبيق. - control_guidance_end (
floatأوlist[float]، اختياري، القيمة الافتراضية 1.0) — النسبة المئوية من إجمالي الخطوات التي يتوقف عندها ControlNet عن التطبيق. - control_image (
torch.Tensor،PIL.Image.Image،np.ndarray،list[torch.Tensor]،list[PIL.Image.Image]،list[np.ndarray]، —list[list[torch.Tensor]]،list[list[np.ndarray]]أوlist[list[PIL.Image.Image]]): شرط الإدخال الخاص بـ ControlNet لتوفير التوجيه إلىunetأثناء التوليد. إذا تم تحديد النوع على أنهtorch.Tensor، فإنه يُمرَّر إلى ControlNet كما هو. يمكن أيضًا قبولPIL.Image.Imageكصورة. الأبعاد الافتراضية للصورة الناتجة هي أبعادimage. إذا تم تمرير الارتفاع و/أو العرض، يتم تغيير حجمimageوفقًا لذلك. إذا تم تحديد عدة وحدات ControlNet فيinit، يجب تمرير الصور كقائمة بحيث يمكن تجميع كل عنصر من عناصر القائمة بشكل صحيح للإدخال إلى وحدة ControlNet واحدة. - controlnet_conditioning_scale (
floatأوlist[float]، اختياري، القيمة الافتراضية 1.0) — تُضرب مخرجات ControlNet فيcontrolnet_conditioning_scaleقبل إضافتها إلى الباقي فيunetالأصلية. إذا تم تحديد عدة ControlNets فيinit، يمكنك ضبط المقياس المقابل كقائمة. - control_mode (
intأوlist[int]، اختياري، القيمة الافتراضية هي None) — وضع التحكم عند تطبيق ControlNet-Union. - num_images_per_prompt (
int، اختياري، القيمة الافتراضية 1) — عدد الصور التي سيتم توليدها لكل موجه. - generator (
torch.Generatorأوlist[torch.Generator]، اختياري) — مولّد واحد أو قائمة من مولّدات torch لجعل التوليد حتميًا. - latents (
torch.FloatTensor، اختياري) — كائنات latents ضجيجية مُولّدة مسبقًا، مُستخرجة من توزيع غاوسي، تُستخدم كمدخلات لتوليد الصور. يمكن استخدامها لتعديل نفس التوليد باستخدام أوامر مختلفة. إذا لم تُقدَّم، سيتم توليد كائن latents عن طريق الاستخراج باستخدام مولّد الأرقام العشوائيةgeneratorالمُقدَّم. - prompt_embeds (
torch.FloatTensor, اختياري) — تضمينات نصية مُولّدة مسبقًا. يمكن استخدامها لتعديل مدخلات النص بسهولة، مثلًا وزن الموجه. إذا لم تُقدَّم، فسيتم توليد تضمينات النص من معامل الإدخالprompt. - pooled_prompt_embeds (
torch.FloatTensor، اختياري) — تضمينات نصية مجمّعة مُولّدة مسبقًا. يمكن استخدامها لتعديل مدخلات النص بسهولة، مثلًا وزن الموجه. إذا لم تُقدَّم، فسيتم توليد تضمينات النص المجمّعة من معامل الإدخالprompt. - negative_prompt_embeds (
torch.FloatTensor، اختياري) — تضمينات نصية سلبية مُولّدة مسبقًا. يمكن استخدامها لتعديل مدخلات النص بسهولة، مثلًا وزن الموجه. إذا لم تُقدَّم، فسيتم توليد negative_prompt_embeds من معامل الإدخالnegative_prompt. - negative_pooled_prompt_embeds (
torch.FloatTensor، اختياري) — تضمينات نصية مجمعة سالبة مُولّدة مسبقًا. يمكن استخدامها لتعديل مدخلات النص بسهولة، مثلًا وزن المحفّز. إذا لم تُقدَّم، فسيتم توليد تضمينات negative_prompt_embeds المجمعة من معامل الإدخالnegative_prompt. - ip_adapter_image — (
PipelineImageInput، اختياري): مدخل صورة اختياري للعمل مع IP Adapters. - ip_adapter_image_embeds (
list[torch.Tensor]، اختياري) — تضمينات صور مُولّدة مسبقًا لـ IP-Adapter. يجب أن تكون قائمة بطول يساوي عدد وحدات IP-Adapter. يجب أن يكون كل عنصر منها متجهًا (tensor) بشكل(batch_size, num_images, emb_dim). إذا لم يُقدَّم، تُحسب التضمينات من معامل الإدخالip_adapter_image. - negative_ip_adapter_image —
(
PipelineImageInput، اختياري): مدخل صورة اختياري للعمل مع IP Adapters. - negative_ip_adapter_image_embeds (
list[torch.Tensor]، اختياري) — تضمينات صور مُولّدة مسبقًا لـ IP-Adapter. يجب أن يكون قائمة بطول يساوي عدد وحدات IP-Adapter. يجب أن يكون كل عنصر منها متجهًا (tensor) بشكل(batch_size, num_images, emb_dim). إذا لم يُقدَّم، تُحسب التضمينات من معامل الإدخالip_adapter_image. - output_type (
str، اختياري، القيمة الافتراضية"pil") — صيغة مخرجات توليد الصورة. اختر بين PIL:PIL.Image.Imageأوnp.array. - return_dict (
bool، اختياري، القيمة الافتراضيةTrue) — ما إذا كان يجب إرجاع~pipelines.flux.FluxPipelineOutputبدلاً من tuple عادي. - joint_attention_kwargs (
dict، اختياري) — قاموس kwargs يُمرَّر إلىAttentionProcessorكما هو معرَّف تحتself.processorفي diffusers.models.attention_processor إذا تمَّ تحديده. - callback_on_step_end (
Callable، اختياري) — دالة تُستدعى في نهاية كل خطوة إزالة ضوضاء أثناء الاستدلال. تُستدعى الدالة بالحجج التالية:callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict). ستتضمنcallback_kwargsقائمة بجميع المصفوفات كما حددتهاcallback_on_step_end_tensor_inputs. - callback_on_step_end_tensor_inputs (
list، اختياري) — قائمة مدخلات المصفوفات (tensors) لدالةcallback_on_step_end. سيتم تمرير المصفوفات المحددة في القائمة كحجةcallback_kwargs. لن تتمكن من تضمين متغيرات غير مدرجة في خاصية._callback_tensor_inputsلفئة خط الأنابيب (pipeline) الخاص بك. - max_sequence_length (
intالافتراضي 512) — أقصى طول تسلسل يُستخدم معprompt.
يعيد
~pipelines.flux.FluxPipelineOutput أو tuple
~pipelines.flux.FluxPipelineOutput إذا كان return_dict
قيمة True، وإلا tuple. عند إرجاع tuple، يكون العنصر الأول قائمة تحتوي على الصور المولّدة.
الدالة التي تُستدعى عند استدعاء خط الأنابيب للتوليد.
أمثلة:
>>> import torch
>>> from diffusers.utils import load_image
>>> from diffusers import FluxControlNetPipeline
>>> from diffusers import FluxControlNetModel
>>> base_model = "black-forest-labs/FLUX.1-dev"
>>> controlnet_model = "InstantX/FLUX.1-dev-controlnet-canny"
>>> controlnet = FluxControlNetModel.from_pretrained(controlnet_model, torch_dtype=torch.bfloat16)
>>> pipe = FluxControlNetPipeline.from_pretrained(
... base_model, controlnet=controlnet, torch_dtype=torch.bfloat16
... )
>>> pipe.to("cuda")
>>> control_image = load_image("https://huggingface.co/InstantX/SD3-Controlnet-Canny/resolve/main/canny.jpg")
>>> prompt = "A girl in city, 25 years old, cool, futuristic"
>>> image = pipe(
... prompt,
... control_image=control_image,
... control_guidance_start=0.2,
... control_guidance_end=0.8,
... controlnet_conditioning_scale=1.0,
... num_inference_steps=28,
... guidance_scale=3.5,
... ).images[0]
>>> image.save("flux.png")encode_prompt
< source >( prompt: str | list[str]prompt_2: str | list[str] | None = Nonedevice: typing.Optional[torch.device] = Nonenum_images_per_prompt: int = 1prompt_embeds: typing.Optional[torch.FloatTensor] = Nonepooled_prompt_embeds: typing.Optional[torch.FloatTensor] = Nonemax_sequence_length: int = 512lora_scale: float | None = None )
المعاملات
- prompt (
strأوlist[str]، اختياري) — الموجّه الذي سيتم ترميزه - prompt_2 (
strأوlist[str]، اختياري) — الموجّه أو الموجّهات المرسل إلىtokenizer_2وtext_encoder_2. إذا لم يُعرَّف، يُستخدمpromptفي جميع مُشفِّرات النص - device — (
torch.device): جهاز torch - num_images_per_prompt (
int) — عدد الصور التي يجب توليدها لكل موجه - prompt_embeds (
torch.FloatTensor, اختياري) — تضمينات نصية مُولّدة مسبقًا. يمكن استخدامها لتعديل مدخلات النص بسهولة، مثلًا وزن الموجه. إذا لم تُقدَّم، فسيتم توليد تضمينات النص من معامل الإدخالprompt. - pooled_prompt_embeds (
torch.FloatTensor، اختياري) — تضمينات نصية مجمّعة مُولّدة مسبقًا. يمكن استخدامها لتعديل مدخلات النص بسهولة، مثلًا وزن الموجه. إذا لم تُقدَّم، فسيتم توليد تضمينات النص المجمّعة من معامل الإدخالprompt. - lora_scale (
float، اختياري) — مقياس LoRA سيُطبَّق على جميع طبقات LoRA في مُشفِّر النص إذا كانت طبقات LoRA محمَّلة.
FluxPipelineOutput
فئة diffusers.pipelines.flux.pipeline_output.FluxPipelineOutput
< source >( images: list[PIL.Image.Image] | numpy.ndarray )
المعاملات
- images (
list[PIL.Image.Image]أوtorch.Tensorأوnp.ndarray) — قائمة من صور PIL منزوعة الضوضاء بطولbatch_sizeأو مصفوفة numpy أو tensor من torch بأبعاد(batch_size, height, width, num_channels). تمثل صور PIL أو مصفوفة numpy الصور منزوعة الضوضاء في خط أنابيب الانتشار. يمكن أن تمثل tensors من torch إما الصور منزوعة الضوضاء أو الكمونيات الوسيطة الجاهزة للتحويل إلى المُفكِّك.
فئة الإخراج لخطوط أنابيب توليد صور Flux.