合成データ品質検証レポート — 500 枚 procedural 生成サイクル
scripts/generate-synthetic-mahjong.py の本番規模 (500 枚) 出力に対して、クラス均等性 / bbox 統計 / occlusion / はみ出しを定量検証
作成日: 2026-05-14
規模: 500 枚 / 15,821 bbox
生成時間: 126 秒
判定: 合格
← INDEX
合成データ生成ガイド
設計ボトルネック
公開モデル素性
類似モデル
転移学習
卓上マスキング
1. エグゼクティブサマリ
結論:
procedural タイル素材を用いた 500 枚生成サイクルは 合格。
クラス均等性 (CV=0.046, chi2=34.05) は理想に極めて近く、
画像あたり中央値 32 ラベル、重大なはみ出しは 0 件。
YOLO ファインチューンのウォームスタート用データとして即時使用可能。
次は 5,000 枚スケールアップ + 実物データとの 1:10 mix。
bbox 総数
15,821
31.6 / 画像 (mean)
クラス均等性 (CV)
0.046
目標 < 0.10 達成
合格判定の根拠:
クラス均等性 CV=0.046 (< 0.10), はみ出し strict=0%, IoU>0.5 オーバーラップは画像あたり平均 0.55 ペア (occlusion 表現として健全), bbox は normalized 領域 (median 0.0066) に綺麗に収まっており YOLO 学習可能な品質。
2. 生成パラメータと所要時間
2.1 実行コマンド
phase0/.venv/Scripts/python.exe scripts/generate-synthetic-mahjong.py \
--n-images 500 --procedural --out-dir synth/output-500/ \
--n-tiles-min 13 --n-tiles-max 50 --img-size 1280x720
2.2 パラメータ
| 項目 | 値 | 備考 |
| 枚数 | 500 | 本番規模 (前 PoC は 10) |
| 画像サイズ | 1280 × 720 | M-League フレームと同等 |
| 1 画像のタイル数 | 13 – 50 | 手牌〜河+手牌の規模 |
| クラス数 | 34 | m/p/s × 9 + 字牌 7 |
| 背景バリエーション | 10 | 緑フェルト/木目/暗部の自動生成 |
| タイル素材 | procedural (34 種) | 実物 PNG 未整備のためフォールバック |
| seed | 42 | 再現可能 |
2.3 所要時間
| 区分 | 計測値 | 目安 | 判定 |
| 500 枚 wall-clock | 126 秒 (2 分 6 秒) | ≤ 5 分 | 合格 |
| 1 枚あたり | ~0.25 秒 | ≤ 0.6 秒 | 合格 |
| 5,000 枚推定 | ~21 分 | ≤ 50 分 | スケール可 |
スケーリングノート:
126 秒 / 500 枚 = 252 ms/枚。5,000 枚なら 21 分、50,000 枚でも 3.5 時間で計算可能。
実物データのアノテーションが 1 枚 1〜3 分かかることを思い出すと、合成側は 200 倍速。
3. 品質指標 (1) クラス分布 / 均等性
3.1 標本統計
| 指標 | 値 | 合格閾値 | 判定 |
| クラス数 | 34 | 34 | OK |
| 1 クラスあたり期待値 | 465.32 | ≥ 200 | OK |
| 標準偏差 (count) | 21.59 | ≤ 100 | OK |
| 変動係数 CV = σ/μ | 0.0464 | ≤ 0.10 | OK |
| Chi-square (vs uniform) | 34.05 | ≤ df × 2 = 66 | OK |
| 最小クラス | 2m = 419 | ≥ 期待値 × 0.5 | OK |
| 最大クラス | Wh (白) = 520 | ≤ 期待値 × 1.5 | OK |
解釈:
各クラスは均等に近く出現 (期待 465 に対し range 419-520)。
Chi-square 34.05 は自由度 33 (= 34-1) の chi2 分布で p ≈ 0.41 となり、
「均等分布」帰無仮説を 棄却しない (= 統計的に均等とみなせる)。
4. 品質指標 (2) bbox 統計 (サイズ・アスペクト比)
4.1 サイズ (正規化 w×h)
| 指標 | 値 (norm) | 1280×720 換算 (px2) |
| min | 0.000749 | ~690 |
| p25 | 0.003623 | ~3,340 |
| median | 0.006584 | ~6,070 |
| mean | 0.007476 | ~6,890 |
| p75 | 0.010582 | ~9,750 |
| max | 0.022656 | ~20,880 |
平均タイル幅 = 0.0620 (1280 px 換算 79 px)、平均高さ = 0.1101 (720 px 換算 79 px)。
手続き生成タイルの素サイズ 60×80 を回転/透視で 0.5–1.5 倍スケールしているため妥当。
4.2 アスペクト比 (h / w)
| 指標 | 値 | 備考 |
| min | 0.98 | ほぼ正方 (90° 回転後) |
| p25 | 1.57 |
| median | 1.78 | 麻雀牌の縦長比に近い |
| mean | 1.80 |
| p75 | 2.01 |
| max | 3.17 | 透視変形で縦長になったケース |
備考:
h/w 中央値 1.78 は麻雀牌実物 (約 26×20×16mm → 表面比 1.3) よりやや縦長。
回転 ±180° と透視変形 ±20° の組合せが効いている。
将来、実タイル PNG (top-down 撮影) を導入すると比は 1.3 に寄るはず。
5. 品質指標 (3) 画像あたりラベル数
| 指標 | 値 |
| min | 13 |
| p25 | 22 |
| median | 32 |
| mean | 31.64 |
| p75 | 41 |
| max | 50 |
--n-tiles-min 13 --n-tiles-max 50 の一様分布通り。
手牌 13 枚 (シャンテン中の最小局面) から、捨て牌+鳴き+手牌で 50 枚程度までを網羅。
実 M-League フレームの牌密度 (約 20–80 牌/フレーム) のうち 下〜中央域をカバー。
改善余地:
上限を 80 程度まで延ばすと、終盤の高密度シーンも訓練できる。次サイクルで検討。
6. 品質指標 (4) 重なり率 (IoU > 0.5)
| 指標 | 値 |
| 合計オーバーラップペア | 277 |
| 画像あたり平均 | 0.554 |
| 画像あたり中央値 | 0 |
| 画像あたり最大 | 5 |
| 1 ペア以上重なる画像の比率 | 38.6% |
解釈:
IoU>0.5 のペアは画像平均 0.55 と低めだが、38.6% の画像で何らかの occlusion が含まれており、
YOLO の occlusion 耐性を学習させるサンプルとして十分。
重大な「同一クラス完全重複」(IoU>0.9) は仕様上ほぼ発生していない。
7. 品質指標 (5) bbox はみ出し率
| カテゴリ | 件数 | 比率 | 判定 |
| 1 px 以上はみ出し (any) | 168 / 15,821 | 1.06% | 許容 |
| 50% 超画面外 (strict) | 0 / 15,821 | 0.00% | 合格 |
解釈:
generator 側でmax(0, ...) / min(W-1, ...) のクリップが効いており、
画面端で部分的にはみ出すのは 1.06% のみ。重大な「ほぼ画面外なのにラベルがついている」ケースは 0 件。
これは truncated tile 表現として意図したもので、検出器の画像端ロバスト性に寄与する。
8. 統計可視化 (6 サブプロット)
図 1: 上段 = クラス分布 / bbox サイズ散布 / アスペクト比、下段 = ラベル数 / IoU 重なり / はみ出し率。
クラス分布の赤破線は均等仮定の期待値 (465)。
読み方のポイント:
- 上段左: 34 本のバーが赤破線 (465) の周辺に揃う → 均等性 OK
- 上段中: (w, h) 散布図が縦長クラスタ → 麻雀牌の縦長形状を反映
- 上段右: h/w ヒストグラムが 1.5〜2.0 に集中 → 仕様通り
- 下段左: ラベル数 13〜50 で平坦 → 一様サンプリング成功
- 下段中: 重なりペア数は 0 〜 5 の範囲、過半数 (61.4%) が 0
- 下段右: any=1.1%、strict=0.0% で安全
10. 合否判定と次アクション
10.1 合否判定マトリクス
| カテゴリ | 指標 | 結果 | 判定 |
| 生成速度 | 500 枚 wall-clock | 126 秒 | 合格 |
| クラス均等性 | CV / Chi-square | 0.046 / 34.05 | 合格 |
| bbox サイズ | median 0.66% | 正常 | 合格 |
| アスペクト比 | median 1.78 | 正常 (やや縦長) | 微調整可 |
| ラベル数分布 | 13〜50 一様 | 仕様通り | 合格 |
| occlusion | 38.6% の画像で発生 | 適切 | 合格 |
| はみ出し | strict 0.00% | クリーン | 合格 |
総合判定: 合格 —
本サイクルの 500 枚は YOLO ウォームスタート用データとして即時使用可能。
PoC 段階の 10 枚から問題なくスケールアップでき、5,000 枚への外挿も計算時間的に妥当 (推定 21 分)。
10.2 推奨次アクション (優先度順)
- ★★★ 5,000 枚スケールアップ —
--n-images 5000 で本生成。同じ procedural 設定で 21 分を見込む。
- ★★★ 実タイル PNG 整備 —
実物麻雀牌の top-down 撮影 (34 種 × 1〜3 アングル) を
synth/tiles/ に配置すると、ドメインギャップが激減 (procedural の絵柄は M-League 牌と異なる)。
- ★★ ラベル数上限拡張 —
--n-tiles-max 80 で終盤の高密度シーンも訓練可能に。
- ★★ 実物 500 枚との混合 (1:10 = 実 500 + 合成 5000) —
合成データ生成ガイド の Sec 7 の比率で訓練。
- ★ アスペクト比の絞り込み —
実物比 1.3 に近づけるため透視
max_tilt_deg を 20°→10° に下げる選択肢を保留。
10.3 生成済成果物
| パス | 用途 |
synth/output-500/synth_000000.jpg … synth_000499.jpg | 500 枚の画像 (JPEG 92%) |
synth/output-500/synth_000000.txt … synth_000499.txt | 500 枚の YOLO ラベル |
synth/output-500/classes.txt | 34 クラス名一覧 |
synth/output-500/_quality-report.json | 全統計を含む機械可読レポート |
synth/output-500/_quality-summary.png | 6 サブプロットの可視化 |
scripts/validate-synthetic-data.py | 本品質検証スクリプト (再現可能) |
再現コマンド:
# 生成
phase0/.venv/Scripts/python.exe scripts/generate-synthetic-mahjong.py \
--n-images 500 --procedural --out-dir synth/output-500/ \
--n-tiles-min 13 --n-tiles-max 50 --img-size 1280x720 --seed 42
# 検証
phase0/.venv/Scripts/python.exe scripts/validate-synthetic-data.py \
--in-dir synth/output-500/