Fisherfaces 人臉識(shí)別
PCA 方法是 EigenFaces 方法的核心,它找到了最大化數(shù)據(jù)總方差特征的線性組合。不可否認(rèn),EigenFaces
是一種非常有效的方法,但是它的缺點(diǎn)在于在操作過(guò)程中會(huì)損失許多特征信息。
因此,在一些情況下,如果損失的信息正好是用于分類(lèi)的關(guān)鍵信息,必然會(huì)導(dǎo)致無(wú)法完成分類(lèi)。Fisherfaces 采用 LDA(Linear Discriminant Analysis,線性判別分析)實(shí)現(xiàn)人臉識(shí)別。線性判別識(shí)別最早由 Fisher 在 1936 年提出,是一種經(jīng)典的線性學(xué)習(xí)方法,也被稱(chēng)為“Fisher 判別分析法”。
基本原理
線性判別分析在對(duì)特征降維的同時(shí)考慮類(lèi)別信息。其思路是:在低維表示下,相同的類(lèi)應(yīng)該緊密地聚集在一起;不同的類(lèi)別應(yīng)該盡可能地分散開(kāi),并且它們之間的距離盡可能地遠(yuǎn)。簡(jiǎn)單地說(shuō),線性判別分析就是要盡力滿(mǎn)足以下兩個(gè)要求:
- 類(lèi)別間的差別盡可能地大。
- 類(lèi)別內(nèi)的差別盡可能地小。
做線性判別分析時(shí),首先將訓(xùn)練樣本集投影到一條直線 A 上,讓投影后的點(diǎn)滿(mǎn)足:
- 同類(lèi)間的點(diǎn)盡可能地靠近。
- 異類(lèi)間的點(diǎn)盡可能地遠(yuǎn)離。
做完投影后,將待測(cè)樣本投影到直線 A 上,根據(jù)投影點(diǎn)的位置判定樣本的類(lèi)別,就完成了識(shí)別。
例如,圖 23-13 所示的是一組訓(xùn)練樣本集。現(xiàn)在需要找到一條直線,讓所有的訓(xùn)練樣本滿(mǎn)足:同類(lèi)間的距離最近,異類(lèi)間的距離最遠(yuǎn)。
圖 23-14 的左圖和右圖中分別有兩條不同的投影線 L1 和 L2,將圖 23-13 中的樣本分別投影到這兩條線上,可以看到樣本集在 L2 上的投影效果要好于在 L1 上的投影效果。
線性判別分析就是要找到一條最優(yōu)的投影線。以圖 23-14 中右圖投影為例,要滿(mǎn)足:
- A、B 組內(nèi)的點(diǎn)之間盡可能地靠近
- C 的兩個(gè)端點(diǎn)之間的距離(類(lèi)間距離)盡可能地遠(yuǎn)
找到一條這樣的直線后,如果要判斷某個(gè)待測(cè)樣本的分組,可以直接將該樣本點(diǎn)向投影線投影,然后根據(jù)投影點(diǎn)的位置來(lái)判斷其所屬類(lèi)別。
例如,在圖 23-15 中,三角形樣本點(diǎn) U 向投影線投影后,其投影點(diǎn)落在圓點(diǎn)的投影范圍內(nèi),則認(rèn)為待測(cè)樣本點(diǎn) U 屬于圓點(diǎn)所在的分類(lèi)。
函數(shù)介紹
OpenCV 中,通過(guò)函數(shù) cv2.face.FisherFaceRecognizer_create()生成 Fisherfaces 識(shí)別器實(shí)例模型,然后應(yīng)用 cv2.face_FaceRecognizer.train()函數(shù)完成訓(xùn)練,用 cv2.face_FaceRecognizer.predict()函數(shù)完成人臉識(shí)別。
-
函數(shù)cv2.face.FisherFaceRecognizer_create()
函數(shù) cv2.face.FisherFaceRecognizer_create()的語(yǔ)法格式為:
retval = cv2.face.FisherFaceRecognizer_create( [, num_components[,
threshold]] )
式中的兩個(gè)參數(shù)都是可選參數(shù),它們的含義為:
- num_components:使用 Fisherfaces 準(zhǔn)則進(jìn)行線性判別分析時(shí)保留的成分?jǐn)?shù)量??梢圆捎媚J(rèn)值“0”,讓函數(shù)自動(dòng)設(shè)置合適的成分?jǐn)?shù)量。
- threshold:進(jìn)行識(shí)別時(shí)所用的閾值。如果最近的距離比設(shè)定的閾值 threshold 還要大,函數(shù)會(huì)返回“-1”。
- 函數(shù)cv2.face_FaceRecognizer.train()
函數(shù) cv2.face_FaceRecognizer.train()對(duì)每個(gè)參考圖像進(jìn)行 Fisherfaces 計(jì)算,得到一個(gè)向量。
每個(gè)人臉都是整個(gè)向量集中的一個(gè)點(diǎn)。該函數(shù)的語(yǔ)法格式為:
None = cv2.face_FaceRecognizer.train( src, labels )
式中各個(gè)參數(shù)的含義為:
- src:訓(xùn)練圖像,即用來(lái)學(xué)習(xí)的人臉圖像。
- labels:人臉圖像所對(duì)應(yīng)的標(biāo)簽。
該函數(shù)沒(méi)有返回值。
-
函數(shù)cv2.face_FaceRecognizer.predict()
函數(shù) cv2.face_FaceRecognizer.predict()在對(duì)一個(gè)待測(cè)人臉圖像進(jìn)行判斷時(shí),尋找與其距離最近的人臉圖像。與哪個(gè)人臉圖像最接近,就將待測(cè)圖像識(shí)別為其對(duì)應(yīng)的標(biāo)簽。該函數(shù)的語(yǔ)法格式為:
label, confidence = cv2.face_FaceRecognizer.predict( src )
式中的參數(shù)與返回值的含義為:
- src:需要識(shí)別的人臉圖像。
- label:返回的識(shí)別結(jié)果的標(biāo)簽。
- confidence:置信度評(píng)分。置信度評(píng)分用來(lái)衡量識(shí)別結(jié)果與原有模型之間的距離。0 表示完全匹配。該值通常在 0 到 20 000 之間,若低于 5000,就認(rèn)為是相當(dāng)可靠的識(shí)別結(jié)果。需要注意,該評(píng)分值的范圍與 EigenFaces 方法的評(píng)分值范圍一致,與 LBPH 方法的評(píng)分值范圍不一致。
示例:使用 FisherFaces 完成一個(gè)簡(jiǎn)單的人臉識(shí)別程序
import cv2
import numpy as np
images=[]
img1= cv2.imread("face\\face2.png",cv2.IMREAD_GRAYSCALE);
img1.resize((240,240))
images.append(img1)
img2= cv2.imread("face\\face3.png",cv2.IMREAD_GRAYSCALE);
img2.resize((240,240))
images.append(img2)
img3= cv2.imread("face\\face4.png",cv2.IMREAD_GRAYSCALE);
img3.resize((240,240))
images.append(img3)
img4= cv2.imread("face\\face5.png",cv2.IMREAD_GRAYSCALE);
img4.resize((240,240))
images.append(img4)
labels=[0,0,1,1]
#print(labels)
recognizer = cv2.face.FisherFaceRecognizer_create()
recognizer.train(images, np.array(labels)) # 識(shí)別器訓(xùn)練
predict_image=cv2.imread("face\\face6.png",cv2.IMREAD_GRAYSCALE)
predict_image.resize((240,240))
label,confidence= recognizer.predict(predict_image)
print("label=",label)
print("confidence=",confidence)
運(yùn)行結(jié)果:
label= 0
confidence= 1034.0276952694567
從結(jié)果中可以看出,他的準(zhǔn)確度又比EigenFaces 人臉識(shí)別對(duì)比的化準(zhǔn)確多了。
常見(jiàn)的OpenCV人臉?biāo)惴ㄒ约八鼈兊膶?duì)比
Haar Cascade人臉檢測(cè)(查找):
Haar Cascade是一種傳統(tǒng)的人臉檢測(cè)算法,它基于特征的級(jí)聯(lián)分類(lèi)器。盡管速度較快,但對(duì)于一些角度、光照和遮擋變化較大的情況,可能表現(xiàn)不夠穩(wěn)定和準(zhǔn)確。
Dlib人臉檢測(cè)和識(shí)別:
Dlib庫(kù)提供了基于HOG特征的人臉檢測(cè)和深度學(xué)習(xí)的人臉識(shí)別。Dlib在不同角度和輕微遮擋下有良好的檢測(cè)性能。它還可以進(jìn)行人臉特征點(diǎn)檢測(cè),如眼睛、嘴巴等。
深度學(xué)習(xí)模型:(后續(xù)講解)
OpenCV也集成了一些深度學(xué)習(xí)模型用于人臉檢測(cè)和識(shí)別,如基于CNN的人臉檢測(cè)器和基于深度學(xué)習(xí)的人臉識(shí)別算法。這些模型通常在大規(guī)模數(shù)據(jù)集上進(jìn)行了訓(xùn)練,具有更高的準(zhǔn)確性,但可能需要更多的計(jì)算資源。
LBPH人臉識(shí)別:(應(yīng)用少)
局部二值模式直方圖(LBPH)是一種基于紋理的人臉識(shí)別算法,適用于小規(guī)模數(shù)據(jù)庫(kù)。它不需要大量的訓(xùn)練數(shù)據(jù),但在復(fù)雜場(chǎng)景下可能性能較差。
Eigenfaces和Fisherfaces:
Eigenfaces和Fisherfaces是基于PCA和LDA的經(jīng)典人臉識(shí)別算法。它們?cè)谀承┣闆r下可能表現(xiàn)出色,但在復(fù)雜環(huán)境中可能不如深度學(xué)習(xí)模型。
在選擇OpenCV人臉?biāo)惴〞r(shí),需要考慮以下因素:
準(zhǔn)確性: 算法的準(zhǔn)確性是否滿(mǎn)足你的應(yīng)用需求?
速度: 算法的執(zhí)行速度是否足夠快?
復(fù)雜度: 算法的實(shí)現(xiàn)和使用是否容易?
數(shù)據(jù)規(guī)模: 你的數(shù)據(jù)集是大還是???
場(chǎng)景: 你的應(yīng)用場(chǎng)景中是否有遮擋、光照變化等因素?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-665270.html
一般來(lái)說(shuō),對(duì)于復(fù)雜的人臉檢測(cè)和識(shí)別問(wèn)題,深度學(xué)習(xí)模型可能會(huì)更加準(zhǔn)確,但也需要更多的計(jì)算資源。對(duì)于一些簡(jiǎn)單的應(yīng)用,傳統(tǒng)的方法如Haar Cascade或Dlib可能已經(jīng)足夠。選擇適合自己應(yīng)用的算法需要根據(jù)具體情況進(jìn)行權(quán)衡和評(píng)估。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-665270.html
到了這里,關(guān)于opencv 進(jìn)階13-Fisherfaces 人臉識(shí)別-函數(shù)cv2.face.FisherFaceRecognizer_create()的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!