Qwen-Image 2.1 Fun ControlNet Union: 8 видов контроля в одном файле

ComfyUI Wikinews

ControlNet Union от Alibaba PAI для Qwen-Image 2.1 объединяет восемь структурных контролей и инпейтинг в одну ветку на 7.5 ГБ, а поддержка ComfyUI уже на подходе.

Qwen-Image-2.1-Fun-Controlnet-Union (Hugging Face | VideoX-Fun | ComfyUI PR #16519) это ветка ControlNet-Union от Alibaba PAI для Qwen-Image 2.1. Один checkpoint на 7.5 ГБ управляет восемью условиями структурного контроля плюс инпейтингом, и он загружается поверх замороженного базового transformer, а не заменяет его.

Qwen-Image 2.1 вышел 20 сентября 2026 года как 7B single-stream DiT, который генерирует и редактирует одними и теми же весами и записывает настоящую RGBA-альфу. Ветка ControlNet-Union идёт тем же путём, который Alibaba PAI выбрала для MiniMax H3: единственный контрольный checkpoint, покрывающий все условия, поэтому переключение весов под каждое условие не требуется.

Одна ветка, восемь условий

Выпущенный файл содержит только контрольную ветку (control_img_in плюс 16 control_blocks, около 7.0 ГБ согласно карточке модели, 7.55 ГБ на диске). Она загружается с strict=False поверх базового transformer Qwen-Image 2.1, который остаётся замороженным, поэтому базовые веса переиспользуются ровно в том виде, в каком они есть.

Условия контроляCanny, Depth, Grayscale, HED, Lineart, MLSD, Pose, Scribble
Глубина контрольной ветки16 блоков, один skip на каждом 2-м из 32 блоков transformer (control_layers = [0, 2, 4, ..., 30])
Ширина входа контроляcontrol_in_dim = 129: control latents (64) + маска (1) + latents маскированного изображения (64)
Инъекцияzero-gated before_proj / after_proj на каждом контрольном блоке, добавляются обратно в основную ветку
ВыборкаCFG-distilled, примеры скриптов запускаются при guidance_scale = 1.0 (один forward pass на шаг)
Текстовый энкодер / VAEprocessor Qwen3-VL для промпта и изображения-условия, VAE декодирует RGBA, поэтому превью сохраняются как PNG

control_context_scale масштабирует каждый control skip перед добавлением в основную ветку: 1.0 это самое сильное значение, использованное во всех опубликованных результатах, меньшие значения ослабляют направление, а 0.0 полностью отключает контрольную ветку.

Условия контроля

УсловиеСигнал контроля
CannyКарта краёв Canny
DepthМонокулярная карта глубины
GrayscaleИзображение в градациях серого (яркость)
HEDКарта детекции краёв HED
LineartИзвлечение линейного арта
MLSDКарта детекции линейных сегментов
PoseСкелет DWPose
ScribbleСвободные линии или линии наброска

Подойдёт любое обычное RGB-изображение контроля под целевой холст: в карточке модели отмечено, что модель терпима к разной толщине линий, порогам и кадрированию. Все примеры ниже взяты из карточки модели при 40 шагах вывода, control_context_scale = 1.0 и seed 43, где сигнал контроля слева, а генерация справа.

Контроль CannyРезультат Canny
Карта краёв CannyСгенерированный результат
Контроль глубиныРезультат глубины
Карта глубиныСгенерированный результат
Контроль в градациях серогоРезультат в градациях серого
Изображение в градациях серогоСгенерированный результат
Контроль каракулямиРезультат каракулей
Набросок каракулямиСгенерированный результат

Остальные условия (HED, Lineart, MLSD, Pose) следуют тому же шаблону на странице модели.

Инпейтинг использует ту же ветку

Вход контроля расширен до 129 каналов именно для того, чтобы одна ветка выполняла обе задачи: control latents, маска сохранения и latents маскированного изображения конкатенируются перед входом в ветку. Для чистого контроля каналы маски и маскированного изображения дополняются нулями, поэтому тот же checkpoint по-прежнему выполняет обычные Canny или Depth. При инпейтинге маскированная область перерисовывается по промпту, а остальная часть кадра сохраняется, и эти режимы можно комбинировать: подайте изображение контроля вместе с маской, и перерисованная область будет следовать и промпту, и заданной структуре.

Маска белая там, где содержимое должно быть перегенерировано, и чёрная там, где его нужно сохранить. Перегенерированные пиксели кодируются средне-серым, нулём входного диапазона VAE [-1, 1], поэтому нетронутые области переживают цикл кодирования и декодирования.

Исходное изображениеМаска инпейтингаКонтроль позыРезультат инпейтинга
Исходное изображениеМаскаКонтроль позыРезультат инпейтинга

Поддержка ComfyUI

Поддержка ComfyUI находится на рассмотрении, а не в релизе. Kijai открыл PR #16519 («Support Qwen-Image 2.1 union fun controlnet») 24 сентября 2026 года, и он изменяет четыре файла:

  • comfy/ldm/qwen_image21/model.py добавляет QwenImage21FunControl и QwenImage21FunControlBlock, ветку в стиле VACE, которая внедряет control latents в целевые строки и добавляет skip after_proj каждого блока обратно после одного базового блока.
  • comfy_extras/nodes_model_patch.py учит ModelPatchLoader этой структуре: он определяет checkpoint по control_img_in плюс control_blocks.0.img_mlp.out.weight и выводит число блоков, control_in_dim, размерность головы и соотношение MLP из state dict, поэтому один загрузчик подходит для всего этого семейства checkpoint-ов. Квантованные файлы загружаются со смешанно-точными операциями, сохраняя слои квантованными при вычислениях в bf16.
  • comfy_extras/nodes_qwen.py добавляет QwenImage21FunControlNetApply ("Apply Qwen Image 2.1 Fun ControlNet"): входы это model плюс model_patch, strength (по умолчанию 1.0), start_percent / end_percent и опциональные control_image, inpaint_image и mask («1 отмечает область для перегенерации»).
  • comfy/controlnet.py уточняет детекцию загрузчика Qwen Fun, чтобы новый checkpoint не был принят за старую структуру ControlNet.

Сконвертированные патчи для ComfyUI уже опубликованы Kijai, пока PR находится на рассмотрении:

Официального шаблона рабочего процесса для него в Comfy-Org/workflow_templates пока нет, поэтому предыдущие шаблоны Qwen-Image (image_qwen_image_controlnet_patch, image_qwen_image_instantx_inpainting_controlnet) предназначены для более старых моделей и здесь не подходят.

Доступность

Вне ComfyUI checkpoint запускается через VideoX-Fun: клонируйте VideoX-Fun, поместите базовую модель Qwen-Image 2.1 и контрольный checkpoint в models/Diffusion_Transformer/ и запустите examples/qwenimage21_fun/predict_t2i_control.py (или predict_i2i_inpaint.py для инпейтинга). Ветка была добавлена туда в коммите «Update Qwen Image 2.1 Control and Flex Forcing».

Стоит запомнить четыре замечания из карточки модели:

  • config_path обязан быть config/qwenimage21/qwenimage21_control.yaml. Он строит контрольную ветку ровно так, как ожидает checkpoint (control_layers: [0, 2, 4, ..., 30], control_in_dim: 129), а любой другой конфиг молча отбрасывает или смещает контрольные веса и даёт неверный вывод.
  • sample_size задаёт холст вывода. Держите обе стороны кратными 16, чтобы карта контроля не искажалась.
  • use_kv_cache = True кеширует ключи текста и изображения-условия после первого шага denoise, что ускоряет генерацию при фиксированном разрешении.
  • Память: transformer плюс текстовый энкодер Qwen3-VL не помещаются полностью загруженными на одну потребительскую GPU. Карточка модели рекомендует model_group_offload как самый быстрый вариант или model_cpu_offload_and_qfloat8 на одной GPU с большим объёмом памяти.

Комментарии

Войдите через GitHub, чтобы участвовать в обсуждении.

Загрузка комментариев…
Qwen-Image 2.1 Fun ControlNet Union: 8 видов контроля в одном файле | ComfyUI Wiki