顔認証の概要
- OpenCVの顔推定器 アルゴリズムは「Local Binary Patterns Histogram(LBPH)」を使用
- 「モデルファイル作成編」でモデルファイル作成時に人物毎に付与した番号が「 顔認証」で判定結果を出力する
- 判定した結果と共に信頼度も判定してくれる。
顔認証方法(ソースコード説明)は以下の流れ
- 予めで顔認証モデルファイルを作成した時の人物毎の番号毎に表示する名前をコードに埋め込みする
- 顔認証モデルファイルのYAMLファイルを読み出し
- カメラから顔をキャプチャー
- 顔と目を識別
- キャプチャーした顔画像を特徴量比較にかける
- 比較結果をキャプチャーした画像上に名前を出力する
- 合わせてキャプチャーした画像に顔を識別箇所と目を識別した箇所を四角線で描画し画面出力する
- フレームレート(FPS)値と顔画像の比較にかかる時間、信頼度も出力する
コメント
- 掲載したソースは「Mac」で動作確認済み
*「ラズパイ」/「Tinkerboard」でも動作可能
- USBカメラのVideoポート変更必要
- 使った各種バージョンは以下
- MacOS Mojave / python3.5.6 / Opencv3.4.2 / VS Code1.38.1
顔認証結果のイメージ画像
ファイル構成
- ./data_xml/ # カスケードファイルを格納しているフォルダ
- ./image_data/ # キャプチャーした画像ファイルを保存するフォルダ
- ./trainer/ # 最後に学習したYAMLファイルとして保存するフォルダ
- face_recognition.py # 顔認証のPythonファイル
import cv2
import numpy as np
import os
import time
User_id = 0
recognizer=cv2.face_LBPHFaceRecognizer.create()
recognizer.read('/Users/local/source/opencv/face_recognition/trainer/trainer.yml')
cascadePath = '/Users/local/source/opencv/face_recognition/data_xml/haarcascade_frontalface_alt2.xml'
faceCascade = cv2.CascadeClassifier(cascadePath)
eye_cascadePath = '/Users/local/source/opencv/face_recognition/data_xml/haarcascade_eye.xml'
eye_cascade = cv2.CascadeClassifier(eye_cascadePath)
names = ['None', 'Jone', 'tommy', 'samansa', 'jonson', 'Naomi']
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
minW = 0.1*cap.get(cv2.CAP_PROP_FRAME_WIDTH)
minH = 0.1*cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
while True:
tick = cv2.getTickCount()
ret, img =cap.read()
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(
gray,
scaleFactor = 1.2,
minNeighbors = 3,
minSize = (int(minW), int(minH)),
)
for(x,y,w,h) in faces:
cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)
eyes_gray = gray[y : y + int(h/2), x : x + w]
eyes = eye_cascade.detectMultiScale(
eyes_gray,
scaleFactor=1.11,
minNeighbors=3,
minSize=(8, 8))
for ex, ey, ew, eh in eyes:
cv2.rectangle(img, (x + ex, y + ey), (x + ex + ew, y + ey + eh), (255, 255, 255),2)
t1 = time.time()
id ,confidence = recognizer.predict(gray[y:y+h,x:x+w])
t2 = time.time()
dt1 = t2 - t1
if confidence < 60 and confidence > 0:
id = names[id]
confidence = "{0}%".format(round(100 - confidence))
else:
id = "unknown"
confidence = "{0}%".format(round(100 - confidence))
cv2.putText(img, "confidence: " + str(confidence), (x+5, y + 20), cv2.FONT_HERSHEY_PLAIN, 1, (255,255,0), 2)
cv2.putText(img, str(id)+' Time'+str(round(dt1, 3))+ 'sec' , (x+5,y-5), cv2.FONT_HERSHEY_PLAIN, 1, (255,255,255), 2)
fps = cv2.getTickFrequency() / (cv2.getTickCount() - tick)
cv2.putText(img, "FPS:{} ".format(int(fps)),
(10, 50), cv2.FONT_HERSHEY_PLAIN, 3, (255, 255, 255), 2, cv2.LINE_AA)
cv2.imshow('camera',img)
k = cv2.waitKey(10) & 0xff
if k == 27:
break
print("\n Exit Program")
cap.release()
cv2.destroyAllWindows()