OpenCV使用Fisherfaces算法,實現人臉識別對比


Fisherfaces使用LDA(Linear Discriminant Analysis,線性判別分析)實現人臉識別。線性判別識別最早由Fisher在1936年提出,是一種經典的線性學習方法,也稱為“Fisher判別方法”。

一、基本原理
線性判別分析在對特征值降維的同時考慮類別信息。其主要思路為:在低維表示下,相同的類應該緊密聚集在一起;不同的類應該盡可能的分開且距離應盡可能遠。即線性判別分析要盡力滿足一下兩個要求:
·類別之間的差別盡可能地大
·類別之間的差別盡可能地小

做線性判別分析時,首先將訓練樣本投影到一條直線A上,讓投影后的點滿足:
·異類之間的點盡可能地遠離
·同類之間的點盡可能地靠近

做完投影后,將待測樣本投影到直線A上,根據投影點的位置判斷樣本的類別,就完成了識別。

例如:下圖為一組訓練樣本集,現在需要找到一條直線,讓所有樣本滿足:
異類之間的點盡可能地遠離,同類之間的點盡可能地靠近
在這里插入圖片描述
下圖左右兩圖分別有兩條不同投影線L1和L2,將上圖中的樣本投影到這兩條線上,可以看到下圖中L2的投影效果要好於在L1上的投影結果。
在這里插入圖片描述
如上圖所示線性判別分析找到的最優的投影線,A B樣本組內樣本之間的距離要盡可能的近,C的組間的距離要盡可能的遠。找到這樣一條直線后,如果要判斷某個待測樣本的分組,可以將該樣本點向投影線投影,然后根據投影點的位置來判斷其所屬類別。
例如下圖中,三角形樣本U向投影線投影后,其投影點在原點的投影范圍內,則認為該樣本點U屬於圓點所在分類。
在這里插入圖片描述
二、函數介紹
Opencv提供函數:cv2.face.FisherFaceRecognizer_create()生成Fisherfaces識別實例模型,然后應用cv2.face_FaceRecognizer.train()函數完成訓練,用cv2.face_FaceRecognizer.predict()函數完成人臉識別。

1.cv2.face.FisherFaceRecognizer_create()
該函數語法格式:r1 = cv2.face.FisherFaceRecognizer_create(num_components,threshold)
兩個參數都為可選參數,他們的定義為:
num_components:使用Fisherfaces准則進行線性判別分析時保留的成分數量。可以采用默認值“0”
threshold:進行識別時所用的閾值。如果最近的距離比設定的閾值threshold還要大,函數返回1

2.cv2.face.FisherFaceRecognizer.train()
該函數對每個參考圖像進行Fisherfaces計算,得到一個向量。每個人臉都是整個向量集中的一個點。該函數的語法格式為:
no = cv2.face.FisherFaceRecognizer.train(src,labels)
src:訓練圖像,用來學習的圖像。
labels:人臉圖像所對應的標簽。
該函數沒有返回值。

3.cv2.face_FaceRecognizer.predict()
該函數在對一個待測人臉圖像進行判別時,尋找與其距離最近的人臉圖像,將其識別為對應的標簽。語法格式:
label,confidence=cv2.face_FaceRecognizer.predict(src)
src:需要識別的人臉圖像。
label:返回識別結果的標簽。
confidence:置信度評分,用來衡量識別結果與原有模型之間的距離。0表示完全匹配。該值通常在0到20000之間,若低於5000則認為是相當可靠的識別結果。

下面介紹簡單的人臉識別示例:
(運行環境:PyCharm+python3.7+opencv4.5.1.48)
先有五張圖,其中前四張作為訓練集(圖1、4為一組標簽為0,圖2、3為一組標簽為1),另外一張為測試:
1.                   2.                     3.                     4.                     5.
在這里插入圖片描述 在這里插入圖片描述 在這里插入圖片描述 在這里插入圖片描述 在這里插入圖片描述
代碼:

import cv2
import numpy as np
images = []
# 這里因為需要我將照片導入前已經調整為一樣大小,如果嫌麻煩可以在代碼中將圖像resize成一樣大的,這里在給出
ima = cv2.imread("img/1.png", cv2.IMREAD_GRAYSCALE)
imb = cv2.imread("img/4.png", cv2.IMREAD_GRAYSCALE)
imc = cv2.imread("img/2.png", cv2.IMREAD_GRAYSCALE)
imd = cv2.imread("img/3.png", cv2.IMREAD_GRAYSCALE)
images.append(ima)
images.append(imb)
images.append(imc)
images.append(imd)
# 前兩張標簽為0,后兩張標簽為1
labels = [0, 0, 1, 1]
# print(labels)
recognizer = cv2.face.FisherFaceRecognizer_create()
recognizer.train(images, np.array(labels))
predict_image = cv2.imread("img/5.png", cv2.IMREAD_GRAYSCALE)
label, confidence = recognizer.predict(predict_image)
# 輸出匹配的人臉圖像標簽,0或1
print("label=", label)
# 輸出置信讀
print("confidence=", confidence)
# 顯示訓練集中最為匹配的圖像
 

運行結果:
在這里插入圖片描述
可以看到匹配的標簽為1,置信讀為1687多
假設如果將圖1、4,2、3標簽互換輸出結果應該是標簽0,結果如下:
在這里插入圖片描述
正確🙊👏🏻👏🏻
參考書籍:《OpenCV輕松入門:面向Python》李宗立.電子工業出版社.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM