Masquer n'importe quoi en tapant son nom : masquage et inpainting avec Florence 2 dans ComfyUI

Tapez « crown », « tiger » ou « glasses » et Florence 2 renvoie un masque. Construisez le workflow dans ComfyUI, faites un inpainting de la zone masquée avec SD 1.5, combinez deux masques en un seul et transformez un masque en bordure.

Anton Tenitsky13 octobre 20268 min de lectureVersion vidéo plus bas

Ce guide a été traduit de l'anglais par IA et peut contenir des erreurs. Lire l'original.

Un crâne blanc portant une couronne, la couronne mise en évidence en vert par un masque Florence 2 piloté par texte

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 :

  1. ComfyUI Essentials, une collection basique de nodes dont vous avez vraiment besoin (Mask Preview, Image Resize et plus).
  2. ComfyUI Universal Styler, qui aide à sortir du texte (son node Get Text affiche les légendes de Florence).
  3. 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

  1. 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.
  2. Ajoutez Florence2Run et connectez le modèle.
  3. Ajoutez Load Image avec votre image, dans l’entrée d’image de Florence2Run.
  4. 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.
Load Image avec une photo de tigre alimentant le node Florence2Run avec la tâche referring_expression_segmentation et le prompt tiger, avec l'aperçu du masque montrant la silhouette du tigre
La configuration de base : chargeur de modèle, Florence2Run avec un prompt de texte, et des aperçus sur chaque sortie.

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.

Un crâne portant une couronne avec des boîtes englobantes dessinées par Florence 2
La tâche par défaut : des boîtes englobantes autour des objets qu'il reconnaît.

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.

L'image du crâne avec la couronne masquée en vert
« Crown » : le masque couvre toute la couronne et rien d'autre.

« 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

  1. 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.
  2. 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.
  3. 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.
  4. 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 :

Le crâne, portant maintenant une couronne d'argent ornée, à côté d'un node rgthree Image Comparer
Seule la couronne change : argent au lieu d'or, choisi en tapant deux mots.

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.

  1. 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.
  2. 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.
  3. 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.
  4. Prévisualisez le masque combiné : le tigre entier.
La seconde branche Florence avec le tigre mis en évidence en vert et un aperçu de masque de la silhouette complète du tigre
Le second prompt attrape la patte arrière ; ensemble, les masques couvrent tout le tigre.

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.

Le tigre remplacé par un chat tigré marchant dans la même scène de jungle
« Cat » à la place du tigre, fondu dans les plantes environnantes.

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 :

  1. Invert Mask (un node natif) sur le masque des lunettes.
  2. Grow Mask de 10 pixels. Sur le masque inversé, le blanc grandit et le noir rétrécit.
  3. 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.
  4. Ajoutez des nodes Mask Preview en chemin pour voir chaque étape.
Grow Mask réglé sur expand 10, alimentant un Mask Composite réglé sur multiply, avec des masques de lunettes inversés et rétrécis dans les aperçus
Inverser, agrandir de 10 px, multiplier : la différence est une fine bordure.

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.

Anton Tenitsky est artiste 3D avec plus de 15 ans d'expérience en infographie, qui a travaillé avec Nickelodeon, Gameloft, Marvel Rivals et de nombreux autres clients. En savoir plus sur moi

Guides associés