Qwen-Image 2.1 Fun ControlNet Union : 8 contrôles dans un seul fichier

ComfyUI Wikinews

Le ControlNet Union d'Alibaba PAI pour Qwen-Image 2.1 regroupe huit contrôles structurels et l'inpainting dans une branche de 7,5 Go, avec un support ComfyUI à venir.

Qwen-Image-2.1-Fun-Controlnet-Union (Hugging Face | VideoX-Fun | ComfyUI PR #16519) est la branche ControlNet-Union d'Alibaba PAI pour Qwen-Image 2.1. Un seul checkpoint de 7,5 Go pilote huit conditions de contrôle structurel ainsi que l'inpainting, et il est chargé par-dessus le transformer de base gelé au lieu de le remplacer.

Qwen-Image 2.1 est arrivé le 20 septembre 2026 sous la forme d'un DiT single-stream de 7B qui génère et édite avec les mêmes poids et écrit un véritable alpha RGBA. La branche ControlNet-Union suit le même chemin qu'Alibaba PAI a emprunté pour MiniMax H3 : un seul checkpoint de contrôle qui couvre toutes les conditions, donc aucun changement de poids par condition n'est nécessaire.

Une branche, huit conditions

Le fichier publié ne contient que la branche de contrôle (control_img_in plus 16 control_blocks, environ 7,0 Go selon la fiche du modèle, 7,55 Go sur le disque). Il est chargé avec strict=False par-dessus le transformer de base Qwen-Image 2.1, qui reste gelé, de sorte que les poids de base sont réutilisés exactement tels quels.

Conditions de contrôleCanny, Depth, Grayscale, HED, Lineart, MLSD, Pose, Scribble
Profondeur de la branche de contrôle16 blocs, un skip sur un bloc de transformer sur deux parmi les 32 (control_layers = [0, 2, 4, ..., 30])
Largeur d'entrée de contrôlecontrol_in_dim = 129 : latents de contrôle (64) + masque (1) + latents d'image masquée (64)
Injectionbefore_proj / after_proj à porte zéro sur chaque bloc de contrôle, rajoutés dans la branche principale
ÉchantillonnageDistillé CFG, les scripts d'exemple tournent à guidance_scale = 1.0 (une passe avant par étape)
Encodeur de texte / VAEProcesseur Qwen3-VL pour le prompt et l'image de condition, le VAE décode en RGBA donc les aperçus sont enregistrés en PNG

control_context_scale met à l'échelle chaque skip de contrôle avant qu'il ne soit ajouté à la branche principale : 1.0 est le réglage le plus fort utilisé pour tous les résultats publiés, des valeurs plus faibles atténuent le guidage, et 0.0 désactive la branche de contrôle.

Conditions de contrôle

ConditionSignal de contrôle
CannyCarte de contours Canny
DepthCarte de profondeur monoculaire
GrayscaleImage en niveaux de gris (luminance)
HEDCarte de détection de contours HED
LineartExtraction de trait
MLSDCarte de détection de segments de ligne
PoseSquelette DWPose
ScribbleLignes à main levée ou esquissées

N'importe quelle image de contrôle RGB ordinaire à la taille de la toile cible fonctionne : la fiche du modèle précise qu'elle tolère des épaisseurs de trait, des seuils et des recadrages différents. Tous les exemples ci-dessous proviennent de la fiche du modèle avec 40 étapes d'inférence, control_context_scale = 1.0 et la graine 43, le signal de contrôle à gauche et la génération à droite.

Contrôle CannyRésultat Canny
Carte de contours CannySortie générée
Contrôle de profondeurRésultat de profondeur
Carte de profondeurSortie générée
Contrôle en niveaux de grisRésultat en niveaux de gris
Image en niveaux de grisSortie générée
Contrôle ScribbleRésultat Scribble
Croquis à main levéeSortie générée

Les conditions restantes (HED, Lineart, MLSD, Pose) suivent le même schéma sur la page du modèle.

L'inpainting partage la même branche

L'entrée de contrôle est élargie à 129 canaux précisément pour qu'une seule branche puisse faire les deux tâches : les latents de contrôle, un masque de conservation et les latents d'image masquée sont concaténés avant d'entrer dans la branche. Pour du contrôle pur, les canaux du masque et de l'image masquée sont remplis de zéros, de sorte que le même checkpoint exécute encore du Canny ou du Depth simple. Pour l'inpainting, la zone masquée est redessinée à partir du prompt tandis que le reste de l'image est préservé, et les deux peuvent être combinés : fournissez une image de contrôle avec un masque et la zone redessinée suit à la fois le prompt et la structure donnée.

Le masque est blanc là où le contenu doit être régénéré et noir là où il doit être conservé. Les pixels régénérés sont encodés en gris moyen, le zéro de la plage d'entrée [-1, 1] du VAE, de sorte que les zones non touchées survivent à l'aller-retour.

Source d'inpaintingMasque d'inpaintingContrôle de poseSortie d'inpainting
Image sourceMasqueContrôle de poseSortie d'inpainting

Prise en charge ComfyUI

La prise en charge ComfyUI est en cours de révision plutôt que publiée. Kijai a ouvert la PR #16519 (« Support Qwen-Image 2.1 union fun controlnet ») le 24 septembre 2026, et elle modifie quatre fichiers :

  • comfy/ldm/qwen_image21/model.py ajoute QwenImage21FunControl et QwenImage21FunControlBlock, une branche de style VACE qui injecte les latents de contrôle dans les lignes cibles et rajoute le skip after_proj de chaque bloc après un bloc de base.
  • comfy_extras/nodes_model_patch.py apprend à ModelPatchLoader la disposition : il détecte le checkpoint par control_img_in plus control_blocks.0.img_mlp.out.weight et déduit du state dict le nombre de blocs, control_in_dim, la dimension de tête et le ratio MLP, de sorte qu'un seul loader convient à cette famille de checkpoints. Les fichiers quantifiés se chargent avec des opérations en précision mixte, ce qui garde les calques quantifiés avec un calcul en bf16.
  • comfy_extras/nodes_qwen.py ajoute QwenImage21FunControlNetApply (« Apply Qwen Image 2.1 Fun ControlNet ») : les entrées sont model plus model_patch, strength (par défaut 1.0), start_percent / end_percent, et en option control_image, inpaint_image et mask (« 1 marque la région à régénérer »).
  • comfy/controlnet.py resserre la détection du loader Qwen Fun afin que le nouveau checkpoint ne soit pas confondu avec une disposition ControlNet plus ancienne.

Les patchs ComfyUI convertis sont déjà publiés par Kijai pendant que la PR est en cours de révision :

Il n'existe pas encore de modèle de flux de travail officiel dans Comfy-Org/workflow_templates, donc les modèles Qwen-Image précédents (image_qwen_image_controlnet_patch, image_qwen_image_instantx_inpainting_controlnet) concernent des modèles plus anciens et ne s'appliquent pas ici.

Disponibilité

En dehors de ComfyUI, le checkpoint s'exécute via VideoX-Fun : clonez VideoX-Fun, placez le modèle de base Qwen-Image 2.1 et le checkpoint de contrôle dans models/Diffusion_Transformer/, puis lancez examples/qwenimage21_fun/predict_t2i_control.py (ou predict_i2i_inpaint.py pour l'inpainting). La branche y a été ajoutée dans le commit « Update Qwen Image 2.1 Control and Flex Forcing ».

Quatre notes de la fiche du modèle méritent d'être retenues :

  • config_path doit être config/qwenimage21/qwenimage21_control.yaml. Il construit la branche de contrôle exactement comme le checkpoint l'attend (control_layers: [0, 2, 4, ..., 30], control_in_dim: 129), et toute autre configuration omet ou déplace silencieusement les poids de contrôle et produit une sortie erronée.
  • sample_size définit la toile de sortie. Gardez les deux côtés en multiples de 16 pour que la carte de contrôle ne soit pas déformée.
  • use_kv_cache = True met en cache les clés du texte et de l'image de condition après la première étape de débruitage, ce qui accélère la génération à une résolution fixe.
  • Mémoire : le transformer plus l'encodeur de texte Qwen3-VL ne tiennent pas entièrement chargés sur un seul GPU grand public. La fiche du modèle recommande model_group_offload comme option la plus rapide, ou model_cpu_offload_and_qfloat8 sur un seul GPU à grande mémoire.

Commentaires

Connectez-vous avec GitHub pour rejoindre la discussion.

Chargement des commentaires…
Qwen-Image 2.1 Fun ControlNet Union : 8 contrôles dans un seul fichier | ComfyUI Wiki