本文へスキップ

APIで画像をレイヤー分解:Seedream 5.0 Flash と Pro の比較

1枚の画像をきれいなベース画像と最大16枚の透過PNGレイヤーへ。実際の結果、bboxの書き方、費用、レイヤーの組み戻し方を解説。

執筆
SpicyAPI Engineering
公開
読了時間
約 14 分
更新
LATE SHIFTのポスターをレイヤー別に分解した図。きれいな雨の町、ダイナー、タイトル、タグライン、赤いトレンチコートを着た女性、ADMIT ONEのチケットが、それぞれ金色の枠に入った状態

結論から: 画像1枚を送ると、修復されたベース画像(抜き出した要素を取り除き、背景を補完した画像)と、要素1つにつき1枚の最大16枚の透過PNGレイヤーが返ります。各レイヤーには name と boundingBox が付くので、レイヤーは元の位置に重ねられます。SpicyAPI はこれを Seedream 5.0 Flash でどの解像度でも出力画像1枚あたり $0.026、Seedream 5.0 Pro で画像1枚あたり $0.042(1K、1.5K)または $0.084(2K、auto)で実行できます。まずはFlashから始めてください。私たちのテストではアダルト入力のすべてのカテゴリを問題なく処理できました。Pro はより高く、2人の成人間による親密なシーンの画像を拒否します。

30秒でわかる要点

  • 出力: ベース画像はインデックス0、続いてレイヤーです。レイヤーは常に透過PNGで、output_format が変えるのはベース画像だけ(JPEGまたはPNG)です。
  • 上限と課金: 1回の実行で最大17画像(ベース画像+16レイヤー)。返ってきた画像に対して課金され、ベース画像も含みます。タスクが受理されると17画像分の金額を保留し、実際の枚数が判明した時点で差額を返金します。
  • プロンプトは任意。 書かないとモデルが主要な要素を選びます。書くと名前で指定したものを分解します。レイヤー数を指定する設定はありません。
  • 即座には終わらない: 両モデルとも1回の実行におよそ45〜100秒かかります。
  • 実行が終わったらファイルを自分のストレージにコピーしてください。

実際にどう見えるか

出発点は Seedream 5.0 Flash で生成したポスターでした。

LATE SHIFTのポスター。赤いトレンチコートを着た女性が、赤いネオンサインのダイナーの前で紙カップを持っている。上部にクリーム色のセリフ体タイトル、右下に黄色のADMIT ONEチケットの切り取り

Flash、プロンプトなしで

resolution を auto に設定し、プロンプトなしでポスターを送りました。返ってきたのは8画像で、ベース画像に加えて7レイヤー、すなわちダイナー、遠くの車、赤いネオンサイン、赤いトレンチコートを着た女性、タグライン、LATE SHIFTタイトル、ADMIT ONEチケットでした。

LATE SHIFT結果のレイヤーを分解した図。雨の町のベース画像と7レイヤー(ダイナー、車、ネオン、女性、タグライン、タイトル、チケット)が金色の枠で扇状に開かれ、右に番号付きリスト

ベース画像は雨の町で、ダイナーも女性も文字もすべて除去され、路面が補完されたものです。削除した要素の裏側にあったものをモデルが再描画するため、見かけ上は自然ですが、元のピクセルではありません。

Flashのベース画像。ダイナー、女性、文字がすべて削除され、背景が補完された雨の夜道

Flashのレイヤー2枚を単体で見たもの(エディタで見られる市松模様は単なる透過です):

単体で見た、透過版のLATE SHIFTタイトルレイヤー
単体で見た、赤いトレンチコートを着た女性の透過レイヤー

Pro、要素に名前をつける

Pro には同じポスターを、5つの要素を列挙したプロンプトと1.5Kで渡しました:

text
Separate the LATE SHIFT title, the tagline, the woman in the red trench coat,
the diner building and the ADMIT ONE ticket stub into their own layers

返ってきたのは6画像で、ベース画像と、Diner building、Tagline text、LATE SHIFT title、Woman in red trench coat、ADMIT ONE ticket stub という名前の5レイヤーでした。これをバウンディングボックスの順に重ねると、元のポスターが再現されます。

Pro結果のコンタクトシート。ベース画像と5枚の透過レイヤー(ダイナー、タグライン、タイトル、女性、チケット)

Pro は、以前作った香水の広告も処理できました。4つの要素(NOIR ÉTÉのヘッドライン、ボトル、金色のリボン、小さな「eau de parfum」の行)を名前で指定すると、5画像が返りました。空の黒い大理石台座がベース画像で、ほかに4レイヤーです。何も再生成せずに新しい背景で撮り直せる商品ショットになります。

Proの香水結果のコンタクトシート。空の黒い大理石ベース画像と4レイヤー(金色のリボン、ボトル、ヘッドライン、小さな文字)

Flash と Pro のどちらを使うか

FlashPro
出力1画像あたりの価格どの解像度でも $0.026$0.042(1K、1.5K)、$0.084(2K と auto)
デフォルトの resolutionauto1.5k
名前とバウンディングボックス全レイヤーに name と boundingBox全レイヤーに name と boundingBox
同じポスター、自動分解7レイヤー+ベース画像8レイヤー+ベース画像
アダルト向けの入力画像(NSFW、強めのテーマまで)受理受理
2人の成人間による親密なシーン受理拒否、課金なし
プロンプト任意。記載する場合は3文字以上任意

デフォルトでは Flash を選んでください。より安価で、ここでテストしたアダルト入力のすべてのカテゴリを問題なく処理できました。Flash の分解で必要な要素が欠け、かつ入力が2人の成人間による親密なシーンではない場合は Pro を選んでください(同じシーンを服で覆ったバージョンなら正常に分解されます)。Pro では拒否された画像は汎用的なエラー付きの失敗タスクとして返り、課金は発生しません。同じ画像を再試行せず、Flash に送ってください。どちらも名前とバウンディングボックスが得られるため、同じ仕事に適しています:

  • ポスターのヘッドラインを編集して戻す;
  • 背景だけを差し替え、製品や人物はそのまま残す;
  • 切り抜きをステッカーや再利用可能なデザイン素材に変える;
  • 1枚のイラストからパララックスシーンやアニメーションリグを作る。

欲しいものを名前で指定するプロンプトの書き方

プロンプトがなければ、モデルは何を要素とみなすか自分で決めます。プロンプトがあれば、あなたが列挙したものを分解します。結果を安定させたのは2つの習慣でした:

  • 関心のある要素はすべて名前で指定する。 短い名詞句で書いてください: "the LATE SHIFT title"、"the woman in the red trench coat"。省いたものはモデル次第なので、移動予定のものは必ず名前を付けます。要素を少なく頼むとレイヤーも少なくなり、上限は16枚です。
  • 領域を <bbox> で指し示す。 座標は x1 y1 x2 y2 の形式で、画像サイズにかかわらず、左上を原点とする0〜1000のグリッドに正規化されます:
text
Separate the title text <bbox>179 58 809 197</bbox> and the parrot
<bbox>330 274 641 991</bbox> into independent layers

これで、2つのものが似ている場合や重なっている場合も区別できます。1536×2048の画像で、水平方向に100〜900のボックスを取ると、154〜1382のピクセルを覆います。

費用

返ってきた画像ごとに課金され、ベース画像も1枚として数えられます。典型的なポスターや広告は3〜11画像を返します。Flash では $0.078〜$0.286、Pro を1.5Kで6画像実行すると 6 × $0.042 = $0.252 です。レイヤーごとにそれ以外の課金は発生しません。

受理時に保留される金額は17画像分の価格です。Flash では $0.442、Pro では1Kまたは1.5Kで $0.714、2Kまたは auto で $1.428 です。実行終了時に実際の枚数まで解放されます。Pro で確実に分解したい場合は resolution を 1k または 1.5k にしてください。auto は2Kの料金で課金されるため、Flash の例から auto のままコピペしたリクエストは Pro では2倍になります。

まず Playground で試す

  1. Flash のレイヤー分解ページ を開き、Playground タブの Form ビューのままにします。実行するには、残高のあるアカウントでサインインします。
  2. Input image の下にポスターや広告を追加します(ファイル、または Asset URL)。
  3. Prompt は空のままにしてモデルに主要な要素を選んでもらい、移動したい要素は名前で指定し、2つのものが似ていれば <bbox> を付けます。
  4. Flash では Resolution を auto のままにして、モデルを実行します。結果はレイヤー表示として開き、レイヤーの非表示、1枚または全部をzipでダウンロードする、表示中のスタックを1枚のPNGにエクスポートするといった操作ができます。サイトで生成した画像は、そのままレイヤー分解に送れます。
  5. 分解で何かが欠けていた場合は、同じ画像を Pro のページ で実行してください。auto は2Kで課金されるため、そこでは Resolution を 1k または 1.5k にします。

次はコードから実行する

Python SDK(pip install spicyapi)をインストールし、サーバー環境で SPICY_API_KEY を設定して、次を実行します:

python
import uuid
from spicyapi import SpicyClient, output_assets

client = SpicyClient()  # reads SPICY_API_KEY from the environment

task = client.create_task(
    model="bytedance/seedream-5.0-flash/layer-decomposition",
    input_data={
        "image_url": "https://your-cdn.example/poster.png",
        "prompt": "Separate the LATE SHIFT title, the tagline, the woman in the red trench coat, "
                  "the diner building and the ADMIT ONE ticket stub into their own layers",
        "resolution": "auto",
        "output_format": "png",
    },
    idempotency_key=str(uuid.uuid4()),
)

print("Resume task:", task["taskId"], flush=True)
final = client.wait_for_terminal(task["taskId"])  # a run takes about 45 to 100 seconds
if final["state"] != "succeeded":
    raise RuntimeError(f"{task['taskId']} ended as {final['state']}: {final.get('errorCode')}")
assets = output_assets(final)  # assets[0] is the base plate; copy the files to your own storage now
if not assets or any(a.get("pending") or a.get("unavailable") or not a.get("url") for a in assets):
    raise RuntimeError(f"Task {task['taskId']} has no ready output; check this task before a new run")

Pro には bytedance/seedream-5.0-pro/layer-decomposition を "resolution": "1.5k" で使います。元画像は10 MB以下にしてください。作成、待機、ダウンロード、再試行、コールバック本文は tasks ガイド と Python SDK リファレンス にあります。

Agent に実行させる

分割をアシスタントに任せたい場合、3つの公式ツールはいずれも価格を表示し、有料呼び出しの前に確認を求めます。

  • CLI。 同じ input オブジェクトを input.json に置いてから:

``bash spicyapi tasks create --model bytedance/seedream-5.0-flash/layer-decomposition --input-file input.json --wait ``

CLI ドキュメントも参照してください。npx @spicyapi/cli はインストールなしで動きます。

  • MCP サーバー。 アシスタントに MCP サーバー を追加して、次のように依頼します: "Split this poster into layers with Seedream 5.0 Flash and name the title, the tagline and the woman." spicyapi_task_create を呼び出し、価格の確認で停止します。続いて spicyapi_task_wait を呼びます。
  • Skill。 npx skills add spicyapi-ai/spicy-skill は Agent Skill をインストールし、コーディングアシスタントがフィールドを推測せずに最新のモデルスキーマを読むようにします。

レイヤーを組み戻す

レイヤーのPNGは、通常そのレイヤーが占める枠より解像度が高くなっています(例: 671×139 の枠に 1233×256 のPNG)。そこで各レイヤーを枠内にスケールしてから、zIndex の小さい順に描画してください。Flash とPro のどちらの出力でも同じ手順が使えます。

Pillow を使ったPython:

python
import io
import requests
from PIL import Image

def fetch(url):
    return Image.open(io.BytesIO(requests.get(url, timeout=60).content)).convert("RGBA")

assets = output_assets(final)                      # from the finished task above
if not assets or any(a.get("pending") or a.get("unavailable") or not a.get("url") for a in assets):
    raise RuntimeError(f"Task {task['taskId']} has no ready output; check this task before a new run")
canvas = fetch(assets[0]["url"])                   # base plate, zIndex 0

for a in sorted(assets[1:], key=lambda a: a["layer"]["zIndex"]):
    box = a["layer"].get("boundingBox")
    if not box:
        continue                                   # no position: place this one by hand
    x1, y1, x2, y2 = [round(v) for v in box]
    layer = fetch(a["url"]).resize((x2 - x1, y2 - y1), Image.LANCZOS)
    canvas.paste(layer, (x1, y1), layer)           # alpha-aware paste

canvas.convert("RGB").save("recomposed.jpg", quality=95)

ブラウザーの canvas なら同じことができます:

js
async function load(url) {
  const img = new Image();
  img.crossOrigin = "anonymous";
  img.src = url;
  await img.decode();
  return img;
}

const assets = task.data.output.assets;           // task: the finished task's JSON
const base = await load(assets[0].url);
const canvas = document.createElement("canvas");
canvas.width = base.naturalWidth;
canvas.height = base.naturalHeight;
const ctx = canvas.getContext("2d");
ctx.drawImage(base, 0, 0);

const layers = assets.slice(1).sort((a, b) => a.layer.zIndex - b.layer.zIndex);
for (const a of layers) {
  const box = a.layer.boundingBox;
  if (!box) continue;                              // no position: place this one by hand
  const [x1, y1, x2, y2] = box;
  ctx.drawImage(await load(a.url), x1, y1, x2 - x1, y2 - y1);
}

ポスターのタイトルを差し替えるには、そのレイヤーをループから外し、同じ枠に自分のテキストを描いて、ほかはそのまま残します。背景だけを変えるなら、assets[0] を同じサイズの自分の画像に差し替えます。

画像をレイヤー分解する別の方法

この検索で上位に出るページの多くは、クレジット建てで API のないブラウザーツールです。主なオープンソースの代替は Qwen-Image-Layered(Apache 2.0、20B パラメータ)で、GPU に自分でホストするか、fal 経由で出力1画像あたり $0.05 で呼び出せます(レイヤーごとに課金される場合、デフォルトの4レイヤー実行で約 $0.20 です)。そこではレイヤー数を指定でき(デフォルトは4)、名前も位置情報もない透明なキャンバス全体の画像が得られます。fal の安全チェッカーはデフォルトで有効で、フラグが立った入力には黒い画像を返します。レイヤー数を固定したい場合や自分でホストしたい場合に使ってください。トリミングされたレイヤー、名前と位置情報、要素を名指しするプロンプト、アダルト入力画像の受理が必要なら Seedream のレイヤー分解を選んでください。Flash でも画像1枚あたり $0.026 なので、画像単位では安く済みます。

FAQ

何枚のレイヤーが得られますか?

モデルが見つけた枚数だけ、最大16枚にベース画像を加えた数です。枚数を指定することはできません。制御したい要素は名前で列挙し、欠けているものがあれば名前(または <bbox>)を付けて再実行してください。再実行も新規実行と同じ扱いで課金されます。

SpicyAPI 以外で作られた画像も分解できますか?

はい。モデルページの制限内であれば、画像1枚なら何でも構いません。きれいに分解できるポスター素材を作るには、Seedream 5.0 Flash テキストから画像 から始めてください。

結果は再現できますか?

いいえ。シードがないので、分解は1回だけ実行し、ファイルを保存して、そのファイルを編集してください。

ここから先へ

すでにお好きなポスターを Flash のレイヤー分解 で試してください。何かが欠けていた場合は、同じ画像を Pro に通してください。

他の言語 English · 한국어 · Deutsch · Français · Español · Português (Brasil) · Русский · Italiano · Polski

実際に試してみる

支払いは実行した分だけ。プランもサブスクリプションもありません。

使用モデル:MiniMax H3 · ByteDance Seedance 2.0 Fast