写真から顔の検出や識別を行うFaceAPIに触れる機会があったので、実施手順と結果をまとめてみました。なお、今回ご紹介する手順は、Microsoftさんから提供されているコンソールのみで行っており、プログラミング不要です。
MicrosoftさんのCognitive Serviceとして提供されています。Cognitiveは「認知」という意味で、見たり聞いたり理解したりといったことを、コンピュータが行ってくれるサービスです。Cognitive Serviceには「視覚」、「音声」、「知識」、「検索」、「言語」の5つのカテゴリがあります。
FaceAPIは「視覚」カテゴリに属するサービスで、画像データから顔を検出し、年齢、性別、感情などを取得できます。また、予め人物毎に顔画像を登録しておく事で、検出した顔が誰なのかを識別することができます。
FaceAPI用コンソールではローカル環境の画像ファイルを直接アップロードすることができない為、ローカル環境に用意した画像データ(FaceAPIに学習させるための登録用画像ファイルと、学習させたモデルでの識別可否をテストするためのテスト用画像ファイル)を、Azure Storageにアップロードします。
今回はクラウドサービスとして、MicrosoftさんのStorageサービスであるAzure Storageを使用しましたが、AWSさんのS3等他のクラウドのストレージサービスでも問題ないはずです。
顔を識別できるようにするためには事前に識別したい顔画像を登録しておく必要があります。おおまかな流れとして、まず器となるPerson Groupを作成し、その中にPersonオブジェクトを作成、その後それぞれのPersonオブジェクト内に顔画像を登録して、最後にPerson Groupを学習させるといった手順になります。
FaceAPI用コンソールを開き、下記手順で顔情報を学習させます。
①Person Groupの作成
「Person Group – Create a Person Group」を使用し、Person Groupを作成します。
②Personオブジェクトの作成
「 Person – Create a Person」を使用し、作成したPerson Group内にPersonオブジェクトを作成します(最大1000人分)。
③顔写真の登録
「 Person – Add a Person Face」を使用し、作成したPersonオブジェクト内に顔写真を登録します(最大248枚分)。
また、登録する写真内の顔は1つだけとする必要があります(顔が複数ある写真を使用する場合は「targetFace」パラメータで登録対象を選択することも可能)。
④学習
「 Person Group – Train Person Group」を使用して、顔写真を登録したPerson Groupを学習させます。
学習させたモデルが、テスト用の画像ファイルを正しく識別できるか確認します。おおまかな流れは以下の通りです。
顔の登録同様、FaceAPI用コンソールから実施します。
①顔の検出
「Face – Detect」を使用し、パラメータで指定したURLにあるテスト用画像ファイルから顔写真を抽出します。抽出した顔写真はFaceAPI内部で24時間保管され、顔写真に対して付与されたfaceIdが返されます。
また、「returnFaceAttributes」パラメータを使用することで、年齢、性別、感情などもあわせて取得できます(初期値は取得無し)。
②顔の特定
「Face – Identify」を使用し、パラメータで指定したfaceIdの顔写真と各Personオブジェクト内の顔写真との類似性を示す確信度が閾値を超えたPersonオブジェクトのIDを返します。検索対象は、パラメータで指定したPerson Groupに登録されているPersonオブジェクトに限ります。faceIdは複数指定可能で、最大10人分まで指定可能です。
「maxNumOfCandidatesReturned」パラメータで、返されるPersonオブジェクトの数を変更できます(初期値は1)。「confidenceThreshold」パラメータで、確信度の閾値を変更できます(初期値は0.5)。
実際に顔画像の登録と識別を行ってみました。
ぱくたそさんの画像から計21枚(7人×3枚)の顔画像の登録を試みました。結果として、「登録不可」と記載した4枚の顔写真については顔として認識されず、登録ができませんでした。
顔を傾けている画像や、横顔の画像は認識されにくいようです。
同一人物の別の写真をテスト用画像ファイルとして識別のテストを行った所、7人全て正しい人物の確信度が最も高いという結果になりました。
登録した顔写真の枚数や、テスト用画像ファイルの顔が正面を向いているかどうかによって、確信度に差が出ています。より多くの顔画像を登録し、正面を向いている画像であるほど、確信度は高くなるはずです。
次に、個別の顔写真を1枚の写真に結合したものをテスト用画像ファイルとして使用してみました。
結果は全て顔として認識され、確信度も個別写真の時とほとんど同じ値でした。
ブラウザとMicrosoft Azureのサブスクリプションキー(新規であれば1ヶ月間は無料枠の範囲内で自由に使用可能)があれば実行可能なので、もしも興味がわきましたら是非試してみて下さい。記事には載せていませんが、表情や角度によって取得される年齢や感情の変わり具合を見るのも面白かったです。
また、今回はFaceAPI用コンソールでの手順でしたが、FaceAPI用コンソール下部に言語毎のサンプルコードも載っています。例えば、WebRTCと組み合わせてノートパソコン付属のカメラ機能でキャプチャーした顔画像の登録や識別を行うプログラムを組むといったこともできます。
引き続き、Microsoftさんの他のCognitive Serviceについても検証していく予定なので、またどこかで発信していけたらと思います。