Mantener consistente el rostro de un personaje de IA, medido con una puntuación de similitud en pods de GPU con tope de gasto, y aplicado a seis piezas de marketing de una marca veterinaria.
Rol: Constructor del pipeline (proyecto personal) Periodo: 2026 Estado: production
Qué tanto coincide el rostro del personaje en las seis piezas de marketing, medido (más alto es más parecido)
La embajadora de marca se reconoce de pieza en pieza, así que las campañas se ven coherentes.
Medición propia sobre las seis imágenes finales, 2026-10-13
La más débil de las seis piezas; por debajo de 0.45 a 0.50 se vería como otra persona
Hasta la pieza más débil conserva la identidad del personaje, así que el conjunto funciona como serie.
Medición propia sobre las seis imágenes finales, 2026-10-13
Costo estimado de las seis piezas de marketing en una GPU rentada (unos 37 minutos, borrada al terminar)
Una tanda de contenido de marca cuesta menos de un dólar, bajo un tope de gasto fijado antes.
Tarifa del catálogo del proveedor y marcas de tiempo del pod, 2026-10-13
Velocidad de una GPU rentada frente a generar en la laptop (27 retratos en 1.6 minutos)
Las tandas terminan en minutos en lugar de horas, a unos US$0.22 por hora de GPU.
Medición propia, proyecto de investigación, 2026-10-13
Arquitectura
Contexto
Genero imágenes con ComfyUI, una herramienta de grafo de nodos donde un flujo de trabajo es un diagrama de modelos y operaciones y no un script. Los mismos nodos corren en mi laptop y en pods rentados de RunPod, así que las preguntas son dónde debe correr cada trabajo, cómo mantener reconocible el rostro de un personaje a lo largo de muchas imágenes y cuánto cuesta. Este caso tiene dos partes: la investigación que produjo el pipeline y su aplicación a contenido de marketing de VetNova, el software para clínicas veterinarias que construí, con una embajadora de marca que es un personaje de IA.
Las imágenes son un personaje ficticio nuevo creado para este portafolio y para el marketing de VetNova con el mismo pipeline; los recursos del proyecto de investigación original son privados.
Mi rol
- Decidí: en qué GPU corre cada tipo de trabajo, cómo se enciende y se apaga una tanda, el tope de gasto de cada corrida, qué receta es la final y qué imágenes generadas son lo bastante buenas para publicarse.
- Verifiqué: la vista de facturación del proveedor y la lista de recursos en ejecución, para poder decir el costo y confirmar que no queda ningún pod, volumen ni endpoint. Medí la consistencia de identidad con un número y revisé cada imagen a ojo: manos u ojos deformes, texto suelto, logos y animales.
- Delegué a la IA: la generación de imágenes y de video en sí, que hacen los modelos dentro del flujo que diseño. El gasto y las reglas de apagado se quedan conmigo; no le delego a un agente decisiones de gasto en la nube.
Investigación
Modelos de texto locales. El criterio fue caber en memoria. Mi laptop tiene unos 31 GB de RAM y ninguna GPU útil. Con cuantización GGUF de 4 bits (Q4) un modelo de 8B pesa unos 4.9 GB, uno de 7B unos 4.1 GB, uno de 24B unos 14 GB (lento) y uno de 8x7B unos 26 GB (de 1 a 3 tokens por segundo). Los modelos de 7 a 8B corrían de 6 a 15 tokens por segundo, cómodos para chatear; elegí Q4_K_M como equilibrio entre tamaño y calidad. Un modelo local de 8B no es más capaz que su base, así que las tareas complejas siguen yendo a modelos en la nube.
Modelos de imagen. Mantuve tres checkpoints SDXL locales y los comparé con la misma semilla, comprobando que el adaptador de identidad mantuviera el rostro. En la CPU de la laptop una imagen tardaba unos 4 minutos a 640x960, y de 8 a 15 minutos con un detailer de rostro en cuerpo completo. En una RTX 3090 Community a unos US$0.22 por hora, 27 retratos tomaron 1.6 minutos, unas 70 veces más rápido. El mínimo práctico es 12 GB de VRAM para SDXL y 24 GB para video. Me quedé con cerca de 1 megapíxel (832x1216): a 640x960 con CFG alto y un adaptador facial fuerte la salida parecía caricatura.
Dataset y LoRA. Un LoRA es un adaptador pequeño que le enseña una identidad a un modelo base sin reentrenarlo. El dataset fue de 34 imágenes realistas más 13 expresiones, 47 en total. El entrenamiento corrió con kohya sd-scripts (v0.9.1, porque la rama principal pedía un torch más nuevo que el del pod): 1,880 pasos en unos 41 minutos en una GPU rentada, guardando unas 10 épocas. Aprobé la época 8 tras revisar las épocas 2 a 10 a ojo. Con el LoRA el rostro se mantiene sin el adaptador; el adaptador solo no lograba varias expresiones (tristeza, llanto, guiño). Un segundo reentrenamiento (épocas 6 a 14) se rechazó: similitud media de 0.43 a 0.47 y mínima de 0.25 a 0.31, frente a 0.595 del LoRA aprobado. La lección: un dataset hecho con imágenes ya desviadas fija la desviación en el LoRA.
Métrica de identidad y receta. Puntué cada receta con el coseno de similitud de los embeddings faciales de InsightFace contra una imagen de referencia.
| Receta | Media | Mínima |
|---|---|---|
| V0 | 0.617 | 0.453 |
| V6 (FaceID 0.6) | 0.595 | 0.534 |
| V8 (FaceID 0.8) | 0.611 | 0.520 |
| V9 (FaceID 0.7) | 0.599 | 0.520 |
V0 tiene la media más alta pero la peor mínima, así que adopté V9: un rostro más anclado que V6 y igual de real. Un voto ciego mío sobre cinco fotos dio a V6 seis puntos, a V9 cinco y a V8 tres, y ninguna se marcó como IA. La métrica no ve el color de ojos ni el aspecto de caricatura; eso lo decide la revisión humana. Una puntuación menor a 0.45 o 0.50 cuenta como otra persona. V9 es FaceID 0.7, CFG 3.5, un sampler DPM++ 2M SDE y un detailer de rostro con denoise 0.25.
Video. La imagen a video con Wan 2.2 corre en una L40S: 20 pasos de unos 70 segundos, unos 24 minutos por clip. El modo rápido de 4 pasos tenía aspecto de cera y lo rechacé. Usar el mismo primer y último fotograma mantuvo mejor el rostro (similitud de 0.86 a 0.94); la imagen a video simple deriva (0.68).
Costo. Un pod nuevo por tanda, borrado al terminar, porque los pods apagados pierden la GPU. Un fallo documentado: un pod Community nunca arrancó (39 minutos sin runtime), así que lo borré y repetí la tanda en Secure. Toda la investigación de realismo costó unos US$1.1 y el día de entrenamiento del LoRA unos US$2. La factura de octubre de 2026 estaba en US$8.11 antes de la tanda de marketing de abajo (US$7.83 de GPU y US$0.28 de disco), sin endpoints serverless ni volúmenes de red.
Aplicación a marketing: la embajadora de marca IA de VetNova
Para VetNova creé un personaje ficticio nuevo, una veterinaria de unos 32 años con bata clínica azul marino y estetoscopio, y produje seis piezas con el mismo método de imagen de referencia, adaptador de identidad y medición. No usé el LoRA de la investigación: esta tanda muestra solo la parte del adaptador de identidad del pipeline.
- Referencia. Generé cuatro candidatos del rostro con un checkpoint SDXL realista de propósito general y elegí uno.
- Consistencia. Cada pieza usa IP-Adapter FaceID Plus V2 con un peso de 0.5 a 0.7 desde esa referencia, CFG 3.5 y un detailer de rostro con denoise 0.25. Un prompt negativo estricto mantiene todo profesional y propio de una clínica, y excluye además menores, texto, logos, marcas de agua y deformaciones.
- Selección. Generé al menos dos variantes por pieza, y hasta seis cuando fallaban las manos, el texto en la ropa o la composición. Descarté las que tenían texto garabateado en batas o letreros, una bata blanca no deseada o un mal encuadre.
- Medición. Similitud de InsightFace contra la referencia de la misma tanda: media 0.679 y mínima 0.645 en las seis piezas finales (post del cachorro 0.665, banner de recepción 0.695, historia con gato 0.667, post con perro mayor 0.645, retrato de estudio 0.701, banner de bienvenida 0.702). Son más altas que las 0.595 a 0.617 de las recetas de investigación porque la referencia y las piezas salen de una misma tanda y las piezas las elegí yo, así que las leo como una comprobación de consistencia y no como una comparación equivalente.
- Costo y tiempo. Un pod RTX 4090 Secure a US$0.89 por hora (la 3090, más barata, no tenía stock), unos 37 minutos de la creación al borrado, 37 imágenes generadas, costo estimado de unos US$0.55 bajo un tope duro de US$3.00. El pod se borró y la lista de pods de la cuenta quedó vacía.
Las seis piezas son un post 1:1 con un cachorro, un banner 16:9 de recepción con espacio libre a la derecha para texto, una historia 9:16 con un gato, un post 1:1 con un perro mayor, un retrato de estudio 4:5 y un banner 16:9 de bienvenida. La resolución es el tamaño nativo de SDXL, cerca de 1 megapíxel, exportada a un máximo de 1,600 px.
Decisiones
| Decisión | Alternativas descartadas | Por qué |
|---|---|---|
| Un script crea el pod de cada tanda, baja los modelos en paralelo, arranca ComfyUI y borra el pod al terminar | Encender y apagar pods a mano desde la consola | El apagado es parte del mismo comando, así que nunca depende de que me acuerde. |
| Un tope duro de gasto fijado por mí antes de la corrida (US$3.00 para la tanda de marketing, alerta de parada en US$2.50) | Corridas sin límite cobradas a fin de mes | Un proceso que crea recursos de pago necesita un límite que elijo yo, no uno que se ponga un agente. |
| Receta V9, elegida por métrica más voto ciego | La receta con la media más alta (V0) | V0 tenía la peor mínima (0.453); V9 sostiene el rostro con más fiabilidad. |
| Rechazar el modo de video de 4 pasos y el LoRA reentrenado | Video más rápido; un segundo LoRA | Un aspecto de cera y una similitud menor (0.43 a 0.47) son peores que 24 minutos y un buen LoRA. |
| RTX 4090 Secure cuando la tarjeta barata no tiene stock | Esperar una 3090 Community | La tanda es corta, así que la tarifa mayor cuesta centavos; esperar cuesta tiempo. |
| Sin volumen de red persistente; los modelos se bajan de nuevo en cada pod | Un volumen que guarde modelos entre sesiones | Un volumen cobra todos los días, genere o no. |
| Pods en lugar de endpoints serverless | Un endpoint serverless | Un endpoint sirve para un servicio que atiende peticiones; esto es trabajo por lotes que enciendo y apago yo. |
Validación y QA
Del lado de la nube reviso lo que reporta el proveedor: el conteo de pods activos (cero después de la tanda) y los renglones de facturación. Antes de trabajos pesados en mi propia máquina compruebo que la cola de ComfyUI esté libre.
Del lado de la imagen, la puntuación de similitud facial convierte la elección de receta en una comparación, y mi revisión de cada imagen cubre lo que el número no ve: manos, ojos, animales, texto suelto y logos, y si el resultado se ve profesional y publicable. Los archivos exportados pasan por un script que borra los metadatos de generación que guarda ComfyUI, y verifiqué que no quede ninguno.
Resultados
- Un pipeline que mantiene reconocible a un personaje de IA a lo largo de muchas imágenes, con un número que lo demuestra y un rechazo documentado para cada receta que no aguantó.
- Seis piezas de marketing de VetNova con similitud facial media de 0.679 y mínima de 0.645, producidas en unos 37 minutos por un costo estimado de US$0.55.
- Un estado final limpio: cero pods activos, sin volúmenes, sin endpoints.
Qué resuelve y dónde más sirve
Una marca que usa un personaje de IA necesita el mismo rostro en cada post, banner e historia, y necesita saber cuánto cuesta cada tanda. Este pipeline mide el parecido facial con un número, elige imágenes por ese número y por revisión humana, y corre en GPU rentadas que se apagan solas bajo un tope de gasto.
Dónde más aplica el mismo patrón:
- Personajes o mascotas de marca consistentes para clínicas, inmobiliarias y tiendas en línea.
- Imágenes de producto y de catálogo con un mismo estilo a lo largo de muchas piezas y formatos.
- Cualquier equipo que rente GPU en la nube y necesite topes de gasto firmes y apagado garantizado.
Qué haría distinto
Registraría el rendimiento, el tiempo por paso y el costo en el momento en que ocurre cada corrida, en las mismas notas del flujo, porque una vez borrado el pod ya no puedo leer esos números en la consola. El costo de la tanda de marketing de esta página es una estimación por tarifa y tiempo porque el renglón del proveedor para el pod aún no aparecía cuando lo escribí. También haría que el tope de gasto sea un argumento obligatorio del script y prepararía una referencia y una biblioteca de prompts antes de rentar el pod, ya que la mayor parte de los 37 minutos se fue en instalar nodos y bajar modelos, no en generar.
Evidencia
Abrir la demo en otra pestaña Ver el código en GitHub
Versión completa: repositorio privado, disponible bajo solicitud.