Cuando vi por primera vez las imágenes generadas por los modelos Flux.1 de Black Forest Labs, tuve que pararme a pensar si eran generadas por IA o por un humano. ¿Y lo más emocionante? Algunos de estos modelos vienen con pesos abiertos, ¡así que tú también puedes probarlos!
Los modelos FLUX.1 incluyen tres variantes, cada una diseñada para necesidades diferentes:
- FLUX.1 [pro]: Ofrece la máxima calidad, pero los pesos no están disponibles. Está pensado para uso comercial.
- FLUX.1 [dev]: Ofrece una gran calidad con pesos abiertos, perfecto para proyectos no comerciales.
- FLUX.1 [schnell]: Ofrece una calidad decente con velocidades de inferencia más rápidas, ideal para el despliegue local, perfecto para desarrolladores que trabajan en proyectos personales.
El núcleo de estos modelos es una arquitectura de transformador de flujo rectificado de 12.000 millones de parámetros. Esta arquitectura incorpora funciones avanzadas, como incrustaciones posicionales giratorias y capas de atención paralelas, que mejoran tanto la calidad visual como la eficiencia computacional.
Según el equipo de Black Forest Labs, los modelos FLUX.1 destacan en varias áreas clave:
- Cumplimiento puntual: Siguen las instrucciones del usuario con gran precisión.
- Calidad de imagen: Generan resultados detallados y visualmente atractivos.
- Diversidad de resultados: Ofrecen una amplia gama de opciones de estilo.
FLUX.1 se integra perfectamente con los difusores de Hugging Face, lo que facilita la creación de imágenes asombrosas con sólo un poco de experiencia.
Sumerjámonos y veamos cómo puedes utilizar el modelo FLUX.1-dev para generar imágenes fotorrealistas y encantadoras.
Configuración
Para realizar nuestros experimentos, sólo necesitaremos dos bibliotecas: Diffusers y PEFT. Vamos a instalarlas:
pip install -Uqqq pip --progress-bar off
pip install -qqq git+https://github.com/huggingface/diffusers.git@d8a16635f47ac455abd61879bcc6be32dfeaa561
pip install -qqq peft==0.12.0 --progress-bar off
He realizado los experimentos en Google Colab utilizando una GPU Nvidia A100 (40GB). El código debería funcionar en cualquier máquina con una GPU suficientemente potente.
La librería Diffusers se instala desde un commit hash específico para asegurar la compatibilidad con el adaptador LoRA que usaremos para el modelo FLUX.1-dev.
Comencemos importando las librerías necesarias y estableciendo una semilla para la reproducibilidad:
import matplotlib
import matplotlib.pyplot as plt
import torch
from diffusers import FluxPipeline
SEED = 42
La versión dev del modelo FLUX.1 está disponible en el hub de modelos Hugging Face. Podemos cargarlo utilizando el método FluxPipeline.from_pretrained
y moverlo a la GPU:
pipe = FluxPipeline.from_pretrained(
"black-forest-labs/FLUX.1-dev", torch_dtype=torch.bfloat16
)
pipe.to("cuda")
Generación de imágenes
Para generar imágenes, crearemos una función de ayuda llamada generar_imágenes. Esta función tomará un prompt y algunos parámetros opcionales, devolviendo una lista de imágenes generadas por el modelo:
def generate_images(
prompt: str,
guidance_scale: float = 3.5,
n_steps: int = 30,
lora_scale: float = 1.0,
n_images: int = 1,
):
return pipe(
prompt=prompt,
width=1024,
height=768,
guidance_scale=guidance_scale,
output_type="pil",
num_inference_steps=n_steps,
max_sequence_length=512,
num_images_per_prompt=n_images,
generator=torch.Generator("cpu").manual_seed(SEED),
joint_attention_kwargs={"scale": lora_scale},
).images
Todas nuestras imágenes se generarán a un tamaño de 1024 (ancho) x 768 (alto) píxeles. El generador asegura que se respeta el valor SEED, haciendo que los resultados sean reproducibles.
Parámetros
¿Quieres ver los parámetros completos de las imágenes? Lea el tutorial ampliado en MLExpert.io
Pasos de inferencia
Los modelos de difusión se entrenan para eliminar el ruido gaussiano aleatorio paso a paso para generar una muestra de interés, como una imagen o audio.
num_inference_steps
- el número de pasos de eliminación de ruido. Un mayor número de pasos de eliminación de ruido suele dar lugar a una imagen de mayor calidad a expensas de una inferencia más lenta.
steps = [5, 10, 15, 20, 25, 30]
images = []
for n_steps in steps:
images.append(generate_images(prompt, n_steps=n_steps)[0])

Orientación
Una escala de orientación más alta incita a generar imágenes estrechamente vinculadas a la indicación de texto, normalmente a expensas de una menor calidad de imagen.
guidances = [0, 2, 4, 6, 8, 10]
images = []
for guidance in guidances:
images.append(generate_images(prompt, guidance_scale=guidance)[0])

También prometí (según el título) algunas imágenes bonitas. Veamos cómo se comporta el modelo con la petición de una bonita hidra:

Diversidad de resultados
Los autores de los modelos FLUX.1 afirman que sus modelos generan diferentes estilos de imágenes. Vamos a comprobarlo generando imágenes para una pregunta sobre pingüinos:

El estilo de los pingüinos varía a lo largo de las imágenes, parece que los autores tenían razón.
Adaptador fotorrealista
Los chicos de XLabs AI han publicado un adaptador LoRA para el modelo FLUX.1-dev. Este adaptador, llamado RealismLoRA, mejora la capacidad del modelo para generar imágenes fotorrealistas y está publicado en HuggingFace model hub. Carguemos el adaptador sobre el modelo FLUX.1-dev:
pipe.load_lora_weights(
pretrained_model_name_or_path_or_dict="XLabs-AI/flux-RealismLora",
weight_name="lora.safetensors",
)
Probemos con el mismo indicador que utilizamos al principio para generar la mujer:

¿Notas las diferencias? Son sutiles pero la imagen generada con el adaptador RealismLoRA
tiene (por ejemplo) el pelo mucho más lleno y la textura de la piel imperfecta.
Puedes variar el parámetro lora_scale
para controlar el nivel/peso del adaptador LoRA (fotorrealismo en este caso). Aquí tienes un ejemplo:

Compare el nivel de detalle entre lora_scale=0,0 y lora_scale=1,0. Este último tiene detalles mucho más nítidos.
Probemos con algunas indicaciones más:


Impresionante, ¿verdad? Terminemos con algo realmente lindo:

Conclusión
Si eres como yo, probablemente te sorprenderá la calidad de las imágenes generadas por el modelo FLUX.1-dev. La capacidad de crear imágenes fotorrealistas y cautivadoras con sólo unas pocas indicaciones demuestra realmente el poder de los modelos de IA como éste. Los pesos abiertos facilitan la experimentación y la perfecta integración del modelo en tus propios proyectos. Así que adelante, ¡pruébalo!
¿Quieres ver las instrucciones completas para las imágenes? Lee el tutorial ampliado en MLExpert.io