← INDEX に戻る
🀄 YOLO と Roboflow の関係
麻雀牌AI で使っている2つの技術は「競合」ではなく データ → モデル の関係。一言でいうと
Roboflow = 教材(写真と正解ラベル)、YOLO = それで学ぶ生徒(検出モデル)。
1. 一言サマリ
Roboflow はラベル付き学習画像を用意・配布する基盤。
YOLO はその画像から学習して牌を検出するモデル。
層が違うので役割がぶつからず、Roboflow が用意したデータで YOLO が学習するという縦の関係になります。
📦 Roboflow(データ層)
- 実写の麻雀牌写真にバウンディングボックス + クラスを付けたデータセットを配布
- この案件:
riichi-mahjong-detection(Roboflow Universe, CC BY 4.0, 実写38クラス)
- YOLO形式でエクスポートできる(images + .txt + data.yaml)
- 使うのは学習時だけ。実行時は不要
🧠 YOLO(モデル層)
- "You Only Look Once" 物体検出モデル。この案件は Ultralytics の YOLO11n / YOLOv8n
- 画像から牌の位置(枠)と種類(1索など)を一発で推定
- 学習後 ONNX に書き出し、ブラウザ(onnxruntime-web)で推論
- iPhone の camera-ai がこれ。リアルタイム検出 + 13枠KEEP + 役判定
2. 全体パイプライン(データ → モデル → 推論)
flowchart LR
subgraph DATA["データ層 (学習素材)"]
RF["📦 Roboflow Universe
riichi-mahjong-detection
実写・38クラス・CC BY 4.0"]
SYN["🎨 自前 synth
索子/1索 低画質特化
34クラス (procedural)"]
end
RF -->|"YOLO形式 export
images + .txt + data.yaml"| DS[("datasets/
mahjong-raw")]
SYN -->|"34→38 remap 統合
merge-synth-into-yolov8.py"| DS
DS -->|"学習 (GTX1050)"| YOLO["🧠 Ultralytics YOLO
YOLO11n / YOLOv8n"]
YOLO -->|"export"| ONNX["best.onnx"]
ONNX -->|"配置"| CAM["camera-ai.html
onnxruntime-web"]
CAM --> IP["📱 iPhone Safari
リアルタイム検出
+ 13枠KEEP + 役判定"]
classDef rf fill:#ede9fe,stroke:#7c3aed,color:#5b21b6;
classDef yo fill:#cffafe,stroke:#0e7490,color:#155e75;
class RF,SYN,DS rf;
class YOLO,ONNX,CAM,IP yo;
📦 紫=データ層(Roboflow + synth)、🧠 水色=モデル層(YOLO)。
Roboflow と synth は別物で、Roboflowの実写を土台に synth で索子/1索を水増ししています。
3. 役割の対比
| 観点 | Roboflow | YOLO (YOLO11n / YOLOv8n) |
| 正体 | データセット基盤(アノテーション/ホスティング/配布) | 物体検出モデル(アルゴリズム) |
| 仕事 | ラベル付き学習画像を用意・配布 | 画像から牌を検出(枠 + クラス) |
| この案件の実体 | datasets/mahjong-raw(Roboflow Universe 由来, 実写38クラス) | Ultralytics YOLO。現在 yolo11n.pt で学習 |
| 形式 | YOLO形式で export(images + .txt + data.yaml) | 学習後 best.onnx に export |
| 実行時(推論) | 不要 | onnxruntime-web でブラウザ内推論 |
| たとえ | 📚 教材(写真と正解) | 🎓 生徒(教材で学ぶ) |
4. 学習時 と 実行時 で関わりが変わる
flowchart TB
subgraph TRAIN["🛠 学習時 (オフライン / GPU)"]
direction LR
RF2["📦 Roboflow データ"] --> TT["🧠 YOLO 学習"] --> OO["best.onnx"]
end
subgraph RUN["🌐 実行時 (端末内 / ブラウザ)"]
direction LR
OO --> ORT["onnxruntime-web"] --> DET["牌を検出"]
end
RF2 -. "実行時は使わない" .-x DET
classDef rf fill:#ede9fe,stroke:#7c3aed,color:#5b21b6;
classDef yo fill:#cffafe,stroke:#0e7490,color:#155e75;
class RF2 rf; class TT,OO,ORT,DET yo;
✅ ポイント: Roboflow は学習時だけ。デプロイ済みモデル(ONNX)も推論(onnxruntime-web)も
Roboflow には一切アクセスしません。プライバシー上もカメラ映像は端末内で完結します。
5. この案件特有: クラス順の食い違いと remap
Roboflow側と自前synthでクラスの並び順が別物だったため、混ぜる前に名前ベースで対応付け(remap)しています。
flowchart LR
A["🎨 synth ラベル
34クラス・スートメジャー順
(例: index 18 = 1索)"]
B["📦 Roboflow 側
38クラス・数字メジャー順
(例: index 6 = 1索)"]
A -->|"クラス名で一致付け
data.yaml の names を正
merge-synth-into-yolov8.py"| C["✅ 38クラス順に揃えて統合
1索: 18 → 6"]
B --> C
C --> D[("datasets/mahjong-raw/train
synthlq_*.jpg + .txt")]
索子・萬子・筒子はスート文字(s/m/p)が一意なので確実に対応。字牌(z)だけは
両者の 1z..7z が東〜中の標準順である前提で揃えています。
6. 用語ミニ辞典
- YOLO (You Only Look Once)
- 画像を一度の推論で「どこに・何が」あるかを出す物体検出モデル系。Ultralytics 実装の v8 / 11 を使用。
- Roboflow / Roboflow Universe
- 画像アノテーション・データセット管理の基盤。Universe は公開データセットの共有場所。ここから実写麻雀データを取得。
- YOLO形式
- 画像 + 同名の
.txt(1行=1物体: cls cx cy w h 正規化)+ クラス定義(data.yaml)。Roboflow が出力し YOLO が読む共通フォーマット。
- ONNX
- 学習済みモデルを実行環境非依存に書き出す形式。ブラウザの onnxruntime-web で動かすために YOLO から export。
- synth(合成データ)
- Roboflow由来ではない自前生成データ。タイル素材を背景に配置+低画質劣化し、索子/1索を厚く水増しして認識率を底上げ。