نحن نصمم بنية جديدة يمكنها دعم أكثر من 10 أنواع تحكم في حالة إنشاء تحويل النص إلى صورة ويمكنها إنشاء صور عالية الدقة قابلة للمقارنة بصريًا مع منتصف الرحلة . تعتمد الشبكة على بنية ControlNet الأصلية، ونحن نقترح وحدتين جديدتين من أجل: 1 توسيع ControlNet الأصلي لدعم ظروف الصورة المختلفة باستخدام نفس معلمة الشبكة. 2 دعم إدخال الشروط المتعددة دون زيادة تحميل الحساب، وهو أمر مهم بشكل خاص للمصممين الذين يرغبون في تحرير الصورة بالتفصيل، حيث تستخدم الشروط المختلفة نفس أداة تشفير الحالة، دون إضافة حسابات أو معلمات إضافية. نحن نجري تجارب شاملة على SDXL ونحقق أداءً فائقًا في القدرة على التحكم والنتيجة الجمالية. نحن ننشر الطريقة والنموذج لمجتمع مفتوح المصدر حتى يتمكن الجميع من الاستمتاع به.
إذا وجدت أنه مفيد، من فضلك أعطني نجمة، شكرا جزيلا لك!!
تم إصدار نسخة SDXL ProMax!!!، استمتع بها!!!
يؤسفني أنه نظرًا لصعوبة موازنة إيرادات المشروع ونفقاته، فقد تم تخصيص موارد وحدة معالجة الرسومات لمشاريع أخرى من المرجح أن تكون مربحة، وتم إيقاف تدريب SD3 حتى أجد دعمًا كافيًا لوحدة معالجة الرسومات، وسأبذل قصارى جهدي لتحقيق ذلك ابحث عن وحدات معالجة الرسومات لمواصلة التدريب. إذا كان هذا يسبب لك إزعاجًا، فأنا أعتذر بشدة عن ذلك. أريد أن أشكر كل من أحب هذا المشروع، دعمكم هو ما يجعلني أستمر
ملاحظة: قمنا بوضع نموذج بروماكس مع لاحقة بروماكس في نفس ريبو نموذج Huggingface، وستتم إضافة التعليمات التفصيلية لاحقًا.
يظهر المثال التالي من دقة 1M -> دقة 9M
استخدم تدريب الجرافة مثل Novelai، حيث يمكنك إنشاء صور عالية الدقة بأي نسبة عرض إلى ارتفاع
استخدم كمية كبيرة من البيانات عالية الجودة (أكثر من 10000000 صورة)، وتغطي مجموعة البيانات مجموعة متنوعة من المواقف
استخدم المطالبة المعاد شرحها مثل DALLE.3، واستخدم CogVLM لإنشاء وصف تفصيلي، وقدرة متابعة جيدة للمطالبة
استخدم العديد من الحيل المفيدة أثناء التدريب. بما في ذلك على سبيل المثال لا الحصر، زيادة التاريخ، والخسارة المتعددة، والدقة المتعددة
استخدم نفس المعلمة تقريبًا مقارنةً بـ ControlNet الأصلي. لا توجد زيادة واضحة في معلمة الشبكة أو الحساب.
دعم أكثر من 10 شروط تحكم، ولا يوجد انخفاض واضح في الأداء في أي حالة مقارنة بالتدريب بشكل مستقل
دعم إنشاء حالات متعددة، ويتم تعلم دمج الحالات أثناء التدريب. لا حاجة لتعيين المعلمة الفائقة أو مطالبات التصميم.
متوافق مع نماذج SDXL الأخرى مفتوحة المصدر، مثل BluePencilXL وCounterfeitXL. متوافق مع موديلات لورا الأخرى.
https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0
https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0
https://huggingface.co/xinsir/controlnet-tile-sdxl-1.0
https://huggingface.co/xinsir/controlnet-canny-sdxl-1.0
[07/06/2024] إطلاق ControlNet++
والنماذج المدربة مسبقًا.
[07/06/2024] إطلاق كود الاستدلال (شرط واحد وشرط متعدد).
[07/13/2024] قم بإصدار ProMax ControlNet++
مع وظيفة التحرير المتقدمة.
ControlNet++ للتدرج
ControlNet++ لـ Comfyui
إصدار كود التدريب وإرشادات التدريب.
الافراج عن ورقة arxiv.
أحد أهم نماذج شبكة التحكم، نستخدم العديد من الحيل في تدريب هذا النموذج، بنفس جودة https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0، وأداء SOTA في التحكم في الوضعية. لجعل النموذج المفتوح يصل إلى أفضل أداء له، يجب عليك استبدال وظيفة draw_pose في حزمة controlnet_aux (comfyui لديها حزمة controlnet_aux الخاصة بها)، راجع البرامج النصية الاستدلالية للحصول على التفاصيل.
أحد أهم نماذج شبكة التحكم، كاني هو التدريب المختلط مع Linert، Anime Linert، mlsd. أداء قوي في التعامل مع أي خطوط رفيعة، النموذج هو المفتاح لتقليل معدل التشوه، يوصى باستخدام خط رفيع لإعادة رسم اليد/القدم.
أحد أهم نماذج شبكة التحكم، يمكن لنموذج الخربشة أن يدعم أي عرض خط وأي نوع خط. بنفس جودة https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0، تجعل الجميع رسامين روحيين.
ملحوظة: استخدم الهيكل العظمي للتحكم في وضع الإنسان، استخدم خطًا رفيعًا لرسم تفاصيل اليد/القدم لتجنب التشوه
ملاحظة: تحتوي الصورة العميقة على معلومات تفصيلية، ومن الشائع استخدام العمق للخلفية واستخدام الهيكل العظمي للمقدمة
ملحوظة: Scribble هو نموذج خط قوي، إذا كنت تريد رسم شيء ما بمخطط تفصيلي غير صارم، فيمكنك استخدامه. يمنحك Openpose + Scribble مزيدًا من الحرية لإنشاء صورتك الأولية، ثم يمكنك استخدام خط رفيع لتحرير التفاصيل.
نقوم بجمع كمية كبيرة من الصور عالية الجودة. يتم تصفية الصور والتعليق عليها بجدية، وتغطي الصور مجموعة واسعة من المواضيع، بما في ذلك الصور الفوتوغرافية والأنيمي والطبيعة والرحلة المتوسطة وما إلى ذلك.
نقترح وحدتين جديدتين في ControlNet++، تسمى Condition Transformer وControl Encoder، على التوالي. لقد قمنا بتعديل وحدة قديمة قليلاً لتعزيز قدرتها على التمثيل. علاوة على ذلك، نقترح استراتيجية تدريب موحدة لتحقيق السيطرة الفردية والمتعددة في مرحلة واحدة.
لكل شرط، نقوم بتعيينه بمعرف نوع التحكم، على سبيل المثال، openpose--(1, 0, 0, 0, 0, 0)، العمق--(0, 1, 0, 0, 0, 0), الشروط المتعددة ستكون مثل (فتح، عمق) --(1، 1، 0، 0، 0، 0). في أداة تشفير التحكم، سيتم تحويل معرف نوع التحكم إلى تضمينات نوع التحكم (باستخدام التضمينات الموضعية الجيبية)، ثم نستخدم طبقة خطية واحدة لعرض تضمينات نوع التحكم للحصول على نفس التعتيم مع تضمين الوقت. تتم إضافة ميزات نوع التحكم إلى وقت التضمين للإشارة إلى أنواع التحكم المختلفة، وهذا الإعداد البسيط يمكن أن يساعد ControlNet على التمييز بين أنواع التحكم المختلفة حيث أن تضمين الوقت يميل إلى أن يكون له تأثير عالمي على الشبكة بأكملها. بغض النظر عن الشرط الفردي أو الشرط المتعدد، يوجد معرف نوع تحكم فريد يتوافق معه.
نقوم بتوسيع ControlNet لدعم مدخلات تحكم متعددة في نفس الوقت باستخدام نفس الشبكة. يتم استخدام محول الحالة للجمع بين ميزات حالة الصورة المختلفة. هناك ابتكاران رئيسيان في أساليبنا، أولاً، تشترك الظروف المختلفة في نفس أداة تشفير الحالة، مما يجعل الشبكة أكثر بساطة وخفة الوزن. وهذا يختلف عن الطرق السائدة الأخرى مثل T2I أو UniControlNet. ثانيًا، نضيف طبقة محول لتبادل معلومات الصورة الأصلية والصور الشرطية، بدلاً من استخدام مخرجات المحول مباشرة، نستخدمها للتنبؤ بانحياز الشرط إلى ميزة الشرط الأصلي. هذا يشبه إلى حد ما ResNet، وقد وجدنا بشكل تجريبي أن هذا الإعداد يمكن أن يحسن أداء الشبكة بشكل واضح.
إن برنامج تشفير الحالة الأصلي لـ ControlNet عبارة عن مجموعة من طبقات التحويل وعمليات تنشيط Silu. نحن لا نغير بنية برنامج التشفير، بل نقوم فقط بزيادة قنوات التحويل للحصول على برنامج تشفير "سميك". وهذا يمكن أن يزيد من أداء الشبكة بشكل واضح. والسبب هو أننا نتشارك نفس المشفر في جميع ظروف الصورة، لذلك يتطلب الأمر أن يتمتع المشفر بقدرة تمثيل أعلى. سيكون الإعداد الأصلي جيدًا لحالة واحدة ولكنه ليس جيدًا لأكثر من 10 شروط. لاحظ أن استخدام الإعداد الأصلي أمر جيد أيضًا، مع بعض التضحية بجودة إنشاء الصورة.
قد يكون التدريب بحالة واحدة محدودًا بسبب تنوع البيانات. على سبيل المثال، يتطلب الأمر openpose منك التدرب على الصور مع الأشخاص، ويتطلب mlsd منك التدرب على الصور ذات الخطوط، وبالتالي قد يؤثر على الأداء عند إنشاء كائنات غير مرئية. علاوة على ذلك، فإن صعوبة التدريب على الظروف المختلفة تختلف، فمن الصعب جعل جميع الظروف تتقارب في نفس الوقت والوصول إلى أفضل أداء لكل حالة على حدة. أخيرًا، سنميل إلى استخدام شرطين أو أكثر في نفس الوقت، فالتدريب متعدد الشروط سيجعل دمج الشروط المختلفة أكثر سلاسة ويزيد من قوة الشبكة (حيث يتعلم شرط واحد معرفة محدودة). نقترح مرحلة تدريب موحدة لتحقيق التقارب الأمثل للحالة الواحدة والدمج المتعدد الحالات في نفس الوقت.
يتطلب ControlNet++ تمرير معرف نوع التحكم إلى الشبكة. نقوم بدمج عنصر التحكم 10+ إلى 6 أنواع تحكم، معنى كل نوع هو كما يلي:
0- مفتوح
1- العمق
2-خط سميك(scribble/hed/softedge/ted-512)
3 -- خط رفيع (canny/mlsd/lineart/animelineart/ted-1280)
4- عادي
5- المقطع
نوصي بإصدار بايثون >= 3.8، ويمكنك ضبط البيئة الافتراضية باستخدام الأمر التالي:
conda create -n controlplus python=3.8 كوندا تفعيل controlplus تثبيت النقطة -r متطلبات.txt
يمكنك تنزيل وزن النموذج في https://huggingface.co/xinsir/controlnet-union-sdxl-1.0. سيتم وضع أي إصدار جديد للنموذج على واجهة المعانقة، يمكنك متابعة https://huggingface.co/xinsir للحصول على أحدث معلومات النموذج.
نحن نقدم البرامج النصية الاستدلالية لكل شرط التحكم. يرجى الرجوع إليها لمزيد من التفاصيل.
يوجد بعض الاختلاف في المعالجة المسبقة، للحصول على أفضل أداء للتحكم في الوضع المفتوح، يرجى القيام بما يلي: ابحث عن util.py في حزمة controlnet_aux، واستبدل وظيفة draw_bodypose بالكود التالي
def draw_bodypose(canvas: np.ndarray, keypoints: List[Keypoint]) -> np.ndarray: """ ارسم نقاط المفاتيح والأطراف التي تمثل وضعية الجسم على لوحة قماشية معينة. Args: Canvas (np.ndarray): مصفوفة ثلاثية الأبعاد تمثل اللوحة القماشية (الصورة) التي سيتم رسم نقاط مفاتيح الجسم عليها (قائمة [نقطة رئيسية]): قائمة كائنات النقاط الرئيسية التي تمثل نقاط مفاتيح الجسم المراد رسمها: np.ndarray: مصفوفة ثلاثية الأبعاد تمثل اللوحة القماشية المعدلة مع وضع الجسم المرسوم. ملاحظة: تتوقع الوظيفة تسوية إحداثيات x وy لنقاط المفاتيح بين 0 و1. """ H, W, C = Canvas. شكل إذا كان الحد الأقصى (W, H) < 500: النسبة = 1.0 elif max(W, H) >= 500 والحد الأقصى (W, H) < 1000: النسبة = 2.0 elif max(W, H) >= 1000 والحد الأقصى (W) ، H) < 2000: النسبة = 3.0 إليف ماكس (ث، ح) > = 2000 و ماكس (ث، ح) < 3000: النسبة = 4.0 إليف ماكس (W، H) >= 3000 والحد الأقصى (W، H) < 4000: النسبة = 5.0 إليف ماكس (W، H) > = 4000 والحد الأقصى (W، H) < 5000: النسبة = 6.0 آخر: النسبة = 7.0 عرض العصا = 4 أطراف تسلسلية = [ [2، 3]، [2، 6]، [3، 4]، [4، 5]، [6، 7]، [7، 8]، [2، 9]، [9، 10]، [10، 11]، [2، 12]، [12، 13]، [13، 14]، [2، 1]، [1، 15]، [15، 17]، [1، 16]، [16، 18]، ] الألوان = [[255، 0، 0]، [255، 85، 0]، [255، 170، 0]، [255، 255، 0]، [170، 255، 0]، [85، 255، 0] ]، [0، 255، 0]، [0، 255، 85]، [0، 255، 170]، [0، 255، 255]، [0، 170، 255]، [0، 85، 255]، [0، 0، 255]، [85] , 0, 255], [170، 0، 255]، [255، 0، 255]، [255، 0، 170]، [255، 0، 85]] لـ (k1_index، k2_index)، اللون بالرمز البريدي (limbSeq، الألوان): keypoint1 = نقاط المفاتيح [k1_index - 1] keypoint2 = نقاط المفاتيح [k2_index - 1] إذا keypoint1 هو لا شيء أو keypoint2 هو لا شيء: تابع Y = np.array([keypoint1.x, keypoint2.x]) * float(W) X = np.array([keypoint1.y, keypoint2.y]) * float(H ) mX = np.mean(X) mY = np.mean(Y) الطول = ((X[0] - X[1]) ** 2 + (Y[0] - Y[1]) ** 2) ** 0.5 زاوية = math.degrees(math.atan2(X[0] - X[1], Y[0] - Y[1])) المضلع = cv2.ellipse2Poly((int(mY), int( mX)))، (int(الطول / 2)، int(stickwidth *نسبة)))، int(angle)، 0, 360, 1) cv2.fillConvexPoly(canvas, مضلع، [int(float(c) * 0.6) for c in color]) لنقطة المفتاح، اللون في الرمز البريدي (نقاط المفاتيح، الألوان): إذا كانت نقطة المفاتيح لا شيء: تابع x، y = keypoint.x، keypoint.y x = int( x * W) y = int(y * H) cv2.circle(canvas, (int(x), int(y)), int(4 * نسبة), اللون, السُمك=-1) قماش الإرجاع
لاستدلال شرط واحد، يجب عليك إعطاء صورة موجهة وتحكم، وتغيير الأسطر المقابلة في ملف بايثون.
بايثون controlnet_union_test_openpose.py
بالنسبة للاستدلال متعدد الشروط، يجب عليك التأكد من توافق image_list المدخلات مع control_type، على سبيل المثال، إذا كنت تريد استخدام الوضع المفتوح والتحكم في العمق، image_list --> [controlnet_img_pose, controlnet_img_ Deep, 0, 0, 0, 0], control_type -- > [1، 1، 0، 0، 0، 0]. ارجع إلى controlnet_union_test_multi_control.py لمزيد من التفاصيل.
من الناحية النظرية، لا تحتاج إلى تعيين مقياس الحالة لظروف مختلفة، فقد تم تصميم الشبكة وتدريبها لدمج الظروف المختلفة بشكل طبيعي. الإعداد الافتراضي هو 1.0 لكل إدخال شرط، وهو نفسه مع التدريب متعدد الشروط. ومع ذلك، إذا كنت تريد زيادة التأثير لبعض شروط الإدخال المحددة، فيمكنك ضبط مقاييس الحالة في وحدة محول الحالة. في هذه الوحدة، ستتم إضافة شروط الإدخال إلى ميزات الصورة المصدر جنبًا إلى جنب مع التنبؤ بالتحيز. إن ضربها بمقياس معين سيؤثر كثيرًا (ولكن قد يتسبب في نتيجة غير معروفة).
بايثون controlnet_union_test_multi_control.py