Tapez « t-shirt » et vous obtenez un masque du t-shirt. Tapez « face », « bookshelf » ou « wall » et vous obtenez ceux-là. Florence 2 est un modèle de vision de Microsoft capable de trouver des objets à partir d’une description textuelle, et dans ComfyUI il la transforme en un masque que vous pouvez utiliser pour un inpainting. C’est presque incroyable ce qu’il sait faire, mais il a des réserves, et j’en parlerai aussi.
Florence 2 est décrit dans l’article Florence-2: Advancing a Unified Representation for a Variety of Vision Tasks (Xiao et al., 2023). C’est un modèle de recherche pour de nombreuses tâches (légendage, détection d’objets, segmentation et plus) ; ici, je ne l’utilise que pour les masques.
En bref
- Nodes : ComfyUI-Florence2 (celui de Kijai), ComfyUI Essentials, Universal Styler pour la sortie de texte, rgthree pour comparer.
- Modèle : Florence-2-large pour les meilleurs masques ; base en solution de repli.
- Tâche :
referring_expression_segmentation, puis saisissez ce qu’il faut masquer. - Inpaint : InpaintModelConditioning avec l’image d’origine et le masque ; denoise autour de 0,5–0,62.
- Les masques se combinent : Mask Composite (add) réunit deux masques ; Grow Mask plus multiply fait une bordure.
Nouveau sur ComfyUI ? Commencez par les bases des nodes ComfyUI et le texte vers image et installer le ComfyUI Manager. Le workflow terminé est gratuit sur mon Patreon : glissez le JSON et installez les nodes manquants depuis le Manager.
Installer les nodes
Dans Manager → Custom Nodes Manager, installez :
- ComfyUI Essentials, une collection basique de nodes dont vous avez vraiment besoin (Mask Preview, Image Resize et plus).
- ComfyUI Universal Styler, qui aide à sortir du texte (son node Get Text affiche les légendes de Florence).
- Florence 2. Il y a deux paquets, celui de Kijai et celui de spacepxl. Celui de Kijai a plus d’étoiles et a été mis à jour plus récemment. Les deux sont très proches, mais j’ai dû réécrire une partie du code de spacepxl pour l’exécuter sur le dernier ComfyUI. Restez sur celui de Kijai.
Redémarrez ComfyUI après l’installation.
Construire la partie Florence 2
- Ajoutez DownloadAndLoadFlorence2Model. Il télécharge automatiquement le modèle la première fois qu’il tourne, donc pas de git clone ni de chasse aux dossiers de modèles.
- Ajoutez Florence2Run et connectez le modèle.
- Ajoutez Load Image avec votre image, dans l’entrée d’image de Florence2Run.
- Connectez toutes les sorties : un Preview Image pour l’image, un Mask Preview (d’Essentials) pour le masque et un node Get Text pour la légende. Si une sortie n’est pas connectée, le réseau ne tourne pas, et le modèle ne se télécharge pas.
Cliquez sur Queue. La première exécution télécharge le modèle, ce qui peut prendre quelques minutes ou plus selon votre connexion ; vous pouvez le suivre dans la fenêtre de commande. La tâche par défaut trouve les objets de l’image et dessine une boîte englobante autour de chacun (ici : une couronne et un crâne). Les boîtes englobantes ne sont pas très utiles pour cela ; de vrais masques le sont.
Choisir le modèle
- Florence-2-base : celui par défaut.
- Florence-2-base-ft / large-ft : « ft » signifie affiné pour des usages précis. Je ne les recommande pas ; ils ont donné de moins bons résultats que base.
- Florence-2-large : vivement recommandé. Il prend nettement plus de temps par image mais fait de bien meilleurs masques.
Choisir la tâche
La liste task est le réglage le plus important. Réglez-la sur caption et il décrit l’image ; pour moi le texte ne s’est pas affiché dans le node Get Text sur cette machine, bien qu’il soit apparu dans la fenêtre de commande et ait fonctionné sur une autre machine. Les légendes ne sont de toute façon pas le but ici.
La tâche que vous utiliserez presque tout le temps est referring_expression_segmentation. Saisissez ce que vous voulez dans le champ de texte, lancez, et vous obtenez un masque.
« Skull » a donné tout de suite un beau masque. « Crown », non, au début : les modèles d’IA ne sont pas parfaits et cela arrive de temps en temps. Quand je suis repassé de large à base et ai lancé le même prompt, j’ai obtenu un bon masque de la couronne. Changer de modèle de temps en temps fait partie du processus.
Faire l’inpainting de la zone masquée
- Ajoutez InpaintModelConditioning. Connectez le mask de Florence2Run, et l’image de votre Load Image d’origine, pas de Florence2Run : la sortie d’image de Florence porte le masque coloré peint dessus.
- Construisez une chaîne standard de texte vers image : Load Checkpoint (j’utilise epiCPhotoGasm), un CLIP Text Encode positif et un négatif (je les colore en vert et en rouge), un KSampler, VAE Decode et Save Image.
- Faites passer les prompts d’abord par InpaintModelConditioning, puis dans le KSampler. Connectez le VAE à InpaintModelConditioning, et sa sortie latent à l’entrée latente du KSampler.
- Saisissez le changement voulu (« silver » pour la couronne) et réglez le denoise à environ 0,62. Le denoise contrôle le mélange entre le prompt et l’image d’origine, et c’est la valeur la plus importante ici.
S’il se plaint d’une connexion VAE manquante, faites-en glisser une. Le résultat :
Pour comparer, ajoutez un Image Comparer de rgthree, avec la nouvelle image en A et l’originale en B. Il faudra relancer pour l’activer, ce qui donne un résultat différent.
Combiner deux masques : le tigre entier
Sur une photo de tigre de Fotoref (la banque de photos que j’ai cofondée), « tiger » a masqué l’avant du corps mais manqué la patte arrière. Contournez les nodes d’inpainting (sélectionnez-les et appuyez sur Ctrl+B) pendant que vous testez les masques.
- Copiez la branche Florence avec Ctrl+C, Ctrl+Maj+V, ce qui conserve les connexions. Donnez-lui les mêmes nodes de sortie (aperçu, aperçu de masque, Get Text) ; sans eux, elle ne tourne pas, même si vous ne les utilisez pas.
- Essayez des prompts pour la partie manquante. « Tiger back leg » n’a pas marché. Avec le modèle large et un prompt plus créatif, « tiger black stripes front and back », j’ai obtenu la patte arrière. J’ai essayé environ dix prompts pour y arriver.
- Ajoutez Mask Composite : un masque dans destination, l’autre dans source (ils devraient simplement s’appeler A et B), opération add, puisque vous ajoutez du blanc au blanc. Multiply supprimerait tout.
- Prévisualisez le masque combiné : le tigre entier.
Réactivez les nodes d’inpainting et connectez le masque composé à InpaintModelConditioning. J’ai oublié de changer le prompt et obtenu un tigre argenté. Avec « cat », il a fait un chat, et il s’est bien fondu : il a remplacé le bas du corps par de la végétation proche et mis une pierre sous une patte. On n’est pas loin d’une excellente génération ; il faut plus d’exécutions.
Visages
Sur l’une de mes sculptures 3D, « face » a donné un masque du visage. Avec le prompt « male », il a fait l’inpainting du visage d’une autre personne. À denoise 0,25, le résultat ressemblait davantage à l’original, bien qu’il ait eu du mal avec l’anatomie étrange que j’avais sculptée (cornes, un piercing en bas) et l’ait remplacée par une barbe, ce qui est attendu.
Astuce : Florence2Run a une seed. Passez control_after_generate de randomize à fixed, pour que le masque ne soit pas régénéré chaque fois que vous essayez un nouveau prompt.
Transformer un masque en bordure
Sur un selfie, « glasses » a donné un masque plutôt correct. Mais je voulais ne changer que la monture, et elle est trop fine pour que Florence la masque à partir d’un prompt. Les nodes de masquage classiques peuvent le faire à la place :
- Invert Mask (un node natif) sur le masque des lunettes.
- Grow Mask de 10 pixels. Sur le masque inversé, le blanc grandit et le noir rétrécit.
- Mask Composite avec le masque agrandi comme destination et le masque d’origine comme source, opération multiply. Cela soustrait l’un de l’autre et laisse la bordure de la monture.
- Ajoutez des nodes Mask Preview en chemin pour voir chaque étape.
J’ai connecté cette bordure à InpaintModelConditioning avec « silver » comme prompt à un denoise de 0,5. Honnêtement, je n’ai pas obtenu de très bon résultat ici, malgré différentes valeurs de denoise et différents prompts. L’essentiel est la technique : obtenir un masque à partir d’un prompt, puis appliquer les mêmes astuces d’agrandissement et de soustraction que vous utiliseriez dans n’importe quelle application de VFX ou de compositing.
Prochaines étapes
Pour un inpainting plus lourd avec un modèle plus puissant, voir l’inpainting avec Flux. Pour corriger les visages et les mains sans dessiner de masques du tout, voir corriger automatiquement les visages et les mains d’IA. Les masques aident aussi le transfert de style IPAdapter à se concentrer sur un seul sujet.
Voir la version vidéo (15:54)
Tout ce qui précède est aussi dans la vidéo, si vous préférez suivre à l’écran. La vidéo est en anglais.
Questions fréquentes
Quel modèle Florence 2 utiliser pour les masques ?
Florence-2-large donne de bien meilleurs masques que base mais prend plus de temps. Les versions fine-tuned (ft) ont donné de moins bons résultats que base dans mes tests. Quand large rate quelque chose, essayez base avec le même prompt ; parfois il y arrive.
Quelle tâche Florence 2 produit des masques à partir d'un prompt de texte ?
referring_expression_segmentation. Saisissez ce que vous voulez masquer dans le champ de texte du node Florence2Run.
Florence 2 n'a masqué qu'une partie de l'objet. Que faire ?
Masquez la partie manquante avec un second prompt (ou un autre modèle), puis réunissez les deux masques avec un node Mask Composite réglé sur add.
Pourquoi le masque change-t-il à chaque exécution ?
Florence2Run a sa propre seed. Passez control_after_generate de randomize à fixed, pour que le masque reste identique pendant que vous essayez différents prompts d'inpainting.
