tonkunの備忘録

色々調べた事、試した事などを載せます

Xamarin.Android Cognitive Service Face APIを使って顔認証をしてみた

qiita.com

の9日目の記事になります。

前回準備したFace APIを使ったなんちゃってログインのような処理を作ってみようと思います。

tonkun-no.hatenablog.com

処理の流れとしては

  1. カメラのプレビューから顔を検出

  2. プレビューから顔の画像を取得
    →どうしてもプレビューから画像の取得が出来なかったので、写真を撮影する方法に変更しています・・・orz

  3. 取得した画像をFace APIを使用して顔を検出

  4. 検出した顔に対してあらかじめ用意した顔リストから類似する顔を検出

  5. 検出できたら認証成功

  6. 認証に成功したら次の画面に移動

と言った感じです。

プロジェクト構成

Xamarin.Androidで作成します。 プロジェクトの構成としては、以下の通り

f:id:tonkun_no:20161206194255p:plain

AndroidプロジェクトとPCLプロジェクトの2つです。

実装

Face API周りの準備から。

NuGetからMicrosoft.ProjectOxford.FaceをPCLプロジェクトにインストール

f:id:tonkun_no:20161206194628p:plain

実際に顔認証をしている処理としては

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に上がっているので、詳しくはそちらを見てみてください。

github.com

実行

実行してみると、カメラのプレビューで顔を検出したタイミングで認証が行われ、 FaceListに登録した顔と似ていると判定されれば、認証成功として次の画面へ移動できました。
f:id:tonkun_no:20161207041408g:plain

カメラの顔検出がかなり早いので、撮影のタイミングによっては認証に失敗したりと、 何だかちょっとイマイチな動作ですが・・・そこはまぁ(・ω・`)

Face APIを使って、こんなに簡単に顔の検出等が出来るのはいいですね。 他のAPIも試してみたいと思います。

*1:CreateFaceListAsyncとAddFaceToFaceListAsyncを使用します