Skip to main content

Descripción general

LoRA (Low-Rank Adaptation) es una técnica de ajuste fino que enseña a un modelo de IA un nuevo estilo visual usando un pequeño conjunto de imágenes de ejemplo. Funciona inyectando nuevos “pesos de estilo” en un modelo existente, lo que hace que el entrenamiento sea rápido y eficiente. Esta guía recorre el flujo completo:

Prepara las imágenes de entrenamiento

Cura y sube imágenes de alta calidad que representen el estilo deseado

Envía el trabajo de entrenamiento

Envía una solicitud POST a /styles/train con tus URLs de imágenes y la configuración

Monitorea el progreso

Sigue el estado del trabajo con el job_id devuelto

Genera con tu estilo

Aplica tu estilo entrenado a la generación de imágenes

Prepara las imágenes de entrenamiento

Curar tu dataset

La calidad de tus imágenes de entrenamiento impacta directamente en los resultados. Los distintos tipos de entrenamiento tienen requisitos diferentes:
TipoCaso de usoConsejos
StyleEstilos artísticos, estéticas visualesEstilo consistente en sujetos variados
CharacterSemejanza personal, personajes consistentesPoses, expresiones e iluminación variadas
ObjectElementos u objetos específicosMúltiples ángulos, objeto consistente

¿Cuántas imágenes?

La calidad importa mucho más que la cantidad. Un pequeño conjunto de imágenes excelentes superará a un conjunto grande de imágenes mediocres.
Tamaño del datasetGuía
5 imágenesMínimo viable. Puede funcionar para estilos simples y consistentes
10-30 imágenesRecomendado. Mejor balance entre calidad y cobertura
50+ imágenesRendimientos decrecientes salvo que el estilo tenga alta variación
Calidad > Cantidad15 imágenes de alta calidad producirán mejores resultados que 50 de baja calidad. Prioriza:
  • Alta resolución (1024x1024 mínimo)
  • Estilo consistente en todas las imágenes
  • Sin marcas de agua, textos superpuestos o artefactos de compresión
  • Sujetos variados manteniendo la coherencia de estilo
Datasets de ejemplo
  • Entrenamiento de personaje: fotos de una persona con poses, expresiones y condiciones de iluminación variadas. Evita incluir otras personas en las imágenes.
  • Entrenamiento de estilo: una colección de obras de arte con un estilo consistente. Por ejemplo, The Metropolitan Museum of Art Ukiyo-E Dataset ofrece grabados japoneses en madera ideales para entrenar un estilo artístico.

Sube las imágenes

Antes de entrenar, sube tus imágenes para obtener URLs alojadas. Usa el endpoint /assets:
import requests
import os
from dotenv import load_dotenv
import mimetypes

load_dotenv()

API_BASE = "https://api.krea.ai"
API_TOKEN = os.getenv("API_TOKEN")

image_dir = "training_images"
uploaded_urls = []

for filename in os.listdir(image_dir):
    if filename.lower().endswith(('.jpg', '.jpeg', '.png', '.webp')):
        filepath = os.path.join(image_dir, filename)
        mime_type, _ = mimetypes.guess_type(filepath)

        with open(filepath, 'rb') as f:
            response = requests.post(
                f"{API_BASE}/assets",
                headers={"Authorization": f"Bearer {API_TOKEN}"},
                files={"file": (filename, f, mime_type)},
                data={"description": f"Training image: {filename}"}
            )

        if response.ok:
            data = response.json()
            uploaded_urls.append(data["image_url"])
            print(f"Uploaded: {filename}")
        else:
            print(f"Failed: {filename}")

print(f"\nUploaded {len(uploaded_urls)} images")
Guarda los valores image_url devueltos — los pasarás al endpoint de entrenamiento.

Entrena tu estilo

Ejemplo básico de entrenamiento

Envía las URLs de tus imágenes para iniciar el entrenamiento:
import requests
import os
from dotenv import load_dotenv

load_dotenv()

API_BASE = "https://api.krea.ai"
API_TOKEN = os.getenv("API_TOKEN")

# Training URLs from the upload step
urls = [
    "https://krea.ai/assets/img1.jpg",
    "https://krea.ai/assets/img2.jpg",
    "https://krea.ai/assets/img3.jpg",
    # ... more images
]

response = requests.post(
    f"{API_BASE}/styles/train",
    headers={
        "Authorization": f"Bearer {API_TOKEN}",
        "Content-Type": "application/json"
    },
    json={
        "name": "Ukiyo-E Style",
        "urls": urls,
        "model": "flux_dev",
        "type": "Style",
        "max_train_steps": 500
    }
)

response.raise_for_status()
job = response.json()
print(f"Training started! Job ID: {job['job_id']}")

Tipos de entrenamiento

El parámetro type establece valores predeterminados inteligentes optimizados para tu caso de uso:
TipoIdeal para
StyleEstilos artísticos, estéticas visuales
CharacterSemejanza personal, personajes consistentes
ObjectElementos o productos específicos
DefaultEntrenamiento genérico

Parámetros

Parámetros obligatorios

name
string
required
Un nombre descriptivo para tu estilo personalizado.Ejemplo: "Ukiyo-E Style", "Product Photos"
urls
array
required
Arreglo de URLs de imágenes con las que entrenar. Incluye más imágenes para mejores resultados.

Parámetros opcionales

model
string
default:"flux_dev"
Modelo base para entrenamiento:Modelos de imagen:
  • flux_dev - Alta calidad, versátil
  • flux_schnell - El modelo en tiempo real de BFL
  • qwen - El modelo de Alibaba
  • z-image - El modelo de imagen eficiente de Alibaba
  • wan22 - Solo generación de imagen
Modelos de video:
  • wan - El modelo de video de Alibaba
type
string
default:"Default"
Categoría de entrenamiento: Style, Object, Character o Default
trigger_word
string
Palabra personalizada para activar este estilo en los prompts. Si no se especifica, se usa el nombre del estilo.
Elige palabras de activación únicas que no aparezcan en prompts típicos. Usa guiones bajos para triggers de varias palabras: ukiyo_style
learning_rate
number
Controla la intensidad del entrenamiento. Valores más altos entrenan más rápido pero pueden sobreajustar.Rango recomendado: 0.0001 - 0.001
max_train_steps
integer
Máximo de iteraciones de entrenamiento. Rango: 1-2000
batch_size
integer
Imágenes procesadas simultáneamente. Lotes más grandes = entrenamiento más rápido pero más memoria.

Ajustar parámetros avanzados

Comienza con los valores por defecto que establece el campo type — funcionan bien en la mayoría de los casos. Solo ajústalos si observas problemas específicos:
Controla con qué agresividad el modelo se adapta a tus imágenes de entrenamiento.
ValorCuándo usarlo
0.0001 (menor)Problemas de sobreajuste, estilos complejos, datasets pequeños
0.0003 (por defecto)La mayoría de los casos
0.0005-0.001 (mayor)Entrenamiento más rápido
Señales de que necesitas ajustar:
  • Las salidas se ven idénticas a las imágenes de entrenamiento → baja la tasa
  • La influencia del estilo es débil tras el entrenamiento → sube la tasa ligeramente
Cuánto tiempo entrena el modelo con tus imágenes.
Tamaño del datasetPasos recomendados
5-10 imágenes300-500 pasos
15-30 imágenes500-800 pasos
50+ imágenes800-1500 pasos
Señales de que necesitas ajustar:
  • Las salidas son demasiado rígidas e ignoran los prompts → reduce los pasos
  • La influencia del estilo es débil → aumenta los pasos
  • Las imágenes generadas se ven exactamente como los datos de entrenamiento → reduce los pasos (sobreajuste)
Ajuste iterativoSi tu primer intento de entrenamiento no produce los resultados que quieres:
  1. Comienza ajustando max_train_steps (la solución más común)
  2. Luego prueba learning_rate si los pasos solos no bastan

Formato de respuesta

{
  "job_id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "queued",
  "created_at": "2024-01-15T10:30:00Z"
}

Monitorea el progreso del entrenamiento

El entrenamiento suele tardar de 5 a 15 minutos. Consulta la API de Jobs para verificar el estado:
import requests
import time
import os
from dotenv import load_dotenv

load_dotenv()

API_BASE = "https://api.krea.ai"
API_TOKEN = os.getenv("API_TOKEN")
job_id = "your-job-id"

while True:
    response = requests.get(
        f"{API_BASE}/jobs/{job_id}",
        headers={"Authorization": f"Bearer {API_TOKEN}"}
    )
    job = response.json()
    status = job["status"]

    print(f"Status: {status}")

    if status == "completed":
        style_id = job["result"]["style_id"]
        print(f"Training complete! Style ID: {style_id}")
        break
    elif status in ["failed", "cancelled"]:
        print(f"Training {status}")
        break

    time.sleep(30)
Los trabajos de entrenamiento pasan por estos estados:
  1. queued - En espera en la cola
  2. processing - Entrenamiento activo
  3. completed - Entrenamiento finalizado con éxito
  4. failed - El entrenamiento encontró un error
  5. cancelled - Trabajo cancelado manualmente

Usa tu estilo entrenado

Una vez completado el entrenamiento, aplica tu estilo a la generación de imágenes usando el parámetro styles:
Propiedad del estilo entre la app y la APILa API y la webapp de Krea operan como identidades de usuario distintas dentro de tu espacio de trabajo. Los estilos son privados del usuario que los creó, así que:
  • Los estilos entrenados en la app no son accesibles desde la API a menos que se compartan
  • Los estilos entrenados desde la API no son accesibles en la app a menos que se compartan
Para compartir un estilo con tu espacio de trabajo (funciona en ambos sentidos):
curl -X POST https://api.krea.ai/styles/YOUR_STYLE_ID/share/workspace \
  -H "Authorization: Bearer YOUR_API_TOKEN"
import requests
import time
import os
from dotenv import load_dotenv

load_dotenv()

API_BASE = "https://api.krea.ai"
API_TOKEN = os.getenv("API_TOKEN")
STYLE_ID = "w29t6pvy0"

response = requests.post(
    f"{API_BASE}/generate/image/krea/krea-2/medium",
    headers={
        "Authorization": f"Bearer {API_TOKEN}",
        "Content-Type": "application/json"
    },
    json={
        "prompt": "An abstract, colorful, surreal composition of symmetry and balance. Swirling colors, imagery of trees and coalescing patterns converge. The lantern of light and death. It is as if the world was at once dark, and yet again lit.",
        "aspect_ratio": "1:1",
        "resolution": "1K",
        "styles": [
            {
                "id": STYLE_ID,
                "strength": 0.95
            }
        ]
    }
)

job = response.json()
job_id = job["job_id"]
print(f"Generation started! Job ID: {job_id}")

# Poll for completion
while True:
    check = requests.get(
        f"{API_BASE}/jobs/{job_id}",
        headers={"Authorization": f"Bearer {API_TOKEN}"}
    )
    status_data = check.json()

    if status_data["status"] == "completed":
        image_url = status_data["result"]["urls"][0]
        print(f"Image ready: {image_url}")
        break
    elif status_data["status"] == "failed":
        print("Generation failed")
        break

    time.sleep(2)

Intensidad del estilo

El parámetro strength (0.0-1.0) controla con qué fuerza se aplica tu estilo:
IntensidadEfecto
0.5-0.7Influencia sutil, mantiene la flexibilidad del prompt
0.8-0.9Aplicación fuerte del estilo, punto de partida recomendado
0.95-1.0Máximo apego al estilo, puede reducir la respuesta al prompt
Comienza con 0.8 y ajusta según los resultados. Valores más bajos dan más libertad creativa; valores más altos imponen un apego más estricto al estilo.

Combinar múltiples estilos

Aplica varios estilos agregándolos al arreglo styles:
"styles": [
    {"id": "style-id-1", "strength": 0.6},
    {"id": "style-id-2", "strength": 0.4}
]

Buenas prácticas

  • Usa tantas imágenes de alta calidad como tengas para obtener resultados óptimos
  • Asegura un estilo consistente en todas las imágenes de entrenamiento
  • Incluye variedad de sujetos manteniendo la coherencia de estilo
  • Evita marcas de agua, textos superpuestos o artefactos
  • Usa imágenes de al menos 1024x1024 de resolución
  • Comienza con los parámetros por defecto usando el campo type
  • Para estilos: 500-1000 pasos suelen ser suficientes
  • Tasas de aprendizaje más bajas (0.0001-0.0003) previenen el sobreajuste
  • Aumenta los pasos si el estilo no es lo suficientemente fuerte
  • Reduce los pasos si la salida es demasiado rígida
  • Usa la misma palabra de activación si planeas combinar varios estilos
  • Las palabras de activación se inyectan automáticamente en el prompt si incluyes el estilo
  • Evita palabras comunes que aparezcan en prompts típicos
  • Usa guiones bajos para triggers de varias palabras: my_custom_style