Method

何をどう測っているか

Mirroirの診断が実際に何を測り、どの数値でタイプを分けているかを、実装のまま公開します。 数式も閾値もそのままです。

先に3つ、はっきりさせておきます。機械学習は使っていません。手で決めた閾値による計算です。精度検証もしていません。正解ラベル付きのデータセットを持っていないためです。そして2D画像では触診情報が取れません。骨格診断が本来行う「骨や関節の触診」は、写真からは分かりません。

1. 写真の前処理

iPhoneで撮った写真の多くは Display P3 という色空間で記録されています。これを sRGB に変換しないと、 後段で使う b*(黄み・青みの軸)の値がずれ、イエベ/ブルベの判定が狂います。 画像に埋め込まれた ICC プロファイルを読んで変換しています。

次に、グレーワールド仮説による照明補正をかけます。画面全体の平均色が無彩色に近づくよう 各チャンネルを係数倍する処理で、屋内の電球色や日陰といった環境差をならします。

2. 撮り直しをお願いする条件

解析前に4つの条件を見て、外れていれば結果を出さずに撮り直しをお願いします。

解像度 幅 200px 未満 または 高さ 300px 未満 → NG 明るさ 平均輝度 35 未満(暗すぎ)/ 230 超(明るすぎ)→ NG ブレ ラプラシアン分散 50 未満 → NG 顔の向き 顔の中心が画像の左右 35〜65% の範囲外 → NG

3. パーソナルカラーの判定

顔写真から肌の色を複数箇所サンプリングし、それぞれ 5×5 ピクセルの平均を取って Lab 色空間に変換します。外れ値は IQR法(四分位範囲)で落とし、残りの平均を使います。 使うのは次の3つの値だけです。

L* 明るさ(0〜100) b* 黄み(+) と 青み(−) の軸 saturation 彩度(HSVから算出、0〜1)

この3値をそれぞれシグモイド関数に通してスコア化し、掛け合わせます。

yellow = sigmoid(b*, center=2.0, scale=15.0) # 黄み寄りか blue = 1 − yellow bright = sigmoid(L*, center=60.0, scale=0.1) # 明るいか dark = 1 − bright vivid = sigmoid(saturation, center=0.25, scale=4.0) # 鮮やかか muted = 1 − vivid spring = yellow × bright × vivid summer = blue × bright × muted autumn = yellow × dark × muted winter = blue × dark × vivid

4つの積を合計で割って確率に直し、一番大きいものを結果とします。a*(赤み・緑みの軸)は計測していますが、分類には使っていません。中央値(center)と傾き(scale)は手で決めた値で、実データによる調整は行っていません。

4. 骨格タイプの判定

全身写真から MediaPipe Pose で姿勢を推定します。33点の関節が取れますが、実際に使っているのは6点だけです。

11, 12 左右の肩 23, 24 左右の腰 27, 28 左右の足首

この6点から2つの比率を出し、それだけで3タイプに分けます。

shoulder_hip_ratio 肩幅 ÷ 腰幅 upper_lower_ratio 上半身の長さ ÷ 下半身の長さ straight = sigmoid(肩腰比, center=1.05, scale=15.0) × sigmoid(上下比, center=0.70, scale=8.0) wave = sigmoid(1/肩腰比, center=1.05, scale=15.0) × sigmoid(1−上下比, center=0.30, scale=8.0) natural = (exp(−((肩腰比−1.0)/0.08)²) + exp(−((上下比−1.0)/0.12)²)) / 2 × 0.8

ナチュラルは肩幅と腰幅が近く、上下のバランスが取れているときに高くなるガウス関数です。 末尾の ×0.8 は「ナチュラルに寄りすぎないように」手で入れた係数で、 実測にもとづくものではありません。

5. できないこと

  • 触診の代わりにはなりません。骨格診断は本来、骨の出方・関節の大きさ・筋肉や脂肪のつき方を触って確かめます。 2D画像からは取得できない情報で、これは工夫で埋まる差ではなく構造的な限界です。
  • 精度を測っていません。正解ラベル付きのデータセットを持っておらず、何割当たるのかを検証できていません。 「当たる」「正確」といった表現を使わないのはこのためです。
  • 機械学習ではありません。上に書いた通り、手で決めた閾値の計算です。学習も再学習もしていません。
  • 照明と写り方に影響されます。前処理で補正していますが、極端な色の照明やメイク、髪色によって結果は変わります。

6. なぜ公開するのか

この種のサービスは、判定の仕組みを明かさないのが普通です。中身を見せれば 「思っていたより単純だ」と受け取られるかもしれません。

それでも公開するのは、精度を検証していない以上、「当たります」と言う代わりに「こう測っています」と言うのが唯一誠実な立場だと考えるからです。判断の材料を持ったうえで、結果をどう扱うか決めていただければと思います。

結果の位置づけ

以上の通り、診断結果は参考値です。 確定的な診断が必要な場合は、対面のイメージコンサルタントやパーソナルカラーアナリストに ご相談ください。Mirroirは、そこへ行く前の当たりをつける道具として使っていただくのが いちばん役に立つと考えています。