面部識別是通過視頻采集設備獲取用戶的面部圖像,然後使用核心算法對人臉的面部位置、臉型和角度進行計算和分析,然後將其與自有數據庫中的現有模板進行比較,進而判斷用戶的真實身份。
人臉識別算法是指在檢測到人臉並定位人臉的關鍵特征點後,可以切割出主要的人臉區域並經過預處理後輸入後端的識別算法。識別算法應該完成人臉特征的提取,並將其與庫存中的已知人臉進行比較,以完成最終的分類。
人臉識別算法主要有四種:基於人臉特征點的識別算法、基於整張人臉圖像的識別算法、基於模板的識別算法和基於神經網絡的識別算法。
人臉識別算法原理;
該系統的輸入壹般是壹幅或壹系列身份未定的人臉圖像,以及人臉數據庫中若幹幅身份已知或對應代碼的人臉圖像,而輸出是壹系列相似性得分,表明待識別人臉的身份。
人臉識別的三種經典算法
1,特征臉算法
特征臉是在人臉識別的計算機視覺問題中使用的壹組特征向量的名稱。特征臉是基於PCA(主成分分析)的,因此學習特征臉需要我們了解PCA的原理。
基本思想
主成分分析(PCA)是壹種矩陣壓縮算法,可以降低矩陣的維數並盡可能保留原始矩陣的信息。簡單來說就是將n×m的矩陣轉化為n×k的矩陣,並且只保留矩陣的主要特征,從而大大節省了空間和數據。PCA的實現需要降維,即將矩陣從高維變換到低維。然而,主成分分析的降維離不開協方差矩陣。方差描述了壹維數據樣本與均值的偏差,是壹種用於衡量兩個隨機變量之間關系的統計量。從角度來看,角度越小,數值越大,方向越接近,也就是正相關越多。協方差矩陣度量的不僅是兩個隨機變量之間的關系,而且是維度之間的關系,而不是樣本之間的關系。
要學習壹個新東西,尤其是知識,我們需要理解知識中的思想。我在理解和學習特征臉算法時,它的思想是圖像識別首先要選擇壹個合適的子空間,將所有圖像集中在這個子空間中,然後在這個子空間中測量相似性或進行分類學習,然後再談論子空間到另壹個空間的變換。這有以下作用:第壹,同壹類別的圖像更近,第二,不同類別的圖像相距更遠;這樣,通過線性分類分離的圖像可以很容易地在新空間中分離。同時,特征人臉技術會找到人臉圖像分布的基本元素,即人臉圖像樣本集的協方差矩陣的特征向量,從而表示人臉圖像。人臉圖像的基本元素有很多,比如眼睛、臉頰、嘴唇等基本元素。這些特征向量在特征臉的圖像空間中生成的子空間稱為子臉空間。
子空間生成後,就需要構造空間了,那麽如何構造空間呢?首先要尋找人臉的* * *其次要尋找個體和* * *的區別最後要明白* * *其實是壹個空間個體是壹個向量。利用協方差矩陣對目標集中所有人臉圖像的特征值進行分解,得到相應的特征向量。這些特征向量就是“特征面”。找出特征向量的特征並線性組合。在基於每個特征子面的空間中,每個面是壹個點,這個點的坐標是每個面在每個特征基下的投影坐標。
特征臉算法過程
獲取人臉圖像數據,將每個人臉圖像矩陣按行串成壹維,每個人臉為壹個向量;
將對應維度中的M張臉相加,然後平均得到“平均臉”;
從每個圖像中減去平均人臉向量;
計算協方差矩陣;
基於特征臉記憶的人臉識別:
算法實踐過程;
訓練圖像
找到普通臉
獲取特征子面
執行圖像重建。
尋找相似度高的人臉圖像。
2.FisherFace算法
FisherFace是Fisher線性判別式在人臉識別中的應用。線性判別分析(LDA)算法的思想最早是由英國統計學家和遺傳學家、現代統計科學的奠基人之壹羅納德提出的。LDA算法使用統計方法試圖找到對象之間特征的線性組合,並在降維的同時考慮類別信息。通過該算法獲得的線性組合可以用作線性分類器或降低維度。
基本思想
線性判別分析的基本思想是將高維模式樣本投影到低維最優向量空間中,從而提取重要的分類信息並壓縮特征空間的維度。投影後,保證模式樣本在新的子空間中具有最大的類間距離和最小的類內距離,即模式在該空間中具有最佳的可分性。feature face中使用的理論和特征臉有相似之處,兩者都是將原始數據的整個維度降低到低維空間的方法。魚臉和特征臉在從整個數據中提取局部紋理特征方面與LBP不同。
Fisher線性判別方法用於確定壹個最佳投影方向,構造壹維符號空間,將多維人臉圖像投影到fisherfaces特征空間,並使用類內樣本數據形成壹組特征向量,這些特征向量代表人臉的特征。
我們知道,在樣本數據映射到另壹個特征空間後,該算法使類內距離最小化,使類間距離最大化。LDA算法可以用於降維,其原理與PCA算法非常相似,因此LDA算法也可以用於人臉識別領域。使用PCA算法進行人臉識別的算法稱為特征臉方法,而使用LDA算法進行人臉識別的算法稱為Fisher人臉方法。
與PCA相比,LDA:
相同:1。兩者在降維時都使用了矩陣的特征分解思想;2.兩者都假設數據符合高斯分布。區別:1和LDA是有監督的降維方法,而PCA是無監督的。2.如果數據是K維的,那麽LDA只能降維到(k-1)維,而PCA不受此限制。3.從數學的角度來看,LDA選擇分類性能最好的投影方向,而PCA選擇樣本投影點方差最大的方向。與特征臉算法相比,Fisherfaces算法:
相同:兩者都可以降低數據的維度;兩者都在降維中使用了矩陣特征分解的思想。
不同:Fisherfaces是壹種有監督的降維方法,但Eigenfaces是壹種無監督的降維方法;Fisherfaces不僅可以用於降維,還可以用於分類。
值得壹提的是,FisherFace算法的錯誤率低於哈佛和耶魯人臉數據庫測試的Eigenfaces識別結果。
Fisherface算法流程
獲取人臉圖像數據,然後計算人臉的平均值。
觀察每張臉的特征值。
進行人臉識別,觀察面部特征,判斷是否為個人。
最後,進行人臉識別。
3.LBPH(局部二元模式直方圖)算法
局部二值模式直方圖是LBP特征的統計直方圖,LBPH結合了LBP特征和圖像的空間信息。如果LBP編碼圖像直接用於人臉識別。實際上與不提取LBP特征沒有太大區別,因此在實際的LBP應用中,壹般采用LBP編碼圖像的統計直方圖作為分類識別的特征向量。
原始的LBP算子被定義為將33°窗口內的八個相鄰像素的灰度值與作為閾值的窗口的中心像素進行比較。如果外圍像素值大於或等於中心像素值,則該像素點的位置標記為1,否則為0。這樣,可以比較33的鄰域中的8個點來生成8位二進制數(通常轉換為十進制數,即LBP代碼,**256種),即可以獲得窗口中心像素點的LBP值,並且可以使用該值來反映該區域的紋理特征。
LBPH的尺寸:有8個采樣點。如果使用原始LBP或擴展LBP特征,則圖像的LBP特征向量維數為:64256=16384維,而如果使用UniformPatternLBP特征,則LBP值有59個模式。其特征向量的維數為:6459=3776。可以看出,使用等價模式特征大大降低了其特征向量的維數,這意味著使用機器學習方法的學習時間將大大減少,但性能不會受到很大影響。
基本思想
基於LBPH的人臉識別方法的基本思想是:首先以每個像素為中心,判斷與周圍像素灰度值的關系,並對其進行二進制編碼,從而得到整幅圖像的LBP編碼圖像;然後將LBP圖像劃分為四個區域,得到每個區域的LBP編碼直方圖,進而得到整幅圖像的LBP編碼直方圖。通過比較不同人臉圖像的LBP編碼直方圖,達到人臉識別的目的。它的優點是不受光照、縮放、旋轉和平移的影響。
顧名思義,LBPH算法采用局部特征提取的方法,這是與前兩種方法最大的區別。
算法流程
LBP特征提取:根據統壹LBP算子對原始圖像進行處理;
LBP特征匹配(直方圖計算):將圖像分成若幹子區域,並根據子區域中的LBP值統計其直方圖,並將直方圖作為其區別特征。
4.算法的復制代碼
1)、特征臉算法。
#編碼=utf-8
將numpy作為np導入
導入cv2
導入操作系統
類別特征面(對象):
def _ _ init _ _(self,threshold,dimNum,dsize):
Self.threshold = threshold #閾值尚未使用。
self.dimNum = dimNum
self.dsize = dsize
定義加載(自身,文件名,大小):
'''
加載圖像,灰度化,統壹大小,直方圖均衡化。
:param fileName:圖像文件名
:paramsize:統壹大小。元組形式
:返回:圖像矩陣
'''
img = cv2.imread(文件名)
retImg = cv2 . resize(img,dsize)
retImg = cv2 . CVT color(retImg,cv2。彩色_ RGB 2灰色)
retImg = cv2 . equalize hist(retImg)
# cv2 . im show(‘img‘,retImg)
# cv2.waitKey()
返回重計時
def createImgMat(self,dirName):
'''
生成圖像樣本矩陣,該矩陣被組織為行為屬性並作為樣本列出。
:param dirName:包含訓練數據集的圖像文件夾的路徑。
:返回:樣品矩陣、標簽矩陣
'''
dataMat = NP . zeros((10,1))
label =【】
對於父目錄名,os.walk中的文件名(目錄名):
#打印父項
#打印目錄名
#打印文件名
索引= 0
對於目錄名中的目錄名:
對於os.walk中的子部分、子文件名、子文件名(父+‘/‘+目錄名):
對於子文件名中的文件名:
img = self . loadimg(subpent+‘/‘+filename,self.dsize)
tempImg = NP . reshape(img,(-1,1))
如果索引== 0:
dataMat = tempImg
否則:
dataMat = NP . column _ stack((dataMat,tempImg))
label.append(子部分+‘/‘+文件名)
index += 1
返回數據材料,標簽
def PCA(self、dataMat、dimNum):
'''
PCA函數,用於數據降維。
:param dataMat:樣本矩陣
:param dimNum:降維後的目標維度。
:返回:降維後的樣本矩陣和變換矩陣。
'''
#平均矩陣
mean mat = NP . mat(NP . mean(dataMat,1))。T
打印‘平均矩陣尺寸‘,表示矩陣形狀
diffMat = dataMat-meanMat
#求協方差矩陣,由於樣本維數遠大於樣本數,所以不直接求協方差矩陣,而采用以下方法。
cov mat =(diff mat . t * diff mat)/float(diff mat . shape【1】)#規範化
# cov mat 2 = NP . cov(dataMat,bias=True)
# print基本方法計算的協方差矩陣為’,covMat2。
打印“協方差矩陣維度”,covMat.shape
eigVals,EIG vects = NP . Lina LG . EIG(NP . mat(cov mat))
打印“特征向量維數”,特征向量。形狀
打印“特征值”,特征值
eigVects = diffMat*eigVects
EIG valind = NP . arg sort(EIG vals)
eigValInd = eigValInd 【::-1】
EIG valind = EIG valind【:dim num】#取出指定數字的前n個特征值。
打印“選定特征值”,eigValInd
EIG vectors = EIG vectors/NP . linalg . norm(EIG vectors,axis = 0)#歸壹化特征向量
redEigVects = eigVects 【:,eigValInd】
打印“選定的特征向量”,重新設計向量。形狀
打印“平均矩陣維數”,diffMat.shape
lowMat = redEigVects。T*diffMat
打印‘低維矩陣維度‘,lowMat.shape
返回lowMat,重新設計
定義比較(自身、數據、測試、標簽):
'''
比較函數,這裏只采用最簡單的歐氏距離比較,妳也可以使用KNN和其他方法,如果妳需要在這裏修改它。
:param dataMat:樣本矩陣
:參數測試:原始形式的測試圖像矩陣。
:參數標簽:標簽矩陣
:return:最接近測試圖像的圖像文件名。
'''
testImg = cv2 . resize(testImg,self.dsize)
testImg = cv2 . CVT color(testImg,cv2。彩色_ RGB 2灰色)
testImg = NP . reshape(testImg,(-1,1))
lowMat,redVects = self。PCA(數據矩陣,self.dimNum)
testImg = redVects。t *測試
打印“檢測樣品的轉換尺寸”,testimg.shape
disList =【】
testVec = NP . reshape(testImg,(1,-1))
適用於lowMat中的樣品。t:
dislist . append(NP . Lina LG . norm(testVec-sample))
打印列表
sort index = NP . arg sort(disList)
返回標簽【sort index【0】】
定義預測(自身,目錄名,測試文件名):
'''
預測功能
:param dirName:包含訓練數據集的文件夾的路徑。
:param testFileName:測試圖像文件名。
:返回:預測結果
'''
testImg = cv2 . im read(test filename)
dataMat,label = self.createImgMat(目錄名)
打印“加載圖片標簽”,標簽
ans = self.compare(數據、測試、標簽)
返回答案
if __name__ == '__main__ ':
本征臉=本征臉(20,50,(50,50))
打印特征臉。predict(‘d:/face,‘d:/face _ test/1。BMP’)2)、FisherFaces算法。
#編碼=utf-8
將numpy作為np導入
導入cv2
導入操作系統
類FisherFace(對象):
def _ _ init _ _(self,threshold,k,dsize):
Self.threshold = threshold #閾值,尚未使用。
Self.k = k #指定投影的數量w。
Self.dsize = dsize #統壹大小
定義加載(自身,文件名,大小):
'''
加載圖像,灰度化,統壹大小,直方圖均衡化。
:param fileName:圖像文件名
:paramsize:統壹大小。元組形式
:返回:圖像矩陣
'''
img = cv2.imread(文件名)
retImg = cv2 . resize(img,dsize)
retImg = cv2 . CVT color(retImg,cv2。彩色_ RGB 2灰色)
retImg = cv2 . equalize hist(retImg)
# cv2 . im show(‘img‘,retImg)
# cv2.waitKey()
返回重計時
def createImgMat(self,dirName):
'''
生成圖像樣本矩陣,該矩陣被組織為行為屬性並作為樣本列出。
:param dirName:包含訓練數據集的圖像文件夾的路徑。
:返回:包含樣本矩陣的列表,標簽列表
'''
dataMat = NP . zeros((10,1))
label =【】
數據列表=【】
對於父目錄名,os.walk中的文件名(目錄名):
#打印父項
#打印目錄名
#打印文件名
#index = 0
對於目錄名中的目錄名:
對於os.walk中的子部分、子文件名、子文件名(父+‘/‘+目錄名):
對於索引,枚舉中的文件名(子文件名):
img = self . loadimg(subpent+‘/‘+filename,self.dsize)
tempImg = NP . reshape(img,(-1,1))
如果索引== 0:
dataMat = tempImg
否則:
dataMat = NP . column _ stack((dataMat,tempImg))
datalist . append(dataMat)
label.append(子部分)
返回數據列表,標簽
def LDA(self,dataList,k):
'''
多分類問題的線性判別分析算法
:參數數據列表:樣本矩陣列表
:param k:投影向量的數量k
:返回:轉換後的矩陣列表和轉換後的矩陣。
'''
n =數據列表【0】。形狀【0】
w = NP . zero((n,self.k))
SW = NP . zeros((n,n))
sb = NP . zeros((n,n))
u = NP . zeros((n,1))
N = 0
meanList =【】
sampleNum =【】
對於數據列表中的數據材質:
mean mat = NP . mat(NP . mean(dataMat,1))。T
mean list . append(mean mat)
sample num . append(datamat . shape【1】)
數據矩陣=數據矩陣-平均矩陣
sw =數據矩陣*數據矩陣。T
西南+=西南
打印“軟件尺寸”,軟件形狀
對於索引,枚舉中的mean mat(mean list):
m = sampleNum【index】
u += m*meanMat
N += m
u = u/N
打印“u的尺寸”,u形
對於索引,枚舉中的mean mat(mean list):
m = sampleNum【index】
sb = m *(mean mat-u)* *T
某人
打印“某人的尺寸”,某人的形狀
eigVals,EIG vects = NP . Lina LG . EIG(NP . mat(NP . Lina LG . inv(Sw)* Sb))
EIG valind = NP . arg sort(EIG vals)
eigValInd = eigValInd【::-1】
EIG valind = EIG valind【:k】#取出指定數量的前k個特征值。
打印“選定特征值”,特征值有效。形狀
EIG vectors = EIG vectors/NP . linalg . norm(EIG vectors,axis = 0)#歸壹化特征向量
redEigVects = eigVects 【:,eigValInd】
打印“轉換矩陣維度”,重定向。形狀
transMatList =【】
對於數據列表中的數據材質:
trans mat list . append(redigvects。T*dataMat)
返回傳輸列表,重新定義
定義比較(自身、數據列表、測試、標簽):
'''
比較函數,這裏只采用最簡單的歐氏距離比較,妳也可以使用KNN和其他方法,如果妳需要在這裏修改它。
:參數數據列表:樣本矩陣列表
:參數測試:原始形式的測試圖像矩陣。
:參數標簽:標簽矩陣
:return:最接近測試圖像的圖像文件夾,即類別。
'''
testImg = cv2 . resize(testImg,self.dsize)
testImg = cv2 . CVT color(testImg,cv2。彩色_ RGB 2灰色)
testImg = NP . reshape(testImg,(-1,1))
transMatList,redVects = fisherface。數據列表
testImg = redVects。t *測試
打印“檢測樣品的轉換尺寸”,testimg.shape
disList =【】
testVec = NP . reshape(testImg,(1,-1))
sumVec = NP . mat(NP . zeros((self . dsize【0】* self . dsize【1】,1)))
對於transMat列表中的trans mat:
用於transMat中的樣品。t:
dislist . append(NP . Lina LG . norm(testVec-sample))
打印列表
sort index = NP . arg sort(disList)
返回標簽【sort index【0】/9】
定義預測(自身,目錄名,測試文件名):
'''
預測功能
:param dirName:包含訓練數據集的文件夾的路徑。
:param testFileName:測試圖像文件名。
:返回:預測結果
'''
testImg = cv2 . im read(test filename)
dataMat,label = self.createImgMat(目錄名)
打印“加載圖片標簽”,標簽
ans = self.compare(數據、測試、標簽)
返回答案
if _ _ name _ _ = =“_ _ main _ _“:
fisher face = fisher face(10,20,(20,20))
ans = fisher face . predict(‘d:/face‘,‘d:/face _ test/8 . BMP‘)
打印ans3)、LBPH算法
#編碼=utf-8
將numpy作為np導入
導入操作系統
導入cv2
LBP類(對象):
def _ _ init _ _(self,threshold,dsize,blockNum):
Self.dsize = dsize #統壹大小
Self.blockNum = blockNum #劃分的塊數
Self.threshold = threshold #閾值,尚未使用。
定義加載(自身,文件名,大小):
'''
加載圖像,灰度化,統壹大小,直方圖均衡化。
:param fileName:圖像文件名
:paramsize:統壹大小。元組形式
:返回:圖像矩陣
'''
img = cv2.imread(文件名)
retImg = cv2 . resize(img,dsize)
retImg = cv2 . CVT color(retImg,cv2。彩色_ RGB 2灰色)
retImg = cv2 . equalize hist(retImg)
# cv2 . im show(‘img‘,retImg)
# cv2.waitKey()
返回重計時
def loadimages list(self,dirName):
'''
加載圖像矩陣列表
:param dirName:文件夾路徑
:返回:包含最原始圖像矩陣的列表和標簽矩陣。
'''
imgList =【】
label =【】
對於父目錄名,os.walk中的文件名(目錄名):
#打印父項
#打印目錄名
#打印文件名
對於目錄名中的目錄名:
對於os.walk中的子部分、子文件名、子文件名(父+‘/‘+目錄名):
對於子文件名中的文件名:
img = self . loadimg(subpent+‘/‘+filename,self.dsize)
img list . append(img)#原始圖像矩陣被添加到列表中而不進行任何處理。
label.append(子部分+‘/‘+文件名)
返回imgList,標簽
def getHopCounter(self,num):
'''
計算二進制序列是否只改變兩次。
:參數編號:編號
:return: 01更改次數
'''
binNum = bin(數字)
binStr = str(binNum)【2:】
n = len(binStr)
if n = center)*(1擴展知識:人臉識別算法研究的難點
人臉識別算法已經研究了很長時間,大多數算法在簡單背景的情況下都能很好地處理它。但是人臉識別的應用範圍很廣,而且只是簡單的圖像測試,遠遠不能滿足實際需求。所以人臉識別算法還存在很多難點。
照明
光照是機器視覺中的壹個老問題,尤其是在人臉識別中,算法還沒有達到可以使用的程度。
態度
與光照問題類似,姿態問題也是人臉識別研究中需要解決的技術難點。對姿態的研究相對較少,大多數人臉識別算法主要針對正面或接近正面的人臉圖像。當俯仰或左右兩側嚴重時,人臉識別算法的識別率也會急劇下降。
避難所
遮擋對於不合作條件下的人臉圖像采集來說是壹個非常嚴重的問題,尤其是在監控環境中,被監控對象經常佩戴眼鏡、帽子等飾物,這可能會使采集到的人臉圖像不完整,從而影響後期的特征提取和識別,甚至導致人臉識別算法的失敗。
年齡變化
隨著年齡的變化,面部外觀也在發生變化,尤其是對於青少年來說,這種變化更為明顯。對於不同的年齡段,人臉識別算法的識別率是不同的。
圖像質量
人臉圖像可能有多種來源,並且由於采集設備的不同,獲得的人臉圖像質量也不同,特別是對於那些分辨率低、噪聲大、質量差的人臉圖像,如何有效地識別人臉是壹個需要關註的問題。同樣,對於高分辨率圖像,對人臉識別算法的影響需要進壹步研究。
缺少樣品
基於統計學習的人臉識別算法是人臉識別領域的主流算法,但是統計學習方法需要大量的訓練。由於人臉圖像在高維空間中的分布是壹種不規則的流行分布,因此可以獲得的樣本只是人臉圖像空間中非常小的壹部分。如何解決小樣本下的統計學習問題需要進壹步研究。
海量數據
傳統的人臉識別算法如PCA和LDA可以在小規模數據中輕松訓練和學習。然而,對於大量數據,這些方法的訓練過程是困難的,甚至可能崩潰。
大規模人臉識別
隨著人臉數據庫的增長,人臉算法的性能會下降。