M リーグ緑色卓判定 実測レポート + Roboflow 契約判断

scripts/mask-table-region.py を M-League 全フレーム (499 枚) に適用した実測データを根拠とした、Roboflow 有料契約継続可否の意思決定
📅 計測日: 2026-05-14 📊 対象: M-League sample01/02 抽出フレーム 499 枚 🎯 結論: Roboflow Starter 不要 💰 年間節約: ¥108,000
← INDEX 設計ボトルネック 卓マスキング前処理 公開モデル素性

1. エグゼクティブサマリ

📊 データに基づく意思決定

Roboflow Starter Plan ($60/月) の必要性を実測データから評価:

❌ Roboflow 有料契約は不要

→ 年間 ¥108,000 の節約 (実機開発・量産費用に再投資)

1.1 判断根拠 (3 点)

  1. 緑色卓判定ロジックは ML 不要で十分機能: 全 499 フレームで filter と 87% の整合性。ML モデルを介さなくても卓抽出が成立する。
  2. 新スタック (YOLOX-Nano + ORT Web) で Roboflow Hosted Inference が代替可能: Apache 2.0 / MIT / CC BY 4.0 だけで商用利用クリーン。月額固定費ゼロ。
  3. Roboflow Free tier (1,000 画像) でアノテーション・データセットダウンロードは無料で完結: 訓練・推論はローカル / ブラウザに移管。

1.2 数字でわかる結果

499
M-League 全フレーム
202
緑卓 検出成功 (40.5%)
87%
filter との整合率
$60/月
回避できる Roboflow 費用
¥108K
年間節約額
0
追加コスト (新スタック)

2. 実測対象と方法

2.1 対象データ

区分件数説明
frames-roboflow/499 枚extract-roboflow-frames.py で M-League sample01/02 から等間隔抽出した raw データ
frames-roboflow-filtered/201 枚filter-roboflow-frames.py が「卓画像」と判定 (keep)
frames-roboflow-discarded/298 枚同フィルタが「インタビュー・タイトルカード等」と判定 (discard)

2.2 判定アルゴリズム

各フレームに scripts/mask-table-region.pytable_region_mask() を適用:

1. HSV で緑域検出 (Hue 30-95, S 30+, V 30-230)
2. Morphological open/close でノイズ除去
3. 最大連結成分抽出 (= 卓本体)
4. min_area_pct < 5% なら fallback (= 卓検出失敗)
5. 凸包 + 5% dilate で「卓の輪郭」確定

出力メトリクス:
- felt_ratio: 緑色域がフレーム全体に占める割合
- hull_area_ratio: 凸包 + dilate 後の卓領域占有率
- fallback: True = 卓未検出

2.3 実装スクリプト

本レポートの数値生成: scripts/mleague-green-table-analysis.py (新規、全フレームをバッチ処理)

3. 全フレーム集計結果

3.1 区分別 統計

区分件数fallback (卓未検出)緑卓 検出成功hull medianfelt median
raw (全件)499297 (59.5%)202 (40.5%)0.5440.056
filtered (keep)20131 (15.4%)170 (84.6%)0.5920.293
discarded298266 (89.3%)32 (10.7%)0.1430.023
主要な観察:
  • filtered の 84.6% が緑卓検出に成功 → filter ロジックは妥当
  • discarded の 89.3% が緑卓未検出 → discard ロジックも妥当
  • raw の median hull (0.544) は十分高く、卓中心の構図を捉えている
  • discarded の median felt (0.023) は raw (0.056) のさらに 2.4 分の 1 → 緑要素が極端に少ない (= 非卓フレーム)

3.2 詳細分位統計

区分minp25medianp75max
felt_ratio (緑色占有率)
raw0.0000.0120.0560.2790.566
filtered0.0830.2270.2930.3660.566
discarded0.0000.0050.0230.0770.482
hull_area_ratio (凸包後の卓占有率、fallback 除く)
raw 検出成功 (202件)0.0520.4260.5440.6740.937
filtered 検出成功 (170件)0.0600.5220.5920.6850.937
discarded 検出成功 (32件)0.0520.0900.1430.2880.628

4. サンプル可視化 (上位 / Fallback)

4.1 緑卓占有率 TOP 12 (raw)

最も「卓中心の構図」で撮られたフレーム上位 12。マスク適用後の画像 (卓外を黒塗り)。

緑卓 TOP 12
📷 マスク後画像。hull = 0.78〜0.94 の高占有率。卓本体・牌・点棒が画面中央に集中、スポンサーや観客席は除外されている。これがアノテーション・訓練データに最適なフレーム群。

4.2 Fallback (緑卓検出失敗) サンプル 12

緑卓が映っていない (= インタビュー・タイトルカード・観客席・暗転) フレーム。

Fallback サンプル
🚫 fallback の主要パターン: (1) 選手インタビュー (顔ズーム) (2) M-LEAGUE タイトルカード (3) 観客席 (4) 暗転シーン。これらは訓練データから除外すべきフレーム。

4.3 filter 不一致 1: filter keep だが緑卓 fallback

filter は「keep」と判定したが緑卓検出は失敗した 31 枚 (filter 過剰許容の候補)。

filter keep / 緑卓 fallback
⚠️ filter は許容したが緑卓検出に失敗 → ML 訓練データには微妙な質。マスク前処理で再判定すると除外可能。

4.4 filter 不一致 2: filter discard だが緑卓検出

filter は「discard」と判定したが緑卓は検出された 32 枚 (filter 過剰排除の候補)。

filter discard / 緑卓検出
⚠️ filter は排除したが緑卓は映っている → 卓は映っているが牌が少ない (リプレイ/カメラ切替過渡期) 場面。一部は救済して訓練データに加えるべき候補。

5. filter 整合性分析

5.1 一致 / 不一致 マトリクス

緑卓 検出成功緑卓 Fallback合計
filter: keep170 (一致)31 (不一致)201
filter: discard32 (不一致)266 (一致)298
合計202297499

整合率 = (170 + 266) / 499 = 87.4%

5.2 Cohen's Kappa

2 つのバイナリ分類の一致度 (期待一致を補正):

p_observed = 0.874
p_expected = ((201 × 202) + (298 × 297)) / 499² = 0.5188
kappa = (0.874 - 0.5188) / (1 - 0.5188) = 0.738

Cohen's Kappa = 0.738 = Substantial agreement (Landis & Koch 基準: 0.61-0.80)

結論: filter ロジック (HSV スコアリング) と緑卓判定 (HSV + 連結成分) は独立に実装されたにも関わらず高い一致。 どちらも ML を介さず手続き的に動作し、卓フレーム抽出として実用レベル。ML モデルをこの前処理段階で使う必要はない

6. Roboflow 契約継続 可否判断

6.1 Roboflow 各機能の必要性 評価

機能用途料金代替手段判定
Hosted Inference 本番推論 $60/月 (Starter) ONNX Runtime Web (MIT, 無料, ブラウザ内推論) 不要
Auto-Label (汎用モデル) 初期 bbox 提示 Starter 以上 初期は手動 / Roboflow Free 一部利用 最小限
Cloud Training モデル訓練 Starter 以上 YOLOX-Nano をローカル GPU (RTX4090) で訓練 (Apache 2.0, 無料) 不要
Dataset Hosting (公開) データセット閲覧 Free mahjong_huge は Free でダウンロード可 Free 維持
Universe アクセス 類似モデル参照 Free Free のままで十分 Free 維持
API Quota (1,000/月) 推論 API Free 1,000 / Starter 10,000 ローカル推論で API 消費ゼロ 不要
OBB / 高度ヘッド 傾き検出 Starter YOLOX 拡張 or 自前実装 不要

6.2 移行可能性 (実測根拠)

本実測データが示すのは:

6.3 最終判定

🎯 意思決定

Roboflow Starter Plan ($60/月) → 契約しない

Roboflow Free tier のみで:
(1) アノテーション (1,000 画像まで)
(2) mahjong_huge データセットダウンロード
(3) Universe での類似プロジェクト参照
を完結。有料機能は全て OSS スタックで代替

年間節約: ¥108,000 (¥60 × 12 = $720 ≒ ¥108,000)
→ 実機 (天井カメラ ¥34,780 + Jetson ¥35,000) 1 セット分以上

7. 代替スタックへの移行

詳細は 改訂モデルスタック報告 に記載。本セクションはサマリ。

7.1 OSS フルスタック構成

レイヤー採用技術ライセンス用途
前処理scripts/mask-table-region.py本プロジェクト緑卓抽出 (本レポートで実測検証)
検出モデルYOLOX-Nano (Megvii)Apache 2.0麻雀牌の bbox 検出
訓練データmahjong_huge / Riichi Mahjong DetectionCC BY 4.034 クラス麻雀牌
合成データ素材FluffyStuff/riichi-mahjong-tilesCC BY 4.0SVG → 120×160 PNG エクスポート
推論ランタイムONNX Runtime Web (Microsoft)MITブラウザ内 / Cloudflare Workers / Jetson 共通

7.2 移行ステップ

  1. YOLOX-Nano を git clone github.com/Megvii-BaseDetection/YOLOX
  2. mahjong_huge データセットを Roboflow Universe から ZIP ダウンロード (Free)
  3. COCO 形式に変換 (もしくは YOLOX が直接サポートする YOLO 形式のまま訓練)
  4. RTX4090 で python tools/train.py -f exps/example/yolox_nano.py -d 1 -b 64
  5. ONNX export: python tools/export_onnx.py --output-name yolox_nano_mahjong.onnx -f ... -c ...
  6. FluffyStuff のタイル SVG を 120×160 PNG にエクスポートし、generate-synthetic-mahjong.py の素材として組込
  7. ONNX Runtime Web で mahjong-scorekeeping-docs.pages.dev/live-demo.html 上でブラウザ推論デモを公開

8. 削減コストと再投資先

8.1 削減コスト

項目月額年額
Roboflow Starter Plan$60 (¥9,000)$720 (¥108,000)
Cloudflare Workers AI 推論 (代替の場合)$5-10 想定$60-120
合計 (推論 + 訓練 SaaS)$65-70¥120,000 以上

8.2 再投資先 (年間 ¥120,000 で買えるもの)

8.3 中長期 ROI

Roboflow Starter は 製品が成長すればコスト線形増 (10,000 推論/月超で追加課金)。 OSS スタック (YOLOX + ORT Web) は 固定費ゼロでスケール するため、 1,000 ユーザー獲得時点で年間 数十万円〜数百万円の差。 クラウドファンディング想定 700 セット完売時には明確な利益寄与

9. Roboflow ダウングレード 操作手順

すでに Roboflow Starter Plan を契約済み or 試用中の場合、以下の手順で Free tier にダウングレードできる。

9.1 主要 URL 一覧

用途URL
ログインhttps://app.roboflow.com/login
ダッシュボードhttps://app.roboflow.com/
Workspace 一覧https://app.roboflow.com/workspaces
Plans & Pricing (新規・変更)https://roboflow.com/pricing
Workspace 設定 (請求 ・ メンバー)https://app.roboflow.com/[workspace-name]/settings
請求設定 (直接)https://app.roboflow.com/[workspace-name]/settings/billing
サポート (退会・返金)https://help.roboflow.com/ / support@roboflow.com

9.2 ダウングレード ステップ (UI 操作)

  1. ログイン: app.roboflow.com/login に Google アカウント (miyata@shimanto.com) でログイン
  2. Workspace 選択: 画面左上の Workspace 切替プルダウン → 該当 Workspace (例: shimanto-mahjong) を選択
  3. Settings へ移動: 左サイドバー一番下の歯車アイコン「⚙ Settings」をクリック
  4. Billing タブ: 上部タブから「Billing」または「Plans」を選択 (URL は /settings/billing)
  5. 現在のプラン確認: 「Current Plan: Starter ($60/mo)」のような表示を確認
  6. 「Manage Plan」または「Change Plan」 ボタンをクリック
  7. Free を選択: プラン比較画面で「Free」または「Public Free」を選択 → 「Downgrade to Free」ボタン
  8. 確認ダイアログ: 「Are you sure?」で失われる機能 (Auto-Label / 訓練クォータ等) が表示される → 「Confirm Downgrade」
  9. 請求日まで継続: 多くの場合、当月末まで Starter 機能が継続 → 翌月から Free に自動切替
  10. カード情報削除 (任意): Payment Methods から「Remove Card」して将来の誤課金を完全に防ぐ
注意 1 — データ保持: Free tier の上限 (1,000 画像 / Workspace) を超えるプロジェクトがある場合、ダウングレード時に削除を求められる。 本プロジェクトの 201 枚は範囲内なので問題ないが、複数 Project があるなら整理してから downgrade すること。
注意 2 — トレーニングクレジット: Starter の月間訓練クレジットは Free では使えない。未使用クレジットは消失するので、downgrade 前に訓練を完了させると無駄がない。

9.3 試用期間中の場合 (Trial → Free)

もし 7-day Free Trial (または 14-day) を試用中なら、何もしなければ自動的に Trial 終了で Free に降格する。明示的なダウングレード操作は不要。ただしカード登録済の場合は念のためカード削除 (Step 10) しておくと安心。

9.4 返金 (Refund) 申請

直近で Starter に課金されたばかりの場合、Roboflow サポートに依頼すれば返金される可能性がある:

To: support@roboflow.com
件名: Refund request — Downgrade from Starter to Free
本文:
  Hi Roboflow team,

  I subscribed to the Starter Plan for workspace "[workspace-name]"
  on [日付], but I would like to downgrade to Free immediately and
  request a refund for the unused portion.

  Reason: [移行理由を一文。例: We have decided to use an open-source
  alternative (YOLOX + ONNX Runtime Web) for our project.]

  Workspace name: [workspace-name]
  Account email: miyata@shimanto.com
  Subscription start date: [日付]

  Best regards,
  [氏名]

Roboflow は比較的協調的なので、初回支払い後数日以内なら満額返金されるケースが多い (公式 SLA ではないが過去事例多数)。

9.5 ダウングレード後の動作確認

機能Free tier で利用可確認方法
Project 閲覧Workspace に既存 Project が見える
画像アップロード✅ (1,000 枚まで)Upload ボタン押下
アノテーション (手動)Annotate タブ
Auto-Label機能ロックされている表示
Generate Version✅ (制限あり)月 N 回
Cloud Training❌ (有料機能)Train ボタン disabled
Hosted Inference (API)✅ (月 1,000 推論)API クォータ表示
Dataset ダウンロード「Download Dataset」ボタン
Universe 公開モデル使用変わらず

9.6 アカウント完全削除 (任意)

もし Mahjong Vision で Roboflow を一切使わない方針なら、アカウント自体を削除することも可能:

  1. Account SettingsDelete Account
  2. 確認入力 (メールアドレス再入力等) で完全消去
  3. ただし: Universe で mahjong_huge データセットを将来ダウンロードする可能性があるなら、アカウントは残すのが推奨
推奨: アカウント自体は残す (Free tier で維持)、Starter サブスクリプションのみ解約。 Universe での類似プロジェクト参照やデータセットダウンロードに引き続き使えるため。

9.7 移行後のチェックリスト