Cognitive Services: Face APIの顔認証機能を試してみた

今回は、Face APIの1機能であるVerify (顔認証)機能をPythonで試してみます。

Verify機能のリクエストとレスポンス

Verify機能はFind Similar機能と同じく、似た顔を検出し、人物の認証を行う機能で、Request bodyとリクエスト先のURLが異なる以外は、基本的にFind Similar機能とリクエストの形式は変わりません。

・Python 2.7サンプル

import httplib, urllib, base64
import json

headers = {

Request headers

'Content-Type': 'application/json',
'Ocp-Apim-Subscription-Key': '*** {APIキー}',
}

body = {
"faceId": "c5c24a82-6845-4031-9d5d-****",
"peronId": "815df99c-598f-4926-930a-****",
"personGroupId": "sample_group"
}

params = urllib.urlencode({
})

try:
conn = httplib.HTTPSConnection('westus.api.cognitive.microsoft.com')
conn.request("POST", "/face/v1.0/verify?%s" % params, json.dumps(body), headers)
response = conn.getresponse()
data = json.loads(response.read())
print(data)
conn.close()
except Exception as e:
print("[Errno {0}] {1}".format(e.errno, e.strerror))

Verify機能がFind Similar機能と大きく異なる点は、Find Similarが1対多で顔を比較するのに対し、Verify機能では1対1で顔を比較し、検出、認証を行うことにあります。そのため、Request bodyには比較したい2つのfaceIdのみを記述します。

Verify(認証)という言葉からもわかるように、あくまで顔認証に特化しており、個人の認証を行うことを目的とした機能であることがうかがえます。

body = {
"faceId1": "0e5fee4c-fa0b-437e-8a66-****",
"faceId2": "70212f34-1686-40e1-b79d-****"
}

また、Verify機能では比較対象としてpersonIdというIDを使うことができます。

personIdは、Find Similar機能で使用できるFace Listと同じように永続的に顔の情報を保持できるIDで、Face Listがグループ単位なのに対し、個人レベルの名前や顔を保存しておくことができます。そのため、個人とpersonIdを紐づけておくことで、Verify機能を使った顔認証システムを簡単に構築できます。

body = {
"faceId": "c5c24a82-6845-4031-9d5d-****",
"peronId": "815df99c-598f-4926-930a-****",
"personGroupId": "sample_group"
}

Verify機能のレスポンスはいたってシンプルで、”isIdentical”に比較した2つの顔が同一人物かどうかのブーリアン、”confidence”にその信頼性を0から1の数値で表示します。

{
"isIdentical":true,
"confidence":0.9
}

Verify機能とFind Similar機能は、内部的には同じアルゴリズムで顔の一致をスコアリングしているようで、同じ画像を入力し、”confidence”の値を比較してみると、両者はほぼ同じ値を示します。

このことから、Find Similar機能をVerify機能の代わりとして使用することもでき、利用場面や発生するトランザクション量によって使い分けをすることができそうです。

personIdの登録

それでは実際にVerify機能を試してみますが、今回はpersonIdを使って個人の特定を行うため、はじめにpersonIdの登録を行います。

※ 以降の操作は、Face APIのPython SDKを使用しています。

まず、personIdを格納するPerson Groupの作成を行います。CF.persongroup.createの関数にPerson GroupのIDと名前を設定して実行すると、Cognitive ServicesのFace StorageにPerson Groupが作成されます。Person Groupの作成時にはレスポンスがないため、CF.persongroup.getの関数で作成されたかの確認をしています。

import cognitive_face as CF
import json

def main():

APIキーのセット

api_key = 'd17fb7e5b8954246928d7ab500088903'
CF.Key.set(api_key)

Person Groupの作成

GroupId = 'test_group'
GroupName = 'verify_test'
CF.person_group.create(GroupId, name=GroupName')

Person Groupの確認

print(json.dumps(CF.person_group.get(GroupId), indent = 4))

if _name = 'main_'
main()

続いて作成したPerson GroupにPersonを追加します。CF.person.createの関数に追加先のPerson Groupとユーザー名、オプションでそのユーザーの情報を設定し、実行します。

Personが作成されるとレスポンスとしてpersonIdが返されます。

import cognitive_face as CF
import json

def main():

APIキーのセット

api_key = 'd17fb7e5b8954246928d7ab500088903'
CF.Key.set(api_key)

Personの作成

groupId = 'test_group'
personName = 'Michael'
userData = 'Test User No.XX'
personId = CF.person.create(groupId, personName, user_data=userData)
print(personId)

if _name == 'main_':
main()

personIdは取得できましたが、作成されたばかりのものでは顔が登録されていないため、Verify機能には使えません。そのため、personIdに対して顔の登録を行います。

CF.person.add_faceの関数にPerson GroupのIDと先ほど取得したpersonId、登録する顔の画像URLを設定して実行すると、ParsonにpersistedFaceIdが登録されます。この顔情報は、1つのPersonに対して248個まで登録でき、角度を変えた画像などを複数登録することで精度が高められると推測されます。

import cognitive_face as CF
import json

def main():

APIキーのセット

api_key = 'd17fb7e5b8954246928d7ab500088903'
CF.Key.set(api_key)

顔の追加

groupId = 'test_group'
personId = '8567303f-cb7b-4949-93fc-0826372c353d'
img_url = 'https://recipeteststorage.blob.core.windows.net/face-image/face-v-01.jpg'
CF.person.addface(imgurl, groupId, personId)

Personの確認

print(json.dumps(CF.person.get(groupId, personId), indent = 4))

if _name == 'main_':
main()

以上の操作を行うことで、Verify機能にpersonIdを使用することができます。

Verify機能を使った顔の認証

ここからは実際にFace Verify機能を使って写真から人物の判定をしてみます。

今回は、以下の画像をpersonIdに登録し、比較する画像がその人物かどうかを判定してみます。

・personIdに登録した画像

特定人物の検出には下記のコードを使用しました。Face Verify機能は単体では使えないため、Face Detect機能を併用します。

#!/usr/bin/env python
#coding:utf-8

import cognitive_face as CF
import json

def main():

APIキー

api_key = 'd17fb7e5b8954246928d7ab500088903'
CF.Key.set(api_key)

img_url ='https://recipeteststorage.blob.core.windows.net/face-image/face-v-02.jpg'
prsonGroupId = 'test_group'
prsonId = '8567303f-cb7b-4949-93fc-0826372c353d'

顔検出のリクエスト

detect = CF.face.detect(imgurl, faceid=True, landmarks=False)

顔認証のリクエスト

verified = CF.face.verify(detect[0]['faceId'], persongroupid=prsonGroupId, person_id=prsonId)

結果の表示

print(json.dumps(verified, indent = 4))

if _name == 'main_':
main()

上記コードを以下の画像で実行すると以下のような結果が出力されました。「”isIdentical”: true, “confidence”: 0.71539」と確かに同一人物と判定されました。

同じように、別の写真を使って判定させてみましたが、正しく同一人物の身を認証することができており、カメラを使って簡単に顔認証ができることがわかりました。

同じように、別の写真を使って判定させてみましたが、正しく同一人物の身を認証することができており、カメラを使って簡単に顔認証ができることがわかりました。

今回は、Face APIの顔認証を検証しましたが、Find Similar機能と同様、簡単に人物判定ができました。特にVerify機能は個人の認証に特化しているため、カードリーダにカメラを付け足して、カード認証と顔認証の併用といった使い方ができるのではないでしょうか。

次回は、Find Similar、Verify機能の検出の精度を検証していきます。

お楽しみに!

この記事を書いた人

azure-recipe-user