改訂モデルスタック報告 — YOLOX-Nano + mahjong_huge + ONNX Runtime Web

商用利用クリーンな OSS フルスタック (Apache 2.0 / CC BY 4.0 / MIT) で Mahjong Vision を構築する技術選定書
📅 改訂日: 2026-05-14 🎯 目的: クラウドファンディング・量産フェーズの法務リスク排除 📄 ライセンス: Apache 2.0 + CC BY 4.0 + MIT
← INDEX 設計ボトルネック 緑卓実測 + RF 判断 公開モデル素性 転移学習

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

結論: Mahjong Vision のモデル + 推論ランタイムを YOLOX-Nano (Apache 2.0) + mahjong_huge (CC BY 4.0) + FluffyStuff tiles (CC BY 4.0) + ONNX Runtime Web (MIT) のフル OSS スタックに改訂する。これにより:
  • YOLOv8 (Ultralytics AGPL-3.0) の 商用利用時のソース開示義務 を回避
  • Roboflow Hosted Inference (¥9,000/月) の 固定費を排除 (関連: Roboflow 契約判断レポート)
  • ブラウザ内推論 (ORT Web) で サーバーレス・プライバシー保護 な実機デモ実現
  • FluffyStuff の SVG タイルで 合成データ品質が向上 (現在の procedural モードから本物相当に)

1.1 1 行サマリ (帰属表示用)

検出モデル: YOLOX-Nano (Copyright (c) 2021-2022 Megvii Inc., Apache License 2.0)
学習データ: mahjong_huge / Riichi Mahjong Detection by riichimahjongdetection (CC BY 4.0)
改変: 2 つのデータセットを統合、アノテーション形式を YOLO から COCO に変換、
      クラス体系を日本リーチ麻雀標準 37 クラスに統一。本データセットを用いて検出モデルを学習。
牌画像: riichi-mahjong-tiles by Martin Persson (CC BY 4.0)
改変: SVG を 120×160 PNG にエクスポートして使用。
推論ランタイム: ONNX Runtime Web (Microsoft, MIT License)

2. 新スタック構成 (4 レイヤー)

L1: 検出モデル

YOLOX-Nano

Megvii Inc. が 2021 年に発表した anchor-free YOLO。Nano サイズで 0.9M params、416×416 入力、CPU 推論 25ms/枚目安。

Apache License 2.0
L2: 訓練データ

mahjong_huge / Riichi Mahjong Detection

Roboflow Universe で公開されている大規模リーチ麻雀検出データセット。複数の関連プロジェクトを統合し 37 クラスに統一。

CC BY 4.0
L3: 合成データ素材

FluffyStuff/riichi-mahjong-tiles

Martin Persson 原画ベースの SVG 麻雀牌。萬子・筒子・索子・字牌 + 赤牌 + 裏面の全種をカバー。

CC BY 4.0
L4: 推論ランタイム

ONNX Runtime Web

Microsoft 製のクロスプラットフォーム推論エンジン。WebAssembly + WebGL でブラウザ内 YOLO 推論を実現。

MIT License
ライセンスの組み合わせ可否: Apache 2.0 + CC BY 4.0 + MIT の組み合わせは 商用製品にそのまま配布可能。 必要なのは「クレジット表記の同梱」のみ (本ドキュメント Section 9 参照)。 AGPL-3.0 のような派生物ソース開示義務はゼロ

3. YOLOX-Nano 詳細

3.1 仕様

項目
公式リポジトリgithub.com/Megvii-BaseDetection/YOLOX
ライセンスApache License 2.0 (LICENSE)
AuthorMegvii Inc. (旷视科技, 北京)
パラメータ数約 0.9M (Nano), 8.9M (Small)
入力解像度416×416 (Nano 標準), 640×640 (Small)
アンカーanchor-free (NMS のみ)
論文"YOLOX: Exceeding YOLO Series in 2021" (arXiv:2107.08430)
COCO mAP@0.5:0.95 (Nano)25.8% (416×416), Tesla V100 で 65 FPS
ONNX エクスポート公式 tools/export_onnx.py でサポート

3.2 YOLOv8 (Ultralytics, AGPL-3.0) との比較

項目YOLOX-NanoYOLOv8n (Ultralytics)
ライセンスApache 2.0 (商用クリーン)AGPL-3.0 (商用配布で開示義務)
params0.9M3.2M
COCO mAP@0.5:0.9525.8%37.3%
商用ライセンス料無料$1,000+/月 (Enterprise plan)
ONNX export公式サポート公式サポート
商用配布OK (帰属表示のみ)AGPL-3.0 準拠が必要 (ソース開示 or Enterprise 購入)

3.3 訓練コマンド (実行例)

# 1. リポジトリ取得
git clone https://github.com/Megvii-BaseDetection/YOLOX.git
cd YOLOX
pip install -r requirements.txt
pip install -v -e .

# 2. データセットを COCO 形式に配置 (詳細は次セクション)
# datasets/mahjong/
# ├── annotations/
# │   ├── train.json
# │   └── val.json
# ├── train/  # 画像ファイル
# └── val/

# 3. exp ファイルを用意 (exps/example/mahjong_nano.py)
# 内容: depth=0.33, width=0.25, num_classes=37, data_dir="datasets/mahjong"

# 4. 訓練
python tools/train.py -f exps/example/mahjong_nano.py -d 1 -b 64 --fp16

# 5. ONNX エクスポート
python tools/export_onnx.py \
    --output-name yolox_nano_mahjong.onnx \
    -f exps/example/mahjong_nano.py \
    -c YOLOX_outputs/mahjong_nano/best_ckpt.pth

4. mahjong_huge / Riichi Mahjong Detection データセット

4.1 データセット情報

項目
提供者riichimahjongdetection
URLuniverse.roboflow.com/riichimahjongdetection/riichi-mahjong-detection
関連プロジェクトChinese Mahjong Detection (同提供者)
ライセンスCC BY 4.0 (帰属表示で改変・商用利用可)
クラス数37 クラス目安 (日本リーチ麻雀標準: 萬9 + 筒9 + 索9 + 字7 + 赤3 = 37)
取得方法Roboflow Universe → "Download Dataset" → YOLO/COCO 形式選択
Roboflow 課金不要 (Free tier でダウンロード可)

4.2 改変方針 (本プロジェクト用)

4.3 想定データ規模

ソース枚数
mahjong_huge / Riichi Mahjong Detection数千枚 (実 download 後に確定)
本プロジェクト M-League フレーム (マスク済)201 枚
合成データ (FluffyStuff SVG ベース)5,000 枚
合計1 万枚規模 = MVP 訓練に十分

5. FluffyStuff/riichi-mahjong-tiles SVG 素材

5.1 素材情報

項目
リポジトリgithub.com/FluffyStuff/riichi-mahjong-tiles
原画著作者Martin Persson (martinpersson.org)
ベクター化FluffyStuff および後継 contributors
ライセンスCC BY 4.0
形式SVG (Regular + Black variants)
カバー範囲萬子 1-9・筒子 1-9・索子 1-9・字牌 7・赤牌 (5m赤・5p赤・5s赤)・裏面

5.2 合成データ生成への組込

現状の scripts/generate-synthetic-mahjong.py は procedural モード (白枠 + 中央文字) で動作中。 FluffyStuff SVG を 120×160 PNG にエクスポートして synth/tiles/ に配置すると、 本物相当のタイル絵柄で訓練データを生成できる。

5.3 SVG → PNG エクスポートコマンド

# Inkscape CLI で一括エクスポート (Windows)
$tiles = Get-ChildItem "riichi-mahjong-tiles/Regular/*.svg"
foreach ($svg in $tiles) {
    $png = "synth/tiles/$($svg.BaseName).png"
    inkscape --export-type=png --export-width=120 --export-height=160 --export-filename=$png $svg.FullName
}

# または Python (cairosvg)
import cairosvg
import os
for svg in os.listdir("riichi-mahjong-tiles/Regular/"):
    cairosvg.svg2png(
        url=f"riichi-mahjong-tiles/Regular/{svg}",
        write_to=f"synth/tiles/{svg.replace('.svg', '.png')}",
        output_width=120, output_height=160,
    )

5.4 既存 procedural 素材との比較

項目procedural モード (現状)FluffyStuff SVG (改訂後)
視覚品質白枠 + 文字のみ本物相当の絵柄
萬子の漢数字「1m」等の英数字正しい漢数字 (一二三四...)
筒子の丸模様未再現正確な丸数表現
索子の竹模様未再現正確な竹本数表現
字牌の文字東南西北白發中装飾入りで本物相当
赤牌未対応5m/5p/5s 赤がある
裏面未対応あり
合成品質PoC レベル訓練データとして実用レベル

6. ONNX Runtime Web ランタイム

6.1 仕様

項目
提供者Microsoft
公式サイトonnxruntime.ai/docs/tutorials/web/
ライセンスMIT License
npm パッケージonnxruntime-web
バックエンドWebAssembly (SIMD), WebGL, WebGPU
対応ブラウザChrome / Edge / Firefox / Safari (WebGPU は限定)

6.2 ブラウザ内推論の利点

6.3 統合コード例 (TypeScript)

// docs-site/live-demo.html で動作させるコード骨格
import * as ort from "onnxruntime-web";

async function loadModel() {
    const session = await ort.InferenceSession.create(
        "/models/yolox_nano_mahjong.onnx",
        { executionProviders: ["wasm"] }
    );
    return session;
}

async function detect(session: ort.InferenceSession, imageData: ImageData) {
    // 1. 前処理 (416x416 リサイズ + 正規化)
    const tensor = preprocess(imageData);
    // 2. 推論
    const results = await session.run({ images: tensor });
    // 3. 後処理 (NMS, デコード)
    return postprocess(results.output);
}

6.4 Cloudflare Pages との相性

本プロジェクトはすでに mahjong-scorekeeping-docs.pages.dev を Cloudflare Pages で公開中。 ONNX Runtime Web は 静的ファイル (.onnx) として配信できる ので、 Pages にモデルをアップロードするだけで 無料でブラウザデモが公開可能:

docs-site/
├── index.html
├── live-demo.html          # 新規: ブラウザ推論デモ
└── models/
    └── yolox_nano_mahjong.onnx  # 約 3-5 MB

7. 旧スタック (YOLOv8 + Roboflow) との比較

7.1 全レイヤー比較表

レイヤー旧スタック新スタック (本書)改善
検出モデル YOLOv8m (Ultralytics) YOLOX-Nano (Megvii) ライセンス: AGPL-3.0 → Apache 2.0
モデル課金 Enterprise $1,000+/月 無料 ¥120,000/月 削減
訓練データ test-upsgd/mahjong-tiles (29 枚) mahjong_huge (数千枚) + 自前 規模 100 倍以上
訓練インフラ Roboflow Cloud Training ローカル GPU (RTX4090) で YOLOX 訓練 制御権 + コスト削減
推論インフラ Roboflow Hosted ($60/月) ONNX Runtime Web (無料・ブラウザ) サーバーレス・プライバシー強化
合成データ素材 procedural (白枠 + 文字) FluffyStuff SVG (本物相当) 合成品質大幅向上
合計年間運用費 ¥108,000-¥240,000+ ¥0 ¥108K-¥240K 節約
商用配布 AGPL-3.0 注意 (ソース開示 or Enterprise) クレジット表記のみ 法務リスク排除

7.2 ライセンス互換性マトリクス

組み合わせ互換性備考
Apache 2.0 (YOLOX) + CC BY 4.0 (データ・素材)✅ 完全互換帰属表示で OK
Apache 2.0 (YOLOX) + MIT (ORT Web)✅ 完全互換MIT は最寛容
Apache 2.0 + AGPL-3.0❌ 不互換AGPL は混合不可
商用 + 私的修正✅ Apache/MIT/CC BY 全て OK修正・販売・配布自由

8. 移行ステップ + 想定工数

8.1 移行 Phase 計画

Phase作業工数成果物
P1 YOLOX リポジトリ clone + Python 環境構築 2 時間 動作確認済 venv
P2 mahjong_huge データセット ダウンロード + COCO 変換 + クラス統一 4 時間 datasets/mahjong/
P3 FluffyStuff SVG → 120×160 PNG エクスポート + synth/tiles/ に配置 1 時間 34 種 PNG タイル
P4 合成データ 5,000 枚 再生成 (本物素材使用) 0.5 時間 synth/output-real/
P5 YOLOX-Nano 訓練 (RTX4090, 80 epochs) 4-6 時間 yolox_nano_mahjong.pth
P6 ONNX export + 量子化 1 時間 yolox_nano_mahjong.onnx (3-5 MB)
P7 ONNX Runtime Web デモページ作成 (docs-site/live-demo.html) 6-8 時間 ブラウザ推論デモ
P8 既存 detection スクリプト (analyze-still-frame 等) を Roboflow API から ONNX Runtime に切替 4 時間 サーバーレス化
P9 クレジット表記の各所への追加 + 法務確認 2 時間 LICENSE.txt 更新
合計24-30 時間 (3-4 営業日)

8.2 移行リスク

リスク確度緩和策
YOLOX-Nano が YOLOv8 より精度低い YOLOX-S にアップグレード可能 (params 8.9M, COCO mAP 40.5%)
mahjong_huge データセットがアクセス不能になる 初回ダウンロード時に ZIP をローカル保存 + 自前撮影で補強
ORT Web で WebGPU が一部ブラウザで動かない WASM へフォールバック (全ブラウザ対応)
SVG タイルが M-League 牌と微妙に違う 実物 M-League フレーム 201 枚を訓練データに混合済

9. クレジット表記 (CC BY 4.0 帰属表示)

本スタックを商用製品に組み込む際の必須クレジット表記:

Mahjong Vision uses the following open source components:

- YOLOX object detection framework
  Copyright (c) 2021-2022 Megvii Inc.
  Licensed under the Apache License, Version 2.0.
  Source: https://github.com/Megvii-BaseDetection/YOLOX

- mahjong_huge / Riichi Mahjong Detection dataset
  by riichimahjongdetection on Roboflow Universe.
  Licensed under CC BY 4.0.
  Modified: integrated multiple datasets, converted YOLO annotations to COCO,
  and unified class structure to 37-class Japanese Riichi Mahjong standard.
  Used to train the detection model.
  Source: https://universe.roboflow.com/riichimahjongdetection/riichi-mahjong-detection

- riichi-mahjong-tiles vector graphics
  by Martin Persson (FluffyStuff).
  Licensed under CC BY 4.0.
  Modified: exported SVG to 120×160 PNG and used as synthetic training data.
  Source: https://github.com/FluffyStuff/riichi-mahjong-tiles

- ONNX Runtime Web
  by Microsoft Corporation.
  Licensed under the MIT License.
  Source: https://onnxruntime.ai/docs/tutorials/web/

9.1 表記場所

注意: CC BY 4.0 は「帰属表示」が必須義務。 クレジットを省略・改変するとライセンス違反になる。 特にクラウドファンディング公開時に Makuake 本ページに記載漏れがないか法務チェックリストに追加必須。