DX station

With コロナ時代に向けた AI の導入~Azure Face API による顔検知とマスクの抽出~

横尾 亮佑

横尾 亮佑

こんにちは。はじめまして。
データサイエンティストチームの横尾と申します。今回、SBT のブログに初めて投稿させていただきます。
普段は画像認識関連の案件を中心に、様々なソリューションの構築を通じて皆様の課題を解決するお手伝いをさせていただいております。最近では物体検知 AI を用いて故障箇所を検知する作業を支援させていただきました。
これから画像認識分野を中心に AI や Azure に関する内容を投稿していこうと思いますので、どうぞよろしくお願いいたします。

さて、今回のテーマは「Azure Face API を用いた顔認識」です。

顔認識と言われると顔を撮影してデータベースと統合、そこから個人を特定するような仰々しいものをイメージする方もいらっしゃるかもしれませんが、今回はかなり手軽な顔認識を紹介します。
そもそも、顔認識技術とは画像内の人の顔を認識してその顔の座標や年齢・性別・表情などの特徴を抽出する技術を指します。それを応用すると個人の識別などが可能となるわけです。
皆さんはお店やビルの入り口などで顔を近づけると顔を認識して体温を測ってくれる機械を目にしたことはありませんか?また、スマホのカメラで顔を撮影すると猫耳やアクセサリを自動で描画してくれるアプリも流行しましたね。これらは顔認識技術を応用したソリューションです。
意外と身の回りにも普及している顔認識技術ですが、簡単に試せるサービスがあるのはご存知でしょうか?今回は、画像内の顔について座標の出力やメガネ・マスクの有無といった顔画像の特徴を抽出できる Azure の Face API というサービスを紹介したいと思います。

【参考:Azure Face API URL】
https://azure.microsoft.com/ja-jp/services/cognitive-services/face/



「機械学習導入支援サービス」はこちら




Face API について

まずは Face API について紹介しましょう。Face API は、Microsoft が提供する Azure Cognitive Services の一種です。Azure Cognitive Services とは人間の認知(視覚・音声・言語など)の機能を模した AI を Web API としてすぐに利用できる「AI パーツ」を提供するサービスです。Azure Cognitive Services の特徴は何よりもその「手軽さ」です。本来、AI を構築する際には事前に AI が対象を認識するための「学習」という工程が必要なのですが、Cognitive Service はこの学習工程が不要、もしくはその学習に必要な機能を非常に簡単に使うことができるという特徴があります。
今回ご紹介する Face API は画像に含まれている人の顔の検出、認識、分析を行う AI アルゴリズムを提供するサービスです。事前の学習無しで顔画像認識を使うことができる便利なサービスです。

Face API には次のような機能が含まれます。
① 顔検出(Detect API):画像に含まれている人の顔を検出し、バウンディングボックスで座標を表示する。性別や年齢、髭の有無などの属性を抽出することもできる。
② 顔検証(Verify API):2枚の顔画像が同一人物のものか判定する。一対一の判定。
③ 顔識別(Identify API):検出された顔がデータベースに登録されている顔と一致するか判定する。一対多の判定。
④ 似た顔の検出(Find Similar API):ターゲットの顔画像と候補となる顔画像について照合を行い、ターゲットによく似た顔画像を検索する。
⑤ 顔のグループ化(Group API):顔画像の類似性に基づいて複数のグループに分ける機能。

一文では書ききれない様々な機能がありますので、詳しくは Face API のドキュメントをご覧ください。
【参考:https://docs.microsoft.com/ja-jp/azure/cognitive-services/face/

今回は、①顔検出(Detect API)を用いて画像内の顔の位置を座標として出力させ、2021年2月に新しく実装された新しい属性「マスクの有無」を検出する仕組みを実装しようと思います。


「機械学習導入支援サービス」はこちら


Azure ポータルから Face API を構築する

まずは Azure ポータルから Face API を構築するところから始めましょう。構築する方法は他の Azure のリソースを構築する手順と一緒です。自身がリソースを構築できる Azure のサブスクリプションなどは事前にご準備ください。

1. Azure ポータル(https://portal.azure.com/)にアクセス

2. 「リソースの作成」を選択

3. 検索欄に「Face」と入力して検索し、「作成」ボタンをクリック

4. Face APIの必要事項を設定し、「確認および作成」を選択

  • サブスクリプション:リソースを構築できる任意のサブスクリプション
  • リソースグループ:新規作成(既存のリソースグループでも可)
  • リージョン:東日本
  • 名前:任意の一意な名前
  • 価格レベル:Free

これで Face API のリソースが構築できました。早速顔検知を実装していきましょう。


「機械学習導入支援サービス」はこちら


顔を検知して座標を出力する

それでは、Face API を用いて画像の中から顔を検知して座標を出力、バウンディングボックスとして描画させてみましょう。
Python を使って Azure Blob ストレージに格納されている顔画像に対して座標を出力し、バウンディングボックスで囲むように描画するスクリプトを作ります。環境による依存は無いかと思いますが、念のため私が検証で使用した実行環境を記載しておきます。

  • OS:Windows10 Enterprise
  • Python:3.6
  • 仮想環境:Anaconda
  • エディター:Jupyter Notebook

はじめに Face API を簡単に利用することができる Azure 公式のクライアントライブラリを pip でインストールします。このライブラリをスクリプト内でインポートすることで Face API を使用することができるようになります。

【コマンドライン】

pip install --upgrade azure-cognitiveservices-vision-face

続いて顔認識を実行するスクリプトを組んでいきます。初めにライブラリのインポートを実行します。最後の3行でインポートしたのが先ほどインストールしたクライアントライブラリです。
この後実施するマスクの着用の検知で使用する”Mask”ライブラリもインポートしておきます。

【Python】

# ライブラリのインポート
import io
import os
import requests
from io import BytesIO
from PIL import Image, ImageDraw
from azure.cognitiveservices.vision.face import FaceClient
from msrest.authentication import CognitiveServicesCredentials
from azure.cognitiveservices.vision.face.models import TrainingStatusType, Person, Mask

次に Face API を呼び出すためのエンドポイントとキー用の変数を用意してクライアント認証を行います。その際、エンドポイントとキーの値は先ほど構築した Face API の値に置き換えます。これにより、構築した Face API を特定しアクセスすることができるようになります。それぞれの値は Azure ポータルから Face API のリソースにアクセスし、「キーとエンドポイント」という項目から取得できます。
(※キーとエンドポイントは公開しないように注意してください)

【Python】

# エンドポイント及びキー用の変数
KEY = "KEY_VALUE”
ENDPOINT = "END_POINT_URL"

# クライアント認証
face_client = FaceClient(ENDPOINT, CognitiveServicesCredentials(KEY))

続いて実際に顔認識を行う処理を構築していきます。顔画像はクラウドストレージ上に保存し、アクセスできる URL を取得しておきましょう。(Azure なら Blob ストレージに保存し、Shared Access Signature を取得する。)

【Python】

# 顔画像を実施する画像を定義する
single_face_image_url = 'IMAGE_URL'
single_image_name = os.path.basename(single_face_image_url)
# 検知モデルは最新版のdetection_03を指定する.
detected_faces = face_client.face.detect_with_url(url=single_face_image_url, detection_model='detection_03')
if not detected_faces:
    raise Exception('No face detected from image {}'.format(single_image_name))

# 検知した顔を囲むバウンディングボックスを返す関数
def getRectangle(faceDictionary):
    rect = faceDictionary.face_rectangle
    left = rect.left
    top = rect.top
    right = left + rect.width
    bottom = top + rect.height
    
    return ((left, top), (right, bottom))

# 顔検知結果実施し、バウンディングボックスを描画して表示する関数
def drawFaceRectangles() :
# 画像のダウンロード
    response = requests.get(single_face_image_url)
    img = Image.open(BytesIO(response.content))

# 顔検知結果を赤いバウンディングボックスとして描画する.
    print('Drawing rectangle around face... see popup for results.')
    draw = ImageDraw.Draw(img)
    for face in detected_faces:
        draw.rectangle(getRectangle(face), outline='red')

# 画像を表示する
    img.show()

# 顔検知を実施する
drawFaceRectangles()

このスクリプトを実行すると顔検知の結果がこのように表示されます。

画像内の人の顔をしっかりと認識できているようです。
事前の学習を実施せずに顔検知ができるスクリプトを簡単に構築することができました。


「機械学習導入支援サービス」はこちら


マスクをしているかどうか検知する

昨今のコロナ禍の影響で生活必需品となったマスク。このブログを執筆中の現在は、どこに行ってもマスクの着用を求められます。しかし、その人が正しくマスクを着用し、鼻まで覆われているかどうかは感染拡大の防止の重要なポイントです。Face API は2021年2月のアップデートでマスクの着用について検知できるようになりました。ここからはこの機能を使ってみようと思います。
(アップデートの詳細はこちらから:https://docs.microsoft.com/ja-jp/azure/cognitive-services/face/releasenotes
こちらの画像を先ほどと同様にクラウドストレージ上に保存し、アクセスできる URL を取得します。先ほどは顔の座標をバウンディングボックスとして出力しましたが、今度は性別や年齢など、顔からわかる特徴を出力する attributes というクラスを返すようにスクリプトを構築します。この attributes クラスにマスクの有無などが検知結果として出力されます。

【Python】

# マスク画像の定義
mask_face_image_url = 'IMAGE_URL’
mask_image_name = os.path.basename(mask_face_image_url)

# マスクの検知を実施
detected_faces = face_client.face.detect_with_url(url=mask_face_image_url, detection_model='detection_03', return_face_attributes= ['mask'])
if not detected_faces:
    raise Exception('No face detected from image {}'.format(mask_image_name))

for face in detected_faces: 
    print(face.face_attributes.mask.type) # 着用しているマスクの種類を出力
    print(face.face_attributes.mask.nose_and_mouth_covered) # 鼻と口がマスクで覆われているかを出力

【出力結果】

MaskType.face_mask
True

マスクの着用についても検知できることが確認できました。さらに、鼻と口がマスクで覆われているかどうかについても検知することができるため、正しくマスクを装着していない人に警告を出すような使い方もできそうです。


「機械学習導入支援サービス」はこちら


まとめ

今回は Face API を利用して非常に手軽に試せる顔検知を紹介しました。Face API では顔検知以外にも顔を認識・判別する機能なども提供されており、様々な利用用途が考えられますね。
実際に顔認識モデルを構築するためには、学習用の顔画像を大量に収集する必要があり、最適な学習アルゴリズムの検討や学習を実施する際の計算リソース(GPU 環境など)の確保など、非常に手間がかかります。
しかし、Face API は顔認識モデルを自前で構築する必要が無く、かつ事前学習も行わずに簡単に使えるのも非常に魅力的です。

AI の導入には必要な知識や専門技術が多岐にわたるため、ハードルが高いのも事実です。しかし、今回ご紹介した Face API のように簡単に試してみることができるサービスも多数存在します。最初からじっくりとコーディングしてモデルを構築する前に、まずは簡単に使えるサービスを利用して実現可能性を探ってみるのも良いかと思います。

今回ご紹介した人の顔検知に限らず、キズ・汚れなどの異常検知や現場での人の立ち入りの検知など、画像や動画を用いて何かを検知したいようなご要望や AI 導入に向けたご相談などがありましたらお気軽に弊社までご相談ください。
画像以外にもアンケート結果の分析や計器のログデータの解析・予測に関するご相談も大歓迎です。皆様が抱えている課題を我々に一度お聞かせください。

それでは、次回のブログでお目にかかりましょう。最後までお読みいただきありがとうございました。



関連ページ

「機械学習導入支援サービス」はこちら

【総合】お問い合わせ

製品・サービスに関するお問い合わせはお気軽にご相談ください

ピックアップ

セミナー情報
クラウドエンジニアブログ
clouXion
メールマガジン登録