合成データ品質検証レポート — 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。
画像
500
うちエラー画像 0
bbox 総数
15,821
31.6 / 画像 (mean)
クラス均等性 (CV)
0.046
目標 < 0.10 達成
重大はみ出し
0.00%
50% 超欠落 = 0 件
合格判定の根拠: クラス均等性 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 × 720M-League フレームと同等
1 画像のタイル数13 – 50手牌〜河+手牌の規模
クラス数34m/p/s × 9 + 字牌 7
背景バリエーション10緑フェルト/木目/暗部の自動生成
タイル素材procedural (34 種)実物 PNG 未整備のためフォールバック
seed42再現可能

2.3 所要時間

区分計測値目安判定
500 枚 wall-clock126 秒 (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 標本統計

指標合格閾値判定
クラス数3434OK
1 クラスあたり期待値465.32≥ 200OK
標準偏差 (count)21.59≤ 100OK
変動係数 CV = σ/μ0.0464≤ 0.10OK
Chi-square (vs uniform)34.05≤ df × 2 = 66OK
最小クラス2m = 419≥ 期待値 × 0.5OK
最大クラスWh (白) = 520≤ 期待値 × 1.5OK
解釈: 各クラスは均等に近く出現 (期待 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)
min0.000749~690
p250.003623~3,340
median0.006584~6,070
mean0.007476~6,890
p750.010582~9,750
max0.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)

指標備考
min0.98ほぼ正方 (90° 回転後)
p251.57
median1.78麻雀牌の縦長比に近い
mean1.80
p752.01
max3.17透視変形で縦長になったケース
備考: h/w 中央値 1.78 は麻雀牌実物 (約 26×20×16mm → 表面比 1.3) よりやや縦長。 回転 ±180° と透視変形 ±20° の組合せが効いている。 将来、実タイル PNG (top-down 撮影) を導入すると比は 1.3 に寄るはず。

5. 品質指標 (3) 画像あたりラベル数

指標
min13
p2522
median32
mean31.64
p7541
max50

--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,8211.06%許容
50% 超画面外 (strict)0 / 15,8210.00%合格
解釈: generator 側でmax(0, ...) / min(W-1, ...) のクリップが効いており、 画面端で部分的にはみ出すのは 1.06% のみ。重大な「ほぼ画面外なのにラベルがついている」ケースは 0 件。 これは truncated tile 表現として意図したもので、検出器の画像端ロバスト性に寄与する。

8. 統計可視化 (6 サブプロット)

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% で安全

9. サンプル画像 (variety check)

500 枚から、ラベル密度の異なる 4 枚をピックアップ:

サンプル 1 (sparse)
synth_000008.jpg — sparse: 13 タイル
サンプル 2 (low-mid)
synth_000351.jpg — low-mid: 24 タイル
サンプル 3 (mid-high)
synth_000305.jpg — mid-high: 35 タイル
サンプル 4 (dense)
synth_000424.jpg — dense: 50 タイル
目視チェック観点: 各サンプルで背景 (緑フェルト / 木目 / 暗部) と回転/透視の多様性、 motion blur の効きを確認できる。手続き生成タイルは「視認可能なラベル文字 (一/②/3索/東 等)」がある程度残っており、 クラス識別タスクとして学習可能。

10. 合否判定と次アクション

10.1 合否判定マトリクス

カテゴリ指標結果判定
生成速度500 枚 wall-clock126 秒合格
クラス均等性CV / Chi-square0.046 / 34.05合格
bbox サイズmedian 0.66%正常合格
アスペクト比median 1.78正常 (やや縦長)微調整可
ラベル数分布13〜50 一様仕様通り合格
occlusion38.6% の画像で発生適切合格
はみ出しstrict 0.00%クリーン合格
総合判定: 合格 — 本サイクルの 500 枚は YOLO ウォームスタート用データとして即時使用可能。 PoC 段階の 10 枚から問題なくスケールアップでき、5,000 枚への外挿も計算時間的に妥当 (推定 21 分)。

10.2 推奨次アクション (優先度順)

  1. ★★★ 5,000 枚スケールアップ--n-images 5000 で本生成。同じ procedural 設定で 21 分を見込む。
  2. ★★★ 実タイル PNG 整備 — 実物麻雀牌の top-down 撮影 (34 種 × 1〜3 アングル) を synth/tiles/ に配置すると、ドメインギャップが激減 (procedural の絵柄は M-League 牌と異なる)。
  3. ★★ ラベル数上限拡張--n-tiles-max 80 で終盤の高密度シーンも訓練可能に。
  4. ★★ 実物 500 枚との混合 (1:10 = 実 500 + 合成 5000)合成データ生成ガイド の Sec 7 の比率で訓練。
  5. ★ アスペクト比の絞り込み — 実物比 1.3 に近づけるため透視 max_tilt_deg を 20°→10° に下げる選択肢を保留。

10.3 生成済成果物

パス用途
synth/output-500/synth_000000.jpgsynth_000499.jpg500 枚の画像 (JPEG 92%)
synth/output-500/synth_000000.txtsynth_000499.txt500 枚の YOLO ラベル
synth/output-500/classes.txt34 クラス名一覧
synth/output-500/_quality-report.json全統計を含む機械可読レポート
synth/output-500/_quality-summary.png6 サブプロットの可視化
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/