Skip to main content

概要

LoRA (Low-Rank Adaptation) は、少数のサンプル画像を使って AI モデルに新しいビジュアルスタイルを教えるファインチューニング手法です。既存のモデルに新しい「スタイル重み」を注入することで、訓練を高速かつ効率的に行います。 このガイドでは、完全なワークフローを解説します:

訓練画像を準備する

目的のスタイルを表現する高品質な画像をキュレーションしてアップロードします

訓練ジョブを送信する

画像 URL と設定を指定して /styles/train に POST リクエストを送信します

進捗を監視する

返された job_id を使って訓練ジョブのステータスを追跡します

スタイルを使って生成する

訓練したスタイルを画像生成に適用します

訓練画像を準備する

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

訓練画像の品質は結果に直接影響します。訓練タイプごとに異なる要件があります:
タイプ用途ヒント
Style芸術的スタイル、ビジュアル美学多様な被写体で一貫したスタイル
Character個人の似姿、一貫したキャラクター多様なポーズ、表情、ライティング
Object特定のアイテム、製品複数の角度、一貫したオブジェクト

画像は何枚必要?

品質は量よりもはるかに重要です。優れた画像の少数セットは、平均的な画像の大量セットに勝ります。
データセットサイズガイダンス
5 枚最小限。シンプルで一貫したスタイルに有効です
10〜30 枚推奨。品質とカバレッジの最良のバランス
50 枚以上スタイルに高いバリエーションがない限り、効果は逓減します
品質 > 量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 - BFL のリアルタイムモデル
  • qwen - Alibaba のモデル
  • z-image - Alibaba の効率的な画像モデル
  • wan22 - 画像生成のみ
動画モデル:
  • wan - Alibaba の動画モデル
type
string
default:"Default"
訓練カテゴリ: StyleObjectCharacter、または Default
trigger_word
string
プロンプトでこのスタイルを起動するためのカスタム単語。指定されない場合、スタイル名が使用されます。
典型的なプロンプトに現れない、一意なトリガーワードを選んでください。複数語のトリガーには下線を使用します: ukiyo_style
learning_rate
number
訓練強度を制御します。値が大きいほど訓練は速くなりますが、過学習の可能性があります。推奨範囲: 0.0001 - 0.001
max_train_steps
integer
最大訓練イテレーション数。範囲: 1〜2000
batch_size
integer
同時処理する画像数。バッチが大きいほど訓練は速くなりますが、メモリを多く使用します。

詳細パラメータのチューニング

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 パラメータを使って画像生成にスタイルを適用します:
アプリと API の間のスタイル所有権API と Krea ウェブアプリは、ワークスペース内で別々のユーザー ID として動作します。スタイルは作成したユーザーのプライベートなものであるため、以下の点に注意してください:
  • アプリで訓練したスタイル は共有されない限り 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