Aidemy Tech Blog

機械学習・ディープラーニング関連技術の活用事例や実装方法をまとめる、株式会社アイデミーの技術ブログです。

顔認証の基本である顔認識を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月から認印不要に :日本経済新聞

 

利用が進んでいる顔認証の技術ですが、いったいどんな仕組みになっているのか?

 

顔認証の仕組み

コンピュータは顔検出をして他の物の写真の中からどれが人間の顔かを最初にみつけます!このとき、コンピュータはまず明暗に注目します。下の中央の写真のように、人間の顔をモザイク状にしてみると、目のあたりは暗く、その周囲は明るい。あるいは、鼻筋は明るいがその両側は暗いというような、大ざっぱな特徴があることわかります。

f:id:hiroki-ddd:20171012000921j:plain

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

顔の場所がわかったら次は「顔認識」、つまり誰の顔かを判断するプロセスへと進む。顔認識では、コンピュータは検出された顔の目や眉毛、鼻、口などの部分を見つけて、そこに印をつけていく。たとえば、唇のまん中と端っこといった具合です。

実は、このプロセスを実地に試してみることができるサイトがあります。「detectFace();」というサイトで、ここの「簡易サンプル」というページに画像をアップすると、顔認識処理をしてくれます。実際に処理してみたのが下の写真です。

f:id:hiroki-ddd:20171012002146j:plain

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

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

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

では次は顔認証の技術の初歩的な顔認識を実践してみましょう!

 

 

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

OpenCVとは?

オープンソースのコンピューター・ビジョン・ライブラリです。コンピュータで画像や動画を処理するのに必要な、さまざま機能が実装されています。

www.buildinsider.net

OpenCVのHaar-like特徴分類器を使って、顔認識をしてみます。

Haar-like特徴を用いたブースティングされた分類器のカスケードはこちらからダウンロードしてみてください。https://github.com/opencv/opencv/tree/master/data/haarcascades

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

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

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

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

f:id:hiroki-ddd:20171012151914j:plain

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)

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

 実行結果

f:id:hiroki-ddd:20171012152735p:plain

上手いこと全員の顔を認識できました!

ただしこの画像は全員正面を向いているのでかなり認識しやすいものです。

OpenCVの便利さを感じて頂けたでしょうか?
今回、使用したのは顔だけでしたが他にも笑顔や目も認識できますので!

簡単な物ならこのように簡単に実装することができます!

今回は以上となります。機械学習やディープラーニングについてさらに技術的な面からも

学びたい人は弊社Aidemyのプログラミング講座もぜひご検討ください。

無料カウンセリングは下のリンクから

aidemy.net

最後までご覧頂き,ありがとうございました!