← 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. 役割の対比

観点RoboflowYOLO (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索を厚く水増しして認識率を底上げ。