OpenCV 提供了三種人臉識別方法:
- Eigenfaces
Eigenfaces是一種基于PCA(Principal Component Analysis,主成分分析)的人臉識別方法,屬于OpenCV中的特征臉方法之一。該方法將人臉圖像轉(zhuǎn)換為低維的特征向量,使用PCA降維的方式提取出訓練集中的主成分特征,進而提取出人臉圖像的特征向量。在進行識別時,通過比較輸入圖像與訓練集中每個圖像的特征向量的相似度來判斷其所屬的人臉類別。
- Local Binary Patterns Histograms (LBPH)
LBPH 是一種基于局部二值模式(Local Binary Pattern)的人臉識別方法,它將每個像素與周圍的像素進行比較,計算出每個像素點的二進制編碼,再將編碼串聯(lián)起來形成一個局部特征。LBPH 的優(yōu)點是對于圖像的旋轉(zhuǎn)、縮放和灰度變化等不敏感,但對于遮擋和表情變化等因素的魯棒性還有待提高。
- Fisherfaces
Fisherfaces 是一種基于線性判別分析(Linear Discriminant Analysis)的人臉識別方法,它通過將圖像投影到低維空間,將圖像從高維特征向量轉(zhuǎn)換為低維特征向量,并使用低維特征向量進行分類。Fisherfaces 的優(yōu)點是對于光照、表情變化等因素的魯棒性很強,但對于遮擋的魯棒性還有待提高。
1 Eigenfaces
Eigenfaces 是一種基于主成分分析(Principal Component Analysis, PCA)的人臉識別方法,它是最早的、也是最簡單的人臉識別方法之一。
Eigenfaces 方法將每個人臉圖像看作一個高維向量,通過對這些向量進行 PCA 變換,得到一組特征向量(也稱為 eigenfaces),并將每個人臉圖像投影到這組特征向量上,從而將高維的人臉數(shù)據(jù)降維到一個低維的特征空間中,進而實現(xiàn)人臉識別。
1.1 建模流程
首先,通過cv2.face.EigenFaceRecognizer_create()
創(chuàng)建Eigenfaces識別器:
EigenFaceRecognizer = cv2.face.EigenFaceRecognizer_create([, num_components[, threshold]])
其中,可選參數(shù)num_components
表示PCA保留的特征數(shù)量,默認為0,即保留所有特征??蛇x參數(shù)threshold
表示一個閾值,當人臉圖像與訓練數(shù)據(jù)的差異小于該閾值時,認為這是同一個人。默認值為0,表示不使用閾值。
該方法返回一個EigenFaceRecognizer
對象,可以使用其train()
方法進行訓練,predict()
方法進行預測,save()
和load()
方法保存和加載模型。
隨后,進行訓練:
cv2.face.EigenFaceRecognizer_create().train(src, labels)
或
EigenFaceRecognizer.train(src, labels)
其中,
-
src
:訓練數(shù)據(jù),可以是一個列表或一個 NumPy 數(shù)組,其中每個元素都是包含人臉圖像的數(shù)組。 -
labels
:與訓練數(shù)據(jù)對應的標簽,傳入的一個 NumPy 數(shù)組,其中每個元素都是一個整數(shù)標簽,表示訓練數(shù)據(jù)中對應人臉的身份信息。
該函數(shù)不返回任何值,訓練后的識別器會保存在類實例中,可以通過調(diào)用 cv2.face.EigenFaceRecognizer_create().predict()
函數(shù)使用它。
最后,使用模型進行預測:
label, confidence = recognizer.predict(src)
recognizer.predict(src)
函數(shù)是使用已經(jīng)訓練好的人臉識別器對輸入的人臉圖像進行識別。它接收一個參數(shù)src
,即待識別的人臉圖像。該函數(shù)返回兩個值:
-
label
:表示識別結(jié)果對應的人臉標簽,通常是一個整數(shù)。 -
confidence
:表示識別結(jié)果的置信度或準確度。值越小表示置信度越高,一般情況下,評分小于5000就可以認為匹配度高,評分為0則為完全一樣。
1.2 示例代碼
下面提供一個代碼腳本,大概的流程為:
- 定義一個空列表
photos
和一個空列表labels
。 - 使用 OpenCV 中的
cv2.imread()
函數(shù)讀取一組人臉圖像,并將其添加到photos
列表中。每張圖像都有一個對應的標簽,表示這張圖像屬于哪個人。 - 創(chuàng)建一個字典
names
,將每個標簽與對應的人名關(guān)聯(lián)起來。 - 使用 OpenCV 中的
cv2.face.EigenFaceRecognizer_create()
函數(shù)創(chuàng)建一個特征臉識別器。 - 使用
recognizer.train()
函數(shù)訓練識別器,讓其學會如何識別這組人臉圖像。 - 讀取一張待識別的人臉圖像,并使用
recognizer.predict()
函數(shù)對其進行識別。該函數(shù)返回一個標簽和一個置信度評分。 - 打印出評分和對應的人名。
訓練數(shù)據(jù)網(wǎng)上可以較為容易的找到,也可以博客下面留言獲取。
import cv2
import numpy as np
photos = list()
lables = list()
photos.append(cv2.imread("第一張圖象地址,后面依此類推", 0))
lables.append(0) # 第1張圖像對應的標簽
photos.append(cv2.imread("", 0))
lables.append(0) # 第2張圖像對應的標簽
photos.append(cv2.imread("", 0))
lables.append(0) # 第3張圖像對應的標簽
photos.append(cv2.imread("", 0))
lables.append(1) # 第4張圖像對應的標簽
photos.append(cv2.imread("", 0))
lables.append(1) # 第5張圖像對應的標簽
photos.append(cv2.imread("", 0))
lables.append(1) # 第6張圖像對應的標簽
names = {"0": "張三", "1": "李四"} # 標簽對應的名稱字典
recognizer = cv2.face.EigenFaceRecognizer_create() # 創(chuàng)建特征臉識別器
recognizer.train(photos, np.array(lables)) # 識別器開始訓練
i = cv2.imread("待識別.png", 0) # 待識別的人臉圖像
label, confidence = recognizer.predict(i) # 識別器開始分析人臉圖像
print("confidence = " + str(confidence)) # 打印評分
print(names[str(label)]) # 數(shù)組字典里標簽對應的名字
cv2.waitKey()
cv2.destroyAllWindows()
其運行結(jié)果為;
2 Fisherfaces
Fisherfaces 是一種基于線性判別分析(Linear Discriminant Analysis, LDA)的人臉識別方法,它是 Eigenfaces 方法的改進版本。
Fisherfaces 通過尋找最佳的投影方向(線性變換),將高維的人臉數(shù)據(jù)投影到一個低維的特征空間中,從而實現(xiàn)人臉識別。與 Eigenfaces 不同的是,F(xiàn)isherfaces 不僅僅考慮樣本之間的距離,還考慮了樣本所屬的類別之間的距離,因此更加適用于多類別人臉識別。
Fisherfaces 方法與 Eigenfaces 方法相比,具有更高的識別率和更好的魯棒性,但計算成本較高。
2.1 建模流程
OpenCV的各模型建模流程相同,除
recognizer = cv2.face.EigenFaceRecognizer_create()
# 需要改成
recognizer = cv2.face.FisherFaceRecognizer_create()
其余均不需更改。
2.2 示例代碼
示例代碼與1.2中基本完全相同,需要更改的就是2.1中提到的部分。
更改方法后,運行結(jié)果為:
此處看出這個模型的confidence較高,也就是對結(jié)果更沒有信心,其原因可能是因為 Fisherfaces 方法對樣本數(shù)據(jù)的數(shù)量和質(zhì)量的要求較高,以及對輸入圖像的光照、姿態(tài)、表情等變化更加敏感。
具體來說,F(xiàn)isherfaces 方法需要在訓練集中包含足夠多的樣本,并且每個樣本需要具有代表性,才能夠獲得較好的分類效果。此外,F(xiàn)isherfaces 方法對于輸入圖像的光照、姿態(tài)、表情等變化比較敏感,這些因素會影響特征向量的提取和分類結(jié)果的準確性,從而降低置信度。
相比之下,Eigenfaces 方法雖然對于樣本數(shù)量和質(zhì)量的要求不高,也比較容易實現(xiàn),但其在人臉識別方面的分類能力和魯棒性較差,因此在某些情況下可能會出現(xiàn)識別錯誤的情況,從而導致置信度較低。
3 Local Binary Histogram
3.1 建模流程
Local Binary Histogram(LBH)是一種基于局部二值模式(Local Binary Pattern, LBP)的人臉識別方法。與前面提到的基于 PCA 或 LDA 的人臉識別方法不同,LBH 方法直接利用局部紋理特征進行人臉識別,具有較好的魯棒性和識別精度。
具體來說,LBH 方法通過以下步驟實現(xiàn)人臉識別:
-
對于每個人臉圖像,將其分成若干個局部區(qū)域,并計算每個局部區(qū)域的 LBP 特征。
-
將每個局部區(qū)域的 LBP 特征用直方圖統(tǒng)計的方法轉(zhuǎn)換為一個向量。
-
將每個人臉圖像的局部區(qū)域 LBP 特征向量組合成一個全局的特征向量,并將其歸一化。
-
對于測試集中的每個人臉圖像,同樣將其分成若干個局部區(qū)域,并計算每個局部區(qū)域的 LBP 特征。將每個局部區(qū)域的 LBP 特征向量用直方圖統(tǒng)計的方法轉(zhuǎn)換為一個向量,并將這些向量組合成一個測試集的全局特征向量。
-
計算訓練集中每個人臉圖像的全局特征向量與測試集中人臉圖像的全局特征向量之間的距離,將距離最小的訓練集中的人臉圖像所屬的類別作為測試集中人臉圖像的識別結(jié)果。
相比于傳統(tǒng)的基于 PCA 或 LDA 的人臉識別方法,LBH 方法更加魯棒,能夠更好地應對光照、姿態(tài)、表情等變化,同時具有較高的識別率和較低的計算成本,因此被廣泛應用于人臉識別和相關(guān)領(lǐng)域。
3.2 示例代碼
此處需要更改的部分:
recognizer = cv2.face.LBPHFaceRecognizer_create()
此處因計算方法不同,需注意返回值confidence
的含義與前兩者不同。
此模型的返回值,小于50認為匹配度較高,0則為完全一樣。文章來源:http://www.zghlxwxcb.cn/news/detail-416875.html
代碼的輸出為:文章來源地址http://www.zghlxwxcb.cn/news/detail-416875.html
到了這里,關(guān)于11 OpenCV圖像識別之人臉識別的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!