ArtificialGuyBR

Home / Blog / Fixing things

FLUX.2 Klein Face Swap: Workflow, Color Matching, Failures

How to swap faces with FLUX.2 Klein using LanPaint think mode and Lab color transfer — plus where the workflow breaks down.

9 sources cited Fixing things

FLUX.2 Klein Face Swap: Workflow, Color Matching, Failures

TL;DR

  • El "think mode" de LanPaint ejecuta 2 iteraciones internas de Langevin por paso de denoising, alineando la nueva cara con los píxeles circundantes antes de la salida final
  • La transferencia de color Lab iguala tono de piel e iluminación de forma independiente a la estructura facial, eliminando el aspecto de recorte pegado
  • El modelo destilado de 9B necesita guidance bajo (1.0–2.0) y solo 2 think steps — más megapíxeles o pasos producen caras plásticas

Cómo funciona el pipeline de reface con FLUX.2 Klein

FLUX.2 Klein es un transformer de rectified flow de 9 mil millones de parámetros que unifica texto-a-imagen y edición imagen-a-imagen en un solo modelo, ejecutándose en menos de 0.5 segundos en una RTX 4090 (BFL blog). La variante de 9B requiere ~29 GB de VRAM (model card). El workflow comunitario de face swap se construye sobre esto combinando tres técnicas: inpainting con LanPaint en think mode, transferencia de color Lab* y LoRAs dirigidos.

Think Mode de LanPaint: iteraciones internas antes del denoising

El inpainting estándar hace denoise una vez por paso. LanPaint inserta un bucle de dinámica de Langevin — el "think mode" — que ejecuta múltiples iteraciones internas antes de cada paso externo de denoising. Para FLUX.2 Klein, el ejemplo oficial usa 2 inner steps (reducidos desde los 5 por defecto) porque los modelos destilados se vuelven inestables con más (repo LanPaint).

Cada iteración interna calcula dos términos de score:

  1. Un score de regularización que atrae el latent hacia la entrada con ruido
  2. Un score de alineación de contenido que atrae los píxeles enmascarados hacia la región conocida (sin máscara) y la propia predicción de imagen limpia del modelo

El balance se controla con LanPaint_Lambda (por defecto 16.0). Un lambda más alto ata la cara inpainteada con más rigor a los píxeles circundantes, reduciendo desajustes de color y artefactos de borde. El bucle interno usa un StochasticHarmonicOscillator con fricción (por defecto 15.0) y puede detenerse antes cuando la imagen limpia predicha de la región enmascarada se estabiliza (LanPaint nodes.py).

Para face swap, esto significa que el modelo "piensa" cómo la nueva cara debe fundirse con el tono de piel, la dirección de la luz y la textura existentes antes de comprometerse con el resultado final de denoising.

Transferencia de color Lab: separar estructura de tono

Después del inpainting, la cara intercambiada suele arrastrar el sesgo de color de la imagen fuente. El workflow aplica una transferencia estadística Lab* (CIELAB) basada en el algoritmo de Reinhard (color_transfer_by_lucas):

  1. Convertir tanto la región facial inpainteada como la referencia objetivo al espacio Lab*
  2. Igualar media y desviación estándar por canal (L=luminancia, a=verde-rojo, b=azul-amarillo)
  3. Escalar por (ref_std / content_std) y desplazar por (ref_mean - content_mean)
  4. Mezclar con fuerza ajustable (0.0–1.0) y convertir de vuelta a RGB

Como L transporta brillo y estructura mientras a/b* transportan oponencia de color, la transferencia ajusta tono de piel y color de iluminación sin desenfocar bordes faciales ni textura. Por eso el resultado deja de leerse como recorte — la geometría viene de LanPaint, el contexto cromático viene del objetivo.

Sampler recomendado: Euler (no Euler Ancestral)

El nodo de LanPaint lista los samplers como ["euler", "euler_ancestral", "heun", ...] con euler primero (LanPaint nodes.py). El artículo original afirma que "euler_ancestral / normal se ve un poco mejor", pero ningún benchmark específico de FLUX respalda esto. Euler ancestral añade ruido estocástico en cada paso (random walk no convergente), lo que puede introducir variación fina que choca con el objetivo de alineación de contenido de LanPaint. Euler determinista (o DPM++ 2M Karras) da estructura facial reproducible — importante cuando necesitas la misma identidad entre generaciones; los defaults estándar de FLUX en ComfyUI siguen el mismo razonamiento (ComfyUI FLUX examples).

Stack de LoRAs para textura y consistencia

LoRA | Source | Modelo base | Fuerza típica | Propósito

|------|--------|------------|------------------|---------

BFS Best Face Swap | HuggingFace | FLUX.2 Klein 9B | 0.8–1.0 | Transferencia central de identidad Consistency | dx8152/Flux2-Klein-9B-Consistency | FLUX.2 Klein 9B | 0.2–1.0 | Reduce el pixel drift entre iteraciones Dramatic Dark Lighting | civitai.com/models/2477155 | FLUX.2 Klein 9B | 0.5–0.8 | Mejora textura y atmósfera Flux2 Anime VAE | CabalResearch | — | — | Decode más nítido, leve sesgo anime El LoRA Consistency apunta específicamente al drift que se acumula al re-encodar/decodar o iterar — los fondos quedan alineados, los reflejos se mantienen, las ediciones repetidas no agravan la deformación. Su existencia como LoRA de FLUX.2 Klein se verificó en HuggingFace search — Consistency LoRAs.

Errores comunes y soluciones

Síntoma | Causa | Solución

|---------|-------|-----

Cara con aspecto plástico / encerado | Megapíxeles altos (2–3) + suavizado del modelo destilado; o guidance demasiado alto | Mantén Set Megapixels en 1; usa guidance 1.0–2.0 según la recomendación de LanPaint; añade prompts de textura ("visible pores, matte finish") Desajuste de color en mandíbula / frente | Diferencia de iluminación entre fuente y objetivo; sin transferencia de color | Ejecuta la transferencia de color Lab tras el inpainting con fuerza 0.5–0.8; iguala la iluminación fuente/objetivo en el preprocesado Borde de máscara brillante o roto | Bug oculto de LanPaint ≤ v1.4.x (peor en z-image-base) | Actualiza LanPaint a v1.5.0+ (release notes) Cara pequeña pierde detalle | Recorte facial por debajo de ~256×256 tras la máscara; restricción de 128×128 del modelo de swap | Sube Set Megapixels a 2–3 con 4–8 pasos de LanPaint; encadena FaceDetailer o un pase de upscale con ADetailer Identidad facial distinta en cada generación | Ruido estocástico de Euler ancestral | Cambia a Euler determinista o DPM++ 2M Karras; fija la seed Fondo cambia entre iteraciones | Pixel drift por encode/decode VAE repetido | Añade el LoRA Consistency con fuerza 0.5–0.7

Dónde falla el workflow

Limitaciones del modelo destilado

FLUX.2 Klein 9B está destilado por pasos a 4 pasos de inferencia. El README de LanPaint advierte explícitamente: "rendimiento degradado en modelos de destilación, como Flux.dev... usa un flux guidance bajo (1.0-2.0) para mitigarlo". El bucle interno de Langevin asume una schedule de ruido que la destilación comprime, así que la señal de alineación de contenido se debilita. Las variantes base (sin destilar) 9B/4B evitan esto pero necesitan ~29GB de VRAM y más pasos.

Caras pequeñas en resolución por defecto

En resolución por defecto, una cara lejana puede caer por debajo del umbral de detalle efectivo del modelo de face swap. Subir megapíxeles ayuda pero produce salida más suave y con menos detalle — el aspecto "plástico". La solución práctica es un enfoque de dos pases: inpainting a mayor resolución con 4–8 think steps, luego un pase de refinado con FaceDetailer.

Casos límite de la transferencia de color

La transferencia Lab aplica las estadísticas de color del objetivo de forma global. Si el objetivo tiene sesgos de color fuertes (neón, golden hour, tungsteno/día mezclados), igualar estadísticas hornea esos sesgos en la cara. Puede hacer falta enmascarar manualmente la región de transferencia o un segundo pase de corrección (color grading selectivo).

Componentes no verificados

El LoRA BFS Best Face Swap (civitai.com/models/2027766), el LoRA Dramatic Dark Lighting y el Flux2 Anime VAE fueron citados en el artículo fuente (Civitai article 27730) pero no se pudo acceder a ellos de forma independiente durante la investigación. Sus efectos declarados (fidelidad de identidad, mejora de textura, nitidez) siguen siendo de fuente única.

FAQ

¿Cómo mejora el think mode de LanPaint la calidad del face swap? Ejecuta iteraciones internas de Langevin que alinean la región facial enmascarada con los píxeles circundantes antes de cada paso de denoising. La cara obtiene múltiples oportunidades de igualar tono de piel e iluminación en lugar de un solo pase.

¿Por qué los face swaps de FLUX Klein se ven plásticos con megapíxeles altos? El campo receptivo del modelo destilado a mayor resolución produce salidas sobre-suavizadas. Mantén el default de 1 megapíxel; si la cara es diminuta, usa 2 megapíxeles con 4–8 think steps.

¿Qué sampler debo usar — euler o euler_ancestral? Usa euler (determinista). Es el primero/default en la lista de samplers de LanPaint. Euler ancestral añade ruido aleatorio por paso, lo que puede desestabilizar la identidad facial.

¿Cómo hace la transferencia de color Lab para que los face swaps coincidan con la iluminación? Lab* separa luminancia de crominancia. La transferencia iguala media y desviación estándar por canal de forma independiente, así que el tono de piel se adapta mientras la estructura facial se mantiene intacta.

¿Cuál es la diferencia entre FLUX.2 Klein base y destilado para inpainting? Las variantes base (9B/4B) no están destiladas — más estables con LanPaint, necesitan ~29GB de VRAM. El 9B destilado corre en 4 pasos pero LanPaint se degrada en él; requiere guidance más bajo (1.0–2.0) y menos think steps (2).

¿Puedo usar esto para caras no humanas? El LoRA BFS está entrenado en caras humanas. Para animales o personajes, transferencia basada en IPAdapter con una imagen de referencia funciona mejor que los modelos de swap ONNX.

¿Por qué brilla el borde de mi máscara? LanPaint ≤ v1.4.x tenía un bug. Actualiza a v1.5.0+.

¿Necesito el LoRA Consistency? Para un solo swap, probablemente no. Para iterar (re-encodar, múltiples ediciones, encadenar pases), úsalo a 0.5–0.7 para evitar el drift acumulado.