SD WebUI APIでECサイト商品写真を生成する3ステップ手順

SD WebUI APIでECサイト商品写真を生成する3ステップ手順

※本記事にはプロモーション(広告・アフィリエイトリンク)を含みます。

メルカリに出品した古着208件を自作ECサイトへ移行した際、背景がバラバラな写真や解像度が低い画像をAIで処理する仕組みが必要になった。Stable Diffusion WebUI はHTTP APIを公開しており、Python から呼び出して画像生成をバッチ処理できる。この記事では、WebUI のAPIモード起動から、VRAM が限られた環境で動く3ステップ高品質化ワークフロー、Apple Silicon でのエラー回避、LCM-LoRA による高速生成の設定値、バーチャル試着ツールのライセンス上の注意点まで書く。

SD WebUI を API モードで起動する

起動コマンドに --api を追加するだけで HTTP API が有効になる。

python launch.py --api --port 7860

起動後、http://localhost:7860/docs にアクセスすると Swagger UI が開き、エンドポイントの一覧とリクエスト・レスポンスのスキーマを確認できる。商品写真の処理で主に使うエンドポイントは次の3つ。

エンドポイント 用途
/sdapi/v1/txt2img テキストから画像を新規生成
/sdapi/v1/img2img 既存画像を元に再生成
/sdapi/v1/extra-single-image ESRGAN 等でアップスケール

Python から /sdapi/v1/txt2img を呼ぶ最小コード:

import requests, base64

payload = {
    "prompt": "white background, product photo, t-shirt, front view, studio lighting",
    "negative_prompt": "person, model, text, watermark, shadow",
    "width": 512,
    "height": 768,
    "steps": 20,
    "cfg_scale": 7,
    "sampler_name": "DPM++ 2M Karras",
}

r = requests.post("http://localhost:7860/sdapi/v1/txt2img", json=payload)
img_b64 = r.json()["images"][0]

with open("output.png", "wb") as f:
    f.write(base64.b64decode(img_b64))

レスポンスの images は base64 エンコードされた PNG のリスト。インデックス 0 が生成画像本体。Swagger UI から事前に動作確認しておくと、エラー時の切り分けがしやすい。

高解像度は 3 ステップに分ける

1024×1536 などの高解像度を Hires fix で一発生成しようとすると、VRAM 不足でエラーになる環境がある。次の3ステップに分けることで、限られた VRAM でも安定した品質を得られる。

ステップ 処理 主な設定値
1. txt2img 512×768 で下絵生成 Steps 20 / CFG 7 / DPM++ 2M Karras
2. ESRGAN 2倍アップスケール Real-ESRGAN x2plus
3. img2img ディテール強化 Denoising 0.35〜0.45

img2img のデノイズ強度は 0.45 を超えるとシルエットが崩れやすい。商品写真はシルエットを保ちたいので 0.35 から始めて調整する。

ESRGAN を API 経由で呼ぶ:

payload_up = {
    "image": img_b64,
    "upscaling_resize": 2,
    "upscaler_1": "R-ESRGAN 4x+",
}
r2 = requests.post("http://localhost:7860/sdapi/v1/extra-single-image", json=payload_up)
upscaled_b64 = r2.json()["image"]

アップスケール後を img2img に渡す:

payload_i2i = {
    "init_images": [upscaled_b64],
    "prompt": payload["prompt"],
    "negative_prompt": payload["negative_prompt"],
    "denoising_strength": 0.4,
    "width": 1024,
    "height": 1536,
    "steps": 20,
    "cfg_scale": 7,
    "sampler_name": "DPM++ 2M Karras",
}
r3 = requests.post("http://localhost:7860/sdapi/v1/img2img", json=payload_i2i)
final_b64 = r3.json()["images"][0]

Apple Silicon でのエラー回避

Mac(Apple Silicon)で 1024×1536 の生成を試みたとき、--opt-sdp-attention を指定した状態でバッファ確保のエラーが出た。

RuntimeError: MPS backend out of memory

起動オプションを --opt-split-attention に変更することで回避できた。Hires fix も同条件では通らなかったため、前述の3ステップ分割ワークフローに切り替えた。

python launch.py --api --opt-split-attention

--opt-sdp-attention は PyTorch の scaled dot-product attention を有効にする設定で、MPS バックエンドとの相性問題が出る可能性がある。MPS と CUDA はメモリアロケーションの実装が異なるため、この問題は MPS 固有と考えられる(環境によって異なる)。

LCM-LoRA で 6 ステップ高速生成

バリエーション確認など速度優先の場面では LCM-LoRA が有効。設定値が狭いレンジに収まっており、外れると品質が急激に落ちる。

パラメータ 設定値
サンプラー LCM
Steps 6
CFG scale 1.5
LoRA weight 1.0

プロンプトへの LoRA 指定形式:

<lora:lcm-lora-sdv1-5:1.0> white background, product photo, ...

CFG を 2 より上げると出力が破綻しやすい。Steps は 4〜8 が実用範囲。LCM-LoRA はベースモデルに対応したものを選ぶ必要があり、SD 1.5 系と SDXL 系では別ファイルになる。

通常の DPM++ 系サンプラーで 20 ステップかかるところを 6 ステップで処理できるため、多数のバリエーションを生成して後から選別するフローに向いている。商品の色違いや角度違いの確認に活用できる。

バーチャル試着への応用と注意点

アパレル商品の場合、商品単体写真だけでなく「モデル着用状態」の画像があると訴求力が上がる。IDM-VTON はこれを実現するツールで、商品画像とモデル画像の2枚を入力として着用合成画像を生成できる。

入力として必要なのは次の2枚:

  • 商品画像:白背景などで撮影したアパレル単体の写真
  • モデル画像:着用させたいポーズ・体型のモデル写真

実際に古着の商品写真を元にモデル着用カットを生成して試した。合成精度はモデル画像の姿勢と服のシルエットが近いほど高くなる傾向がある。

ライセンスの確認が必要:IDM-VTON は CC BY-NC-SA 4.0 で配布されており、コードもチェックポイントも非商用限定となる。商用ECサイトへの組み込みには現時点で制限がある。商用利用可能な代替を探す場合は Apache 2.0 のモデルが選択肢になる(FLUX Schnell で LoRA を学習する手順も参照)。

まとめ

SD WebUI を --api で起動し、txt2img(512×768)→ ESRGAN 2倍 → img2img(denoising 0.35〜0.45)の3ステップを組み合わせることで、VRAM が限られた環境でも商品写真を高解像度化できる。Apple Silicon では --opt-split-attention、LCM-LoRA は Steps 6 / CFG 1.5 がそれぞれ実際に動作した設定値。バーチャル試着の IDM-VTON はライセンスが CC BY-NC-SA 4.0 のため、商用利用前に確認が必要になる。

まず --api フラグ付きで WebUI を起動して http://localhost:7860/docs を開き、Swagger UI から手動でリクエストを投げて動作確認することから始めてほしい。コードへの移行はその後で十分間に合う。

この記事で触れたもの

よくある質問

Stable Diffusion WebUI を API モードで起動するコマンドは?

python launch.py --api --port 7860 で起動します。起動後 http://localhost:7860/docs で Swagger UI が開き、エンドポイントの一覧とリクエスト形式を確認できます。

Apple Silicon で画像生成時にメモリエラーが出る場合の対処は?

起動オプションを --opt-sdp-attention から --opt-split-attention に変更することで回避できます。Hires fix が通らない場合も、txt2img→ESRGAN→img2imgの3ステップ分割に切り替えると安定します。

LCM-LoRA で速く生成するときの CFG とステップ数は?

サンプラー LCM、Steps 6、CFG scale 1.5、LoRA weight 1.0 が実際に動作した設定値です。CFG を 2 より上げると画像が破綻しやすいため、この値を起点に調整してください。

IDM-VTON は商用ECサイトに使えますか?

IDM-VTON は CC BY-NC-SA 4.0 ライセンスで配布されており、コードもチェックポイントも非商用限定です。商用サイトへの組み込みには現時点で制限があるため、利用前にライセンスを必ず確認してください。