Fisherfaces原理
PAC方法是EigenFaces人臉識(shí)別的核心趴泌,它找到了最大化數(shù)據(jù)總方差特征的線性組合薯鳍。但是其具有明顯的缺點(diǎn)富寿,在操作過程中會(huì)損失許多人臉的特征信息见秽。因此在某些特殊的情況下盔然,如果損失的信息剛好是用于分類的關(guān)鍵信息桅打,必然導(dǎo)致結(jié)果預(yù)測(cè)錯(cuò)誤。
Fisherfaces采用LDA(Linear Discriminant Analysis愈案,線性判別分析)實(shí)現(xiàn)人臉識(shí)別挺尾。線性判別分析最早由Fisher在1936年提出,是一種經(jīng)典的線性學(xué)習(xí)方法站绪,也被稱為“Fisher判別分析法”遭铺。
其基本原理:在低維表示下,相同的類應(yīng)該緊密地聚集在一起恢准;不同的類別應(yīng)該盡可能地分散開魂挂,并且它們之間的距離盡可能地遠(yuǎn)。簡(jiǎn)單的概括馁筐,線性判別分析就是盡力滿足以下兩個(gè)要求:
- 類別間的差別盡可能地大
- 類別內(nèi)的差別盡可能地小
做線性判別分析時(shí)涂召,首先將訓(xùn)練集樣本集投影到一條直線A上,讓投影后的點(diǎn)滿足:
- 同類間的點(diǎn)盡可能地靠近
- 異類間的點(diǎn)盡可能地遠(yuǎn)離
做完投影后敏沉,將待測(cè)樣本投影到直線A上果正,根據(jù)投影點(diǎn)的位置判定樣本的類別,就完成了人臉識(shí)別盟迟。
Fisherfaces實(shí)現(xiàn)人臉識(shí)別
在OpenCV中秋泳,通過函數(shù)cv2.face.FisherFaceRecognizer_create()生成Fisherfaces識(shí)別器實(shí)例模型,然后應(yīng)用cv2.face_FaceRecognizer.train()函數(shù)完成訓(xùn)練攒菠,最后用cv2.face_FaceRecognizer.predict()函數(shù)完成人臉識(shí)別轮锥。
因?yàn)镕isherfaces人臉識(shí)別步驟與LBPH、EigenFaces代碼步驟一模一樣要尔,所以我們直接實(shí)戰(zhàn)通過Fisherfaces實(shí)現(xiàn)人臉識(shí)別舍杜。具體代碼如下所示:
images = []
images.append(cv2.imread("42_1.jpg", cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("42_2.jpg", cv2.IMREAD_GRAYSCALE))
labels = [0, 1]
recognizer = cv2.face.FisherFaceRecognizer_create()
recognizer.train(images, np.array(labels))
predict_image = cv2.imread('42_4.jpg', cv2.IMREAD_GRAYSCALE)
label, confidence = recognizer.predict(predict_image)
if label == 0:
print("匹配的人臉為尼根")
elif label == 1:
print("匹配的人臉為瑞克")
print("confidence=", confidence)
運(yùn)行之后,控制臺(tái)輸出如下:
通過Fisherfaces進(jìn)行人臉識(shí)別赵辕,其confidence返回值也在0到20000之間既绩,只要低于5000,都被認(rèn)為是相當(dāng)可靠的識(shí)別結(jié)果还惠。這里饲握,0就是完全匹配。
訓(xùn)練圖像:
測(cè)試圖像: