AWS Amazon Rekognition -SearchFacesで顔検索-

#AWS#rekognition

前回、初めの設定やCompareFacesを利用した顔比較を試しました。 http://roy29fuku.com/infra/aws/amazon-rekognition-compare-faces/   今回は、あらかじめ登録した顔のリストから一致するSearchFacesを使います。 CompareFacesが一対一であるのに対し、SearchFacesは一対多といえばわかりやすいでしょうか。

コレクションとは

前回はS3に置いた画像を二枚指定して、顔比較を行いました。 顔検索ではあらかじめコレクションというものを作っておく必要があります。 コレクションは簡単にいうと顔データの集まりです。 画像から顔だけを抽出することで検索が高速化するのかなと予想。 間違ってたら指摘ください。 詳しくは公式を。

コレクションは、IndexFaces API によって検出された顔を保持するコンテナです。1 つのコンテナを作成してすべての顔を保存することも、複数のコンテナを作成して選択したグループ別に顔を保存することもできます。次の例を考えます。

顔コレクションの管理 - Amazon Rekognition

  ちなみに、顔データの保存は有料です。微々たる額ですが、大規模に利用するときはチェックしましょう。   ここでは以下の操作について触れます。

  • CreateCollection: コレクションの作成
  • IndexFaces: コレクションへの顔データの保存
  • SearchFacesByImage: 入力した顔写真に一致するコレクション内の顔データを検索

aws-shellの設定

ここからちょっとした操作が続きます。 一々ちょっとしたことをpythonスクリプトで書くのも手間だなと思って調べましたが、 awsコマンドで色々操作できるみたいです。   さらにaws-shellという便利なものを知りました。

  これでターミナルからコマンドで快適にaws-cliを操作できるみたいです。 入れていきます。

pip install aws-shell

  aws-cliを入れてれば、~/.aws/credentialsの設定を使用してくれるみたいです。   別のprofileを使いたい場合はprofileオプションをつければそちらの認証情報を利用してくれます。   下の例を説明すると、 defaultは日本リージョンに設定し、オレゴンリージョン用のIAMユーザoregonを設定してあります。 Rekognitionは日本リージョンで利用できないので、profileオプションをつけないとエラー。 オレゴンリージョンのIAMユーザを使ったら通りました。   むっっっちゃ便利!   ちなみに頭に「!」つけることで通常のシェルコマンドも使用できます。

CreateCollection: コレクションの作成

aws-shellでやっちゃいましょう。 新しくgarage_staffというIDのコレクションを作成しました。 (profileオプションは関係ない人は無視してください)   詳しくはこちら

IndexFaces: 顔データの登録

構文はこんな感じ。

aws rekognition index-faces \
--image '{"S3Object":{"Bucket":"bucket","Name":"S3ObjectKey"}}' \
--collection-id "collection-id" \
--region us-east-1 \
--profile adminuser

  たくさん入れるときはちょっと面倒ですね。シェル芸が使えれば良いのですが、生憎シェル初心者なのでこっちはpythonスクリプトで書いてしまいました。 ここら辺を参考に。

  登録した顔データをチェックします。 aws-shellからlist-facesで見ることができます。 一番下のyamadaが僕の顔データです。他に5人別人の顔データを入れてあります。 登録したものとは別の写真を使って検索した時にyamadaにヒットすれば成功です。   IndexFacesについて詳しくはこちら

SearchFacesByImage: コレクションから顔検索

こんな感じでsearch-face-by-imageを使うことで指定したS3の画像とマッチする顔データをコレクションから探してきてくれます。 ここではyamada_2.jpgというS3オブジェクトを指定、コレクションからマッチするものを取得したところyamadaという顔データが一致。 類似度は92.0…。まずまずですね。 一致するものが複数あれば似ている順に並べてくれます。   別の画像でも試したところ一致するものなし。 一致と判定するためのSimiralityの域値が高すぎるので下げたいですね。 オプションがないか調べる。   こんな感じでface-match-thresholdを指定してあげると域値を任意に変更できます。   0にすると複数返ってきました。 本人のがSimilarity 68.7、別人だと一番高くても24.9。 多少条件が悪い写真だったとしても域値を下げれば十分に使えそうですね。

おまけ

ちなみに類似度24.9がこちら(山田)とこちら(大川竜弥さん)。

入力画像

今回は入力画像にS3オブジェクトを使いましたが、Base64でエンコードされた画像のバイトでも良いみたいです。 実際にアプリケーションに組み込むときはこちらの方が良さそうです。カメラで撮って画像を変換、Rekognitionを叩く、みたいな。

適切な画像

今回はテストなんで自分の写真はFacebookから適当に引っ張ってきたものを使いましたが、コレクションに使う画像はちゃんと綺麗なものを撮った方が良いでしょう。 画像に関してAmazonの推奨事項を引用しておきます。

Amazon Rekognition はさまざまな画像の条件とサイズに対応していますが、顔認識用の参照写真を選択する場合は以下のガイドラインに従うことをお勧めします。

  • 顔が正面を向いていること。
  • 影などの陰影がなく、照明が顔に均一に当たっていること。
  • 背景とのコントラストが十分であること。高コントラストのモノクロの背景が最適です。
  • 十分な大きさであること。顔サイズは 200 ピクセル以上が適切です。縦横とも 50 ピクセル未満の顔サイズはお勧めしません。
  • 明るくシャープであること。明るさとシャープネスは、DetectFaces で判断できます。
  • ヘッドバンドやマスクなどで顔の一部が隠されていないこと。

顔認識用の入力画像に関する推奨事項

  以上。ざっとRekognitionをいじりました。 HoloLensから使えるSFチックなアプリ作ってみようかなと構想中です。

参考