پرش به محتوا
← همهٔ یادداشت‌ها

ControlNet در ComfyUI: کنترل ژست و ترکیب‌بندی تصویر

·۷ دقیقه مطالعه·تیم جی‌پی‌یو

یک آدمک چوبی مفصل‌دار با دست‌های باز در یک ژست مشخص، کنار سایه‌اش روی دیوار چوبی.

می‌خواهید تصویری بسازید که آدم داخلش دقیقاً همان ژستی را داشته باشد که در ذهن شماست، یا ترکیب‌بندی یک عکس مرجع را نگه دارد؟ با پرامپت تنها به این‌جا نمی‌رسید. ControlNet همان قطعهٔ گمشده است: یک تصویر راهنما به ComfyUI می‌دهید و مدل مجبور می‌شود ساختار آن را رعایت کند. در این آموزش ComfyUI روی یک ماشین GPU ابری اجاره‌ای، ControlNet را نصب می‌کنیم و دو کار پرکاربرد را انجام می‌دهیم: کنترل ژست با OpenPose و کنترل ترکیب‌بندی با لبه‌های Canny.

کل کار حدود ۳۰ تا ۴۰ دقیقه طول می‌کشد و نیازی به کارت گرافیک شخصی ندارید؛ ماشین را ساعتی و با پرداخت تومانی اجاره می‌کنید. مدل ControlNet حدود ۲.۵ گیگابایت است و چون ماشین‌ها خارج از ایران‌اند، این دانلود روی خود ماشین با سرعت گیگابیتی انجام می‌شود و به اینترنت داخلی شما ربطی ندارد.

پیش‌نیازها

فرض می‌کنیم قبلاً یک بار با ComfyUI تصویر ساخته‌اید. اگر نه، اول پست آموزش ComfyUI روی GPU ابری: اولین تصویر با SDXL را انجام بدهید؛ در ادامه از همان مدل پایهٔ SDXL استفاده می‌کنیم. سه چیز باید آماده باشد:

  • یک حساب جی‌پی‌یو. اگر ندارید، از صفحهٔ ثبت‌نام شروع کنید.
  • یک کلید عمومی SSH ثبت‌شده در بخش حساب کاربری. ورود به ماشین فقط با کلید انجام می‌شود و رمز عبوری در کار نیست.
  • موجودی کیف پول؛ برای این آموزش حدود ۵۰ تا ۸۰ هزار تومان کافی است. برای شروع باید دست‌کم به اندازهٔ یک ساعت از نرخ همان ماشین موجودی داشته باشید.

انتخاب ماشین مناسب

ControlNet یک مدل جداگانه است که کنار مدل SDXL در VRAM بارگذاری می‌شود، پس حدود ۲ تا ۳ گیگابایت به مصرف حافظهٔ کارت اضافه می‌کند؛ یعنی حاشیهٔ امن شما نسبت به قبل کمتر می‌شود. دو پیشنهاد:

  • اقتصادی — RTX 3060 (۱۲ گیگابایت): برای یک ControlNet هم‌زمان جواب می‌دهد، اما اندازهٔ تصویر را از ۱۰۲۴×۱۰۲۴ بالاتر نبرید. در زمان نوشتن این مطلب از حدود ۱۵ هزار تومان در ساعت شروع می‌شود.
  • راحت — RTX 3090 (۲۴ گیگابایت): اگر می‌خواهید دو ControlNet را پشت سر هم زنجیر کنید یا خروجی بزرگ‌تر بگیرید، این کارت خیالتان را راحت می‌کند. در زمان نوشتن این مطلب از حدود ۴۲ هزار تومان در ساعت.

گزینهٔ میانی RTX A4000 با ۱۶ گیگابایت است که در زمان نوشتن این مطلب از حدود ۲۴ هزار تومان در ساعت شروع می‌شود و برای اکثر ورک‌فلوهای ControlNet کافی است. کارت خودتان را با فیلتر مدل و حافظه در بازار GPU پیدا کنید. قیمت ساعتی موقع اجاره قفل می‌شود.

اجاره و راه‌اندازی

در بازار، ماشین موردنظرتان را باز کنید و موقع اجاره از فهرست قالب‌ها ComfyUI را انتخاب کنید. دکمهٔ اجاره را بزنید و صبر کنید تا وضعیت ماشین «آماده» شود.

بعد از آماده‌شدن، صفحهٔ ماشین دستور SSH آماده، لینک Jupyter و توکن آن، دستور «تونل امن»، دکمهٔ «پنل ماشین» و فهرست پورت‌های منتشرشده را یک‌کلیک در اختیارتان می‌گذارد. در این آموزش با SSH فایل‌ها را دانلود می‌کنید و با «پنل ماشین» رابط ComfyUI را باز می‌کنید.

دستور SSH را از صفحهٔ ماشین کپی کنید؛ شکل کلی‌اش چنین است:

ssh -i ~/.ssh/id_ed25519 user@ADDRESS -p PORT

دانلود مدل ControlNet

برای SDXL بهترین انتخاب مدل ControlNet Union است که به‌تنهایی چند حالت کنترل (ژست، عمق، لبه و چند تای دیگر) را پوشش می‌دهد؛ یعنی به‌جای چهار فایل، یک فایل ۲.۵ گیگابایتی. این فایل باید داخل پوشهٔ models/controlnet نصب ComfyUI بنشیند.

اول مسیر دقیق را پیدا کنید، بعد به همان مسیر بروید و مدل را با یک نام خوانا دانلود کنید:

find / -type d -path "*ComfyUI/models/controlnet" 2>/dev/null
cd /workspace/ComfyUI/models/controlnet
wget -O controlnet-union-sdxl-promax.safetensors \
  https://huggingface.co/xinsir/controlnet-union-sdxl-1.0/resolve/main/diffusion_pytorch_model_promax.safetensors

روی ماشین خارج از ایران، این دانلود معمولاً کمتر از یک دقیقه طول می‌کشد. با ls -lh مطمئن شوید فایل کامل (حدود ۲.۵ گیگابایت) رسیده است.

نصب پیش‌پردازنده‌ها

ControlNet با خود عکس شما کار نمی‌کند، با یک تصویر راهنما — مثلاً نقشهٔ اسکلت بدن یا نقشهٔ لبه‌ها. ساختن آن کار «پیش‌پردازنده» است. برای لبه‌ها ComfyUI گرهٔ Canny را به‌صورت داخلی دارد، اما برای تشخیص ژست باید مجموعه‌گره‌های comfyui_controlnet_aux را نصب کنید:

cd /workspace/ComfyUI/custom_nodes
git clone https://github.com/Fannovel16/comfyui_controlnet_aux/
cd comfyui_controlnet_aux
pip install -r requirements.txt

بعد از نصب، ComfyUI را یک بار از نو اجرا کنید (دکمهٔ Restart در منوی رابط) تا گره‌های تازه شناخته شوند.

کنترل ژست با OpenPose

پنل ماشین را باز کنید تا رابط ComfyUI بالا بیاید. از ورک‌فلوی پیش‌فرض متن‌به‌تصویر شروع می‌کنیم و چند گره به آن اضافه می‌کنیم؛ برای افزودن هر گره روی فضای خالی دوبار کلیک کنید و نامش را تایپ کنید.

۱. گرهٔ Load Image را اضافه کنید و عکس مرجعتان را در آن آپلود کنید — عکسی که ژست موردنظر را دارد.

۲. گرهٔ DWPose Estimator را اضافه کنید و خروجی Load Image را به ورودی‌اش وصل کنید تا از عکس شما یک اسکلت رنگی بسازد. بار اول چند ده مگابایت مدل تشخیص ژست را خودش دانلود می‌کند.

۳. گرهٔ Load ControlNet Model را اضافه کنید و فایل controlnet-union-sdxl-promax.safetensors را در آن انتخاب کنید. اگر فایل در فهرست نبود، دکمهٔ Refresh رابط را بزنید.

۴. چون مدل از نوع Union است، یک گرهٔ SetUnionControlNetType بین لودر و مرحلهٔ بعد بگذارید و مقدارش را روی auto بگذارید. اگر نتیجه با حالت خودکار درست درنیامد، مقدار openpose را دستی انتخاب کنید.

۵. گرهٔ Apply ControlNet را اضافه کنید و این‌ها را به آن وصل کنید: خروجی ControlNet از مرحلهٔ قبل، تصویر راهنما از DWPose Estimator، و هر دو گرهٔ متن مثبت و منفی به ورودی‌های positive و negative. سپس خروجی‌های positive و negative این گره را به ورودی‌های متناظر در KSampler بدهید.

حالا در متن مثبت هر چیزی که می‌خواهید بنویسید — مثلاً a knight in silver armor in a misty forest, cinematic lighting — و دکمهٔ Queue را بزنید. آدم داخل تصویر همان ژست عکس مرجع را می‌گیرد، ولی بقیه از پرامپت شما می‌آید.

کنترل ترکیب‌بندی با Canny

اگر به‌جای ژست می‌خواهید ترکیب‌بندی و خطوط کلی یک تصویر حفظ شود، به‌جای DWPose Estimator از گرهٔ داخلی Canny استفاده کنید. ورودی‌اش همان Load Image است و دو تنظیم دارد:

  • low_threshold: پیش‌فرض 0.4. پایین‌تر بیاورید تا جزئیات بیشتری به‌عنوان لبه شناخته شود.
  • high_threshold: پیش‌فرض 0.8. بالاتر ببرید تا فقط لبه‌های قوی بمانند.

خروجی Canny را اول با یک Preview Image نگاه کنید: اگر پر از نویز بود low_threshold را بالا ببرید، اگر خطوط مهم گم شده‌اند پایین بیاورید. وقتی نقشهٔ لبه تمیز شد همان را به Apply ControlNet بدهید و در SetUnionControlNetType گزینهٔ canny/lineart/anime_lineart/mlsd را انتخاب کنید.

تنظیم شدت اثر

گرهٔ Apply ControlNet سه عدد مهم دارد که کیفیت کار را تعیین می‌کنند:

  • strength: چقدر تصویر راهنما به مدل تحمیل شود. 1.0 یعنی کاملاً بچسب به ساختار راهنما. اگر خروجی خشک و مصنوعی شد، آن را روی 0.6 تا 0.8 بگذارید.
  • start_percent: از چند درصد مراحل نمونه‌برداری، کنترل شروع شود. معمولاً 0.0.
  • end_percent: تا چند درصد ادامه پیدا کند. روی 0.7 بگذارید تا مدل در مراحل پایانی آزاد شود و جزئیات طبیعی‌تری بسازد.

اگر به مشکل خوردید

خطای CUDA out of memory: SDXL و ControlNet با هم در VRAM جا نشده‌اند. اندازهٔ تصویر را ۱۰۲۴×۱۰۲۴ نگه دارید، batch_size را روی ۱ بگذارید و ComfyUI را Restart کنید؛ وگرنه سراغ کارتی با VRAM بیشتر بروید.

مدل در فهرست Load ControlNet Model نیست: یا دانلود تمام نشده، یا فایل جای درستی نیست. با ls -lh حجم فایل را در پوشهٔ models/controlnet چک کنید و بعد دکمهٔ Refresh رابط را بزنید.

گرهٔ DWPose Estimator پیدا نمی‌شود: نصب comfyui_controlnet_aux کامل نشده یا ComfyUI هنوز Restart نشده است. خروجی pip install -r requirements.txt را دوباره ببینید.

اسکلت خروجی خالی است: پیش‌پردازندهٔ ژست آدمی در عکس پیدا نکرده. عکسی بدهید که بدن کامل و واضح باشد؛ عکس‌های خیلی تاریک، خیلی شلوغ یا بریده جواب نمی‌دهند.

دانلود نیمه‌کاره ماند: دستور wget را با سوییچ ادامه دوباره بزنید تا از همان‌جا ادامه دهد:

wget -c -O controlnet-union-sdxl-promax.safetensors \
  https://huggingface.co/xinsir/controlnet-union-sdxl-1.0/resolve/main/diffusion_pytorch_model_promax.safetensors

هزینه و صرفه‌جویی

نصب و راه‌اندازی حدود نیم ساعت وقت می‌برد و بعد از آن هر تصویر چند ثانیه است؛ روی کارت اقتصادی یعنی کل این آموزش حدود ده هزار تومان. دو نکته:

  • هزینه دقیقه‌ای از کیف پول کم می‌شود و ماشین متوقف‌شده هزینه‌ای ندارد. وقتی کارتان تمام شد ماشین را متوقف یا حذف کنید.
  • دیسک ماشین با حذف آن پاک می‌شود و فضای ذخیره‌سازی دائمی نداریم. خروجی‌ها را از پوشهٔ ComfyUI/output قبل از حذف ماشین بردارید.

قدم بعدی

قدم طبیعی بعدی کنترل سبک است: با یک LoRA می‌توانید استایل ثابتی به همهٔ خروجی‌ها بدهید. برای دانلود مستقیم مدل‌ها روی ماشین، سراغ پست دانلود مدل هوش مصنوعی روی سرور GPU: scp و rsync بروید.

پرسش‌های متداول

ControlNet در ComfyUI چه کاری می‌کند؟

ControlNet یک مدل کمکی است که کنار مدل اصلی اجرا می‌شود و ساختار خروجی را از یک تصویر راهنما می‌گیرد: ژست بدن، خطوط و ترکیب‌بندی، یا عمق صحنه. ظاهر و سبک تصویر همچنان از پرامپت شما می‌آید.

برای ControlNet چقدر VRAM لازم است؟

ControlNet حدود ۲ تا ۳ گیگابایت به مصرف مدل پایه اضافه می‌کند. با SDXL و تصویر ۱۰۲۴×۱۰۲۴، کارت ۱۲ گیگابایتی کافی است و ۱۶ یا ۲۴ گیگابایت حاشیهٔ راحتی می‌دهد. برای مقایسهٔ دقیق‌تر کارت‌ها، پست انتخاب کارت گرافیک هوش مصنوعی: راهنمای VRAM هر کار را ببینید.

آیا می‌شود دو ControlNet را هم‌زمان استفاده کرد؟

بله. خروجی positive و negative یک گرهٔ Apply ControlNet را به ورودی گرهٔ بعدی بدهید تا زنجیر شوند؛ مثلاً ژست از OpenPose و ترکیب‌بندی از Canny. مصرف VRAM بالا می‌رود، پس strength هر کدام را کمی پایین‌تر بگذارید.

چرا تصویر خروجی دقیقاً شبیه عکس مرجع شده است؟

strength را خیلی بالا گذاشته‌اید. آن را به 0.6 کم کنید و end_percent را روی 0.7 بگذارید.

آیا برای ControlNet به کارت گرافیک شخصی نیاز است؟

نه. یک ماشین GPU ابری را ساعتی و با پرداخت تومانی اجاره کنید، قالب ComfyUI را انتخاب کنید و بعد از چند دقیقه شروع کنید. وقتی کارتان تمام شد ماشین را متوقف می‌کنید و هزینه قطع می‌شود.

تصویر کاور: «Mannequin-1090714» اثر Hannah Alkadi، از ویکی‌مدیا کامنز، لایسنس CC0.