> ## 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) は、少数のサンプル画像を使って AI モデルに新しいビジュアルスタイルを教えるファインチューニング手法です。既存のモデルに新しい「スタイル重み」を注入することで、訓練を高速かつ効率的に行います。

このガイドでは、完全なワークフローを解説します:

<Steps>
  <Step title="訓練画像を準備する" icon="images">
    目的のスタイルを表現する高品質な画像をキュレーションしてアップロードします
  </Step>

  <Step title="訓練ジョブを送信する" icon="play">
    画像 URL と設定を指定して `/styles/train` に POST リクエストを送信します
  </Step>

  <Step title="進捗を監視する" icon="clock">
    返された `job_id` を使って訓練ジョブのステータスを追跡します
  </Step>

  <Step title="スタイルを使って生成する" icon="sparkles">
    訓練したスタイルを画像生成に適用します
  </Step>
</Steps>

***

## 訓練画像を準備する

### データセットのキュレーション

訓練画像の品質は結果に直接影響します。訓練タイプごとに異なる要件があります:

| タイプ           | 用途               | ヒント              |
| ------------- | ---------------- | ---------------- |
| **Style**     | 芸術的スタイル、ビジュアル美学  | 多様な被写体で一貫したスタイル  |
| **Character** | 個人の似姿、一貫したキャラクター | 多様なポーズ、表情、ライティング |
| **Object**    | 特定のアイテム、製品       | 複数の角度、一貫したオブジェクト |

### 画像は何枚必要?

品質は量よりもはるかに重要です。優れた画像の少数セットは、平均的な画像の大量セットに勝ります。

| データセットサイズ   | ガイダンス                        |
| ----------- | ---------------------------- |
| **5 枚**     | 最小限。シンプルで一貫したスタイルに有効です       |
| **10〜30 枚** | 推奨。品質とカバレッジの最良のバランス          |
| **50 枚以上**  | スタイルに高いバリエーションがない限り、効果は逓減します |

<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` - 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">
    同時処理する画像数。バッチが大きいほど訓練は速くなりますが、メモリを多く使用します。
  </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 ウェブアプリは、ワークスペース内で別々のユーザー ID として動作します。スタイルは作成したユーザーのプライベートなものであるため、以下の点に注意してください:

  * **アプリで訓練したスタイル** は共有されない限り 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>
