Amazon Rekognitionを利用した顔認証システムの構築

こんにちは。katoです。

今回はAmazon Rekognitionを利用した、顔認証でのログインシステムを構築していきたいと思います。

 

概要

今回構築する顔認証システムの概要は下図の様になります。

 

顔認証システムの概要  構成図

 

boto3を利用して、S3への写真配置およびRekognitionへの人物比較リクエストを実行します。
比較結果に基づき、サイトログインの可否を判定します。

なお、今回記載する内容は青枠で囲われた部分の処理となります。
クライアントから顔写真を取得する処理は適宜設定を行うようお願いします。
今回は、顔写真のアップロードにて認証を行いますが、実際に導入する場合には、カメラデバイス等で写真を取得する様にした方がスマートになるかと思います。

 

手順

それではさっそく構築を行っていきたいと思います。

2月末から東京リージョンでもRekognitionが利用できるようになったので、今回は東京リージョンで構築を行っていきます。

 

S3バケット

まずはじめに、ソース画像とアップロード画像を保存するS3バケットを作成します。

Rekognitionの人物比較では、S3に配置されたソース画像とターゲット画像を比較し、その一致度を算出します。

今回はソース画像とターゲット画像の保存バケットを分けて作成しています。

バケットの作成が終わったら、ソース画像のアップロードを行います。

今回作成するアプリケーションでは、ユーザ名からソース画像を決定しておりますので、「ユーザ名.png」という形式でソース画像をアップロードしてください。

 

PHP

今回、フロントとなるPHPのログインページは以下の様に作成しております。

<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>rekognition</title>
</head>
<body>
<?php
  if (isset($_FILES['file'])){
    $file_name = "./upload/".$_POST['user'].".png";
    if($_FILES['file']){
      move_uploaded_file($_FILES['file']['tmp_name'], "$file_name");
      $output=shell_exec('python ./python.py "'.$_POST['user'].'"');
      if ($output >= 90 ) {
        header('location: ./login/login.php');
        exit();
      } else {
        $out=explode('\n',$output);
        $length=count($out);
        for ($i=0; $i<$length; $i++) {
          echo $out[$i];
          echo nl2br("\n");
        }
      }
    }
  }
?>
<form action="./rekognition.php" method="POST" enctype="multipart/form-data">
  user neme:
  <input type="text" name="user">
  <br>
  <input type="file" name="file">
  <br>
  <br>
  <input type="submit" value="login">
</form>
</body>
</html>

ここで行っているのは、クライアントからの写真データ取得およびRekognition用のPythonスクリプト呼び出しとなります。

フロントのアプリケーションは利用シーンごとに異なると思いますので、ここは参考程度にご覧ください。

 

Python

クライアントから取得した写真データをもとにRekognitionの画像比較を行うスクリプトを記載します。

#!/usr/bin/python

import boto3
import json
import sys

s3 = boto3.resource('s3', region_name='ap-northeast-1')
rekognition = boto3.client('rekognition', region_name='ap-northeast-1')

args = sys.argv
user = args[1]

upload_file = './upload/'+user+'.png'
save_file = user+'.png'

bucket = &quot;target-bucket-name&quot;
s3.Bucket(bucket).upload_file(upload_file, save_file)

sbucket = &quot;source-bucket-name&quot;
tbucket = &quot;target-bucket-name&quot;
source = user+&quot;.png&quot;
target = user+&quot;.png&quot;

try:
  response = rekognition.compare_faces(
    SourceImage={'S3Object':{'Bucket': sbucket, 'Name': source}},
    TargetImage={'S3Object':{'Bucket': tbucket, 'Name': target}}
  )
  if len(response['FaceMatches']) != 0:
    print(response['FaceMatches'][0]['Similarity'])
  else:
    print(&quot;not match&quot;)
except Exception as e:
  print(e.args)

このスクリプトは、ソースとターゲット画像の比較結果をPHPに返しています。

PHPはこの結果をもとに、ログインの可否を決定するように動作します。

 

動作確認

今回は認証に成功すると別ページにリダイレクトするよう設定しております。

なお、apache側の設定で、ログインページ以外からのrefererは禁止しております。

<Directory "/var/www/html/login">
  SetEnvIf Referer "http://xxxxxxxxxx/rekognition.php" check
  Options Indexes FollowSymLinks
  AllowOverride None
  Require env check
</Directory>

 

Rekognitionの人物判定は結構厳しく、そっくりさんなどはマッチしませんでした。
精度の高い判定結果が得られる反面、髭の有無などによってマッチしない場合があったので注意が必要です。

 

ログイン画面

ログイン画面

 

ログイン成功時

ログイン成功時

 

認証失敗時(別人等)

認証失敗時(別人等)

 

認証失敗時(人が映っていない画像等)

認証失敗時(人が映っていない画像等)

 

まとめ

Rekognitionを利用した顔認証システムの構築をご紹介致しました。

Rekognitionを利用すれば簡単に顔認証の仕組みを構築できるので、IOTなどと組み合わせて、ログインシステムや入退管理システム等に利用出来るのではと思いました。

東京リージョンでも利用できるようになり、身近なサービスとなりましたので、ご興味のある方は一度お試しになってみてはいかがでしょうか。