> ## Documentation Index
> Fetch the complete documentation index at: https://www.krea.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Обучение пользовательскому стилю

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

export const HeroHeader = ({image, video, title, description}) => {
  return <div className="relative aspect-[2/1] h-[30vh] w-full rounded-lg overflow-hidden mb-8">
      {}
      {video && <video autoPlay muted loop playsInline className="absolute top-0 left-0 w-full h-full object-cover hidden md:block m-0" style={{
    zIndex: 1,
    objectPosition: "20% 20%"
  }}>
          <source src={video} type="video/webm" />
        </video>}

      {}
      <img src={image} alt="" className={`absolute top-0 left-0 m-0 w-full h-full object-cover ${video ? "md:hidden" : "block"}`} style={{
    zIndex: 1,
    objectPosition: "20% 20%"
  }} />

      {}
      <div className="absolute inset-0 bg-gradient-to-t from-black/70 via-black/30 to-black/10 flex flex-col justify-end p-8 dark:hidden" style={{
    zIndex: 2
  }}>
        <h1 className="text-4xl font-bold text-white m-0 drop-shadow-[0_2px_4px_rgba(0,0,0,0.5)]">
          {title}
        </h1>
        <p className="text-lg text-white/95 mt-2 drop-shadow-[0_1px_2px_rgba(0,0,0,0.5)]">
          {description}
        </p>
      </div>

      {}
      <div className="absolute inset-0 bg-gradient-to-t from-black/80 via-black/40 to-black/20 hidden dark:flex flex-col justify-end p-8" style={{
    zIndex: 2
  }}>
        <h1 className="text-4xl font-bold text-white m-0 drop-shadow-[0_2px_4px_rgba(0,0,0,0.5)]">
          {title}
        </h1>
        <p className="text-lg text-white/95 mt-2 drop-shadow-[0_1px_2px_rgba(0,0,0,0.5)]">
          {description}
        </p>
      </div>
    </div>;
};

<HeroHeader image="https://s.krea.ai/docs-lora.webp" title="Обучение пользовательскому стилю (LoRA)" description="Обучите пользовательский стиль на собственных изображениях, чтобы генерировать AI-арт с согласованной визуальной эстетикой." />

## Обзор

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

Это руководство описывает полный рабочий процесс:

<Steps>
  <Step title="Подготовьте изображения для обучения" icon="images">
    Отберите и загрузите качественные изображения, представляющие желаемый стиль
  </Step>

  <Step title="Отправьте задание на обучение" icon="play">
    Отправьте POST-запрос на `/styles/train` с URL изображений и конфигурацией
  </Step>

  <Step title="Отслеживайте прогресс" icon="clock">
    Следите за статусом задания обучения с помощью возвращённого `job_id`
  </Step>

  <Step title="Генерируйте в своём стиле" icon="sparkles">
    Применяйте обученный стиль при генерации изображений
  </Step>
</Steps>

***

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

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

Качество обучающих изображений напрямую влияет на результат. У разных типов обучения разные требования:

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

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

Качество важнее количества. Небольшой набор превосходных изображений даст лучший результат, чем большой набор посредственных.

| Размер датасета       | Рекомендации                                                                |
| --------------------- | --------------------------------------------------------------------------- |
| **5 изображений**     | Минимально работоспособный. Подходит для простых, консистентных стилей      |
| **10–30 изображений** | Рекомендуется. Оптимальный баланс качества и охвата                         |
| **50+ изображений**   | Диминishing returns, если только стиль не отличается высокой вариативностью |

<Warning>
  **Качество > количество**

  15 качественных изображений дадут лучший результат, чем 50 некачественных. Приоритеты:

  * Высокое разрешение (минимум 1024x1024)
  * Согласованный стиль во всех изображениях
  * Отсутствие водяных знаков, надписей и артефактов сжатия
  * Разнообразные сюжеты при сохранении единства стиля
</Warning>

<Info>
  **Примеры датасетов**

  * **Обучение персонажей**: фотографии человека с разными позами, выражениями лица и освещением. Избегайте изображений с посторонними людьми.
  * **Обучение стилю**: коллекция работ в одном стиле. Например, [The Metropolitan Museum of Art Ukiyo-E Dataset](https://www.kaggle.com/datasets/kengoichiki/the-metropolitan-museum-of-art-ukiyoe-dataset) предоставляет японские гравюры укиё-э, идеально подходящие для обучения художественному стилю.
</Info>

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

Перед обучением загрузите изображения, чтобы получить хостинговые URL. Используйте эндпоинт `/assets`:

<CodeGroup>
  ```python Python theme={null}
  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")
  ```

  ```bash cURL theme={null}
  # Upload a single image
  curl -X POST https://api.krea.ai/assets \
    -H "Authorization: Bearer YOUR_API_TOKEN" \
    -F "file=@/path/to/image.jpg" \
    -F "description=Training image"

  # Response: {"id": "...", "image_url": "https://..."}
  ```
</CodeGroup>

<Tip>
  Сохраните возвращённые значения `image_url` — вы передадите их в эндпоинт обучения.
</Tip>

***

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

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

Отправьте URL изображений, чтобы запустить обучение:

<CodeGroup>
  ```python Python theme={null}
  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']}")
  ```

  ```bash cURL theme={null}
  curl -X POST https://api.krea.ai/styles/train \
    -H "Authorization: Bearer YOUR_API_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "Ukiyo-E Style",
      "urls": [
        "https://krea.ai/assets/img1.jpg",
        "https://krea.ai/assets/img2.jpg",
        "https://krea.ai/assets/img3.jpg"
      ],
      "model": "flux_dev",
      "type": "Style",
      "max_train_steps": 500
    }'
  ```
</CodeGroup>

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

Параметр `type` задаёт разумные значения по умолчанию, оптимизированные под ваш сценарий:

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

### Параметры

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

<ParamField path="name" type="string" required>
  Описательное имя для вашего пользовательского стиля.

  **Пример:** `"Ukiyo-E Style"`, `"Product Photos"`
</ParamField>

<ParamField path="urls" type="array" required>
  Массив URL изображений для обучения. Больше изображений — лучше результат.
</ParamField>

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

<ParamField path="model" type="string" default="flux_dev">
  Базовая модель для обучения:

  **Модели изображений:**

  * `flux_dev` — высокое качество, универсальная
  * `flux_schnell` — realtime-модель BFL
  * `qwen` — модель Alibaba
  * `z-image` — эффективная модель изображений от Alibaba
  * `wan22` — только генерация изображений

  **Видеомодели:**

  * `wan` — видеомодель Alibaba
</ParamField>

<ParamField path="type" type="string" default="Default">
  Категория обучения: `Style`, `Object`, `Character` или `Default`
</ParamField>

<ParamField path="trigger_word" type="string">
  Пользовательское слово для активации стиля в запросах. Если не указано, используется имя стиля.

  <Tip>Выбирайте уникальные триггерные слова, которые не встречаются в обычных запросах. Для триггеров из нескольких слов используйте подчёркивания: `ukiyo_style`</Tip>
</ParamField>

<Accordion title="Расширенные параметры" icon="sliders">
  <ParamField path="learning_rate" type="number">
    Контролирует интенсивность обучения. Высокие значения ускоряют обучение, но могут приводить к переобучению.

    **Рекомендуемый диапазон:** 0.0001 – 0.001
  </ParamField>

  <ParamField path="max_train_steps" type="integer">
    Максимальное число итераций обучения. Диапазон: 1–2000
  </ParamField>

  <ParamField path="batch_size" type="integer">
    Число изображений, обрабатываемых одновременно. Больший batch = быстрее обучение, но больше памяти.
  </ParamField>
</Accordion>

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

Начинайте с параметров по умолчанию, задаваемых полем `type` — они хорошо работают в большинстве случаев. Меняйте эти значения, только если сталкиваетесь с конкретными проблемами:

<AccordionGroup>
  <Accordion title="Скорость обучения" icon="gauge">
    Контролирует, насколько агрессивно модель адаптируется к вашим обучающим изображениям.

    | Значение                  | Когда использовать                                       |
    | ------------------------- | -------------------------------------------------------- |
    | **0.0001** (ниже)         | Проблемы переобучения, сложные стили, маленькие датасеты |
    | **0.0003** (по умолчанию) | Большинство сценариев                                    |
    | **0.0005–0.001** (выше)   | Более быстрое обучение                                   |

    **Признаки, что стоит скорректировать:**

    * Результаты выглядят как копии обучающих изображений → понизьте скорость
    * Влияние стиля слабое после обучения → слегка повысьте скорость
  </Accordion>

  <Accordion title="Шаги обучения" icon="shoe-prints">
    Как долго модель обучается на ваших изображениях.

    | Размер датасета   | Рекомендуемое число шагов |
    | ----------------- | ------------------------- |
    | 5–10 изображений  | 300–500 шагов             |
    | 15–30 изображений | 500–800 шагов             |
    | 50+ изображений   | 800–1500 шагов            |

    **Признаки, что стоит скорректировать:**

    * Результаты слишком жёсткие, игнорируют запросы → уменьшите число шагов
    * Влияние стиля слабое → увеличьте число шагов
    * Сгенерированные изображения выглядят точно как обучающие данные → уменьшите число шагов (переобучение)
  </Accordion>
</AccordionGroup>

<Tip>
  **Итеративная настройка**

  Если первая попытка обучения не даёт нужного результата:

  1. Начните с корректировки `max_train_steps` (самое частое исправление)
  2. Затем попробуйте `learning_rate`, если одних только шагов недостаточно
</Tip>

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

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

***

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

Обучение обычно занимает 5–15 минут. Опрашивайте Jobs API для проверки статуса:

<CodeGroup>
  ```python Python theme={null}
  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)
  ```

  ```bash cURL theme={null}
  # Check job status (repeat until completed)
  curl -X GET https://api.krea.ai/jobs/YOUR_JOB_ID \
    -H "Authorization: Bearer YOUR_API_TOKEN"
  ```
</CodeGroup>

<Accordion title="Значения статуса задания" icon="diagram-project">
  Задания обучения проходят через следующие состояния:

  1. **queued** — ожидает в очереди
  2. **processing** — активное обучение
  3. **completed** — обучение успешно завершено
  4. **failed** — при обучении произошла ошибка
  5. **cancelled** — задание отменено вручную
</Accordion>

***

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

Как только обучение завершится, применяйте стиль при генерации изображений через параметр `styles`:

<Warning>
  **Владение стилями между приложением и API**

  API и веб-приложение Krea работают как отдельные пользовательские идентификаторы внутри вашего рабочего пространства. Стили приватны для пользователя, который их создал, поэтому:

  * **Стили, обученные в приложении**, недоступны через API, если ими не поделиться
  * **Стили, обученные через API**, недоступны в приложении, если ими не поделиться

  Чтобы поделиться стилем со своим рабочим пространством (работает в обе стороны):

  ```bash theme={null}
  curl -X POST https://api.krea.ai/styles/YOUR_STYLE_ID/share/workspace \
    -H "Authorization: Bearer YOUR_API_TOKEN"
  ```
</Warning>

<CodeGroup>
  ```python Python theme={null}
  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)
  ```

  ```bash cURL theme={null}
  # Generate with style
  curl -X POST https://api.krea.ai/generate/image/krea/krea-2/medium \
    -H "Authorization: Bearer YOUR_API_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{
      "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": "w29t6pvy0",
          "strength": 0.95
        }
      ]
    }'

  # Then poll /jobs/{job_id} for the result
  ```
</CodeGroup>

### Сила стиля

Параметр `strength` (0.0–1.0) контролирует, насколько сильно применяется ваш стиль:

| Сила     | Эффект                                                        |
| -------- | ------------------------------------------------------------- |
| 0.5–0.7  | Мягкое влияние, сохраняется гибкость запроса                  |
| 0.8–0.9  | Сильное применение стиля, рекомендуемая стартовая точка       |
| 0.95–1.0 | Максимальное следование стилю, может снизить отклик на запрос |

<Tip>
  Начните с силы `0.8` и корректируйте по результатам. Меньшие значения дают больше творческой свободы; большие — обеспечивают более строгое следование стилю.
</Tip>

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

Применяйте несколько стилей, добавляя их в массив `styles`:

```python theme={null}
"styles": [
    {"id": "style-id-1", "strength": 0.6},
    {"id": "style-id-2", "strength": 0.4}
]
```

***

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

<AccordionGroup>
  <Accordion title="Подбор изображений" icon="images">
    * Для оптимального результата используйте как можно больше качественных изображений
    * Обеспечьте согласованный стиль на всех обучающих изображениях
    * Включайте разнообразные сюжеты, сохраняя единство стиля
    * Избегайте водяных знаков, надписей и артефактов
    * Используйте изображения не ниже 1024x1024
  </Accordion>

  <Accordion title="Конфигурация обучения" icon="sliders">
    * Начинайте с параметров по умолчанию через поле `type`
    * Для стилей обычно достаточно 500–1000 шагов
    * Более низкие значения скорости обучения (0.0001–0.0003) предотвращают переобучение
    * Увеличьте число шагов, если стиль недостаточно выражен
    * Уменьшите число шагов, если результат слишком жёсткий
  </Accordion>

  <Accordion title="Триггерные слова" icon="wand-magic-sparkles">
    * Используйте одно и то же триггерное слово, если планируете комбинировать несколько стилей
    * Триггерные слова автоматически подставляются в запрос при использовании стиля
    * Избегайте распространённых слов, встречающихся в обычных запросах
    * Для триггеров из нескольких слов используйте подчёркивания: `my_custom_style`
  </Accordion>
</AccordionGroup>
