先日iOS12がリリースされましたね。
待ち望んでいた機能がついにリリースされました!
それは...VNDetectFaceRectanglesRequest
でロールとヨー角が取れるようになりました...!
ここでは、iOS12で追加されたロールとヨー角について簡単に記載しています。
はじめに
本記事はVisionを使って顔検出をしたことがある方向けの記事です。
Visionでの顔検出の方法を知りたい方は参考記事を先に見ると良いと思います。
iOS11までの課題
Visionを使えば楽々顔検出!できますが、問題がありました。
なんと横顔でも取れてしまいます。
横顔でも取れるなんてすごい!何も問題ない!ように見えますが、正面の顔のみ欲しいというニーズは結構あります。
私が参加しているプロジェクトでもなるべく正面の顔のみ抽出したかったのですが、iOS11までのVisionでは私の知る限りでは正面の顔のみ抽出したいということはできませんでした。
その為、VNDetectFaceLandmarksRequest
を利用して顔のパーツ座標から顔の正面具合を計算してみたり、Visionは諦めてOpenCVのfrontalface
を検討等していました。
そこで、iOS12の新機能の登場です!
ロールとヨー角が取れるようになりました!
用語
ざっくり言うと下記です。
どちらも正面を向いているときは0度となります。
- ロール (roll)
首の傾げ具合の角度 - ヨー角 (yaw)
どれだけ首を横に向けているかの角度
実装
非常に簡単です。
VNDetectFaceRectanglesRequest
で取得できるVNFaceObservation
から、roll
とyaw
プロパティを呼ぶだけです。
let request = VNDetectFaceRectanglesRequest { (request: VNRequest, error: Error?) in
for observation in request.results as! [VNFaceObservation] {
print(observation.roll)
print(observation.yaw)
}
}
roll
とyaw
プロパティはOptionalですので、実際に使用する際にはif let
等を使います。
結果
プロパティ呼ぶだけですので取得はさくっとできました。
[出力例]
roll: 0.5235988
yaw: 0.7853982
上記の値はRadianなので角度に直すとroll
が30度、yaw
が45度になります。
もっと細かな値が取れるのかと想定していましたが、下記のようにroll
は30度ずつ、yaw
は45度ずつの角度が取得できるようです。
roll: 0, 0.5235988, 1.047198, ...
yaw: 0, 0.7853982, 1.570796, ...
よく考えるとVisionは機械学習で顔検出してるはずですので、適度な角度ずつクラス分類されているのは当然なのかなーと思います。
30度、45度ずつしか取得できませんが、横顔の取得は除外できるようになりそうです。
お試しに作ったプログラムはGitHubで公開していますので、気になる方はどうぞ。