Xamarin.Android Cognitive Service Face APIを使って顔認証をしてみた
の9日目の記事になります。
前回準備したFace APIを使ったなんちゃってログインのような処理を作ってみようと思います。
処理の流れとしては
カメラのプレビューから顔を検出
プレビューから顔の画像を取得
→どうしてもプレビューから画像の取得が出来なかったので、写真を撮影する方法に変更しています・・・orz取得した画像をFace APIを使用して顔を検出
検出した顔に対してあらかじめ用意した顔リストから類似する顔を検出
検出できたら認証成功
認証に成功したら次の画面に移動
と言った感じです。
プロジェクト構成
Xamarin.Androidで作成します。 プロジェクトの構成としては、以下の通り
AndroidプロジェクトとPCLプロジェクトの2つです。
実装
Face API周りの準備から。
NuGetからMicrosoft.ProjectOxford.FaceをPCLプロジェクトにインストール
実際に顔認証をしている処理としては
FaceServiceClient _faceServiceClient = new FaceServiceClient("your subscription key"); private async Task<SimilarPersistedFace[]> GetSimilarFaces(Stream imageStream) { try { // 顔を検出 var faces = await _faceServiceClient.DetectAsync(imageStream); // 検出した顔がリストにあるか検索(1件のみ抽出) return await _faceServiceClient.FindSimilarAsync(faces.FirstOrDefault().FaceId, _faceListId, candidatesCount); } catch (FaceAPIException) { // 何かしらエラー return new SimilarPersistedFace[0]; } }
と
DetectAsyncをして、撮った画像から顔を検出して、
FindSimilarAsyncでFaceListに同じ顔があるか検索して結果を返しているだけでOK。
超簡単です。
APIの使い方はこちらを参考にしました。
Microsoft Cognitive Services
今回FaceListはあらかじめ作成しています。
同じくAPIが用意されているので、そちらを使えばサクッと作れると思います。*1
カメラ側のでの顔検出はGooglePlayServices.Visionを使います。
以前に書いた記事の機能をベースにしています。
tonkun-no.hatenablog.com
顔を検出したタイミングで写真を撮影して、 そのコールバック処理で、先ほど準備したFace APIを使用して認証を行っています。 成功した場合は次の画面へ移動、失敗した場合はそのままになっています。
ソースはGithubに上がっているので、詳しくはそちらを見てみてください。
実行
実行してみると、カメラのプレビューで顔を検出したタイミングで認証が行われ、
FaceListに登録した顔と似ていると判定されれば、認証成功として次の画面へ移動できました。
カメラの顔検出がかなり早いので、撮影のタイミングによっては認証に失敗したりと、 何だかちょっとイマイチな動作ですが・・・そこはまぁ(・ω・`)
Face APIを使って、こんなに簡単に顔の検出等が出来るのはいいですね。 他のAPIも試してみたいと思います。
*1:CreateFaceListAsyncとAddFaceToFaceListAsyncを使用します