Labmartの顔認証を実装してみる

この記事は,CPS Labo Advent Calendar 2018の14日目の記事です.

adventar.org

13日目の記事はこちら

qiita.com

 

ご挨拶

こんにちは,B3のanzyです.この度無事CPSに配属されました.よろしくお願いします.

Labmart is 何?

こちらをご覧ください.

unotovive.hatenablog.jp

顔認証システム

流れはこうです.

webcamが起動 → 顔検出 → 予測 → いわいっぺい!

開発環境

python3.5.2

ubuntu16.04

webカメラから画像を抽出

import cv2 # OpenCV のインポート
cap = cv2.VideoCapture(int(cameraid))

簡単ですね.あとはcap.read()をすれば1フレームを読み込むことが可能です.

リサイズとグレースケール化

frame = cv2.resize(frame, (int(frame.shape[1]*0.7), int(frame.shape[0]*0.7)))
 
# 処理速度を高めるために画像をグレースケールに変換したものを用意
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

画像サイズが大きいと処理が重くなってしまいます.リサイズとグレースケール化してあげます.

顔検出

cascade = cv2.CascadeClassifier('models/haarcascade_frontalface_default.xml')
facerect = cascade.detectMultiScale(gray)

簡単ですね.これだけで顔を検出できます.

Haar like特徴量とは(専門でなければ飛ばす)

Haar like特徴量とは,よくわかりませんがここが全てです.

簡単に説明すると,

  • 探索窓の任意の位置に矩形領域を配置する.
  • 矩形領域に任意のパターンを設定する.
  • パターンの黒領域、白領域それぞれの画素値の和の平均A_1, A_2を求める.
  • それらの差を特徴量Hとする.
  • 矩形領域の位置・サイズ・パターンを変えて繰り返す.
  • 検索窓の位置を変えて上記を繰り返す.

こうして無数の特徴量Hを得られました.お疲れ様です.

予測

recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read("models/test/LBPHF.xml")
def test_get_images_and_labels(image):
face = np.array(image, 'uint8')
label, confidence = recognizer.predict(face)
return label, confidence
 
label,con = test_get_images_and_labels(cv2.resize(face_gray,(200, 200),
interpolation=cv2.INTER_LINEAR))

LBPHとはLocal Binary Patterns Histogramの略です.顔を小さなセルに分割し、それぞれのエリアのヒストグラムを比較します。

参考記事

towardsdatascience.com

 labelが特定した人のid,conが信頼度みたいなものです.

conの閾値を設けることで,よりセキュア(?)な認証になります.今回は経験則から60以下としました.

さらに,labelが30フレーム連続で同一人物であるなどの条件をいくつか設けています.

 

いわいっぺい

こうして,ボスイケボな「いわいっぺい」を聞くことができます.

まとめ

まだまだ,決算システムとしては未熟です.

顔を登録して顔認証してもらうと分かると思いますが,高確率で私のidになってしまいます.顔が平べったいからかもしれない

 vueオタクとまた残留して頑張りたいと思います.

おわり