あなたはイケメンの定義を知っているだろうか?
イケメンの定義って? 顔の特徴と、顔だけじゃないカッコいい男の条件とは| マイナビウーマン等でも語られている通り、爽やかな笑顔が条件であることは言うまでもない。
今回、FirebaseのMLKitの顔認識を使ってみるついでにイケメン度を検出できるかどうかを検証してみた。
ということで、イケメン風の男性に出演を依頼し、彼を用いてFirebase MLKitのFaceDetectionで出来ることを確認していく。
イケメンの顔を検出
まずは顔自体を検出しないと始まらない。緑の範囲が顔の枠。
VisionFaceにあるframeプロパティから枠が取得できる。
次はイケメンの顔のパーツを検出していこう。
イケメンの顔ランドマーク検出
VisionFaceのlandmark(ofType: FaceLandmarkType)メソッドで点が取得できる。
- mouthBottom(口の下部)
- mouthLeft(口の左部)
- mouthRight(口の右部)
- noseBase(鼻)
- leftEye(左目)
- rightEye(右目)
- leftEar(左耳)
- rightEar(右耳)
- leftCheek(左頬)
- rightCheek(右頬)
が用意されている。イケメンは顔のバランスがシンメトリーであると言われているため、リアルな話この情報からイケメン度は検出することが可能だ。
ちなみにパーツはrectangleとして取得できるわけではないので、これだけでは例えば目を切り取ったりはできない。
笑顔度と目の開き度の検出
VisionFaceには、smilingProbability, leftEyeOpenProbability,rightEyeOpenProbabilityというpropertyがあって、目の開き度合いと笑い度合いが取得できる。
目の開き度はとてもいい感じだが、笑顔度合いは口の角度で決定されるようなので、目は笑ってなくても笑ってることになる。 これではイケメンかどうか判別するのが少し難しいかもしれない。
顔の角度が取れる
headEulerAngleYとheadEulerAngleZが取得できて、顔の向きを取得することができる。自撮りが当たり前となっている昨今では、**斜め左上から撮影するとイケメンに見えると言われている。**リアルな話、この斜め左上を数値化することができるため、よりイケメンに取れる角度をフィードバックすることが可能だ。
結論
- イケメンとしての笑顔度
- イケメンとしての目の開き度
- イケメンに見える角度
- イケメンとしてシンメトリーか否か
といった情報をなんとOn Deviceで取得できるMLKitのFace Detection.
イケメンを検出するのが可能だということがわかった。
iOS11から用意されているVisionフレームワークの方は顔ランドマークからrectangleまで描画できるが、MLKitのFace Detectionのメリットとしては、笑い度や目の開き度、角度が取れること、そしてiOS, Androidの両方のOSで使えること、また、そもそもはTensorFlowだと思うので、拡張性があるという点にあると思う。