導航:首頁 > 源碼編譯 > lda演算法人臉識別

lda演算法人臉識別

發布時間:2023-12-20 03:11:03

Ⅰ opencv實現人臉識別有多少種演算法

OpenCV在2.4.1以後的版本中開始自帶人臉識別,共有三種人臉識別演算法的實現,分別是PCA , LDA , LBPH. OpenCV2創建方法如下:
cv::Ptr<cv::FaceRecognizer>facerPCA,facerLDA;
cv::Ptr<cv::FaceRecognizer>facerLBPH=cv::createLBPHFaceRecognizer();
facerPCA=cv::Algorithm::create<cv::FaceRecognizer>("FaceRecognizer.Eigenfaces");
facerLDA=cv::Algorithm::create<cv::FaceRecognizer>("FaceRecognizer.Fisherfaces");
在OpenCV3中,人臉識別的實現被移動到第三方庫opencv_contrib中,而且OpenCV3版本的各個版本3.0.0,3.2.0,3.3.0的創建方法均不同,且都被移動到cv::face::名字空間下.

Ⅱ 人臉識別有什麼優化演算法還請各位大神賜教,簡單一點的。謝謝

人臉識別技術概述
廣義的人臉識別主要分為人臉檢測(face detection)、特徵提取(feature extraction)和人臉識別(face recognition)三個過程,如圖1所示。
人臉,人臉識別,人臉識別技術
圖1 典型的人臉識別過程
其中,第三步提到的人臉識別是狹義的人臉識別,即將待識別人臉所提取的特徵與資料庫中人臉的特徵進行對比,根據相似度判別分類。而人臉識別又可以分為兩個大類:一類是確認(verification),這是人臉圖像與資料庫中已存的該人圖像比對的過程,回答你是不是你的問題;另一類是辨認(identification),這是人臉圖像與資料庫中已存的所有圖像匹配的過程,回答你是誰的問題。顯然,人臉辨認要比人臉確認困難,因為辨認需要進行海量數據的匹配。在辨認過程中,海量數據的處理、特徵提取和分類演算法的選擇變得非常重要。識別率和識別速度是人臉識別技術中主要的衡量演算法性能的指標。本文後面提到的人臉識別,主要指的是人臉辨認。
人臉識別技術原理
人臉識別演算法發展到今天,大致上可以分為兩類:基於特徵的人臉識別演算法和基於外觀的人臉識別演算法。其中,多數基於特徵的人臉識別演算法屬於早期的人臉識別演算法,現在已經不再使用。不過近些年出現了一些新的基於特徵的演算法,並取得不錯的效果。而基於外觀的人臉識別演算法是由於實現簡單,受到廣泛關注。接下來將分別介紹兩類人臉識別演算法。
基於特徵的人臉識別演算法:早期的人臉識別演算法主要是基於特徵模板和幾何約束來實現的。這一類演算法首先對輸入圖像進行處理,提取出如眼睛、鼻子和嘴等面部特徵和外觀輪廓。然後計算這些面部特徵之間的幾何關系,如距離、面積和角度等。這樣將輸入圖像轉換為幾何特徵向量後,使用標準的統計模式識別技術進行匹配分類。由於演算法利用了一些直觀的特徵,計算量小。不過,由於其所需的特徵點不能精確選擇,限制了它的應用范圍。另外,當光照變化、人臉有外物遮擋、面部表情變化時,特徵變化較大。所以說,這類演算法只適合於人臉圖像的粗略識別,無法在實際中應用。
人臉,人臉識別,人臉識別技術
圖2 一些典型的面部幾何特徵示意圖
以上這些方法都是通過一些特徵模板和幾何約束來檢測特定的面部特徵,並計算特徵之間的關系。還有一些方法使用了圖像的局部表示來提取特徵。其中最受關注的方法是局部二值模式(LBP)演算法。LBP方法首先將圖像分成若干區域,在每個區域的像素3x3鄰域中用中心值作閾值化,將結果看成是二進制數。圖3顯示了一個LBP運算元。LBP運算元的特點是對單調灰度變化保持不變。每個區域通過這樣的運算得到一組直方圖,然後將所有的直方圖連起來組成一個大的直方圖並進行直方圖匹配計算進行分類。
人臉,人臉識別,人臉識別技術
圖3 LBP運算元
基於特徵的人臉識別演算法主要的優勢在於對姿態、尺度和光照等變化魯棒。由於多數特徵是基於手動選擇和先驗知識,受圖像本身的成像質量影響較少。另外,提取出的面部特徵往往維數較低,匹配速度快。這些方法的缺點是自動特徵提取的難度較大。如果特徵集的鑒別能力弱,再多的後續處理也無法補償本身的不足。
基於外觀的人臉識別演算法:基於外觀的人臉識別演算法也稱為整體方法。它們使用圖像的全局信息來辨識人臉。最簡單的整體方法是用二維數組來存放圖像的灰度值,然後直接對輸入圖像和資料庫中的所有圖像進行相關性比較。這種方法的缺點非常多,如易受環境影響、計算耗時等。其中一個重要的問題是這樣的分類是在一個非常高維的空間中進行的。為了克服維數問題,一些演算法使用統計降維方法來獲取和保留更有用的信息,最典型的演算法就是主成分分析(PCA)演算法和線性鑒別分析(LDA)演算法。
PCA演算法指出任何特定的人臉可以由一個低維的特徵子空間表示,並可以用這個特徵子空間近似地重建。將輸入人臉圖像投影到特徵子空間上得到的特徵與已知的資料庫進行比對來確定身份。PCA演算法選取的特徵最大化了人臉樣本間的差異,但也保留了一些由於光照和面部表情產生的不必要的變化。而同一個人由於光照產生的變化可能會大於不同人之間的變化,如圖4所示。LDA演算法在最大化不同個體之間的樣本差異的同時,最小化同一個體內部的樣本差異。這樣達到了人臉特徵子空間的劃分。圖5是PCA和LDA演算法的示例。其中,PCA的特徵臉是由組成PCA特徵子空間的特徵向量按二維圖像來排列得到的類似人臉的圖像。LDA的Fisher臉也是同樣道理。經過特徵臉和Fisher臉重構得到的人臉圖像在第四行。可以看到,PCA重構臉與輸入人臉差異較小,但LDA的Fisher臉很難辨認,但突出了該個體的顯著特徵。PCA和LDA方法都假設存在一個最優的投影子空間。這個子空間的每個區域對應唯一的一個人。然而,事實上在人臉空間中許多人經常會映射到相同的區域中,因此這種假設並不成立。

來源:海鑫科金
http://www.hisign.com.cn/news/instry/2699.html

Ⅲ 降維演算法之LDA(線性判別降維演算法)--有監督

    LDA在模式識別領域( 比如人臉識別,艦艇識別等圖形圖像識別領域 )中有非常廣泛的應用,因此我們有必要了解下它的演算法原理。  

  不同於PCA方差最大化理論, LDA演算法的思想是將數據投影到低維空間之後,使得同一類數據盡可能的緊湊,不同類的數據盡可能的分散 。因此,LDA演算法是一種有監督的機器學習演算法。同時,LDA有如下兩個假設:(1)原始數據根據樣本均值進行分類。(2)不同類的數據擁有相同的協方差矩陣。當然,在實際情況中,不可能滿足以上兩個假設。但是 當數據主要是由均值來區分的時候,LDA一般都可以取得很好的效果 。

    (1)計算類內散度矩陣

    (2)計算類間散度矩陣

    (3)計算矩陣

    (4)對矩陣 進行特徵分解,計算最大的d個最大的特徵值對應的特徵向量組成W。

    (5)計算投影後的數據點

以上就是使用LDA進行降維的演算法流程。實際上LDA除了可以用於降維以外,還可以用於分類。 一個常見的LDA分類基本思想是假設各個類別的樣本數據符合高斯分布 , 這樣利用LDA進行投影後,可以利用極大似然估計計算各個累唄投影數據的均值和方差,進而得到該類別高斯分布的概率密度函數 。當一個新的樣本到來後,我們可以將它投影,然後將投影後的樣本特徵分別帶入各個類別的高斯分布概率密度函數,計算它屬於這個類別的概率,最大的概率對應的類別即為預測類別。LDA應用於分類現在似乎也不是那麼流行。

    class sklearn.discriminant_analysis.LinearDiscriminantAnalysis(solver='svd', shrinkage=None, priors=None, n_components=None, store_covariance=False, tol=0.0001)

參數:

(1)solver: str類型,默認值為"svd",

    svd:使用奇異值分解求解,不用計算協方差矩陣,適用於特徵數量很大的情形,無法使用參數收縮(shrinkage)。

    lsqr:最小平方QR分解,可以結合shrinkage使用。

    eigen:特徵值分解,可以結合shrinkage使用。

 (2)shrinkage: str or float類型,默認值為None

    是否使用參數收縮

    None:不使用參數收縮

    auto:str,使用Ledoit-Wolf lemma

    浮點數:自定義收縮比例。

   (3)components:int類型,需要保留的特徵個數,小於等於n-1

屬性:

(1)covariances_:每個類的協方差矩陣,shape = [n_features, n_features]

(2)means_:類均值,shape = [n_features, n_feateures]

(3)priors_:歸一化的先驗概率。

(4)rotations_:LDA分析得到的主軸,shape = [n_features, n_component]

(5)scalings_:數組列表,每個高斯分布的方差σ

     特點:

        降維之後的維數最多為類別數-1。所以當數據維度很高,但是類別數少的時候,演算法並不適用 。LDA演算法既可以用來降維,又可以用來分類。但是目前來說,主要還是用於降維。在我們 進行圖像識別相關的數據分析時,LDA是一個有力的工具 。

    優點:

   (1) LDA在樣本分類信息依賴均值而不是方差的時候,比PCA之類的演算法較優 。

   (2)在降維過程中可以使用類別的先驗知識經驗,而像PCA這樣的無監督學習則無法使用類別先驗知識。

    缺點:

    (1)LDA不適合非高斯分布樣本進行降維,PCA也存在這個問題。

    (2)LDA降維最多降到類別數K-1的維數,如果我們降維的維度大於k-1,則不能使用LDA。 當然目前有一些LDA的進化版演算法可以繞過這個問題 。

    (3) LDA在樣本分類信息依賴方差而不是均值的時候,降維效果不好 。

    (4)LDA可能過度擬合數據。

    二者都有 降維 的作用。

1.左 邊是PCA,屬於無監督方法 ,當數據沒有標簽時可以用它。 右邊是LDA,屬於監督學習方法 。考慮了數據的分類信息,這樣數據在低維空間上就可以分類了,減少了很多的運算量。

2. PCA主要是從特徵的協方差角度考慮,追求的是在降維之後能夠最大化保持數據的內在信息 。它不考慮分類信息,因此降低維度後,信息損失降到最低,但分類上可能會變得更加困難。 LDA追求的是降維後的數據點盡可能容易被區分 。降維後的樣本數據在新的維度空間有最大的類間距離和最小的類內方差,數據在低維空間有最佳的可分離性。

3. PCA降維後的維度數目是和數據維度相關的 ,原始數據是n維,那麼PCA後維度為1、2~n維。 LDA後的維度數目是和類別的個數相關的 ,原始數據是n維,一共有C個類別,那麼LDA後維度為1、2~C-1維。

4. PCA投影的坐標系都是正交的 。 LDA關注分類能力,不保證投影到的坐標系是正交的 。

Ⅳ 人臉識別演算法是指什麼

本教程操作環境:windows7系統、Dell G3電腦。
人臉識別(Facial Recognition),就是通過視頻採集設備獲取用戶的面部圖像,再利用核心的演算法對其臉部的五官位置、臉型和角度進行計算分析,進而和自身資料庫里已有的範本進行比對,後判斷出用戶的真實身份。
人臉識別演算法是指在檢測到人臉並定位面部關鍵特徵點之後,主要的人臉區域就可以被裁剪出來,經過預處理之後,饋入後端的識別演算法。識別演算法要完成人臉特徵的提取,並與庫存的已知人臉進行比對,完成最終的分類。
人臉識別的演算法有 4 種:基於人臉特徵點的識別演算法、基於整幅 人臉圖像的識別演算法、基於模板的識別演算法、利用神經網路進行識別的演算法。

人臉識別演算法的原理:
系統輸入一般是一張或者一系列含有未確定身份的人臉圖像,以及人臉資料庫中的若干已知身份的人臉圖象或者相應的編碼,而其輸出則是一系列相似度得分,表明待識別的人臉的身份。
人臉識別的三個經典演算法
1、Eigenfaces(特徵臉)演算法

Eigenfaces是在人臉識別的計算機視覺問題中使用的一組特徵向量的名余滑舉稱,豎碧Eigenfaces是基於PCA(主成分分析)的,所以學習Eigenfaces需要我們了解PCA的原理。
基本思想
主成分分析(PCA)是一種矩陣的壓縮演算法,在減少矩陣維數的同時盡可能的保留原矩陣的信息,簡單來說就是將 n×m的矩陣轉換成n×k的矩陣,僅保留矩陣中所存在的主要特性,從而可以大大節省空間和數據量。PCA的實現需要進行降維,也就是將矩陣進行變換,從更高的維度降到低的維度,然而PCA的降維離不開協方差矩陣。方差是描述一維數據樣本本身相對於均值的偏離程度,是一種用來度量兩個隨機變數關系的統計量,從角度來說,其夾角越小,值越大,方向越相近,也就是越正相關。協方差矩陣度量除了是兩個隨機變數的關系外,還是維度與維度之間的關系,而非樣本與樣本之間的關系。
學習一種新的東西,尤其是知識,我們需要了解知識中的思想。我在了解和學習Eigenface演算法時它的思想是圖像識別首先要選擇一個合適的子空間,將所有的圖像集中到這個子空間中,然後在這個子空間中衡量相似性或者進行分類學習,再講子空間變換到另一個空間中,這樣的作用一是同一個類別的圖像離得更近,二是不同的類別的圖像會離得比較遠;這樣經過線性分類分開的圖像在新空間就能容易分開。同時特徵臉技術會尋找人臉圖像分布的基本元素,即人臉圖像樣本集協方差矩陣的特徵向量,以此來表徵人臉圖像。人臉圖像的基本元素有很多,比如眼、面頰、唇等基本元素,這些特徵向量在特徵臉的圖像空間中對應生成的子空間被稱為子臉空間。
生成了子空間之後就要進行空間構造,那麼如何進行空間構造呢?首先要尋找人臉的共性,其次是要尋找個體與共性的差異,還有就是要明白共性其實是空間,個體就是向量。利用協方差矩陣把目標集中所有人臉圖像的特徵值進行分解,得到對應的特徵向量,這些特徵向量就是「特徵臉」。尋找特徵向量的特性,將其進行線性組合。在以每一個特徵子臉為基的空間,每個人臉就是一個點,這個點的坐標就是每一個人臉在每個特徵基下的的投影坐標。
Eigenfaces演算法過程
獲得人臉圖像數據,將每一個人臉圖像矩陣按行串成一維,每個人臉就是一個向量;
將M個人臉在對應維度上加起來,然後求平均得到「平均臉」;
將每個圖像都減去平均臉向量;
計算協方差矩陣;
運用Eigenfaces記性人臉識別;
演算法實踐過程;
訓練圖像
求出平均臉
獲得特徵子臉
進行圖像重構
尋找相似度高的人臉圖像。
2、FisherFace演算法
FisherFace是Fisher線性判別在人臉識別的應用。線性判別分析(LDA)演算法思想最早由英國統計與遺傳學家,現代統計科學的奠讓巧基人之一羅納德*費舍爾(Ronald)提出。LDA演算法使用統計學方法,嘗試找到物體間特徵的一個線性組合,在降維的同時考慮類別信息。通過該演算法得到的線性組合可以用來作為一個線性分類器或者實現降維。
基本思想
線性判別分析的基本思想是:將高維的模式樣本投影到低維最佳矢量空間,以達到抽取重要分類信息和壓縮特徵空間維度的效果,投影後保證模式樣本在新的子空間有最大的類間距離、最小的類內距離,即模式在該空間中有最佳的可分離性。理論和特徵臉里用到的Eigenfaces有相似之處,都是對原有數據進行整體降維映射到低維空間的方法,fisherfaces和Eigenfaces都是從數據整體入手而不同於LBP提取局部紋理特徵。
對降維後的樣本使用Fisher線性判別方法,確定一個最優的投影方向,構造一個一維的體征空間,將多維的人臉圖像投影到 fisherfaces特徵空間,利用類內樣本數據形成一組特徵向量,這組特徵向量就代表了人臉的特徵。
我們知道,該演算法是在樣本數據映射到另外一個特徵空間後,將類內距離最小化,類間距離最大化。LDA演算法可以用作降維,該演算法的原理和PCA演算法很相似,因此LDA演算法也同樣可以用在人臉識別領域。通過使用PCA演算法來進行人臉識別的演算法稱為特徵臉法,而使用LDA演算法進行人臉識別的演算法稱為費舍爾臉法。
LDA和PCA相比:
相同:1、在降維的時候,兩者都使用了矩陣的特徵分解思想;2、兩者都假設數據符合高斯分布。不同:1、LDA是有監督的降維方法,而PCA是無監督的。2、如果說數據是k維的,那麼LDA只能降到(k-1)維度,而PCA不受此限制。3、從數學角度來看,LDA選擇分類性能最好的投影方向,而PCA選擇樣本投影點具有最大方差的方向。Fisherfaces演算法和Eigenfaces演算法相比:
相同:兩者均可以對數據進行降維;兩者在降維時均使用了矩陣特徵分解的思想。
不同:Fisherfaces是有監督的降維方法,而是Eigenfaces無監督的降維方法;Fisherfaces除了可以用於降維,還可以用於分類。
值得一提的是,FisherFace演算法識別的錯誤率低於哈佛和耶魯人臉資料庫測試的Eigenfaces識別結果。
Fisherface演算法流程
獲得人臉圖像數據,然後求出人臉的均值。
觀察各個人臉的特徵值。
進行人臉鑒定,觀察人臉特徵,判斷是否是個人。
最後進行人臉識別。
3、LBPH(Local Binary Patter Histogram)演算法
Local Binary Patterns Histograms即LBP特徵的統計直方圖,LBPH將LBP(局部二值編碼)特徵與圖像的空間信息結合在一起。如果直接使用LBP編碼圖像用於人臉識別。其實和不提取LBP特徵區別不大,因此在實際的LBP應用中,一般採用LBP編碼圖像的統計直方圖作為特徵向量進行分類識別。
原始的LBP運算元定義為在33的窗口內,以窗口中心像素為閾值,將相鄰的8個像素的灰度值與其進行比較,若周圍像素值大於或等於中心像素值,則該像素點的位置被標記為1,否則為0。這樣,33鄰域內的8個點經比較可產生8位二進制數(通常轉換為十進制數即LBP碼,共256種),即得到該窗口中心像素點的LBP值,並用這個值來反映該區域的紋理特徵。
LBPH的維度: 采樣點為8個,如果用的是原始的LBP或Extended LBP特徵,其LBP特徵值的模式為256種,則一幅圖像的LBP特徵向量維度為:64256=16384維,而如果使用的UniformPatternLBP特徵,其LBP值的模式為59種,其特徵向量維度為:6459=3776維,可以看出,使用等價模式特徵,其特徵向量的維度大大減少,這意味著使用機器學習方法進行學習的時間將大大減少,而性能上沒有受到很大影響。
基本思想
建立在LBPH基礎上的人臉識別法基本思想如下:首先以每個像素為中心,判斷與周圍像素灰度值大小關系,對其進行二進制編碼,從而獲得整幅圖像的LBP編碼圖像;再將LBP圖像分為個區域,獲取每個區域的LBP編碼直方圖,繼而得到整幅圖像的LBP編碼直方圖,通過比較不同人臉圖像LBP編碼直方圖達到人臉識別的目的,其優點是不會受到光照、縮放、旋轉和平移的影響。
LBPH演算法「人」如其名,採用的識別方法是局部特徵提取的方法,這是與前兩種方法的最大區別。
LBPH 演算法流程
LBP特徵提取:根據上述的均勻LBP運算元處理原始圖像;
LBP特徵匹配(計算直方圖):將圖像分為若干個的子區域,並在子區域內根據LBP值統計其直方圖,以直方圖作為其判別特徵。
4、演算法的復現代碼
1)、EigenFaces演算法
#encoding=utf-8
import numpy as np
import cv2
import os

class EigenFace(object):
def __init__(self,threshold,dimNum,dsize):
self.threshold = threshold # 閾值暫未使用
self.dimNum = dimNum
self.dsize = dsize

def loadImg(self,fileName,dsize):
『『『
載入圖像,灰度化處理,統一尺寸,直方圖均衡化
:param fileName: 圖像文件名
:param dsize: 統一尺寸大小。元組形式
:return: 圖像矩陣
『『『
img = cv2.imread(fileName)
retImg = cv2.resize(img,dsize)
retImg = cv2.cvtColor(retImg,cv2.COLOR_RGB2GRAY)
retImg = cv2.equalizeHist(retImg)
# cv2.imshow(『img』,retImg)
# cv2.waitKey()
return retImg

def createImgMat(self,dirName):
『『『
生成圖像樣本矩陣,組織形式為行為屬性,列為樣本
:param dirName: 包含訓練數據集的圖像文件夾路徑
:return: 樣本矩陣,標簽矩陣
『『『
dataMat = np.zeros((10,1))
label = []
for parent,dirnames,filenames in os.walk(dirName):
# print parent
# print dirnames
# print filenames
index = 0
for dirname in dirnames:
for subParent,subDirName,subFilenames in os.walk(parent+』/』+dirname):
for filename in subFilenames:
img = self.loadImg(subParent+』/』+filename,self.dsize)
tempImg = np.reshape(img,(-1,1))
if index == 0 :
dataMat = tempImg
else:
dataMat = np.column_stack((dataMat,tempImg))
label.append(subParent+』/』+filename)
index += 1
return dataMat,label

def PCA(self,dataMat,dimNum):
『『『
PCA函數,用於數據降維
:param dataMat: 樣本矩陣
:param dimNum: 降維後的目標維度
:return: 降維後的樣本矩陣和變換矩陣
『『『
# 均值化矩陣
meanMat = np.mat(np.mean(dataMat,1)).T
print 『平均值矩陣維度』,meanMat.shape
diffMat = dataMat-meanMat
# 求協方差矩陣,由於樣本維度遠遠大於樣本數目,所以不直接求協方差矩陣,採用下面的方法
covMat = (diffMat.T*diffMat)/float(diffMat.shape[1]) # 歸一化
#covMat2 = np.cov(dataMat,bias=True)
#print 『基本方法計算協方差矩陣為』,covMat2
print 『協方差矩陣維度』,covMat.shape
eigVals, eigVects = np.linalg.eig(np.mat(covMat))
print 『特徵向量維度』,eigVects.shape
print 『特徵值』,eigVals
eigVects = diffMat*eigVects
eigValInd = np.argsort(eigVals)
eigValInd = eigValInd[::-1]
eigValInd = eigValInd[:dimNum] # 取出指定個數的前n大的特徵值
print 『選取的特徵值』,eigValInd
eigVects = eigVects/np.linalg.norm(eigVects,axis=0) #歸一化特徵向量
redEigVects = eigVects[:,eigValInd]
print 『選取的特徵向量』,redEigVects.shape
print 『均值矩陣維度』,diffMat.shape
lowMat = redEigVects.T*diffMat
print 『低維矩陣維度』,lowMat.shape
return lowMat,redEigVects

def compare(self,dataMat,testImg,label):
『『『
比較函數,這里只是用了最簡單的歐氏距離比較,還可以使用KNN等方法,如需修改修改此處即可
:param dataMat: 樣本矩陣
:param testImg: 測試圖像矩陣,最原始形式
:param label: 標簽矩陣
:return: 與測試圖片最相近的圖像文件名
『『『
testImg = cv2.resize(testImg,self.dsize)
testImg = cv2.cvtColor(testImg,cv2.COLOR_RGB2GRAY)
testImg = np.reshape(testImg,(-1,1))
lowMat,redVects = self.PCA(dataMat,self.dimNum)
testImg = redVects.T*testImg
print 『檢測樣本變換後的維度』,testImg.shape
disList = []
testVec = np.reshape(testImg,(1,-1))
for sample in lowMat.T:
disList.append(np.linalg.norm(testVec-sample))
print disList
sortIndex = np.argsort(disList)
return label[sortIndex[0]]

def predict(self,dirName,testFileName):
『『『
預測函數
:param dirName: 包含訓練數據集的文件夾路徑
:param testFileName: 測試圖像文件名
:return: 預測結果
『『『
testImg = cv2.imread(testFileName)
dataMat,label = self.createImgMat(dirName)
print 『載入圖片標簽』,label
ans = self.compare(dataMat,testImg,label)
return ans

if __name__ == 『__main__』:
eigenface = EigenFace(20,50,(50,50))
print eigenface.predict(『d:/face』,』D:/face_test/1.bmp』)2)、FisherFaces演算法
#encoding=utf-8
import numpy as np
import cv2
import os

class FisherFace(object):
def __init__(self,threshold,k,dsize):
self.threshold = threshold # 閾值,暫未使用
self.k = k # 指定投影w的個數
self.dsize = dsize # 統一尺寸大小

def loadImg(self,fileName,dsize):
『『『
載入圖像,灰度化處理,統一尺寸,直方圖均衡化
:param fileName: 圖像文件名
:param dsize: 統一尺寸大小。元組形式
:return: 圖像矩陣
『『『
img = cv2.imread(fileName)
retImg = cv2.resize(img,dsize)
retImg = cv2.cvtColor(retImg,cv2.COLOR_RGB2GRAY)
retImg = cv2.equalizeHist(retImg)
# cv2.imshow(『img』,retImg)
# cv2.waitKey()
return retImg

def createImgMat(self,dirName):
『『『
生成圖像樣本矩陣,組織形式為行為屬性,列為樣本
:param dirName: 包含訓練數據集的圖像文件夾路徑
:return: 包含樣本矩陣的列表,標簽列表
『『『
dataMat = np.zeros((10,1))
label = []
dataList = []
for parent,dirnames,filenames in os.walk(dirName):
# print parent
# print dirnames
# print filenames
#index = 0
for dirname in dirnames:
for subParent,subDirName,subFilenames in os.walk(parent+』/』+dirname):
for index,filename in enumerate(subFilenames):
img = self.loadImg(subParent+』/』+filename,self.dsize)
tempImg = np.reshape(img,(-1,1))
if index == 0 :
dataMat = tempImg
else:
dataMat = np.column_stack((dataMat,tempImg))
dataList.append(dataMat)
label.append(subParent)
return dataList,label

def LDA(self,dataList,k):
『『『
多分類問題的線性判別分析演算法
:param dataList: 樣本矩陣列表
:param k: 投影向量k的個數
:return: 變換後的矩陣列表和變換矩陣
『『『
n = dataList[0].shape[0]
W = np.zeros((n,self.k))
Sw = np.zeros((n,n))
Sb = np.zeros((n,n))
u = np.zeros((n,1))
N = 0
meanList = []
sampleNum = []

for dataMat in dataList:
meanMat = np.mat(np.mean(dataMat,1)).T
meanList.append(meanMat)
sampleNum.append(dataMat.shape[1])

dataMat = dataMat-meanMat
sw = dataMat*dataMat.T
Sw += sw
print 『Sw的維度』,Sw.shape

for index,meanMat in enumerate(meanList):
m = sampleNum[index]
u += m*meanMat
N += m
u = u/N
print 『u的維度』,u.shape

for index,meanMat in enumerate(meanList):
m = sampleNum[index]
sb = m*(meanMat-u)*(meanMat-u).T
Sb += sb
print 『Sb的維度』,Sb.shape

eigVals, eigVects = np.linalg.eig(np.mat(np.linalg.inv(Sw)*Sb))
eigValInd = np.argsort(eigVals)
eigValInd = eigValInd[::-1]
eigValInd = eigValInd[:k] # 取出指定個數的前k大的特徵值
print 『選取的特徵值』,eigValInd.shape
eigVects = eigVects/np.linalg.norm(eigVects,axis=0) #歸一化特徵向量
redEigVects = eigVects[:,eigValInd]
print 『變換矩陣維度』,redEigVects.shape

transMatList = []
for dataMat in dataList:
transMatList.append(redEigVects.T*dataMat)
return transMatList,redEigVects

def compare(self,dataList,testImg,label):
『『『
比較函數,這里只是用了最簡單的歐氏距離比較,還可以使用KNN等方法,如需修改修改此處即可
:param dataList: 樣本矩陣列表
:param testImg: 測試圖像矩陣,最原始形式
:param label: 標簽矩陣
:return: 與測試圖片最相近的圖像文件夾,也就是類別
『『『
testImg = cv2.resize(testImg,self.dsize)
testImg = cv2.cvtColor(testImg,cv2.COLOR_RGB2GRAY)
testImg = np.reshape(testImg,(-1,1))
transMatList,redVects = fisherface.LDA(dataList,self.k)
testImg = redVects.T*testImg
print 『檢測樣本變換後的維度』,testImg.shape
disList = []
testVec = np.reshape(testImg,(1,-1))
sumVec = np.mat(np.zeros((self.dsize[0]*self.dsize[1],1)))
for transMat in transMatList:
for sample in transMat.T:
disList.append( np.linalg.norm(testVec-sample))
print disList
sortIndex = np.argsort(disList)
return label[sortIndex[0]/9]

def predict(self,dirName,testFileName):
『『『
預測函數
:param dirName: 包含訓練數據集的文件夾路徑
:param testFileName: 測試圖像文件名
:return: 預測結果
『『『
testImg = cv2.imread(testFileName)
dataMat,label = self.createImgMat(dirName)
print 『載入圖片標簽』,label
ans = self.compare(dataMat,testImg,label)
return ans

if __name__==「__main__」:

fisherface = FisherFace(10,20,(20,20))
ans = fisherface.predict(『d:/face』,』d:/face_test/8.bmp』)
print ans3)、LBPH演算法
#encoding=utf-8
import numpy as np
import os
import cv2

class LBP(object):
def __init__(self,threshold,dsize,blockNum):
self.dsize = dsize # 統一尺寸大小
self.blockNum = blockNum # 分割塊數目
self.threshold = threshold # 閾值,暫未使用

def loadImg(self,fileName,dsize):
『『『
載入圖像,灰度化處理,統一尺寸,直方圖均衡化
:param fileName: 圖像文件名
:param dsize: 統一尺寸大小。元組形式
:return: 圖像矩陣
『『『
img = cv2.imread(fileName)
retImg = cv2.resize(img,dsize)
retImg = cv2.cvtColor(retImg,cv2.COLOR_RGB2GRAY)
retImg = cv2.equalizeHist(retImg)
# cv2.imshow(『img』,retImg)
# cv2.waitKey()
return retImg

def loadImagesList(self,dirName):
『『『
載入圖像矩陣列表
:param dirName:文件夾路徑
:return: 包含最原始的圖像矩陣的列表和標簽矩陣
『『『
imgList = []
label = []
for parent,dirnames,filenames in os.walk(dirName):
# print parent
# print dirnames
# print filenames
for dirname in dirnames:
for subParent,subDirName,subFilenames in os.walk(parent+』/』+dirname):
for filename in subFilenames:
img = self.loadImg(subParent+』/』+filename,self.dsize)
imgList.append(img) # 原始圖像矩陣不做任何處理,直接加入列表
label.append(subParent+』/』+filename)
return imgList,label

def getHopCounter(self,num):
『『『
計算二進制序列是否只變化兩次
:param num: 數字
:return: 01變化次數
『『『
binNum = bin(num)
binStr = str(binNum)[2:]
n = len(binStr)
if n = center)*(1擴展知識:人臉識別演算法研究的難點
人臉識別演算法研究已久,在背景簡單的情形下,大部分演算法都能很好的處理。但是,人臉識別的應用范圍頗廣,僅是簡單圖像測試,是遠遠不能滿足現實需求的。所以人臉識別演算法還是存在很多的難點。
光照
光照問題是機器視覺中的老問題,在人臉識別中的表現尤為明顯,演算法未能達到使用的程度。
姿態
與光照問題類似,姿態問題也是人臉識別研究中需要解決的一個技術難點。針對姿態的研究相對比較少,多數的人臉識別演算法主要是針對正面,或接近正面的人臉圖像,當發生俯仰或者左右側而比較厲害的情況下,人臉識別演算法的識別率也將會急劇下降。
遮擋
對於非配合情況下的人臉圖像採集,遮擋問題是一個非常嚴重的問題,特別是在監控環境下,往往被監控對象都會帶著眼鏡﹑帽子等飾物,使得被採集出來的人臉圖像有可能不完整,從而影響了後面的特徵提取與識別,甚至會導致人臉識別演算法的失效。
年齡變化
隨著年齡的變化,面部外觀也在變化,特別是對於青少年,這種變化更加的明顯。對於不同的年齡段,人臉識別演算法的識別率也不同。
圖像質量
人臉圖像的來源可能多種多樣,由於採集設備的不同,得到的人臉圖像質量也不同,特別是對於那些低解析度﹑雜訊大﹑質量差的人臉圖像如何進行有效的人臉識別是個需要關注的問題。同樣的,對於高分辨圖像,對人臉識別演算法的影響也需要進一步研究。
樣本缺乏
基於統計學習的人臉識別演算法是人臉識別領域中的主流演算法,但是統計學習方法需要大量的培訓。由於人臉圖像在高維空間中的分布是一個不規則的流行分布,能得到的樣本只是對人臉圖像空間中的一個極小部分的采樣,如何解決小樣本下的統計學習問題有待進一步的研究。
大量數據
傳統人臉識別演算法如PCA、LDA等在小規模數據中可以很容易進行訓練學習。但是對於大量數據,這些方法其訓練過程難以進行,甚至有可能崩潰。
大規模人臉識別
隨著人臉資料庫規模的增長,人臉演算法的性能將呈現下降。

閱讀全文

與lda演算法人臉識別相關的資料

熱點內容
科普中國app怎麼分享 瀏覽:87
51單片機與32單片機比較 瀏覽:416
SQL加密存儲解密 瀏覽:507
電氣工程師把程序加密 瀏覽:795
解壓切東西動畫版 瀏覽:963
點到橢圓的距離演算法 瀏覽:388
新的編譯系統 瀏覽:533
cad替換樣板命令 瀏覽:363
des演算法例子 瀏覽:390
怎麼隱藏系統app 瀏覽:524
怎麼在惠生活查詢定向app 瀏覽:274
windows程序設計核心編程 瀏覽:444
任我充app怎麼開發票 瀏覽:332
人工智慧與編程語言 瀏覽:408
linux網路編程伺服器 瀏覽:800
海爾32cw空調壓縮機電容多大 瀏覽:749
分區加密了該怎麼辦 瀏覽:105
索尼延時拍攝app怎麼導入 瀏覽:228
冰箱冷凍壞了壓縮機一直響 瀏覽:809
windows伺服器如何組建raid0 瀏覽:180