顔のパーツを認識してその骨格を描く
次にもう1つの顔認識機能、顔のパーツを認識する機能を試しましょう。これはVNDetectFaceLandmarksRequestというクラスによります。上の例と比べて大きく異なるのは、長方形認識のリクエストに代えて、このランドマークの認識リクエストのクラスを使うことです。ランドマークは、一般には地理的な目標物ということになっていますが、「境界線」といった意味もあるのです。
リクエストハンドラーは上の例と同じです。ただし、結果はlandmarksというプロパティに入ってきます。このプロパティには、顔の上のさまざまなパーツの境界線が含まれています。例えば顔の輪郭は、さらにfaceContourというプロパティに入っています。
とりあえず、そのプロパティの値をプレイグラウンドのデバッグ機能で確認してみましょう。
中身は複数の座標の羅列ですが、いかにも顔の輪郭線が描けそうな気がします。顔のパーツの境界線も、上の例と同じように元の画像に重ねて描画して見てみましょう。やはりグラフィックコンテキストを使います。その設定部分は、上の例とまったく同じです。
ここでは、顔の輪郭だけでなく、目、鼻、唇も描くために、得られた座標地をパスとして描画するdrawPathというメソッドを定義しました。
あとは認識された結果から顔のいろいろなパーツの境界線をパスとして描いていきます。その際の座標の基準となるのは、顔を囲う長方形なので、まずはその長方形の位置と大きさを確定します。
その後、結果からfaceContour(顔の輪郭)、leftEye(左目)、rightEye(右目)、noze(鼻)、outerLips(唇の外形)、innerLips(唇の内形)を順に取り出して描画していきます。
やはり結果はデバッグ機能で確認しましょう。
ノイズも多く、顔自体も傾いていますが、見事に顔のパーツの境界線を認識して描くことができました。
次回の予定
今回も、Core MLがらみの機能ながらCoreMLフレームワークを直接利用せずに使えるものを試しました。これで、人の顔の特徴を数値として捉えることができるようになったのです。いろいろな応用が可能だと思うので、ぜひ試してみてください。このVisionフレームワークは、まだまだ奥が深いので次回も引き続き探っていきたいと思います。