Enmascara cualquier cosa escribiendo su nombre: máscaras e inpainting con Florence 2 en ComfyUI

Escribe «crown», «tiger» o «glasses» y Florence 2 te devuelve una máscara. Construye el flujo en ComfyUI, aplica inpainting a la zona enmascarada con SD 1.5, combina dos máscaras en una y convierte una máscara en un borde.

Anton Tenitsky13 de octubre de 20267 min de lecturaVersión en vídeo más abajo

Esta guía se tradujo del inglés con IA y puede contener errores. Leer el original.

Una calavera blanca con una corona, con la corona resaltada en verde por una máscara de Florence 2 guiada por texto

Escribe «t-shirt» y obtienes una máscara de la camiseta. Escribe «face», «bookshelf» o «wall» y obtienes esas. Florence 2 es un modelo de visión de Microsoft que puede encontrar objetos a partir de una descripción de texto, y en ComfyUI lo convierte en una máscara a la que puedes aplicar inpainting. Es bastante increíble lo que puede hacer, pero tiene salvedades, y también las explicaré.

Florence 2 se describe en el artículo Florence-2: Advancing a Unified Representation for a Variety of Vision Tasks (Xiao et al., 2023). Es un modelo de investigación para muchas tareas (descripción de imágenes, detección de objetos, segmentación y más); aquí solo lo uso para máscaras.

En resumen

  • Nodos: ComfyUI-Florence2 (de Kijai), ComfyUI Essentials, Universal Styler para la salida de texto, rgthree para comparar.
  • Modelo: Florence-2-large para las mejores máscaras; base como alternativa.
  • Tarea: referring_expression_segmentation, y luego escribe qué enmascarar.
  • Inpaint: InpaintModelConditioning con la imagen original y la máscara; denoise 0,5–0,62.
  • Las máscaras se combinan: Mask Composite (add) une dos máscaras; Grow Mask más multiply crea un borde.

¿Nuevo en ComfyUI? Empieza por fundamentos de nodos de ComfyUI y texto a imagen y instalar el ComfyUI Manager. El flujo terminado es gratuito en mi Patreon: arrastra el JSON e instala los nodos que falten desde el Manager.

Instala los nodos

En Manager → Custom Nodes Manager, instala:

  1. ComfyUI Essentials, una colección básica de nodos que de verdad necesitas (Mask Preview, Image Resize y más).
  2. ComfyUI Universal Styler, que ayuda a sacar texto (su nodo Get Text muestra los pies de foto de Florence).
  3. Florence 2. Hay dos paquetes, el de Kijai y el de spacepxl. El de Kijai tiene más estrellas y se actualiza más recientemente. Los dos son muy parecidos, pero yo tuve que reescribir parte del código de spacepxl para ejecutarlo en el ComfyUI más reciente. Quédate con el de Kijai.

Reinicia ComfyUI después de instalar.

Construye la parte de Florence 2

  1. Añade DownloadAndLoadFlorence2Model. Descarga el modelo automáticamente la primera vez que se ejecuta, así que no hay que hacer git clone ni buscar carpetas de modelos.
  2. Añade Florence2Run y conecta el modelo.
  3. Añade Load Image con tu imagen, a la entrada de imagen de Florence2Run.
  4. Conecta todas las salidas: un Preview Image para la imagen, un Mask Preview (de Essentials) para la máscara y un nodo Get Text para el pie de foto. Si una salida no está conectada, la red no se ejecutará, y el modelo no se descargará.
Load Image con una foto de un tigre alimentando el nodo Florence2Run con la tarea referring_expression_segmentation y el prompt tiger, con la vista previa de la máscara mostrando la silueta del tigre
La configuración básica: cargador del modelo, Florence2Run con un prompt de texto y vistas previas en cada salida.

Haz clic en Queue. La primera ejecución descarga el modelo, lo que puede tardar unos minutos o más según tu conexión; puedes verlo en la ventana de comandos. La tarea por defecto encuentra los objetos de la imagen y dibuja un recuadro alrededor de cada uno (aquí: una corona y una calavera). Para esto los recuadros no son muy útiles; las máscaras de verdad sí.

Una calavera con una corona con recuadros delimitadores dibujados por Florence 2
La tarea por defecto: recuadros delimitadores alrededor de los objetos que reconoce.

Elige el modelo

  • Florence-2-base: el modelo por defecto.
  • Florence-2-base-ft / large-ft: «ft» significa afinado (fine-tuned) para fines concretos. No los recomiendo; dieron peores resultados que base.
  • Florence-2-large: muy recomendado. Tarda bastante más por imagen, pero hace máscaras mucho mejores.

Elige la tarea

La lista de task es el ajuste más importante. Ponla en caption y describe la imagen; en esta máquina, el texto no aparecía en el nodo Get Text, aunque sí salía en la ventana de comandos y funcionó en otra máquina. De todos modos, los pies de foto no son el objetivo.

La tarea que usarás casi siempre es referring_expression_segmentation. Escribe lo que quieres en el campo de texto, ejecuta y obtienes una máscara.

La imagen de la calavera con la corona enmascarada en verde
«Crown»: la máscara cubre toda la corona y nada más.

«Skull» dio una buena máscara enseguida. «Crown» no, al principio: los modelos de IA no son perfectos y esto pasará de vez en cuando. Cuando pasé de large de vuelta a base y ejecuté el mismo prompt, obtuve una buena máscara de la corona. Cambiar de modelo de vez en cuando es parte del proceso.

Aplica inpainting a la zona enmascarada

  1. Añade InpaintModelConditioning. Conecta la máscara de Florence2Run y la imagen desde tu Load Image original, no desde Florence2Run: la salida de imagen de Florence lleva pintada encima la máscara de color.
  2. Construye una cadena estándar de texto a imagen: Load Checkpoint (yo uso epiCPhotoGasm), un CLIP Text Encode positivo y otro negativo (los coloreo de verde y rojo), un KSampler, VAE Decode y Save Image.
  3. Haz pasar los prompts por InpaintModelConditioning primero, y luego al KSampler. Conecta el VAE a InpaintModelConditioning, y su salida latent a la entrada latente del KSampler.
  4. Escribe el cambio que quieres («silver» para la corona) y fija el denoise en torno a 0,62. El denoise controla la mezcla entre el prompt y la imagen original, y es el valor más importante aquí.

Si se queja de que falta una conexión de VAE, arrastra una. El resultado:

La calavera, ahora con una ornamentada corona de plata, junto a un nodo Image Comparer de rgthree
Solo cambia la corona: plata en lugar de oro, elegido escribiendo dos palabras.

Para comparar, añade un Image Comparer de rgthree, con la imagen nueva como A y la original como B. Tendrás que volver a ejecutar para activarlo, lo que da un resultado distinto.

Combina dos máscaras: el tigre entero

En una foto de un tigre de Fotoref (el banco de fotos que cofundé), «tiger» enmascaró la parte delantera del cuerpo pero se dejó la pata trasera. Desactiva los nodos de inpainting (selecciónalos y pulsa Ctrl+B) mientras pruebas máscaras.

  1. Copia la rama de Florence con Ctrl+C, Ctrl+Shift+V, que conserva las conexiones. Dale los mismos nodos de salida (vista previa, vista previa de máscara, Get Text); sin ellos no se ejecutará, aunque no los uses.
  2. Prueba prompts para la parte que falta. «Tiger back leg» no funcionó. Con el modelo large y un prompt más creativo, «tiger black stripes front and back», obtuve la pata trasera. Probé unos diez prompts hasta llegar ahí.
  3. Añade Mask Composite: una máscara en destination, la otra en source (en realidad deberían llamarse simplemente A y B), operación add, porque sumas blanco con blanco. Multiply lo eliminaría todo.
  4. Mira la vista previa de la máscara combinada: el tigre entero.
La segunda rama de Florence con el tigre resaltado en verde y una vista previa de máscara con la silueta del tigre entero
El segundo prompt capta la pata trasera; juntas, las máscaras cubren todo el tigre.

Vuelve a activar los nodos de inpainting y conecta la máscara combinada a InpaintModelConditioning. Olvidé cambiar el prompt y obtuve un tigre plateado. Con «cat» hizo un gato, y se integró bien: sustituyó la parte inferior del cuerpo por la vegetación cercana y puso una roca bajo una pata. No está lejos de ser una gran generación; hacen falta más ejecuciones.

El tigre sustituido por un gato atigrado caminando por la misma escena de selva
«Cat» en lugar del tigre, integrado entre las plantas de alrededor.

Rostros

En una de mis esculturas 3D, «face» dio una máscara del rostro. Con el prompt «male» hizo inpainting con el rostro de otra persona. Con denoise 0,25 el resultado se parecía más al original, aunque tuvo problemas con la anatomía rara que había esculpido (cuernos, un piercing en la parte inferior) y la sustituyó por una barba, lo cual es de esperar.

Consejo: Florence2Run tiene una seed. Cambia control_after_generate de randomize a fixed, para que la máscara no se regenere cada vez que pruebes un prompt nuevo.

Convierte una máscara en un borde

En un selfie, «glasses» dio una máscara bastante decente. Pero yo quería cambiar solo la montura, y es demasiado fina para que Florence la enmascare a partir de un prompt. En su lugar, los nodos clásicos de enmascarado pueden hacerlo:

  1. Invert Mask (un nodo del núcleo) sobre la máscara de las gafas.
  2. Grow Mask en 10 píxeles. En la máscara invertida, el blanco crece y el negro se encoge.
  3. Mask Composite con la máscara ampliada como destination y la máscara original como source, operación multiply. Eso resta una de otra y deja el borde de la montura.
  4. Añade nodos Mask Preview por el camino para ver cada paso.
Grow Mask con expand 10 alimentando un Mask Composite en multiply, con máscaras de gafas invertidas y reducidas en las vistas previas
Invertir, ampliar 10 px, multiplicar: la diferencia es un borde fino.

Conecté ese borde a InpaintModelConditioning con «silver» como prompt y denoise 0,5. Sinceramente, aquí no obtuve un resultado realmente bueno, pese a probar distintos valores de denoise y prompts. Lo importante es la técnica: obtener una máscara a partir de un prompt y luego aplicar los mismos trucos de ampliar y restar que usarías en cualquier app de VFX o composición.

Siguientes pasos

Para un inpainting más pesado con un modelo más potente, mira inpainting con Flux. Para arreglar rostros y manos sin dibujar máscaras en absoluto, mira arreglar automáticamente rostros y manos de IA. Las máscaras también ayudan a que la transferencia de estilo con IPAdapter se centre en un solo sujeto.

Ver la versión en vídeo (15:54)

Todo lo anterior también está en el vídeo, si prefieres seguirlo en pantalla. El vídeo está en inglés.

Preguntas frecuentes

¿Qué modelo de Florence 2 debo usar para las máscaras?

Florence-2-large da máscaras mucho mejores que base pero tarda más. Las versiones fine-tuned (ft) dieron peores resultados que base en mis pruebas. Cuando large falla, prueba base con el mismo prompt; a veces lo consigue.

¿Qué tarea de Florence 2 crea máscaras a partir de un prompt de texto?

referring_expression_segmentation. Escribe lo que quieres enmascarar en el campo de texto del nodo Florence2Run.

Florence 2 solo enmascaró parte del objeto. ¿Qué puedo hacer?

Enmascara la parte que falta con un segundo prompt (o con otro modelo) y luego une las dos máscaras con un nodo Mask Composite en modo add.

¿Por qué cambia la máscara cada vez que ejecuto?

Florence2Run tiene su propia seed. Cambia control_after_generate de randomize a fixed, para que la máscara se mantenga mientras pruebas distintos prompts de inpainting.

Anton Tenitsky es artista 3D con más de 15 años en gráficos por ordenador, que ha trabajado con Nickelodeon, Gameloft, Marvel Rivals y muchos otros clientes. Más sobre mí

Guías relacionadas