【AI】集合写真から社員をさがせ! Amazon Rekognition (search users by image)
最終更新日: 2024/02/23 3:02pm
こんにちは。
小高です。
前回のブログでは、Amazon Rekognitionの物体検出について簡単に紹介しました。
そこでも述べましたが、Amazon Rekognitionはいくつかの画像認識タスクを集めたサービスです。
今日のブログでは、それらタスクのうち、顔認識(face recognition)について紹介したいと思います。
ケースバイケースで「顔検索」(face search. 画像内にあらかじめ登録された顔があるか調べる)や「顔比較」(face comparison. 画像内の顔の類似性を調べる)というべきかと思いますが、言葉はある程度曖昧なままにしておきます。
まず、顔認識タスクについて簡単に説明します。
顔認識タスクとは、(映画で見るように)画像に写った顔から瞬時に指名を割り出す、といったタスクです。
AIが登場する前は、顔の特徴量(features。目、鼻、耳といったパーツの位置や形など)から顔を認識、識別していました。コンピュータビジョンと呼ばれていた時代ですが、その時代から比較的うまくいっていた分野と思います。
AIの最も顕著な特徴は「特徴量を考えない」という点にあります。AIでfeaturesというと「DNNパラメータ(推定値)」といった意味で具体的・物理的な意味はまったくありません。顔認識タスクは(AIの代表選手である)物体検出タスクと本質的に異なったタスクです。
これらがAmazon Rekognitionという1つのサービスに括られているのは、おもしろいと感じました。
2024/2/24 小高更新:
ブログ公開後、今回使用した画像を使って、OpenCV4.9(python)に旧来から用意されている「Haar-like特徴量」による顔検出(cv2.CascadeClassifierでhaarcascade_frontalface_default.xml)との結果の比較をしたところ、精度に格段の違いがありました。
また、最近のOpenCVに採用されている「AI(DNN)による顔検出(cv2.FaceDetectorYN)」と「顔認識(cv2.FaceRecognizerSF)」をテストしてみました。Amazon RekognitionもDNNベースのモデルに間違いないものと思われます。OpenCVを使って今回のブログに近しいインプリができそうですが、Amazon Rekognitionの方が圧倒的に楽ですね。
これらについては、機会を改めて紹介したいと思います。
2024/3/5 小高更新:
opencvによる顔検出・顔認識についてブログ「【AI/ML】OpenCVによる顔検出と顔認識(CascadeClassifier, FaceDetectorYN, FaceRecognizerSF)」を書きましたので、よろしければそちらもご覧いただければと思います。
準備
Amazon Rekognitionで顔認識は、大きく2つ分かれます。
– 画像にある顔を比較して「どれくらい似ているか」回答する(face comparison)
– 個人(ユーザーといいます)ごとに顔画像を画像データベース(コレクションと呼びます)に登録しておき、入力した画像がその中の誰かと一致するかを回答する(face search)
2つともAWS公式ホームページ(リンク:AWS公式「Amazon Rekognition とは」)を見れば、とても簡単に試してみることができます。
今回は後者を使います。
さて、下は弊社の社長の顔写真です。
コレクションを使うことのメリットとして、1ユーザーあたりに複数の画像を登録して、検出精度をあげることが挙げられます。
今回は正面と横の2画像を用意しました。解像度は640×640 pixです。
図1:コレクションに登録する画像
そして、これをユーザー名suzukiという名前でコレクションに登録しました。
実験
aws cliを使って、Amazon Rekognitionを使ってみます。
下は社長がモップがけをしているカメラ画像です。HDカメラで撮影した画像を640×360 pix に縮小しています。
社長の顔写真はコレクションに登録しました。この画像の社長が認識できるか、Amazon Rekognitionに問い合わせてみます。
図2:分析したい画像
AWS公式ホームページ「ユーザーの検索 (画像)」を見ながら、aws cliを使って問い合わせます。(下記)
(注記)公式ホームページにあるaws cliのサンプルを実行する場合、v1系では一部のコマンドが使えないようです。自分はv2系を使いました。(実行環境はUbuntu20.04です)
$のついている変数(シェル変数)は、みなさんの環境に合わせてください。
コマンドを実行する前に、$BUCKETNAMEの$NAMEに分析したい画像を入れてください。
aws rekognition search-users-by-image \
--image '{"S3Object":{"Bucket":"'$BUCKETNAME'","Name":"'$NAME'"}}' \
--collection-id $COLLECTION \
--profile $PPROFILE \
--output json
下にAmazon Rekognition(search users by image)回答を示します。
コレクションに登録したユーザーが検出された場合、UserMatchesキーの値としてユーザーと類似度(Similarity)が返却されます。
正しくsuzukiと回答されていますね。
{
"UserMatches": [
{
"Similarity": 99.7998275756836,
"User": {
"UserId": "suzuki",
"UserStatus": "ACTIVE"
}
}
],
"FaceModelVersion": "7",
"SearchedFace": {
"FaceDetail": {
"BoundingBox": {
"Width": 0.053176116198301315,
"Height": 0.12363559007644653,
"Left": 0.4110277593135834,
"Top": 0.1536041498184204
}
}
},
"UnsearchedFaces": []
}
返却値の中にダウンディングボックスがあります。
pythonをつかって元画像に枠を描いてみると以下のようになります。ついでにユーザーID(鈴木)と類似度も描き込んでいます。
図3:Amazon Rekognitionによる分析結果
ちなみに、JSON中にあるUnsearchedFacesキーは、複数の顔が検出されたとき、それらのバウンディングボックスを返却します。キー名が示す通り、「(コレクションを)検索しなかった顔」を意味します。
pythonによる処理フローと結果
この一連の流れをpythonにプログラムにしました。下はその処理フローです。
コレクションにはあらかじめ複数のユーザーとそれに関連する画像を登録しておきます。
pythonでは、分析したい画像をいったんAmazon S3にアップロードしてAmazon Rekognitionに問い合わせます。(AWS公式ホームページ「ユーザーの検索 (画像)」には、ローカルファイルを使ったサンプルが掲載されています)
そして、検出されたユーザー、バウンディングボックス、類似度をオリジナル画像に書き入れます。
細かいことになりますが、UserMatchesで検出されたユーザー(SearchedFace)のバウンディングボックスは赤、UnsearchedFacesで検出されたバウンディングボックスは白で描くようにしています。
図4:pythonをつかったAmazon Rekognition(search users by image)の処理フロー
このプログラムを使って下の画像を分析します。お茶をもってどこかに行こうとしていますね。かなり横を向いてしまっています。
図5:分析したい画像(その2)
きちんと認識できていますね。
図6:Amazon Rekognitionによる分析結果(その2)
次の画像は事務所の様子です。奥に一人社員が映り込んでいます。
図7:分析したい画像(その3)
これも社長が検出できています。奥の社員の顔はUnsearchedFacesとして検出されています。こんな小さく映り込んだ顔も認識できるのはすごいですね。
図8:Amazon Rekognitionによる分析結果(その3)
Amazon Rekognitionを使って集合写真から社員を探せ
以上は、AWS公式ホームページをなぞるだけでかなり簡単にできます。
これだけでも、社員の画像(社員証用)をコレクションに登録しておくことで、
– 会社の入り口にカメラを置いておいて、出勤簿を自動化する。
– 登録されている人だけドアが開くようにする。(成田空港の出国審査のようなイメージ。あれもパスポートの写真とその場でとった画像を比較しています)
といったことはできそうです。
以下では、これを少しだけ先に進めます。サンプルとして以下の写真を使います。
この中に社長がいるのですがわかりますか?? (ウィリーを探せみたいですね)
図9:分析したい画像(その4)
これを先のプログラムにかけてみます。コレクションに社長を登録しているのですから、社長が検出されると嬉しい。
残念ながら、顔は全部検出できているのに社長は検出されませんでした。(白枠はUserMatchesでないか、UnsearchedFacesになった顔のバウンディングボックスを表しています)
図10:Amazon Rekognitionによる分析結果(その5)
なぜこうなってしまったかの理由は、Amazon Rekognitionが返却するJSONをみるとわかります。
{
'UserMatches': [],
'FaceModelVersion': '7',
'SearchedFace': {
'FaceDetail': {
'BoundingBox': {
'Width': 0.022474152967333794,
'Height': 0.038808517158031464,
'Left': 0.14160721004009247,
'Top': 0.45548656582832336
}}},
'UnsearchedFaces': [
{
'FaceDetails': {
'BoundingBox': {
'Width': 0.022396858781576157,
'Height': 0.038541439920663834,
'Left': 0.5197679996490479,
'Top': 0.4513976275920868}},
'Reasons': ['FACE_NOT_LARGEST']
},
{
'FaceDetails': {
'BoundingBox': {
'Width': 0.021166710183024406,
'Height': 0.03894129768013954,
'Left': 0.7392590641975403,
'Top': 0.4526035785675049}},
'Reasons': ['FACE_NOT_LARGEST']
},
.....
],
'ResponseMetadata': {
.....
}
}
これによると、Amazon Rekognitionは、
– SearchedFaceキーに示されているバウンディングボックス内の顔をコレクションに問い合わせた。
– コレクション内でマッチしなかった。
– その結果、UserMatchesが空になった。
と動作したことがわかります。
ここでのポイントは、SearchedFace に「一番大きく写っている顔」が自動的に選ばれてしまうこと。
これは、UnsearchedFacesのReason(コレクションを検索しなかった理由)に「FACE NOT LARGEST(最大の顔ではなかったから)」とあることからもわかります。
このようにSearchedFaceが自動的に1つだけ選ばれてしまう仕様のままだと、次のようなことができません。
– 会社内に外部の人が入り込んでいることを検知したい。
– 事務所内の写真から誰がいるか(全員)しりたい。
さて、自動的に1つだけ選ばれてしまうのなら、「1人ずつ切り出してあげればいいじゃん」と思いますよね。
そこで、集合写真から社長の顔を切り出して、Amazon Rekognitionにかけてみました。(52×64 pix)
図11:集合写真から切り出した社長の顔
すると、ばっちりsuzukiと判定されます。50pixなのにすごいですね。
図12:Amazon Rekognitionによる分析結果
これがわかれば、先ほどのpythonを直せば集合写真に映った社長を発見できそうです。
以下がpythonプログラム(修正版)の処理フローです。
図13:pythonをつかったAmazon Rekognition(search users by image)の処理フロー:改訂版
修正版のpythonプログラムでは、Amazon Rekognitionへ複数回のリクエストを出します。
– 人がたくさん写っている写真をAmazon Rekognitionに投げて、すべての顔を認識する。
– 認識された顔(バウンディングボックス)を画像から切り出す。
– 切り出した顔画像の1つ1つについて、Amazon Rekognitionに問い合わせる。
– マッチしたら赤い枠、マッチしなかったら白い枠で囲む。
このため、たくさんの顔が写っている場合には数十からのリクエストが発生します。(Amazon Rekognitionはリクエストに対する従量課金となっています)
以下がその結果です。
ばっちり社長が判別できました。
図14:Amazon Rekognitionによる分析結果
下は弊社「オクトパス」の受賞式典の画像です。これもばっちりですね。
図15:Amazon Rekognitionによる分析結果
今回もかなり楽しかったですね。
社員証の写真を使って何かしてみたい、というのはとても身近なDXに思われます。
そして、このような要件を想定した場合、先のブログで紹介したYOLOのような物体検出モデルの利用(YOLOで社長を判別すること)は現実的ではありません。
一般に物体検出モデル(DNN)で何かを検出する場合には、検出対象の画像をできるだけ多く集める必要があります。これは(たとえData Augmantationしたとしても)過学習を抑えるために必要な要件です。YOLOでは「顔」は識別できても、「社長の顔」は識別できないわけですね。
したがって、このような要件を想定した場合、Amazon Rekognitionを使うことが最適解だと思いました。
以下にAmazon Rekognitionの料金表へのリンクを掲載しておきます。無料枠も設定されていますので、遊んでみられてはいかがでしょうか。
←「【AI】物体検出能力の比較。ChatGPT4、Amazon Rekognition、YOLOv8」前の記事へ 次の記事へ「【AI】ChagtGPT4による画像の要約をAmazon Pollyで読み上げる」→