広色域アセットガバナンス:P3/AdobeRGB/HDR の分類・正規化・逸脱監視と運用SLO
Display P3 / AdobeRGB / HDR (PQ/HLG) 素材は “そのまま” 公開すると 色ズレ / desaturate / 肌色転び / 帯域肥大 を招きます。既存ワークフローが属人的だと ΔE 回帰や ICC 取扱い不整合が散発し、ブランド一貫性と SEO の両面にリスク。本稿は 分類 → sRGB正規化 → 測色 → 逸脱監視 → 例外統制 → 棚卸し を自動化し、継続運用 SLO (平均ΔE00, 肌色ΔE, ガマット外率) を達成し続ける “広色域アセットガバナンス” の完全設計を提示します。
要点(TL;DR)
- 統一入口:アップロード時に ICC / bitDepth / 色域 / dynamicRange を解析しメタDB登録。
- 変換チェーン:ICC変換 → トーンマップ(HDR) → 肌色補正(P3→sRGB) → 8bit化 → メタ最小化。
- 測色ログ:ΔE00 平均/95th, ガマット外率, 肌色領域 ΔE を JSON 出力しバージョン管理。
- SLO:AvgΔE00<2 / 95th<4 / 肌色Avg<1.5 / ガマット外率<1%。閾値逸脱は CI Fail。
- 例外統制:期限付き YAML で許可し自動失効。棚卸しで残存ゼロを目指す。
背景(Why)— なぜガバナンスが必要か
単発の sRGB 変換ガイドは多い一方、組織規模で継続的に 色一貫性 と 帯域効率 を両立する運用標準は未整備なケースが多数。以下が典型的な失敗パターン:
- ICC 混在:一部だけ P3 プロファイル残存 → 一貫性破綻。
- トーンマップ抜け:HDR ハイライトがクリップし黒浮き/白飛び。
- 肌色差分:過度 desaturate でブランド人物写真の印象変化。
- 再エンコード多重:段階毎に画質劣化・帯域増。
1. 取得とメタ解析(Ingestion)
アップロード / Git pull 時にワーカーで exiftool
or exifr
/ sharp.metadata()
を利用し以下を抽出:
- iccProfile.name, colorSpace (srgb|p3|adobe|hdr)
- bitDepth (8|10|12|16)
- pixelFormat (rgba|yuv444|yuv420)
- exif.Orientation, DateTimeOriginal
2. 正規化チェーン(Normalization Pipeline)
最終配信は sRGB 8bit を原則とし、途中段階でのみ広色域/高bit を保持。代表的順序:
- ICC 変換: P3/AdobeRGB→sRGB (relative colorimetric + 適度BlackPoint comp)
- トーンマップ: HDR(PQ/HLG)→LDR (Hable/Reinhard + 局所コントラスト微調整)
- 肌色補正: 低彩度過剰領域を Lab で +ΔChroma (p3-to-srgb-skin-tone-tuning 参照)
- ディザ(10→8bit): 低振幅ブルーノイズ 1D LUT 適用
- メタ最適化: EXIF 安全項目のみ保持 (Orientation 適用後削除)
3. 測色と品質指標(ΔE/ガマット外率/肌色ΔE)
変換前後ペアを Lab (D65) へ変換し ΔE00 を算出。ガマット外率は P3/AdobeRGB ソースの sRGB クリップ画素比率。肌色は顔検出+YCbCrクラスタでマスク生成。
- avgDeltaE00 / p95DeltaE00
- skinAvgDeltaE00 / skin95
- gamutClipRate (%)
- luminanceCompression (HDR peak cd/m² → LDR)
4. 逸脱監視(CI + Dashboard)
CI で新規/変更アセットに対し測色結果 JSON を生成し PR へ添付。閾値逸脱で Fail。ダッシュボードは ΔE 分布ヒストグラム + ガマット外率トレンド + 肌色ΔE 比較。分布異常は移動中央値 + EWMACUSUM を併用し通知。
- Fail 条件: avgΔE00≥2 or p95≥4 or skinAvg≥1.5 or gamutClipRate≥1%
- Warn: 閾値 80% 到達時 (予兆検知)
- 例外: YAML で
{assetId, reason, expires, approvedBy}
5. 例外統制と棚卸し
例外は期限付き (max 90d)。棚卸しスクリプトが期限超過/高ΔE例外を一覧化し Slack に週次通知。SLO レポートは四半期に提出し “残存例外ゼロ率” を改善 KPI に追加。
6. コストとパフォーマンス最適化
- 冪等キャッシュ: 変換前ハッシュ + パラメタ(ICC+toneMap+skinTune) で成果物キー生成。
- 差分再処理: メタのみ変更時は再エンコード省略。
- 並列: Sharp / WASM ΔE 計算を worker pool (n=CPU-1) で並列化。
- しきい値チューニング: ガマット外率 0.3–0.8% の “観測帯” 確保で早期変化感度↑。
7. セキュリティ & プライバシー配慮
- 顔検出はローカル WASM (MediaPipe) 実行。座標を外部送信しない。
- 例外理由に個人名を含めない(識別子は Jira Ticket ID)。
- ログは 180d ローテーション + 集計指標のみ長期保持。
公開前/運用チェックリスト
- メタ解析 (ICC/bitDepth) が ingestion で自動化
- 正規化チェーン順序 (ICC→トーンマップ→肌→8bit→メタ) をドキュメント化
- ΔE/肌色ΔE/ガマット外率 ログ生成 CI 成功
- SLO 閾値設定 & 逸脱時 Fail 動作確認
- 例外 YAML に expires / approvedBy 項目必須化
- 棚卸しスクリプトが週次通知
- ゴールデンセット 10 枚 + ラダー JSON 更新済
FAQ
- ガマット外率 0% を目指さない理由: 低頻度の高彩度ソースでクリップ0%維持はコスト↑。閾値を緩くし再現性優先。
- 肌色マスク失敗時: 顔検出未検出→輝度/彩度範囲の統計クラスタ fallback。
- ΔE 指標がブレる: 圧縮品質変更と混在監視。測色前に可逆(高品質)中間フォーマットへ統一。
まとめ(価値 & 次アクション)
広色域アセット運用は “変換テクニック” だけでは持続しません。ガバナンス (SLI/SLO) / 測色ログ / 逸脱検知 / 例外統制 をパイプライン化することで回帰発生→検知→是正までの時間を短縮し、ブランド一貫性とパフォーマンスを同時に守れます。次の一歩は (1) 既存資産の現状スキャン (2) SLO 草案合意 (3) CI 測色ステップ追加 の 3 つです。