🤖

Cognitive Servicesの顔認識サービスとカスタムOCRモデルでオンライン本人確認のような仕組みを作ってみる with LINE

2021/08/30に公開

こんにちは、もっちゃんと申します。

前回はカスタムなOCRのモデルを作成してみました。

https://zenn.dev/mochan_tk/articles/7cb6427e81d202

そこで、今回はカスタムOCRのモデルとAzure Cognitive Servicesの顔認識(Face)サービスを使ってちょっと面白い仕組みを作ってみようと思います。

Azure Cognitive Servicesの顔認識(Face)サービスとは

image.png

Azure Face サービスは、画像に含まれている人の顔の検出、認識、分析する AI アルゴリズムを提供します。 顔認識ソフトウェアは、セキュリティ、自然なユーザー インターフェイス、画像コンテンツの分析と管理、モバイル アプリ、ロボティクスなど、多種多様なシナリオで重要です。

また、Face サービスでは様々な機能が提供されており、大きく「顔検出」と「顔認識」に分かれています。

顔検出で取得できる頭部姿勢の情報

今回は顔検出で取得できる様々な情報の中で、頭部姿勢(3次元空間での顔の向き)の情報を使います。

3 次元空間での顔の向き。 この属性は、ピッチ、ロール、およびヨー角度 (度数) で表現されます。 値の範囲は、それぞれ -90 度から 90 度、- 90 度から 90 度、-90 度から 90 度です。 角度のマッピングについては以下の図を参照してください。

image.png

顔認識による顔検証、似た顔の検索

顔認識では画像から検出された2つの顔に対し、同一人物のものであるかどうかを評価することができるので、この機能を使います。

オンライン本人確認のような仕組みを作ってみよう

オンラインでの本人確認のような仕組みは、とあるサービスを参考に今回は下記の流れで実施します。参考サービスには遠く及ばないクオリティなのでご了承ください。

  1. オンラインで本人確認を開始する
  2. まず正面からの写真をユーザに送ってもらう
  3. 次に何回か顔の向きをランダムに指示し、写真を送ってもらう
  4. 最後に免許証の写真を送ってもらい、免許証の写真と正面からの写真が同一人物かを判定する
  5. 同一人物であればついでに免許証から必要な情報(名前、生年月日、住所)を取得する

(なお、本記事はオンライン本人確認のクオリティを保証するものではありません、あくまでもAzureのAIサービスを試す目的です。また、参考にさせていただいたサービスとは全く関連もありません。)

先に顔認識による2つの顔の評価の動きを見ておく

顔認識による2つの顔の評価結果を分かりやすく見るため、まずは個別で実施してみます。
下記は Azure Machine Learning StudioのNotebooks上で該当のコードを動かしてみているところです。正面から撮った写真と免許証の写真をあたえると、顔の領域を検知し比較を行なっています。結果、同一人物であると見事にあてているんですね〜

image.png

上記を動かしているコードは基本的に公式のサンプルのままですが、一応下記にコードも貼っておきますね。

! pip install azure-cognitiveservices-vision-face

cog_key = '<your key>'
cog_endpoint = 'https://<your endpoint>.cognitiveservices.azure.com/'

from azure.cognitiveservices.vision.face import FaceClient
from msrest.authentication import CognitiveServicesCredentials
from python_code import faces
import os
face_client = FaceClient(cog_endpoint, CognitiveServicesCredentials(cog_key))

# Get the ID of the first face in image 1
image_1_path = os.path.join('data', 'face', 'IMG_6416.JPG')
image_1_stream = open(image_1_path, "rb")
image_1_faces = face_client.face.detect_with_stream(image=image_1_stream)
face_1 = image_1_faces[0]

# Get the face IDs in a second image
image_2_path = os.path.join('data', 'face', 'IMG_7325.JPG')
image_2_stream = open(image_2_path, "rb")
image_2_faces = face_client.face.detect_with_stream(image=image_2_stream)
image_2_face_ids = list(map(lambda face: face.face_id, image_2_faces))

#image_2_face_ids

# Find faces in image 2 that are similar to the one in image 1
similar_faces = face_client.face.find_similar(face_id=face_1.face_id, face_ids=image_2_face_ids)

# Show the face in image 1, and similar faces in image 2(code in python_code/face.py)
faces.show_similar_faces(image_1_path, face_1, image_2_path, image_2_faces, similar_faces)

カスタムOCRのモデルとAzure Cognitive Servicesの顔認識(Face)サービスを組み合わせてオンライン本人確認のような動きを実現する

下記がカスタムOCRのモデルとAzure Cognitive Servicesの顔認識(Face)サービスを組み合わせて実現した動画になります。リアルタイムに顔の向きをランダムに指示して(ここでは実はランダムでは無く固定にして楽をしています 笑)、ちゃんと指示に従えたら他人の画像を事前に用意したなりすましでは無いという判断ですね。最後に免許証の画像とも比較して本人であることを確認しています、ついでに免許証から情報(名前、生年月日、住所)も取得して入力の簡略化などなどに活用できそうな動きが実現できています。(下記の動画では顔の向きをちゃんと判断しているか確かめるため、わざと別の向きの顔写真を送っていたりします。免許証も妻のものを先に提示して同一人物チェックが上手く働いているかを確認しています)

↓クリックで動画が開きます!

(上記の動画もモザイクばかりでわかりにくいとは思いますが...^^;)

なお、今回使用したサービスは下記になります。(Dockerが好きなのでアプリはContainer上で動かしています。また、LINEのBotを活用すると楽にアプリ化できるので使っています。)

もし上記の情報と下記のコードの情報だけで手を動かせそうでしたらぜひ!(コードも結構雑に書いているので参考程度に使っていただければと!)

.
├── Dockerfile
├── init.sh
├── requirements.txt
└── runserver.py
  • Dockerfile
FROM python:3.8

RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
ADD . /code/

ENV SSH_PASSWD "root:Docker!"

RUN apt-get update \
        && apt-get install -y --no-install-recommends dialog \
        && apt-get update \
	&& apt-get install -y --no-install-recommends openssh-server \
	&& echo "$SSH_PASSWD" | chpasswd 

RUN pip install -r requirements.txt
COPY sshd_config /etc/ssh/
COPY init.sh /usr/local/bin/

RUN chmod u+x /usr/local/bin/init.sh
EXPOSE 2222 5000
ENV PORT 5000
ENTRYPOINT ["init.sh"]
  • init.sh
#!/bin/sh
echo "Starting SSH..."
/usr/sbin/sshd
echo "Starting Gunicorn..."
gunicorn -w 4 -b 0.0.0.0:5000 runserver:app
  • requirements.txt
line-bot-sdk
flask
requests
gunicorn
azure-storage-blob
azure-cognitiveservices-vision-face
azure-cognitiveservices-vision-computervision
azure-cosmos

まとめ

やはりAIを活用すると、これまでに無いサービスが生み出せそうでワクワクしますね。AzureのAI/ML系のサービスを使うと実現スピードや完成度がグッと上がるのですごくオススメです!

Discussion