ArtificialGuyBR

Home / Blog / ComfyUI

IPAdapter vs ControlNet vs Regional Prompter en ComfyUI

Qué herramienta de conditioning usar en ComfyUI para transferencia de estilo, composición y consistencia de personaje, y las configuraciones que funcionan.

16 sources cited ComfyUI

IPAdapter vs ControlNet vs Regional Prompter en ComfyUI

TL;DR

  • IPAdapter transfiere un sujeto o estilo desde una imagen de referencia; añade cross-attention de imagen-prompt sobre el cross-attention de texto congelado (tencent-ailab/IP-Adapter).
  • ControlNet dicta la estructura espacial (bordes, profundidad, pose, segmentación); entrena una copia de los bloques del encoder de UNet alimentada por un mapa de control (lllyasviel/ControlNet).
  • Regional Prompter liga diferentes prompts de texto a diferentes regiones de la imagen, lo que corrige la mezcla de atributos entre personajes (sd-webui-regional-prompter).

La corrección que necesitas antes de cualquier otra cosa

Un tutorial ampliamente circulado de 2024 de ComfyUI te dice que ajustes un slider noise del IPAdapter (0.01 = "añade ruido", 1.0 = "elimina ruido"). Ese parámetro ya no existe. El nodo IPAdapter Apply anterior se eliminó y fue sustituido por IPAdapter Advanced, con image_negative como la entrada de condicionamiento negativo actual — una imagen, no un slider de 0.01–1.0. Sin uno, el nodo usa por defecto una imagen cero: image_negative = image_negative if image_negative is not None else torch.zeros([1, clipvision_size, clipvision_size, 3]). Así sobrevive la idea antigua del negativo con imagen vacía, ahora como entrada de imagen. Ignora cualquier tutorial que cite los números 0.01/1.0.

¿Qué es IPAdapter y cuándo gana?

IPAdapter es un adaptador de unos 22 millones de parámetros que le da a un modelo de difusión de texto-a-imagen pre-entrenado un prompt de imagen encima de su prompt de texto. El repositorio original del artículo describe "un adaptador eficaz y ligero para lograr capacidad de prompt de imagen para los modelos de difusión de texto-a-imagen pre-entrenados. Un IP-Adapter con solo 22M de parámetros puede lograr un rendimiento comparable o incluso mejor que un modelo de prompt de imagen ajustado." El mantenedor de ComfyUI lo llama "un LoRA de 1 imagen" (README de cubiq) — y cuando una imagen no es suficiente, ahí es donde empieza a dar resultado entrenar un LoRA real. Gana por transferencia de apariencia — sujeto, cara o estilo desde una referencia — y pierde cuando necesitas una disposición precisa a nivel de píxeles, porque no lleva un mapa estructural.

Configuración clave: empieza con weight/scale en 0.8 para el weight_type linear por defecto; usa 0.5 para condición equilibrada texto-plus-imagen y 1.0 para solo imagen. Siempre usa una imagen de referencia cuadrada — el procesador predeterminado de CLIP recorta por el centro, así que las entradas no cuadradas "no captarán la información fuera del centro" (README de tencent).

Variantes de los modelos IPAdapter a grandes rasgos

Sufijo del archivoFuerzaMejor paraFuente
ip-adapter_sd15Básico, promedioAsunto/estilo generalREADME de cubiq
ip-adapter_sd15_light_v11Impacto ligeroInfluencia sutilREADME de cubiq
ip-adapter-plus_sd15Muy fuerteAjuste ajustado del sujetoREADME de cubiq
ip-adapter-plus-face_sd15Cara, retratosConsistencia de personajesREADME de cubiq
ip-adapter-full-face_sd15Cara más fuerte, "no necesariamente mejor"Rostros cuando Plus-Face es débilREADME de cubiq

Los modelos FaceID son una familia independiente: "requieren insightface" y "la mayoría de los modelos FaceID también necesitan un LoRA", con la advertencia de que "cada modelo FaceID tiene que emparejarse con su propio LoRA específico" (README de cubiq).

¿Cómo hago que IPAdapter afecte solo a una parte de la imagen?

El nodo IPAdapter Advanced tiene una entrada attn_mask que restringe dónde aplica la referencia. Según la documentación del nodo: "La máscara definirá el área de influencia de los modelos IPAdapter en la imagen final. Las zonas negras no se verán afectadas, las zonas blancas tendrán la influencia máxima. Puede ser una máscara en escala de grises." La máscara debe coincidir con el tamaño o la proporción de la latent. La documentación de diffusers describe el mismo mecanismo de forma independiente: "Binary masking permite asignar una imagen IPAdapter a un área específica de la imagen de salida, lo que resulta útil para componer varias imágenes IPAdapter. Cada imagen IPAdapter requiere una máscara binaria."

Esta es la forma moderna y soportada de componer varias imágenes de referencia en un mismo cuadro. El ejemplo de conditioning regional de cubiq lo demuestra con un nodo MaskFromRGBCMYBW+ que divide una máscara codificada por color en máscaras por región, cada una alimentando un bloque de parámetros de IPAdapter. (Un tutorial anterior cita examples/IPAdapter_2_masks.json, un nombre de archivo que ya no está en el directorio de ejemplos — el equivalente actual es ipadapter_regional_conditioning.json.)

Dos entradas más de IPAdapter Advanced son importantes para el trabajo regional: weight_type ("style transfer (SDXL) solo funciona con SDXL y es una herramienta muy potente para transferir solo el estilo de una imagen pero no su contenido") y start_at/end_at de timestepping ("si empiezas más tarde, por ejemplo start_at=0.3, la imagen generada tendrá un conditioning muy ligero") — ambas según la documentación del nodo.

¿Cómo transfiero solo el estilo, no el contenido, con IPAdapter?

Usa InstantStyle. Su método de dos partes está documentado en el README del proyecto: resta las características de texto de contenido de las características de imagen para que "el estilo y el contenido puedan ser desacoplados explícitamente", y luego inyecta solo en los bloques de atención que manejan el estilo — "up blocks.0.attentions.1 y down blocks.2.attentions.1 capturan el estilo (color, material, atmósfera) y la disposición espacial (estructura, composición) respectivamente." Está "soportado en ComfyUI_IPAdapter_plus desarrollado por nuestro coautor," y la opción weight_type: style transfer (SDXL) expone la misma idea.

¿Qué es ControlNet y cuándo gana?

ControlNet añade una condición espacial — bordes Canny, mapas de profundidad, esqueletos OpenPose, segmentación, trazos, etc. — a través de una copia entrenable de los bloques del encoder de UNet, mientras que una copia "bloqueada" conserva el modelo base. Una "convolución cero" (una conv 1×1 con peso y sesgo en cero) significa que no añade distorsión antes de entrenar: "antes de entrenar, todas las convoluciones cero dan cero, y ControlNet no causará ninguna distorsión" (README de ControlNet). El FAQ del mantenedor explica por qué los pesos cero siguen aprendiendo: "mientras que $x \neq 0$, una iteración de descenso de gradiente hará que $w$ sea distinto de cero."

ControlNet gana cuando necesitas estructura — pose, bordes, profundidad, disposición. El nodo ControlNetApplyAdvanced de ComfyUI expone strength (0.0–10.0, por defecto 1.0), start_percent y end_percent (ambos 0–1) (nodes.py de ComfyUI), igualando el idiom de timestepping de IPAdapter. Varios ControlNets se componen: "más de un ControlNet puede componerse fácilmente para control de multi-condición" (README de ControlNet). Para hacer coincidir los tipos de ControlNet con las tareas, consulta ControlNet models para control de composición.

Regional Prompter: prompts ligados a regiones

Regional Prompter es una extensión de A1111 que permite "diferentes prompts... especificados para diferentes regiones," separados por la palabra clave BREAK. Los usuarios de ComfyUI tienen la misma necesidad cuando las máscaras de IPAdapter parecen demasiado pesadas y una división solo con texto alcanza. La sintaxis:

a man and a woman, a man with black hair
BREAK
a man and a woman, a woman with blonde hair

El primer bloque aplica a la región izquierda, el segundo a la derecha. El "a man and a woman" compartido importa: sin él, el modelo ve dos prompts de una sola persona y renderiza a una persona. La palabra clave ADDCOMM automatiza esto anteponiendo el primer bloque a cada región, y ADDBASE con un base ratio combina un prompt base por peso en lugar de concatenarlo — "common clause combines prompts, and base clause combines weights (like img2img denoising strength)" (README de hako).

Prompt común vs prompt base

CaracterísticaComún (ADDCOMM)Base (ADDBASE)
Cómo se aplicaAntepuesto al prompt de cada regiónCombinado por base ratio (p. ej. 0.2 = 20% base + 80% región)
AnalogíaConcatenaciónMezcla de denoising img2img
Usar cuandoEl encuadre de la escena debe aparecer en cada regiónLa base es demasiado fuerte y quieres reducirla
FuenteREADME de hakoREADME de hako

Modo Attention vs Latent en Regional Prompter

Regional Prompter tiene dos modos de cálculo con un verdadero intercambio entre precisión y velocidad. Según el README, "en el caso de una imagen de 512 x 512, el modo Attention reduce el tamaño de la región a unos 8 x 8 píxeles en profundidad en la U-Net, de modo que las áreas pequeñas se mezclan; el modo Latent calcula 64*64, de modo que la región es exacta." El modo Latent es más lento — "el tiempo de generación es el número de áreas por el tiempo de generación de una foto" — pero es el modo que "permite separar LoRAs hasta cierto punto." Internamente Attention usa BREAK y Latent usa AND, auto-convertido para que puedas escribir cualquiera.

Tokens de ADetailer: [SEP], [SKIP], [PROMPT]

Cuando ADetailer detecta varias caras, tres tokens controlan los prompts por cara. Si aún no has configurado ADetailer, empieza con nuestra guía para arreglar caras y manos automáticamente. Desde la wiki:

  • [SEP] divide un prompt en prompts por objeto, "dividido por la regex \s*[SEP]\s*, aplicado en el orden de detección — que es "altamente arbitrario, así que úsalo con precaución."
  • [SKIP] omite el inpintado para esa parte (regex ^\s*[SKIP]\s*$).
  • [PROMPT] se reemplaza por el prompt de entrada original.

Emparejar Regional Prompter para la ubicación con ADetailer para la reparación de caras es la receta estándar multi-personaje. Un reclamo frecuente de que el orden de procesamiento de caras es ajustable mediante un interruptor de configuración no está respaldado por la wiki de ADetailer — el orden de detección es arbitrario.

Errores comunes y soluciones

Error / síntomaCausaSoluciónFuente
'NoneType' object has no attribute 'encode_image' (a menudo en sd1.5)Encoder de visión CLIP incorrecto, o la extensión obsoleta IPAdapter_ConfyUI en conflictoCarga el encoder correcto desde h94/IP-Adapter (models/image_encoder/model.safetensors para sd1.5, sdxl_models/image_encoder/model.safetensors para sdxl); elimina la extensión obsoleta; actualiza ComfyUI + la extensión IPAdaptercubiq issue #108
size mismatch for proj_in.weight ...Combinación incorrecta modelo/encoder/checkpoint (p. ej. modelo -vit-h con el encoder bigG)Todos los modelos -vit-h necesitan el encoder ViT-H de SD1.5; solo un modelo SDXL y el modelo SD1.5 vit-G necesitan el encoder más grandecubiq issue #108
Expected query, key, and value to have the same dtype ...Desajuste fp16/fp32Ejecuta ComfyUI con --force-fp16cubiq issue #108
Corrupción de LoRA, greenout/blackout en el modo Latent de Regional PrompterProblema conocido de LoRA en modo Latent, sin corrección de causa raízReduce CFG, reduce el peso del LoRA, aumenta los pasos; usa los parámetros negative textencoder y negative U-net; recurre al inpintadoREADME de hako
Una persona donde se querían dosCada prompt de región describe a una personaAñade un prompt común (ADDCOMM) que indique la escena completastable-diffusion-art.com
El color del cabello/ropa llega al personaje equivocadoLa auto-atención asocia atributos a través de la imagenDivide los prompts por región con BREAK para que cada atributo quede bloqueado a su regiónstable-diffusion-art.com

Cómo elegir: una tabla de decisiones

Quieres controlar...Primera opciónRespaldo / combinar con
Sujeto o cara desde una referenciaIPAdapter Plus-Face / FaceIDADetailer para limpieza de caras
Solo estilo, sin fuga de contenidoInstantStyle / weight_type: style transfer (SDXL)IPAdapter attn_mask para localizar
Pose, bordes, profundidad, disposiciónControlNetIPAdapter para la apariencia encima
Diferente prompt por región de la imagenRegional Prompter (BREAK)ADetailer [SEP] para prompts por cara
Componer varias imágenes de referencia en un cuadroIPAdapter attn_mask por imagenControlNet para el diseño subyacente

What must stay fixed? Appearance subject, face, style Structure pose, edges, depth Region this thing, here IPAdapter image prompt, no layout map ControlNet pixel-accurate layout Regional prompting prompt bound to an area Need two of them? They compose: ControlNet fixes the layout while IPAdapter carries appearance. They fail differently — IPAdapter has no structural map, so it cannot hold a pose; ControlNet holds the pose but knows nothing about who the subject is.
Which conditioning tool fits the job

FAQ

¿Cómo hago que IPAdapter afecte solo a una parte de la imagen? Conecta una máscara a la entrada attn_mask de IPAdapter Advanced. Las zonas blancas reciben la influencia completa de la referencia, las zonas negras ninguna, y se permite la escala de grises. La máscara debe coincidir con el tamaño o la proporción de la latent. La documentación de diffusers llama a esto "binary masking" y requiere una máscara binaria por imagen IPAdapter.

¿Cuál es la diferencia entre el prompt común y el prompt base de Regional Prompter? Un prompt común (ADDCOMM) se antepone al prompt de cada región — concatenación. Un prompt base (ADDBASE) se combina por un peso base ratio, como la fuerza de denoising de img2img: una proporción de 0.2 significa 20% base más 80% región. Usa común cuando el encuadre de la escena debe repetirse; usa base cuando ese encuadre es demasiado fuerte y quieres reducirlo (README de hako).

¿Por qué se corrompen mis LoRAs al usar Regional Prompter? Es un problema conocido en el modo Latent — el README lista mitigaciones pero establece "sin solución hasta la fecha." Reduce CFG, reduce el peso del LoRA, aumenta los pasos de muestreo, o usa los parámetros negative textencoder y negative U-net (0–1 por LoRA). El inpintado es el último recurso. La causa profunda no está documentada; no asumas una.

¿Puedo usar IPAdapter y ControlNet juntos? Sí. Tencent distribuye cuadernos dedicados ip_adapter_controlnet_demo para "generación estructural con prompt de imagen," y los ControlNets están documentados como componibles. Una configuración común usa ControlNet (profundidad o OpenPose) para el diseño y IPAdapter para la apariencia del sujeto, cada uno con su propia fuerza/peso y porcentajes de inicio/final.

¿Cómo transfiero solo el estilo, no el contenido, con IPAdapter? Usa InstantStyle, que resta las características de texto de contenido de las características de imagen e inyecta solo en los bloques de atención del estilo (up_blocks.0.attentions.1 para el estilo, down_blocks.2.attentions.1 para el diseño). Está integrado en ComfyUI_IPAdapter_plus; en SDXL también puedes probar weight_type: style transfer (SDXL).

¿Qué tokens de ADetailer separan las caras? [SEP] divide un prompt en prompts por objeto en el orden de detección (que la wiki llama "altamente arbitraria"), [SKIP] omite el inpintado para esa parte, y [PROMPT] se reemplaza por el prompt de entrada original. ADetailer en sí funciona en tres pasos: generar, detectar-y-enmascarar, e inpintar (README).

¿Con qué peso de IPAdapter debo empezar? El README de cubiq sugiere bajar el peso "como mínimo a 0.8" y aumentar los pasos; el NODES.md llama a 0.8 "un buen punto de partida" para el tipo de peso linear por defecto. Para un conditioning equilibrado de texto-plus-imagen, tanto Tencent como la documentación de diffusers apuntan a scale=0.5, reservando 1.0 para generación solo con imagen.

¿Funciona Regional Prompter el 100 % de las veces? No. Un tutorial de la comunidad reporta una tasa de éxito de aproximadamente el 75 %; trátala como reportada por la comunidad y no como una cifra medida (stable-diffusion-art.com). La mezcla de atributos entre personajes aún ocurre, por lo que la reparación de caras con ADetailer suele acompañarla.