Whatnot や Fanatics Live の配信を解析する
cardstream は Whatnot にも Fanatics Live にも、その他どのマーケットプレイスにもログインしません。あなたがすでにそこへ送っている映像と同じものを、自分のマシン上で見て、テーブルに置かれたすべてのカードの名前を出します。ここでは、何もない状態からライブのオーバーレイが出るまでの道のりをまとめました。初回だけ、およそ15分の作業です。
カメラの近くにあるパソコン
macOS、Linux、Windows のいずれか。すでに OBS を動かしているマシンがあれば、それが最適です。解析はローカルで行われるので、映像をどこかへ送る必要はありません。
すでに送っている映像
OBS のシーン、ウェブカメラ、キャプチャーカード、エンコーダーのどれでも。cardstream は今あるものをそのまま取り込みます。配信(ショー)の組み直しは必要ありません。
Ximilar の APIキー
システム全体で唯一の認証情報で、あなたのマシンから外に出ることはありません。マーケットプレイスのアカウントもパスワードも不要で、チャットにボットが入ることもありません。
単体で動かしてみる
配信に組み込む前に、ノートパソコンのウェブカメラで動くことを確かめておきましょう。コマンドは3つだけです。
インストールする
このスクリプトは ~/.cardstream に仮想環境(venv)を作り、リリース版の wheel をチェックサムで検証し、モデルの重みを取得して、コマンドを PATH に追加します。wheel、Docker、ソースからのインストールはダウンロードページにあります。
$ curl -fsSL https://raw.githubusercontent.com/Ximilar-com/cardstream/main/scripts/install.sh | sh キーを設定する
識別はデフォルトで Ximilar の collectibles/v2 を通して行われます(代わりに自前のシステムを使うこともできます)。読み込まれる環境変数は XIMILAR_API_KEY ただ1つです。配信当日に再起動しても消えないよう、シェルのプロファイルに書いておきましょう。
$ export XIMILAR_API_KEY=your-key
ノートパソコンにカードをかざす
これで内蔵ウェブカメラを使ったブラウザ UI が開きます。カードを一瞬じっと構えてみてください。オーバーレイにステートマシンが判断している様子が表示され、続いて名前、セット、信頼度が出て、マッチ(一致)の横には識別呼び出しにかかった実時間が表示されます。これが製品のすべてです。このページの残りは、映像をどこから持ってくるかの話にすぎません。
$ cardstream-web # → http://127.0.0.1:8001
配信に向ける
下のルートから1つ選びます。どれを選ぶかは、たった1つの質問で決まります。デスクトップから配信していますか、それともスマートフォンからですか?
できないこと
公開されている Whatnot や Fanatics の再生ページに cardstream を向けること。自分の配信の送出ストリーム URL は存在せず、プレイヤーをスクレイピングすればプラットフォームの規約の問題に加えて数秒の遅延も生じます。以下のルートはすべて、マーケットプレイスより上流で映像を取り込みます。だからこそ cardstream には、各プラットフォームのアカウントもパスワードも APIキーも必要ないのです。
OBS の仮想カメラ
OBS は合成済みのシーンを、普通のウェブカメラとして OS に見せることができます。cardstream はそれを他のカメラとまったく同じように開きます。2回目のエンコードは不要、エンコーダーに追加の負荷はかからず、ffmpeg をインストールする必要もありません。
- OBS のコントロールドックで仮想カメラ開始をクリックします。
- それをウェブカメラのインデックスとして cardstream に指定します。インデックス 0 はたいてい内蔵カメラなので、仮想カメラは通常 1 です。自分のシーンが映るまで 0、1、2 と試してください。
$ cardstream-web --source 1 本番中ではなく、配信前に一度試しておいてください。macOS ではターミナルにカメラの許可が必要です。お使いのマシンで OpenCV が仮想デバイスを開けない場合は、どの環境でも使えるルート B を使ってください。
OBS からの第2出力
cardstream が自分のマシン上で待ち受け、OBS がそこへ映像のコピーを送ります。Whatnot や Fanatics にはこれまでとまったく同じものが届き続けます。これは送信先の追加であって、転送先の変更ではありません。
- まずリスナーを起動します。プッシュが来るまで待機し、切れても自動で再接続します。
- OBS の配信出力は1つしかないので、コピーは別の出力から送ります。
obs-multi-rtmpプラグインを使うか、設定 → 出力 → 録画 → カスタム出力 (FFmpeg) で、種類を URLに出力、URL をrtmp://127.0.0.1:1935/live、コンテナをflvにして、録画開始を押します。 - このルートはシステムの ffmpeg バイナリを呼び出します。先に
brew install ffmpegを実行してください。
$ cardstream-web --listen \ --source rtmp://0.0.0.0:1935/live
テーブル専用のカメラ
スマートフォンからアプリへ直接送っている場合、分岐させられる映像がありません。送出ストリームを追いかけるのはやめて、同じテーブルを映す cardstream 専用の視点を用意しましょう。真上からの2台目のウェブカメラでも、カメラの HDMI 出力をキャプチャーカードに入れる形でも構いません。
- カードを開封して見せる場所に、ウェブカメラまたはキャプチャーカードを向けます。
- そのカメラのそばにあるマシンで実行します。
$ cardstream-web --source 0 購入者と同じアングルである必要はありません。明るく寄った真上からの映像のほうが、圧縮されたマーケットプレイスの映像より、はるかによく識別できます。
URL があるものなら何でも
rtsp://、rtmp://、srt:// は直接取り込めますし、自作の機材なら ws:// の JPEG フィードにも対応します。再接続は上限付きのバックオフで行われるので、ブレイクの途中でスタジオ回線が切れても、手を触れずに復帰します。
- エンコーダーがすでに配信している URL を指定します。
- ブラウザのページは受動的なビューアーになります。ブラウザを開いていなくても解析は動き続けます。
$ cardstream-web \ --source rtsp://studio/stream1
今日の配信に合わせて調整する
デフォルト設定でも十分に働きますが、ブレイクはただのカメラ映像ではありません。何を開封するかは、たいてい開ける前からわかっているはずです。
何をブレイクするか教える
ゲームやセットをあらかじめ指定すると検索範囲が絞られ、呼び出しは速く、マッチは正確になります。ルールは1つだけ。--game を渡すときは必ず --alphabet も渡してください。ゲームを指定するとエンドポイント側の文字体系の自動判定が無効になり、ラテン文字が前提になるため、日本語のカードが英語版としてマッチしてしまいます。
$ cardstream-web --source 1 \ --game "Pokémon" --alphabet japanese --set-code M4
配信中に切り替える
次のロットが別のゲームになっても、何も再起動する必要はありません。カテゴリ、ゲーム、セットコード、文字体系、結果のしきい値、シャープネスのしきい値は、配信中でもブラウザの設定ダイアログから変更できます。それ以外(検出器、ゲート、解像度)は起動時に一度だけ読み込まれるので、今のうちに決めておきましょう。
ログは残し、ポートは閉じたまま
--split-results を付けると、繰り返し登場したカードをまとめずに、登場するたびに1行ずつ記録します。見せた順に並んだリストができるので、あとから注文と突き合わせるのに便利です。--host はデフォルトの 127.0.0.1 のままにしてください。このプロセスはあなたのキーを保持しており、ローカル UI には認証がないため、LAN から到達できる状態にしてはいけません。
$ cardstream-web --source 1 --split-results 配信を保存して、翌朝に振り返る
--ximilar-stream NEW を付けると、その記録の各行(カード、価格、配信に映っていた時間、識別に使われた切り抜き)が、配信している間に Ximilar アカウントのセッションへ保存されます。配信後は Ximilar アプリの Cardstream セクションで配信全体を確認できます。総額、最も高額なカード、画像付きのすべてのカードが並び、売れたカードに印を付けたり、誤ったマッチを修正したりするのもここで行います。配信の途中でクライアントが再起動したら、NEW の代わりに表示されたセッション ID を付けて起動し直せば、同じ配信の続きとして記録されます。チームのワークスペースに保存するには --ximilar-workspace を使います。
$ cardstream-web --source 1 --price-stats --ximilar-stream NEW # 再起動後: $ cardstream-web --source 1 --price-stats --ximilar-stream <session-id>
あとは配信するだけです。検出、動きの判定、同一性ゲートはすべてあなたのマシン上でローカルに動き、識別の呼び出しはテーブルに置いたカード1枚につき1回だけ発生します。1時間でおよそ100回。その1時間に含まれる 54,000 フレームと比べてみてください。計算の詳細はこちら。
実際に起きる6つのトラブル
仮想カメラが一覧にない
--source 0、1、2 と順に試してください。インデックスは OS が割り当てるものです。macOS では、システム設定 → プライバシーとセキュリティ でターミナルにカメラへのアクセスを許可してください。それでも OpenCV が開けない場合は、ルート B に切り替えてください。
「ffmpeg not found」と出る
システムのバイナリを呼び出すのは --listen と --ffmpeg だけです。インストール(brew install ffmpeg)して再実行してください。仮想カメラ、ウェブカメラ、単純な取り込みのルートには追加のものは何も必要ありません。
OBS で2つ目の配信を追加できない
これは cardstream ではなく OBS の制限です。配信出力は1つしかありません。obs-multi-rtmp プラグインを使えば本当の意味で送信先を追加できますし、ルート B のカスタム出力 (FFmpeg) を使った録画の方法なら、素の OBS のままで動きます。
カードは見つかるのに、まったくマッチしない
ほぼ確実に解像度か動きが原因です。送るフレームの中でカード番号が読める必要があります。OBS は 1080p のままにし、開封したカードを一瞬静止させ、それでもだめなときに初めて --result-threshold を緩めてください(デフォルトは 0.9。高くするほど弱いマッチも残り、1.0 ですべてを残します)。
同じカードが2回識別される
同一性ゲートが2つの映像の類似度を --similarity-threshold(デフォルト 0.85)未満と判定し、新しいカードとして扱ったためです。少し下げてみてください。カードを置いてからもう一度手に取るような場合は、代わりに --forget-after を上げてください。視界から2秒離れたカードは、仕様として新しいカードとして扱われます。
何も検出されない
--show-detection を付けて実行すると検出枠が描画されます。検出は常に動いていますが、デフォルトでは描画されないだけです。枠が出ない場合は、フレーム内でカードが小さすぎるか動きが速すぎます。枠は出るのにマッチしない場合は、上の項目を参照してください。