顔認証の基本である顔認識をOpenCVを使って簡単に実装!

f:id:hiroki-ddd:20171011230425j:plain こんにちは! 機械学習という分野を未経験から学んでいる最中なのですが 最近よく耳にする顔認証も機械学習による技術になります!

「iPhone X」採用の顔認証「FaceID」

Appleではiphone X以降、従来の指紋認証システム 「Touch ID」に代わり、新たな顔認証システム「Face ID」を採用していますよね!Appleによれば、顔認識は、指紋認証に比べて誤認識をなんと20分の1に減らすことができると言われています。

この「Face ID」も機械学習を活用されております。 AIが人間の顔を認識する精度はここ最近、かなり向上していて、顔を認識するAIとディープラーニングは、コンピュータの視覚システムの心臓部であり、AIは人間よりも正確に顔を認識することができるくらいに成長しています!

広がる顔認証システム

これからはiphoneのようにスマホのカメラに顔を向けるだけで簡単にユーザー認証とロック解除ができてしまうことがだんだん当たり前になりつつあります。指紋認証のような無駄な手間が省かれるのは便利ですよね。

顔で同一人物か判断するこの顔認証は、スマホ以外にも様々なシーンでも利用されています。例えばUSJの年パスを購入した本人かどうか顔認証システムで確認したり、オフィスへの入退室のチェックも顔認証している企業もあり、入国審査で顔認証を利用している国もあったりします、そして日本も羽田空港で導入するようです。

羽田の帰国手続きに「顔認証」 10月から認印不要に :日本経済新聞

顔認証の仕組み

コンピュータは顔検出をして他の物の写真の中からどれが人間の顔かを最初にみつけます!このとき、コンピュータはまず明暗に注目します。

下の中央の写真のように、人間の顔をモザイク状にしてみると、目のあたりは暗く、その周囲は明るい。また、鼻筋は明るいがその両側は暗いというような、大ざっぱな特徴があることわかります。

出典:TIME&SPACE「どんどん広がる『顔認証システム』 その精度を高めた「技術の仕組み」とは?」より

そのようにして見つけたいくつかのパターンを、コンピュータはあらかじめ学習したデータと比較し人間の顔のパターンのデータと一致する場所が写真の中にあれば顔として認識するわけですね。これが顔検出の最初のプロセスです! 顔の場所がわかったら次は「顔認識」、つまり誰の顔かを判断するプロセスへと進みます。

顔認識では、コンピュータは検出された顔の目や眉毛、鼻、口などの部分を見つけて、そこに印をつけていきます。たとえば、唇のまん中と端っこといった具合です。 実は、このプロセスを実地に試してみることができるサイトがあります。「detectFace();」というサイトで、ここの「簡易サンプル」というページに画像をアップすると、顔認識処理をしてくれます。実際に処理してみたのが下の写真です。

出典:TIME&SPACE「どんどん広がる『顔認証システム』 その精度を高めた「技術の仕組み」とは?」より

赤い点で表示されているのが、特徴点と呼ばれるポイントで、この特徴点のすべてに、ポイントID、つまり名前がついています。この各特徴点の位置や特徴間の距離などが、この人の特徴を数値で表す顔認証データとなるわけです。

このデータをたとえばA子さんという名前で登録をしておくとほかの画像データで「顔検出→顔認識」のプロセスを繰り返し、顔認証データがA子さんと同じものが 見つかれば、それもA子さんの写真ということになります。

こうしてたくさんの画像データのなかから、A子さんの顔認証データの数値と同じもの(あるいは似ているもの)を検索して見つけるというわけです。顔認証の仕組みを簡単に説明すると、以上のようになります。 では次は顔認証の技術の初歩的な顔認識を実践してみましょう!

OpenCVを使って簡単に顔認識をしてみよう!

OpenCVとは? オープンソースのコンピューター・ビジョン・ライブラリです。コンピュータで画像や動画を処理するのに必要な、さまざま機能が実装されています。
以下の記事ではOpenCVについて詳しく説明されています。

第1回 OpenCVとは? 最新3.0の新機能概要とモジュール構成 (1/2)

OpenCVのHaar-like特徴分類器を使って、顔認識をしてみます。 Haar-like特徴を用いたブースティングされた分類器のカスケードはこちらからダウンロードしてみてください。Github

  • 環境について
  • jupyter notebook
  • 使用言語
  • python3系
  • 使用したパッケージ
  • OpenCV:特徴点を抽出する
  • matplotlib(plt):グラフの作成

では実際にやってみましょう!

  1.  cv2.CascadeClassifierでHaar-like特徴分類器を作成し
  2. Haar-like特徴分類器に対して画像を読み込む
  3. 画像に対して検出した領域を矩形で囲む

画像はこちらを使用します。

import cv2 import matplotlib.pyplot as plt %matplotlib inline
 #顔
 face_cascade_path = "haarcascade_frontalface_alt.xml"
 # カスケード分類器を作成 
face_cascade = cv2.CascadeClassifier(face_cascade_path) 
# 画像を読み込む 
img = cv2.imread('face.jpg') 
# グレースケール化 
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
# 出力結果用にコピー & RGB化 
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 
#囲む色 
color = (0, 255, 0) 
#顔を検知 faces = face_cascade.detectMultiScale(img_gray) for (x,y,w,h) in faces: 
# 検知した顔を矩形で囲む 
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) roi_color = img[y:y+h, x:x+w] 
#画像表示 
plt.imshow(img)

短いコードで済みました!

 実行結果

上手いこと全員の顔を認識できました! ただしこの画像は全員正面を向いているのでかなり認識しやすいものです。 OpenCVの便利さを感じて頂けたでしょうか? 今回、使用したのは顔だけでしたが他にも笑顔や目も認識できますので! 簡単な物ならこのように簡単に実装することができます! 今回は以上となります。

プログラミング未経験からでもAIスキルが身につくAidemy Premium




PythonやAIプログラミングを学ぶなら、オンライン制スクールのAidemy Premiumがおすすめです。
「機械学習・ディープラーニングに興味がある」
「AIをどのように活用するのだろう?」
「文系の私でもプログラミング学習を続けられるだろうか?」
少しでも気になることがございましたら、ぜひお気軽にAidemy Premiumの【オンライン無料相談会】にご参加いただき、お悩みをお聞かせください!