Skip to main content

Обзор

LoRA (Low-Rank Adaptation) — техника тонкой настройки, которая обучает модель ИИ новому визуальному стилю на небольшом наборе примеров. Она внедряет новые «веса стиля» в существующую модель, что делает обучение быстрым и эффективным. Это руководство описывает полный рабочий процесс:

Подготовьте изображения для обучения

Отберите и загрузите качественные изображения, представляющие желаемый стиль

Отправьте задание на обучение

Отправьте POST-запрос на /styles/train с URL изображений и конфигурацией

Отслеживайте прогресс

Следите за статусом задания обучения с помощью возвращённого job_id

Генерируйте в своём стиле

Применяйте обученный стиль при генерации изображений

Подготовка изображений для обучения

Формирование датасета

Качество обучающих изображений напрямую влияет на результат. У разных типов обучения разные требования:
ТипСценарий использованияСоветы
StyleХудожественные стили, визуальная эстетикаСогласованный стиль на разных сюжетах
CharacterПерсональное сходство, консистентные персонажиРазнообразные позы, выражения, освещение
ObjectКонкретные предметы, продуктыНесколько ракурсов, один и тот же объект

Сколько нужно изображений?

Качество важнее количества. Небольшой набор превосходных изображений даст лучший результат, чем большой набор посредственных.
Размер датасетаРекомендации
5 изображенийМинимально работоспособный. Подходит для простых, консистентных стилей
10–30 изображенийРекомендуется. Оптимальный баланс качества и охвата
50+ изображенийДиминishing returns, если только стиль не отличается высокой вариативностью
Качество > количество15 качественных изображений дадут лучший результат, чем 50 некачественных. Приоритеты:
  • Высокое разрешение (минимум 1024x1024)
  • Согласованный стиль во всех изображениях
  • Отсутствие водяных знаков, надписей и артефактов сжатия
  • Разнообразные сюжеты при сохранении единства стиля
Примеры датасетов
  • Обучение персонажей: фотографии человека с разными позами, выражениями лица и освещением. Избегайте изображений с посторонними людьми.
  • Обучение стилю: коллекция работ в одном стиле. Например, The Metropolitan Museum of Art Ukiyo-E Dataset предоставляет японские гравюры укиё-э, идеально подходящие для обучения художественному стилю.

Загрузка изображений

Перед обучением загрузите изображения, чтобы получить хостинговые URL. Используйте эндпоинт /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")
Сохраните возвращённые значения image_url — вы передадите их в эндпоинт обучения.

Обучение стиля

Базовый пример обучения

Отправьте URL изображений, чтобы запустить обучение:
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']}")

Типы обучения

Параметр type задаёт разумные значения по умолчанию, оптимизированные под ваш сценарий:
ТипЛучше всего подходит для
StyleХудожественные стили, визуальная эстетика
CharacterПерсональное сходство, консистентные персонажи
ObjectКонкретные предметы, продукты
DefaultУниверсальное обучение

Параметры

Обязательные параметры

name
string
required
Описательное имя для вашего пользовательского стиля.Пример: "Ukiyo-E Style", "Product Photos"
urls
array
required
Массив URL изображений для обучения. Больше изображений — лучше результат.

Необязательные параметры

model
string
default:"flux_dev"
Базовая модель для обучения:Модели изображений:
  • flux_dev — высокое качество, универсальная
  • flux_schnell — realtime-модель BFL
  • qwen — модель Alibaba
  • z-image — эффективная модель изображений от Alibaba
  • wan22 — только генерация изображений
Видеомодели:
  • wan — видеомодель Alibaba
type
string
default:"Default"
Категория обучения: Style, Object, Character или Default
trigger_word
string
Пользовательское слово для активации стиля в запросах. Если не указано, используется имя стиля.
Выбирайте уникальные триггерные слова, которые не встречаются в обычных запросах. Для триггеров из нескольких слов используйте подчёркивания: ukiyo_style
learning_rate
number
Контролирует интенсивность обучения. Высокие значения ускоряют обучение, но могут приводить к переобучению.Рекомендуемый диапазон: 0.0001 – 0.001
max_train_steps
integer
Максимальное число итераций обучения. Диапазон: 1–2000
batch_size
integer
Число изображений, обрабатываемых одновременно. Больший batch = быстрее обучение, но больше памяти.

Настройка расширенных параметров

Начинайте с параметров по умолчанию, задаваемых полем type — они хорошо работают в большинстве случаев. Меняйте эти значения, только если сталкиваетесь с конкретными проблемами:
Контролирует, насколько агрессивно модель адаптируется к вашим обучающим изображениям.
ЗначениеКогда использовать
0.0001 (ниже)Проблемы переобучения, сложные стили, маленькие датасеты
0.0003 (по умолчанию)Большинство сценариев
0.0005–0.001 (выше)Более быстрое обучение
Признаки, что стоит скорректировать:
  • Результаты выглядят как копии обучающих изображений → понизьте скорость
  • Влияние стиля слабое после обучения → слегка повысьте скорость
Как долго модель обучается на ваших изображениях.
Размер датасетаРекомендуемое число шагов
5–10 изображений300–500 шагов
15–30 изображений500–800 шагов
50+ изображений800–1500 шагов
Признаки, что стоит скорректировать:
  • Результаты слишком жёсткие, игнорируют запросы → уменьшите число шагов
  • Влияние стиля слабое → увеличьте число шагов
  • Сгенерированные изображения выглядят точно как обучающие данные → уменьшите число шагов (переобучение)
Итеративная настройкаЕсли первая попытка обучения не даёт нужного результата:
  1. Начните с корректировки max_train_steps (самое частое исправление)
  2. Затем попробуйте learning_rate, если одних только шагов недостаточно

Формат ответа

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

Отслеживание прогресса обучения

Обучение обычно занимает 5–15 минут. Опрашивайте Jobs API для проверки статуса:
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)
Задания обучения проходят через следующие состояния:
  1. queued — ожидает в очереди
  2. processing — активное обучение
  3. completed — обучение успешно завершено
  4. failed — при обучении произошла ошибка
  5. cancelled — задание отменено вручную

Использование обученного стиля

Как только обучение завершится, применяйте стиль при генерации изображений через параметр styles:
Владение стилями между приложением и APIAPI и веб-приложение Krea работают как отдельные пользовательские идентификаторы внутри вашего рабочего пространства. Стили приватны для пользователя, который их создал, поэтому:
  • Стили, обученные в приложении, недоступны через API, если ими не поделиться
  • Стили, обученные через API, недоступны в приложении, если ими не поделиться
Чтобы поделиться стилем со своим рабочим пространством (работает в обе стороны):
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)

Сила стиля

Параметр strength (0.0–1.0) контролирует, насколько сильно применяется ваш стиль:
СилаЭффект
0.5–0.7Мягкое влияние, сохраняется гибкость запроса
0.8–0.9Сильное применение стиля, рекомендуемая стартовая точка
0.95–1.0Максимальное следование стилю, может снизить отклик на запрос
Начните с силы 0.8 и корректируйте по результатам. Меньшие значения дают больше творческой свободы; большие — обеспечивают более строгое следование стилю.

Комбинирование нескольких стилей

Применяйте несколько стилей, добавляя их в массив styles:
"styles": [
    {"id": "style-id-1", "strength": 0.6},
    {"id": "style-id-2", "strength": 0.4}
]

Лучшие практики

  • Для оптимального результата используйте как можно больше качественных изображений
  • Обеспечьте согласованный стиль на всех обучающих изображениях
  • Включайте разнообразные сюжеты, сохраняя единство стиля
  • Избегайте водяных знаков, надписей и артефактов
  • Используйте изображения не ниже 1024x1024
  • Начинайте с параметров по умолчанию через поле type
  • Для стилей обычно достаточно 500–1000 шагов
  • Более низкие значения скорости обучения (0.0001–0.0003) предотвращают переобучение
  • Увеличьте число шагов, если стиль недостаточно выражен
  • Уменьшите число шагов, если результат слишком жёсткий
  • Используйте одно и то же триггерное слово, если планируете комбинировать несколько стилей
  • Триггерные слова автоматически подставляются в запрос при использовании стиля
  • Избегайте распространённых слов, встречающихся в обычных запросах
  • Для триггеров из нескольких слов используйте подчёркивания: my_custom_style