Qwen-Image 2.1 Fun ControlNet Union : 8 contrôles dans un seul fichier
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 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ôle | Canny, Depth, Grayscale, HED, Lineart, MLSD, Pose, Scribble |
| Profondeur de la branche de contrôle | 16 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ôle | control_in_dim = 129 : latents de contrôle (64) + masque (1) + latents d'image masquée (64) |
| Injection | before_proj / after_proj à porte zéro sur chaque bloc de contrôle, rajoutés dans la branche principale |
| Échantillonnage | Distillé CFG, les scripts d'exemple tournent à guidance_scale = 1.0 (une passe avant par étape) |
| Encodeur de texte / VAE | Processeur 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
| Condition | Signal de contrôle |
|---|---|
| Canny | Carte de contours Canny |
| Depth | Carte de profondeur monoculaire |
| Grayscale | Image en niveaux de gris (luminance) |
| HED | Carte de détection de contours HED |
| Lineart | Extraction de trait |
| MLSD | Carte de détection de segments de ligne |
| Pose | Squelette DWPose |
| Scribble | Lignes à 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.
![]() | ![]() |
|---|---|
| Carte de contours Canny | Sortie générée |
![]() | ![]() |
|---|---|
| Carte de profondeur | Sortie générée |
![]() | ![]() |
|---|---|
| Image en niveaux de gris | Sortie générée |
![]() | ![]() |
|---|---|
| Croquis à main levée | Sortie 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.
![]() | ![]() | ![]() | ![]() |
|---|---|---|---|
| Image source | Masque | Contrôle de pose | Sortie 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.pyajouteQwenImage21FunControletQwenImage21FunControlBlock, une branche de style VACE qui injecte les latents de contrôle dans les lignes cibles et rajoute le skipafter_projde chaque bloc après un bloc de base.comfy_extras/nodes_model_patch.pyapprend à ModelPatchLoader la disposition : il détecte le checkpoint parcontrol_img_inpluscontrol_blocks.0.img_mlp.out.weightet 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.pyajoute QwenImage21FunControlNetApply (« Apply Qwen Image 2.1 Fun ControlNet ») : les entrées sontmodelplusmodel_patch,strength(par défaut 1.0),start_percent/end_percent, et en optioncontrol_image,inpaint_imageetmask(« 1 marque la région à régénérer »).comfy/controlnet.pyresserre 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 :
- qwen_image_2.1_fun_controlnet_union_bf16.safetensors
- qwen_image_2.1_fun_controlnet_union_int8_convrot.safetensors
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_pathdoit êtreconfig/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_sizedé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 = Truemet 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_offloadcomme option la plus rapide, oumodel_cpu_offload_and_qfloat8sur un seul GPU à grande mémoire.












Commentaires
Connectez-vous avec GitHub pour rejoindre la discussion.