- Probé un proyecto para entrenar durante unas horas mi propio modelo de imágenes con IA y generar fotos que parecieran tomadas directamente de mí
- Ej.: generar una foto mía disfrazado de "Superman"
- Razones para intentarlo: parecía divertido, era bueno para jugar con mis hijos y me permitía aprender más sobre modelos personalizados y la parte más avanzada de la IA
- Hace 12 a 18 meses, este trabajo era bastante complejo, pero ahora se ha vuelto muy simple
- En menos de 2 horas creé el modelo y obtuve las imágenes que quería; la clave fue identificar rápido las herramientas correctas
Elegir el patrón de modelo/entrenamiento
- Elementos necesarios
- modelo base (
base model) - técnica de entrenamiento/ajuste fino
- dataset de entrenamiento (unas cuantas fotos propias, etc.)
- modelo base (
- Muchas IAs recomiendan Stable Diffusion, pero elegí el modelo Flux porque Pieter Levels dijo que ofrecía mejor rendimiento
- No es exactamente el modelo SOTA más reciente, pero es más que suficiente
- Como técnica de entrenamiento usé LoRA (Low-Rank Adaptation)
- En vez de reentrenar todo el modelo, solo se entrena la parte asociada a una "palabra mágica" específica
- Ej.: enseñar al modelo una palabra poco común como "czue", para que cuando se use en el prompt refleje las características de ese dataset
Crear el set de entrenamiento
- Hay que preparar varias fotos del sujeto a aprender (unas 10 a 15)
- Cuanta más variedad haya en expresiones, fondo, iluminación y ángulos, mejor
- Idealmente, debería haber una sola persona por foto
- Durante el entrenamiento se necesita una descripción en texto, y ahí debe incluirse la palabra mágica
- Ej.: "a photo of czue on the beach, wearing a blue shirt"
- Pero las herramientas recientes generan captions de imagen automáticamente, así que no hace falta escribir las descripciones a mano
Entrenar el modelo
- Al principio pensé en entrenarlo localmente, pero fue difícil por falta de GPU y RAM
- También se puede ejecutar el código directamente en un servidor cloud con GPU, pero al final usé Replicate
- Es un servicio de alquiler de GPU donde se pueden usar recetas ya preparadas de inmediato
- En este caso usé la receta ostris/flux-dev-lora-trainer
- Después de crear una cuenta en Replicate, hay que configurar la información de cobro
- Parámetros principales
- input_images: fotos de entrenamiento (zip)
- trigger_word: palabra mágica, por ejemplo "czue"
- hf_repo_id, hf_token: repositorio/token de Hugging Face
- autocaption_prefix: texto que se antepone a los captions generados automáticamente (ej.: "A photo of czue,")
Guardar el modelo en Hugging Face
- Hugging Face es una plataforma para almacenar y compartir modelos
- Replicate también guarda el modelo entrenado en algún lugar, pero subirlo a Hugging Face facilita integrarlo con otras herramientas
- Tras crear la cuenta y el modelo, se pasa
hf_repo_id- El token de acceso puede emitirse desde settings/tokens
- Cuando termina el entrenamiento, se sube a Hugging Face un archivo grande llamado
lora.safetensors(aprox. 180MB)
Generar imágenes con el modelo
- Una vez terminado el entrenamiento, sigue el proceso de inferencia: introducir texto en el modelo para crear imágenes
- Se puede probar localmente, pero otra vez recurrí a Replicate
- En lucataco/flux-dev-lora solo hay que configurar el campo hf_lora
- ID de un repositorio público de Hugging Face o enlace al modelo entrenado subido a Replicate
- En lucataco/flux-dev-lora solo hay que configurar el campo hf_lora
- Ej.: si introduces "a photo of czue surfing", obtienes una imagen tuya surfeando como la siguiente
Ejecutar el modelo de forma programática
- Si quieres probar distintos prompts y guardar los resultados automáticamente, es más práctico hacerlo vía API
- Preparé el siguiente script en Python como ejemplo (el código completo está en Github)
# /// script # requires-python = ">=3.12" # dependencies = [ # "replicate", # ] # /// import argparse import os import re import replicate import uuid DEFAULT_MODEL = "czue/me-v1" DEFAULT_COUNT = 1 def get_input(prompt, model=DEFAULT_MODEL, count=DEFAULT_COUNT): return { "prompt": prompt, "hf_lora": model, "num_outputs": count } def main(): parser = argparse.ArgumentParser() parser.add_argument("prompt", help="Prompt for the photo") parser.add_argument("--model", default=DEFAULT_MODEL, help="Model to use (default: %(default)s)") parser.add_argument("--count", default=DEFAULT_COUNT, help="Number of photos to generate (default: %(default)s)", type=int) args = parser.parse_args() input = get_input(args.prompt, args.model, args.count) output = replicate.run( "lucataco/flux-dev-lora:091495765fa5ef2725a175a57b276ec30dc9d39c22d30410f2ede68a3eab66b3", input=input ) output_dir = "output" os.makedirs(output_dir, exist_ok=True) prompt_slug = "-".join(args.prompt.split(" ")[-3:]) prompt_slug = re.sub(r'[^a-zA-Z0-9\-]', '', prompt_slug).lower() for index, item in enumerate(output): file_id = uuid.uuid4().hex[:5] output_path = os.path.join(output_dir, f"{prompt_slug}-{file_id}.webp") with open(output_path, "wb") as file: file.write(item.read()) print(f"Saved photo {output_path}") if __name__ == "__main__": main() - Ejemplo de uso
uv run main.py "a photo of czue, a 40 year old man, writing a blog post" \ --model="czue/me-v1" \ --count=4
Resultados
- El rendimiento del modelo es inconsistente
- A veces capta bastante bien los rasgos de la persona, pero otras genera a alguien distinto
- Si se especifican en el prompt detalles como edad o género, la precisión mejora un poco
- Por ejemplo, "a photo of czue, a 40 year old man, writing a blog post" genera imágenes relativamente consistentes
- En cambio, "a photo of czue writing a blog post" arrojó resultados mucho más variables
- Si se incluye a otra persona, aparecen problemas como mezclar rostros
- Intenté hacer una foto junto a Barack Obama, pero algunas partes de mi cara se reflejaban en Obama y viceversa
- Aun así, fue lo bastante divertido y útil como para probar varias cosas con mis hijos
Costo
- No es gratis, pero tampoco tan caro
- Entrené 3 modelos entre los míos y los de mis hijos, y cada uno costó alrededor de ~$2.50
- Generar imágenes cuesta unos $0.03 por imagen, así que incluso 30 imágenes salen en torno a $1
- En todo el experimento gasté menos de $10 y quedé satisfecho porque el costo fue menor de lo esperado
- Si te interesa entrenar modelos de IA y generar imágenes, vale la pena intentarlo porque es mucho más accesible de lo que parece
5 comentarios
Lo probé por curiosidad y de verdad es muy fácil.
(https://www.youtube.com/watch?v=sNpQ9ULDMoo)
Me la pasé riéndome un buen rato mientras probaba hacer de todo...
¿Al final no intentaremos subir a la red, antes de morir, un modelo entrenado para ser como yo y luego morir? Como un instinto de supervivencia... Aunque eso no sea "yo".
Al ver esta tecnología, me acordé de una novela y quería compartirla. Es el cuento corto llamado "Cronos", incluido en Bisutbangul Pong, una colección de relatos publicada por la escritora Lee Yu-ri. Trata sobre una IA que almacena y aprende de los datos de una persona, es decir, de uno mismo. Como el gato de ese comentario. La usa una mamá con demencia antes de que sus síntomas empeoren más. Y luego sus hijos entran en conflicto. A veces les da consuelo y a la vez les provoca culpa. Si te interesa esta tecnología, o también la historia de ese gato, te recomiendo leerlo.
Un comentario de Hacker News llama la atención
También hay un comentario informativo
"Cualquier tecnología suficientemente avanzada es indistinguible de la magia - Arthur C. Clarke"
Hasta hace apenas 2 años, esto parecía algo que solo veríamos en una película de ciencia ficción, y ahora de verdad estamos presenciando en tiempo real el momento en que la magia se vuelve realidad 😳