世界を動かす技術を、日本語で。

Show HN: 多様な肌色を生成するためのシンプルなアルゴリズムとカラースペース

概要

  • 多様な 肌色表現のためのカラースペース を定義するプロジェクト
  • デジタルアートやキャラクタークリエイター 向けの包括的な色選択ツールの開発
  • PythonおよびJavaScript によるサンプルコードと手法の公開
  • 数学的手法(PCAなど)を活用した 肌色範囲の抽出
  • 社会的・技術的な 限界と今後の課題 も明示

多様な肌色を表現するカラースペースの設計

  • 目的 :キャラクタークリエイターやデジタルアートなど多様な文脈で使える 包括的な肌色カラースペース の定義
  • 背景 :従来の色選択肢では多くの人々が正しく表現されず、 排除や不正確な描写 が生じる現状
  • アプローチ :できるだけシンプルかつ幅広い肌色範囲を RGB空間上で定義 し、手軽に利用できる数式で表現
  • 「十分良い」式 の採用により、実用性と限界のバランスを重視

サンプルアルゴリズムとカラーピッカー

  • カラーピッカー :JavaScriptで実装された カラースペースベースのカスタムピッカー を公開
  • Pythonサンプル :球面内の点を一様分布でサンプリングし、 to_rgb関数 でRGB値に変換する例を提示
    • select_point関数 :2種類のサンプリング手法(決定的・リジェクションサンプリング)
    • to_rgb関数 :XYZ空間からRGBへの変換式

肌色表現の課題と限界

  • 肌色は単一色で表現できない複雑性
    • 血流やメラニン、光の散乱、個人差や健康状態による変動
  • RGB値の表示環境依存性
    • ディスプレイや照明条件で見え方が大きく異なる
  • 個人の主観やバイアス
    • データセット作成や色の選定過程での主観的判断
  • 応用範囲の限定
    • シンプルな用途向けであり、医学的・詳細な分析には不向き

手法の詳細

  • データセット作成
    • 独自UIで RGB空間上の色を手動ラベリング し、可視化
  • 主成分分析(PCA)
    • データセットの「バナナ型」分布を XYZ空間に変換 し、扱いやすく整形
  • 関数フィッティング
    • PCA後のデータに対して 球面方程式 などで近似し、範囲を不等式で表現
  • 関数例 :R² = t² + u² + v² など

社会的文脈と参考リソース

  • 色彩表現と社会問題
    • 歴史的・現代的な 色差別(カラリズム)や人種主義 の影響
  • 参考動画・プロジェクト
    • Nyma Tangの「The Darkest Shade」シリーズ
    • Kat BlaqueのYouTube解説
    • Voxの「How beauty brands failed women of color」
    • Austin Walkerのエッセイ「Me, On The Screen」
    • Angélica Dassの写真プロジェクト「Humanae」
    • Tee Noirの「It's not a Coincidence. It's Colorism.」
    • ブログ「Writing With Color」

今後の課題と展望

  • より客観的なデータセットの構築
    • 多様な視点・環境での色認識の調査
  • ディスプレイや照明条件への適応
    • 色再現性の向上
  • より精密な数式やモデルの導入
    • 医学的・詳細な用途への拡張
  • コミュニティ・ユーザーからのフィードバック反映
    • 実用性と包括性のさらなる強化

このプロジェクトは、 多様性を尊重したデジタル表現 の一歩として、技術的・社会的な両面から意義を持つ試み。 今後の発展や改善の余地 も大きく、さまざまな分野での活用が期待される。

Hackerたちの意見

いいね。ほとんどの色は合ってると思うけど、緑、青、紫も見えるかな?もし手動でスペースから色を選んでるなら問題ないけど、「リアルな色だけ」ってなると別の問題だよね。それを解決する方法があるかもわからないし、実際の色をいくつか除外しちゃうかもしれないし。(色セレクターの形を変えたらどうかな?色空間についてはあんまり詳しくないけど。)

その通りだね。ページの深いところで、ピッカーUIではもっと広い範囲を使えるけど、生成の文脈ではもう少し選択的になりたいって言ってるよ。R^2について説明する時にもう少し詳しく触れるつもりだよ。「リアルな色をいくつか除外しないと解決できる方法があるかもわからない」ってのも100%その通り。今回の作業の大きな部分は、これらの問題に対する解決策に近づくために方程式を調整・改善する方法を定義することだったんだ。共有することで、もっと多くの目や頭がこのことについて考えて、改善案を提案してくれることを期待してる!

下のスライダーを一番右までドラッグすると、信頼できる肌色だけになるよ。右までドラッグすれば、オークやナヴィ、ジンの肌色にも合わせられる。

R^2の値を約1.5に下げると、極端に青、緑、紫の肌色が除外されるね。それは、実際の外れ値を含めつつ、緑のような色を除外する幸せな中間地点のようだ。

これは素晴らしい作品だね!最初は、3Dから2Dに行くのにPCAを使うんだと思ったけど、それだと使いやすいセレクターになる代わりに、全ての人を表現するのが難しくなるよね。次に、U空間ベクトル(PCA画像の基礎を形成するやつ)とそれに対応する楕円を使って色空間を作るのかなと思ったけど、いや、関数フィッティングはすごくスマートなアイデアだね、たとえ手作業でやったとしても。最後に、異なるr値からサンプリングするプレゼンテーションが大好き。固定のr値からサンプリングするか、範囲のr値からサンプリングするかに関わらず、ゲームデザインやアニメーションに素晴らしい応用がありそう。最初の手動データラベリングプロセスはまだよくわからないけど?バイアスが入るように思えるけど、最初の点群と結果の一貫性は確かに物語ってるね。

ありがとう!手動ラベリングのバイアスについても言及してるし、将来的な改善点としてそのラベリングプロセスを科学的にすること(複数のラベラーや専門家のラベラーを使うこと)を提案してる。その後、それを方程式生成のステップに組み込むこともね。「十分良い」という名前の由来の一部でもあるんだ。自分のアートの感覚を使って、たくさんのリファレンス画像を頭に入れておくことで(Humanaeプロジェクトに感謝!)、バイアスを少し和らげられたらいいなと思ってた。でも、バイアスが存在するのは100%その通りだね。

私の博士論文を見てみると、実際には肌の色はメラニンとヘモグロビン濃度を使ってパラメータ化できるんだ。つまり、肌の色は(ざっくり言うと)二次元的だってこと。これを使えば、ピクセルの色を反転させて、誰かのクロモフォア濃度を特定できるんだ。これは論文で引用されている他の研究に基づいているよ。

大好き!特に関連リソースについての内省的な「余談」セクションが素晴らしかった。もっと多くの人がこういう反省を見せてくれたらいいな。

ありがとう!たくさんの愛を送るつもりだよ、基本的にはこの作業の外で見つけて好きだったものばかりだから(Humanaeはこの作業をしている時に見つけたものだと思う)。

面白いのは、1.5の設定(少なくとも私の古いiPhoneでは)オーストラリアの先住民(「アボリジニ」とトレス海峡諸島民)の肌の色の範囲をカバーしてないこと。彼らは他の暗い肌の人々とは少し違う遺伝子の表現から肌の色を得ているらしい。2.0の「外れ値」はその肌の色をカバーしてる。マサイ族や一部のソマリの肌の色も、外れ値で表現される方が良さそう。人間の肌の色の全範囲を技術的に表現するのはちょっと難しいかも。拡散反射がかなり変わるし、それを画面で近似するのが難しいからね(例えば、ウェブデザイナーなら誰でも言えるけど、銀とグレーの表現の違いはハイライトの使い方にある)。でも、肌の色の表現は初期のカラー映画時代よりはずっと良くなってるよ。

そうそう、2.0は私が方程式を調整した値なんだけど、フェア/ディープ軸に沿ってスペースを圧縮して、低いR^2でより良い結果を得る余地は確実にあると思う。私が直面した問題は、スペースがRGBを超えた時に何が起こるかってことだけど、解決策はR、G、Bの値の最後にクランプを追加することだと思う。

この部分(https://toneyalexander.github.io/inclusive-color-space/#pick...)は特にクールだね。多くのキャラクターデザイナーにこの3Dピッカー機能を見てみたいな、あのダサい8色のスウォッチとかじゃなくて。

Hacker Newsで議論の続きを見る