LoginSignup
13
14

More than 5 years have passed since last update.

iOS12 + Vision Framework で顔の向きが取れるようになりました!

Last updated at Posted at 2018-09-19

先日iOS12がリリースされましたね。
待ち望んでいた機能がついにリリースされました!
それは...VNDetectFaceRectanglesRequestでロールとヨー角が取れるようになりました...!
ここでは、iOS12で追加されたロールとヨー角について簡単に記載しています。

はじめに

本記事はVisionを使って顔検出をしたことがある方向けの記事です。
Visionでの顔検出の方法を知りたい方は参考記事を先に見ると良いと思います。

iOS11までの課題

Visionを使えば楽々顔検出!できますが、問題がありました。

なんと横顔でも取れてしまいます。

横顔でも取れるなんてすごい!何も問題ない!ように見えますが、正面の顔のみ欲しいというニーズは結構あります。
私が参加しているプロジェクトでもなるべく正面の顔のみ抽出したかったのですが、iOS11までのVisionでは私の知る限りでは正面の顔のみ抽出したいということはできませんでした。
その為、VNDetectFaceLandmarksRequestを利用して顔のパーツ座標から顔の正面具合を計算してみたり、Visionは諦めてOpenCVのfrontalfaceを検討等していました。

そこで、iOS12の新機能の登場です!
ロールとヨー角が取れるようになりました!

用語

ざっくり言うと下記です。
どちらも正面を向いているときは0度となります。
- ロール (roll)
首の傾げ具合の角度
- ヨー角 (yaw)
どれだけ首を横に向けているかの角度

参考

実装

非常に簡単です。
VNDetectFaceRectanglesRequestで取得できるVNFaceObservationから、rollyawプロパティを呼ぶだけです。

let request = VNDetectFaceRectanglesRequest { (request: VNRequest, error: Error?) in
    for observation in request.results as! [VNFaceObservation] {
        print(observation.roll)
        print(observation.yaw)
    }
}

rollyawプロパティは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で公開していますので、気になる方はどうぞ。

参考

Apple 公式 Document
[iOS 11] 画像解析フレームワークVisionで顔認識を試した結果

13
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
14