cardstream
オープンソース Powered by Ximilar ベータ版

ライブ配信のためのカード識別、その決定版。 ブレイク、リップ(開封)、ライブショーのために。

cardstream はブレイク、リップ、ショーの映像を見守り、トレーディングカードがフレームに入った瞬間に識別します。カード名、セット、信頼度をライブで表示。カード追跡でライブショッピング配信を分析。配信の中身をもっと知りたい配信者のためのツールです。

識別できるもの

ポケモンカードゲームからマジック:ザ・ギャザリングまで

配信ごとにカテゴリを切り替えれば、エンジン全体がそれに追従します。検出、ゲート処理、識別呼び出しのすべてが適切なエンドポイントを指すようになります。マッチ結果には、カード名、セット、セットコード、カード番号、シリーズ、発行年が含まれます。

🃏

トレーディングカードゲーム

collectibles/v2/tcg_id
Ximilar 利用可能

現行からヴィンテージまでのTCGシングルカードを、配信映像からそのまま識別します。エンドポイントはイラスト、枠、テキストを読み取るため、視聴者が見ているのと同じ画像からカードを特定できます。セットシンボルを探したり、コレクターナンバーに目を凝らしたりする必要はありません。

  • ポケモンカードゲーム
  • マジック:ザ・ギャザリング
  • 遊戯王
  • ONE PIECEカードゲーム
  • ディズニー ロルカナ
  • デジモンカードゲーム
  • ドラゴンボールスーパー
  • Flesh and Blood
  • Star Wars Unlimited
  • Star Wars Destiny
  • MetaZoo
  • Riftbound
  • ヴァイスシュヴァルツ
  • ユニオンアリーナ
  • Force of Will
  • Grand Archive
  • ヴァンガード
  • Marvel Champions
  • Sorcery
  • ファイナルファンタジー
  • ガンダム
  • デュエル・マスターズ
  • Naruto Mythos
  • ホロライブ
  • Garbage Pail Kids
🏅

スポーツカード sport_id

ルーキー、パラレル、インサート、直筆サイン入りカードまで。野球、バスケットボール、アメリカンフットボール、サッカー、ホッケーなど主要スポーツ全般を対象に、どのカード、どのセット、どの年度かを正確に特定します。

近日公開
🧊

鑑定済みスラブ slab_id

鑑定ケースのラベルを読み取ります。PSA、BGS、CGCのスラブに入ったカードを、ケースを割ることなく識別します。

近日公開
📚

コミック comics_id

カードと同じ方法で表紙を識別します。静止した1フレームから、タイトル、号数、発行年を判別します。

近日公開
特定のプロバイダーに縛られない

専用の認識システムでも、自作のものでも接続可能

呼び出すかどうかを判断する処理は、すべて識別そのものの前段で行われます。検出、モーションゲート、同一カードゲートはいずれもローカルで動作し、プロバイダーに依存しません。呼び出し自体は差し替え可能な1ステップです。標準ではXimilar、あるいは専用のカード識別サービス、または自分で学習させて自前のハードウェアでホストするモデルでも構いません。

インターフェースはごく小さなものです。カードの切り抜き画像を入力すると、マッチ結果が返ってきます。IdentifyTargetを実装すれば、その前段にあるゲート、スロットル、しきい値はすべてこれまでどおり動作します。誰が応答するにせよ、異なるカード1枚につき切り抜き1回のままです。

# 独自の認識システム、同じエンジン
class HouseIdentifier(IdentifyTarget):
    def identify(self, crop_bgr):
        return my_service.match(crop_bgr)

# どちらの場合も、異なるカード1枚につき切り抜き1回
$ cardstream-web --detector rfdetr
なぜ cardstream.ai なのか

フレームごとではなく、カード1枚につき1回の呼び出し

配信の分析に必要な呼び出しを、本当に新しい情報をもたらすものだけに絞ること——それが狙いです。クローズドなカード認識 SaaS に代わるオープンソースの選択肢。間に入るプラットフォームも、シートライセンスもなし。あなたのハードウェアと APIキー、そしてフレーム内のカードが本当に新しいときだけ外部に問い合わせるステートマシンだけです。

54,000 → ~100
1時間あたりのAPI呼び出し

フレームごとに処理する素朴なパイプラインは、15 fps で1時間に 54,000 回の識別を実行します。cardstream は見せたカード1枚ごとに1回——同じ1時間でおよそ100回です。

540×
識別呼び出しの削減

同じ1時間、同じ映像、同じカードで、54,000 回に対しておよそ100回。モーションゲートと同一性ゲートはあなたのハードウェア上でローカルに動作し、本当に新しいカードがフレーム内で静止したときだけ呼び出しが発生します。

$0
プラットフォーム利用料

SaaS のサブスクリプションも、シート課金も、ロックインもありません。識別まで含めたスタック全体をセルフホストするか、Ximilar API に接続してください。

機能

カード配信ショーに必要なすべて

カードを一枚も見逃さない相方——Whatnot や Fanatics Live 形式のプラットフォームでのライブコマース販売、ボックスブレイク、カードショップの配信、コレクションのカタログ化に。カメラとカードが出会う場所ならどこでも。

⚡

フレームに入った瞬間にわかる

スキャンボタンも、待ち時間もありません。カードを見せるだけで、カード名、セット、信頼度が約0.5秒で配信上にライブ表示されます。

🎯

カード1枚につき1回の呼び出し

モーションゲートと埋め込みベースの同一性ゲートが、あなたの CPU 上でローカルに動作します。カードを静止させれば重複呼び出しはゼロ。カードを入れ替えれば、新しい呼び出しはちょうど1回です。

📡

あらゆる配信ソース

ウェブカメラ、動画ファイル、RTSP、RTMP、SRT——プル取得はもちろん、--listen で OBS から直接プッシュも可能。カスタム構成向けには WebSocket の JPEG フィードにも対応します。

🔌

あらゆる識別バックエンド

Ximilar の collectibles/v2 をそのまま使えるほか、同じエンジンを独自のカード認識器や、自分で学習・ホストしたものに向けることもできます。

🧠

独自モデルの持ち込み

ロケーターの重みは自社製——ファインチューニングした RF-DETR セグメンテーションモデルで、Apache-2.0 ライセンス、インストーラーが取得します。独自のエクスポートを使いたい場合は、ボックス検出器(RF-DETR、RT-DETRv2)にも対応しています。

🔓

オープンソース、セルフホスト

寛容なライセンスの Python パッケージひとつ。読んで、フォークして、自分のハードウェアで動かせます。あなたのキー、あなたのデータ、あなたのインフラで。

仕組み

API を呼ぶべきでないときを賢く見極める

配信と API の間にステートマシンが立ちます。すべてのフレームは DecisionCore——ローカルで動作するひとつのステートマシン——を通り、3つのローカルゲートが、唯一の API ステップが本当に必要かどうかを判断します。

1

検出

ローカル · API呼び出しなし

カードの四角形を見つけ、傾きを補正したきれいな切り抜きを作ります。ローカルのモーションゲートにより、動きあり・カードあり静止・空の3段階でスロットリングされます。

2

モーションゲート

ローカル · API呼び出しなし

軽量な平均フレーム差分。シーンが N フレーム静止して初めて、カードを詳しく見る価値があると判断します。まだ動いている? なら待ちます。

3

同一性ゲート

ローカル · API呼び出しなし

埋め込みの比較でひとつの問いに答えます——これはさっきと同じカードか? 同じカードなら、キャッシュ済みの結果を再送します。

4

識別

Ximilar · 1回の呼び出し

本当に新しいカードが静止したときだけ、Ximilar の識別が実行されます——非同期、デバウンス付きで、フレームループの外で。結果はライブで配信に返されます。

配信者、ブレイカー、ショップ向け

個人で配信していますか?

1人、カメラ1台、夜通しのブレイク。画面に映っているカードが何かを知るために、エンジニアチームは必要ありません。すでに行っている配信をつなぐだけで、cardstreamがライブで分析します。マーケットプレイスで販売していても、自分のチャンネルから直接販売していても同じです。

  • Whatnot
  • Fanatics Live
  • eBay Live
  • TikTok Shop
  • Twitch
  • YouTube Live
  • 自分のサイト

アカウントへのアクセスも、マーケットプレイスのAPIキーも、チャットへのボットも不要です。また、これらのプラットフォームとは一切提携していません。cardstreamが読み取るのは映像だけです。

01

すでにOBSから配信している場合

配信に送っている出力の隣に、もう1つ出力を追加するだけです。購入者にはこれまでとまったく同じ映像が届き、その映像のコピーがcardstreamに入って、テーブルに置かれたカードが通り過ぎる間に識別されます。下記のリスナーにはシステムのffmpegバイナリが必要です。2つ目の出力を用意せず、OBSの仮想カメラを通常のウェブカメラとしてcardstreamに読み込ませることもできます。

$ cardstream-web --listen \
      --source rtmp://0.0.0.0:1935/live
# OBSの2つ目の出力先をここに向ける
02

または、すでにテーブルにあるカメラ

俯瞰カメラ、キャプチャーカード、ウェブカメラ代わりのスマートフォンなど、リップ(開封)と公開に使っているものなら何でも構いません。分析はカメラの隣にあるマシン上で実行されるため、デフォルトで外部に送られるのはカード1枚につき切り抜き1枚だけです。

$ cardstream-web --source 0
# ウェブカメラ · ブラウザUIはlocalhost上
03

または、URLを持つものなら何でも

エンコーダー、スイッチャー、リストリーマー、離れた場所にある第2スタジオ。RTSP、RTMP、SRTのプルに加え、自作の機材向けにWebSocket JPEGフィードにも対応しています。

$ cardstream-web \
      --source rtsp://studio/stream1

ライブオーバーレイ

カードが静止した瞬間にカード名、セット、信頼度が表示されます。そのまま読み上げることも、シーンに合成して戻すこともできます。

すべてのカードを記録

映したすべてのカードの履歴を、各カードのサムネイルと配信に映っていた時間付きで残します。Ximilarアカウントに保存しておけば、何が売れたのか、どれだけの価値があったのかを翌朝に振り返れます。

個人でも無理なく使える

プラットフォーム手数料も、シートライセンスもありません。3時間の配信で発生する識別呼び出しはごくわずかで、フレームごとに呼び出すことはありません。

Cardstream Cloud

配信を保存して、あとから振り返る

cardstream はお使いのマシンで動き、既定では何も保存しません。フラグを1つ付けるだけで、見せたすべてのカードが、価格、配信に映っていた時間、識別に使われた切り抜きとともに、Ximilar アカウントのセッションにも保存されます。配信後に Ximilar アプリを開けば、その配信の価値を確認できます。

$ cardstream-web --price-stats \
    --ximilar-stream NEW
# セッション ID を表示し、配信中に保存します
Ximilar アプリに保存されたセッション。見せた商品の数、有料の API 呼び出し、市場価値、画面に映っていた平均時間、最も高額な商品と最も多かったセットが表示されています。

数字で見る配信

セッションごとに、見せた商品の数、有料の API 呼び出し、市場価値、画面に映っていた平均時間を表示。最も高額な商品と最も多かったセットも並びます。

すべてのカードを画像付きで

各行には、カード、セット、番号、価格、識別に使われた切り抜きが残ります。一覧は商品名やセットで検索でき、セッションは状態、プラットフォーム、日付で絞り込めます。

自分の記録に仕上げる

売れたカードに印を付け、メモを加え、誤ったマッチや価格を修正し、誤検出は削除できます。セッションに名前を付け、ロット番号、コスト、購入者など独自のメタデータも添えられます。

中断したところから再開

配信の途中で再起動した場合は、NEW の代わりにセッション ID を渡せば、セッションが閉じていても同じセッションで続きから記録されます。--ximilar-workspace を使えばチームのワークスペースに保存できます。

既定ではオフです。--ximilar-stream を付けなければ、マシンの外に出るのは識別の呼び出しだけです。保存するには Ximilar アカウントに Cardstream サービスが必要です。課金されるのはセッションの開始だけで、--no-ximilar-stream-images を付ければテキストだけを保存します。

クイックスタート

3ステップでゼロからライブ識別へ

1

インストール

仮想環境(venv)、リリース版wheel(チェックサム検証済み)、モデルの重み、そしてPATH上の2つのコマンドが揃います。スクリプトを使うか、PyPIから同じwheelをpip installするか(重みは別途ダウンロード)、リポジトリをクローンして自分でビルドしてください。DockerとWindowsについてはダウンロードページをご覧ください。

$ curl -fsSL https://raw.githubusercontent.com/Ximilar-com/cardstream/main/scripts/install.sh | sh
# その他のインストール方法 → cardstream.ai/download
$ pip install 'cardstream[client,onnx]'   # または: uv tool install 'cardstream[client,onnx]'
# wheelには重みが含まれません — cardstream.ai/models から2つのtarballを展開し、
# フラグでその場所を指定します:
$ cardstream-web --segmentor-model segmentation_model/onnx/model.onnx \
    --embed-model similarity_model/onnx/model.onnx
$ git clone https://github.com/Ximilar-com/cardstream && cd cardstream
$ ./scripts/build-from-source.sh --models
$ source .venv/bin/activate
2

識別システムを接続

標準でXimilar collectibles/v2に対応しています。システム全体で必要な認証情報は、ximilar.comで取得するキー1つだけです。あるいは、同じステップを独自の認識システムに向けることもできます。

$ export XIMILAR_API_KEY=your-key
3

カメラをカードに向ける

ウェブカメラでブラウザUIを開くか、配信映像を入力してください。RTSPでプルするか、OBSからRTMPで直接プッシュできます。一晩中1つのセットをブレイクするなら、あらかじめ指定しておけばエンドポイントが推測しなくて済みます。CRIの英語版ポケモンカードと指定すれば、間違える要素が3つ減ります。--game を指定するときは必ず --alphabet も指定してください。ゲームを事前指定すると、エンドポイント自身の文字体系検出がオフになります。--price-stats を加えると、各マッチにUSDの市場価格(中央値、価格帯、直近の販売価格)も付き、カード上と履歴の両方に表示されます。--ximilar-stream NEW を加えると、配信をXimilarアカウントに保存して、あとから振り返ることができます。

$ cardstream-web
# → http://127.0.0.1:8001 — カードをかざしてください

# 英語版ポケモンカード、1セット(CRI - Chaos Rising)、USD市場価格付き:
$ cardstream-web --game Pokemon --set-code CRI --alphabet latin --price-stats

オープンソース。セルフホスト。あなたの配信を、あなたのスタックで。

間に入るプラットフォームも、シートライセンスもありません。Ximilar API または独自の識別システムを接続すれば、cardstream はフレームごとではなく、異なるカードごとに1回だけ呼び出します。Whatnot でのブレイク、Fanatics Live 形式のショー、独自のライブコマース環境での配信——どんな形でも、今夜からお手持ちのハードウェアで cardstream を動かせます。