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.
On this page
- TL;DR
- La corrección que necesitas antes de cualquier otra cosa
- ¿Qué es IPAdapter y cuándo gana?
- ¿Cómo hago que IPAdapter afecte solo a una parte de la imagen?
- ¿Cómo transfiero solo el estilo, no el contenido, con IPAdapter?
- ¿Qué es ControlNet y cuándo gana?
- Regional Prompter: prompts ligados a regiones
- Modo Attention vs Latent en Regional Prompter
- Tokens de ADetailer: [SEP], [SKIP], [PROMPT]
- Errores comunes y soluciones
- Cómo elegir: una tabla de decisiones
- FAQ
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 archivo | Fuerza | Mejor para | Fuente |
|---|---|---|---|
ip-adapter_sd15 | Básico, promedio | Asunto/estilo general | README de cubiq |
ip-adapter_sd15_light_v11 | Impacto ligero | Influencia sutil | README de cubiq |
ip-adapter-plus_sd15 | Muy fuerte | Ajuste ajustado del sujeto | README de cubiq |
ip-adapter-plus-face_sd15 | Cara, retratos | Consistencia de personajes | README de cubiq |
ip-adapter-full-face_sd15 | Cara más fuerte, "no necesariamente mejor" | Rostros cuando Plus-Face es débil | README 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ística | Común (ADDCOMM) | Base (ADDBASE) |
|---|---|---|
| Cómo se aplica | Antepuesto al prompt de cada región | Combinado por base ratio (p. ej. 0.2 = 20% base + 80% región) |
| Analogía | Concatenación | Mezcla de denoising img2img |
| Usar cuando | El encuadre de la escena debe aparecer en cada región | La base es demasiado fuerte y quieres reducirla |
| Fuente | README de hako | README 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íntoma | Causa | Solución | Fuente |
|---|---|---|---|
'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 conflicto | Carga 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 IPAdapter | cubiq 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 grande | cubiq issue #108 |
Expected query, key, and value to have the same dtype ... | Desajuste fp16/fp32 | Ejecuta ComfyUI con --force-fp16 | cubiq issue #108 |
| Corrupción de LoRA, greenout/blackout en el modo Latent de Regional Prompter | Problema conocido de LoRA en modo Latent, sin corrección de causa raíz | Reduce CFG, reduce el peso del LoRA, aumenta los pasos; usa los parámetros negative textencoder y negative U-net; recurre al inpintado | README de hako |
| Una persona donde se querían dos | Cada prompt de región describe a una persona | Añade un prompt común (ADDCOMM) que indique la escena completa | stable-diffusion-art.com |
| El color del cabello/ropa llega al personaje equivocado | La auto-atención asocia atributos a través de la imagen | Divide los prompts por región con BREAK para que cada atributo quede bloqueado a su región | stable-diffusion-art.com |
Cómo elegir: una tabla de decisiones
| Quieres controlar... | Primera opción | Respaldo / combinar con |
|---|---|---|
| Sujeto o cara desde una referencia | IPAdapter Plus-Face / FaceID | ADetailer para limpieza de caras |
| Solo estilo, sin fuga de contenido | InstantStyle / weight_type: style transfer (SDXL) | IPAdapter attn_mask para localizar |
| Pose, bordes, profundidad, disposición | ControlNet | IPAdapter para la apariencia encima |
| Diferente prompt por región de la imagen | Regional Prompter (BREAK) | ADetailer [SEP] para prompts por cara |
| Componer varias imágenes de referencia en un cuadro | IPAdapter attn_mask por imagen | ControlNet para el diseño subyacente |
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.