ControlNet
يضيف ControlNet تحكمًا مكانيًا إلى نماذج الانتشار لتحويل النص إلى صورة، ويوجه تخطيط الصورة باستخدام خرائط الحواف أو العمق أو هياكل الوضعيات. تعرّف على آلية عمله مع أمثلة برمجية.
ControlNet بنية شبكة عصبية تضيف تحكمًا مكانيًا إلى نموذج انتشار مدرّب مسبقًا من نوع النص إلى الصورة، مثل Stable Diffusion. وإلى جانب الموجّه النصي، يستقبل صورة شرطية، مثل خريطة حواف أو خريطة عمق أو هيكل عظمي لوضعية بشرية أو خريطة تجزئة، وتتبع الصورة المولّدة ذلك الهيكل فيما يحدد الموجّه المحتوى والأسلوب. فمثلًا، ينتج عن موجّه مثل "فارس يرتدي درعًا فضيًا" مع هيكل عظمي للوضعية فارس بالوضعية المحددة تمامًا. وقد قدمه لڤمين تشانغ وأني راو ومانيش أغراوالا من جامعة ستانفورد في عام 2023 في بحث إضافة تحكم شرطي إلى نماذج الانتشار من النص إلى الصورة، الذي تقاسم جائزة مار لأفضل بحث في ICCV 2023. وتظل أوزان النموذج الأساسي مجمّدة، لذا يضيف ControlNet التحكم دون الإضرار بما يعرفه النموذج بالفعل.
آلية عمل ControlNet#
ينشئ Stable Diffusion صورة عبر إزالة الضوضاء من كامن مرارًا باستخدام U-Net. ويجمّد ControlNet تلك الشبكة U-Net وينشئ نسخة قابلة للتدريب من مُرمِّزها، أي كتل الترميز الاثنتي عشرة والكتلة الوسطى. وتحول شبكة التفاف صغيرة صورة الشرط، التي أبعادها 512×512، أولًا إلى خريطة سمات أبعادها 64×64 تطابق الكامن. وتعالج النسخة القابلة للتدريب الكامن مضافًا إليه سمات الشرط، ثم تُضاف مخرجاتها إلى وصلات التخطي الاثنتي عشرة في U-Net المجمدة وإلى كتلتها الوسطى، ليتلقى مفكّك الترميز المجمّد إشارة التحكم:
لا تتصل النسخة بالنموذج المجمّد إلا عبر طبقات التفاف صفرية: طبقات التفاف بحجم 1×1 تبدأ أوزانها وانحيازاتها من الصفر. في خطوة التدريب الأولى، تُخرج هذه الطبقات أصفارًا، لذا يتصرف النموذج المركّب تمامًا مثل النموذج الأصلي، ولا تصل أي ضوضاء عشوائية إلى الطبقات المدرّبة مسبقًا. ومع ذلك، تتلقى طبقة الالتفاف الصفرية عند الخرج تدرجًا غير صفري للأوزان، لأن مدخلها غير صفري، لذا يحرّك التحديث الأول أوزانها بعيدًا عن الصفر، وتنمو إشارة التحكم انطلاقًا من ذلك. يوضح هذا الكود المكتوب باستخدام PyTorch كتلةً واحدة:
import copy
import torch
from torch import nn
# A frozen block from the pretrained model and a trainable copy of it
torch.manual_seed(0)
locked = nn.Conv2d(64, 64, 3, padding=1).requires_grad_(False)
trainable = copy.deepcopy(locked).requires_grad_(True)
# Zero convolutions: 1x1 convolutions whose weights and biases start at zero
zero_in, zero_out = nn.Conv2d(64, 64, 1), nn.Conv2d(64, 64, 1)
for conv in (zero_in, zero_out):
nn.init.zeros_(conv.weight)
nn.init.zeros_(conv.bias)
x = torch.randn(1, 64, 32, 32) # features entering the block
condition = torch.randn(1, 64, 32, 32) # encoded edge, depth, or pose map
y = locked(x) + zero_out(trainable(x + zero_in(condition)))
# At step 0 the output equals the frozen block's, and only the outer zero conv gets a gradient
print(torch.equal(y, locked(x)))
y.sum().backward()
print(f"zero_in grad: {zero_in.weight.grad.norm():.1f}, zero_out grad: {zero_out.weight.grad.norm():.1f}")يطبع True وzero_in grad: 0.0, zero_out grad: 2040.6. ويطابق خرج الكتلة خرج النموذج المجمّد، وتتلقى التفافة الصفرية الخارجية تدرجًا لأن مدخلها غير صفري، فيما تبدأ الداخلية بالتعلم بعد أن تتحرك الخارجية بعيدًا عن الصفر.
أنواع الشروط#
درّب البحث الأصلي نماذج ControlNet منفصلة لحواف Canny وخرائط العمق وخرائط الأعمدة الناظمية السطحية والخطوط المستقيمة M-LSD والحواف اللينة HED وخرائط التجزئة ADE20K ووضعيات البشر OpenPose ورسومات المستخدم. ويُستخرج كل شرط من صورة مرجعية باستخدام نموذج جاهز، مثل كاشف الحواف Canny في OpenCV أو شبكة تقدير العمق، ويمكن تطبيق عدة نماذج ControlNet في آن واحد، لكل منها قوة خاصة. وتستخرج نماذج تقدير الوضعية في Ultralytics YOLO26 هذا النوع من شروط الوضعية، إذ تتنبأ بـ17 نقطة COCO رئيسية لكل شخص، ويمكن رسمها على هيئة هياكل عظمية على لوحة فارغة:
import cv2
import numpy as np
from ultralytics import YOLO
# حمّل نموذج وضعية YOLO26 يتنبأ بـ17 نقطة رئيسية لكل شخص
model = YOLO("yolo26n-pose.pt")
results = model("https://ultralytics.com/images/bus.jpg")
result = results[0]
# ارسم الهياكل العظمية فقط على لوحة سوداء بحجم الصورة
skeletons = result.plot(img=np.zeros_like(result.orig_img), boxes=False)
cv2.imwrite("pose_condition.png", skeletons)تُظهر الصورة المحفوظة أطراف كل شخص على هيئة خطوط ملوّنة على خلفية سوداء، بعد إزالة ألوان الصورة وملمسها وخلفيتها.
ControlNet والأساليب ذات الصلة#
- LoRA: يضبط مجموعة صغيرة من الأوزان المضافة بدقة لتعليم النموذج أسلوبًا أو شخصية أو غرضًا جديدًا. ويغير LoRA ما يرسمه النموذج، بينما يحدد ControlNet مواضع العناصر، وغالبًا ما يُستخدمان معًا.
- T2I-Adapter: بديل أخف يتضمن نحو 77 مليون معلمة، ويضيف سمات الشرط إلى سمات مُرمِّز U-Net المجمّد بدلًا من تشغيل نسخة كاملة من المُرمِّز. ويمكن جمع المهايئات الخاصة بشروط مختلفة وقت التوليد.
- التوليد من صورة إلى صورة: يبدأ إزالة الضوضاء من نسخة مشوشة من صورة إدخال، لذا يرث الناتج ألوان تلك الصورة وتخطيطها العام. ولا يقيّد ControlNet إلا البنية المستخرجة، مثل الحواف، ويترك الألوان والأنسجة للموجّه.
- الترميم داخل الصورة: يعيد توليد جزء مقنّع من الصورة ليتوافق مع بقيتها. وهو يتحكم في المنطقة التي تتغير، بينما يتحكم ControlNet في بنية المحتوى المولّد.
تطبيقات عملية#
- الهندسة المعمارية والتصميم الداخلي: تتحول الرسومات التخطيطية أو الرسوم الخطية بمساعدة الحاسوب أو خرائط خطوط الغرفة M-LSD إلى تصييرات واقعية بمواد وأساليب مختلفة مع الحفاظ على الهندسة نفسها.
- فن الشخصيات والرسوم المتحركة: تحافظ الهياكل العظمية للوضعيات على ثبات وضعية الشخصية عبر تنويعات الأسلوب، كما تقود الوضعيات المستخرجة لكل إطار من فيديو مرجعي تسلسلات متحركة متناسقة.
- صور المنتجات والتسويق: تحافظ خرائط العمق أو الحواف لصورة المنتج على شكله وموضعه، فيما يغير الموجّه المكان والإضاءة والخلفية.
- البيانات الاصطناعية: يؤدي توليد الصور من خرائط التجزئة أو الوضعيات إلى إنتاج صور تدريب جديدة تكون تسمياتها معروفة مسبقًا، لأن التخطيط حُدّد قبل التوليد.
تدريب ControlNet#
يتطلب التدريب أزواجًا من الصور وخرائط شروطها، تُنتج تلقائيًا بتشغيل مستخرج الشروط على مجموعة بيانات صور ذات تسميات وصفية. ولا تحتاج الأوزان المجمّدة إلى تحديثات للتدرج، لذا لا تستغرق كل خطوة تدريب سوى نحو 23% إضافية من ذاكرة GPU و34% إضافية من الوقت مقارنةً بتحسين Stable Diffusion من دون ControlNet. ويذكر البحث نجاح التدريب على مجموعات بيانات تقل عن 50,000 صورة وتتجاوز مليون صورة. ويُظهر التدريب أيضًا "تقاربًا مفاجئًا": يتجاهل النموذج الشرط لآلاف الخطوات، ثم يبدأ اتباعه فجأة، عادةً خلال 10,000 خطوة تحسين؛ وفي مثال البحث حدث ذلك عند الخطوة 6,133.










