目次
免責事項:このプログラムは、PythonのOpenCVモジュールプログラミングに基づいており、opencvの既存の顔検出器と顔認識器を使用してリアルタイムの顔認識を行います
1.ライブラリ関数を呼び出す
import cv2
import numpy as np
2.カメラを呼び出し、ウィンドウを設定します
frameWidth = 640
frameHeight = 480
cap = cv2.VideoCapture(0)
cap.set(3, frameWidth) #设置参数,10为亮度
cap.set(4, frameHeight)
cap.set(10,150)
3.画像のポジティブおよびネガティブサンプルデータセットのパスを設定します
pos_path = './resource/face_detect/video2imagem3/'
neg_path = './resource/face_detect/video2imagec1/'
test_path = './resource/face/'
images = []
labels = []
4.顔検出器を起動します
注:フェイスレコグナイザーは、opencvライブラリのインストール時にインストールされ、opencvインストールパスの下にあります。
faceCascade = cv2.CascadeClassifier("resource/haarcascade_frontalface_default.xml")
5.ポジティブサンプルとネガティブサンプルのロード
このデータセットの顔データは、プログラムでビデオを処理して取得するため、プログラムにまとめてインポートすると便利です。
ポジティブサンプル(顔)とネガティブサンプル(環境)の比率は約1:3です。この比率はうまくいくと言われています。ラベルは0.1です。
importステートメントは次のとおりです。
for i in range(60): # 正样本
images.append(cv2.imread(pos_path+str(2*(i+1))+'.jpg',cv2.IMREAD_GRAYSCALE))
labels.append(0)
for i in range(173): # 负样本
images.append(cv2.imread(neg_path+str(2*(i+1))+'.jpg',cv2.IMREAD_GRAYSCALE))
labels.append(1)
6.顔の領域を抽出します
ここでは、顔の部分が検出されていない画像は処理されません。顔の部分は、周囲約20ピクセルが抽出されます。
def processing(imageslist):
for j in range(len(imageslist)):
faces = faceCascade.detectMultiScale(imageslist[j], 1.1, 4)
for x,y,w,h in faces:
if x >= 20 and y >= 20: # 未处理没检测到人脸的情况
imageslist[j] = imageslist[j][y-20:y+h+20, x-20:x+w+20]
return imageslist
7.LBPH顔認識モデルを確立する
ここでは、LBPH顔認識モジュールを使用します。これは、この方法では画像データセットのサイズを均一にする必要がなく、EigenFacesモジュールとFisherfacesモジュールの両方で、トレーニングセットの画像とテスト画像のサイズが一定である必要があるためです。
imagesCopy = images
# 提取图像中人脸的区域
imagesCopy = processing(imagesCopy)
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.train(imagesCopy, np.array(labels))
8.リアルタイム検出
顔検出では、顔が検出されない場合、返される顔は空のタプルです。顔が検出された後、顔の領域が抽出され、recognizer.predictが認識に使用されます。信頼度の戻り値の結果は50未満です。信頼性はありますが、80を超えると大きな違いがあると見なされます。
while True:
success,img = cap.read()
predict_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
face = faceCascade.detectMultiScale(predict_image, 1.1, 4)
# print(face) # 空的元组有可能
if face != ():
for x, y, w, h in face:
if x >= 20 and y >= 20:
faceArea = predict_image[y-20:y+h+20, x-20:x+w+20]
cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 1)
label, confidence = recognizer.predict(faceArea)
if confidence <= 80 and label == 0:
cv2.putText(img, "LQL",(x, y-20), cv2.FONT_HERSHEY_COMPLEX, 1,(255,0,0,1))
print("YOU ARE LQL")
else:
cv2.putText(img, "OTHERS", (x, y-20), cv2.FONT_HERSHEY_COMPLEX, 1,(255,0,0),1)
print("OTHERS")
print(confidence)
print(label)
else:
cv2.putText(img, "None", (320, 240), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 0, 255), 1)
print("None")
cv2.imshow("img", img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
9.テスト結果
基本的に特定の顔認識機能を実現できます。
10.欠点
- 個別のトレーニングセクションと検出セクションはなく、毎回再トレーニングが発生し、一定の時間がかかりますが、現時点では認識のみです。-解決済み
- データはビデオから派生した画像であるため、トレーニングセットに存在する可能性のある未検出の顔の状況は処理されていません。
- すべての画像のサイズが均一なサイズにサイズ変更されていないため、LBPHモジュールは顔の認識にのみ使用できます。ただし、cv2.resizeを使用すると、画像比率の不均衡やトレーニング効果の喪失の問題が発生する可能性があります。
- さらに、ネガティブサンプルの場合、背景画像のみが使用され、オブジェクトは後で試すことができます。
つまり、現時点では単純なリアルタイムの顔認識機能しか実装されておらず、後で改善する時期があります。
11.改善方法
- 次の文は、トレーニングされたモデルを保存して読み取ることができるため、トレーニング部分を認識部分から分離できます。
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.save('./resource/face_detect/MyFaceModel.xml')
recognizer.read('./resource/face_detect/MyFaceModel.xml')