【Swift】Visionフレームワークを使って顔検出をしてみた

こんにちは、のっくんです。

今日はSwiftで画像の顔検出をやっていこうと思います。

SwiftにはVisionフレームワークが用意されています。

iOS11(2017年9月リリース)で導入されたフレームワークですが、ざっとみただけでも以下のような機能があります。

  • Object Tracking、物体追跡
  • Face and Body Detection、顔、体検出
  • Animal Detection、動物検出
  • Machine-Learning Image Analysis、マシンラーニングの画像解析

参考:https://developer.apple.com/documentation/vision

スゴイですね。こんな高機能な物が用意されているなんて。

さすがはApple。

デベロッパーとしてはとても嬉しいですね。

早速使っていこうと思います。

画像を用意する

まずは顔の写った画像を用意します。

ネットで人が写っている画像を検索して撮影、Xcodeに取り込みます。

Assetsの中にドラッグAndドロップで取り込んで適当な名前をつけます。

imageviewに表示する

画像をimageviewに表示させます。

ImageViewの高さと横幅を設定しています。

ImageViewの横幅はViewの横幅にします。

ImageViewの高さは「Viewの横幅/画像の横幅」で割合を求めて、その割合を画像の高さと掛け算して求めます。

顔検出をしたら四角形を表示する

続けて以下のコードを追加して顔検出をした後に顔に四角形を表示してみます。

クロージャに以下の処理を追加しましょう。

VNDetectFaceRectanglesRequestsをすると、顔の場所(boundingBox、x座標、y座標、高さ、横幅)が返って来ます。

しかし、VNDetectFaceRectanglesRequestsで顔検出をしているのは元の画像(UIImage)に対してなので、iPhone上の座標とは異なります。

iPhone上の座標に四角形を表示させるために、x、y、高さ、横幅を再計算しています。

ハンドラーを実行する

以上で顔検出時に実行するクロージャ内の処理が出来上がったので、あとは実行するのみです。

VNImageRequestHandlerの引数にcgImageを渡して実行します。

実行結果

良い感じにできていますね。

参考