1. 主成分分析法介紹 什麼是主成分分析法
1、主成分分析(Principal Component Analysis,PCA), 是一種統計方法。通過正交變換將一組可能存在相關性的變數轉換為一組線性不相關的變數,轉換後的這組變數叫主成分。
2、在實際課題中,為了全面分析問題,往往提出很多與此有關的變數(或因素),因為每個變數都在不同程度上反映這個課題的某些信息。
3、主成分分析首先是由K.皮爾森(Karl Pearson)對非隨機變數引入的,爾後H.霍特林將此方法推廣到隨機向量的情形。信息的大小通常用離差平方和或方差來衡量。
2. eigenface 怎樣進行人臉識別
整理了一下,步驟如下:
特徵臉EigenFace從思想上其實挺簡單。就相當於把人臉從像素空間變換到另一個空間,在另一個空間中做相似性的計算。
EigenFace選擇的空間變換方法是PCA,也就是大名鼎鼎的主成分分析。它廣泛的被用於預處理中以消去樣本特徵維度之間的相關性。
EigenFace方法利用PCA得到人臉分布的主要成分,具體實現是對訓練集中所有人臉圖像的協方差矩陣進行本徵值分解,得對對應的本徵向量,這些本徵向量(特徵向量)就是「特徵臉」。每個特徵向量或者特徵臉相當於捕捉或者描述人臉之間的一種變化或者特性。這就意味著每個人臉都可以表示為這些特徵臉的線性組合。
演算法說明白了都是不明白的,所以還是得去看具體實現及具體結構代碼:
3. 電腦是否可以透過口罩還原人臉
電腦當然是可以通過口罩還原人臉的。這主要就是因為現在的電腦系統當中都有了非常高端的人工智慧功能,而且也具有非常高的識別功能,所以只要通過一個人的眼睛就可以懷念他整個臉部。
分子計算機體積小、耗電少、運算快、存儲量大。分子計算機的運行是吸收分子晶體上以電荷形式存在的信息,並以更有效的方式進行組織排列。分子計算機的運算過程就是蛋白質分子與周圍物理化學介質的相互作用過程。轉換開關為酶,而程序則在酶合成系統本身和蛋白質的結構中極其明顯地表示出來。生物分子組成的計算機具備能在生化環境下,甚至在生物有機體中運行,並能以其它分子形式與外部環境交換。因此它將在醫療診治、遺傳追蹤和仿生工程中發揮無法替代的作用。分子晶元體積大大減小,而效率大大提高, 分子計算機完成一項運算,所需的時間僅為10微微秒,比人的思維速度快100萬倍。分子計算機具有驚人的存儲容量,1立方米的DNA溶液可存儲1萬億億的二進制數據。分子計算機消耗的能量非常小,只有電子計算機的十億分之一。由於分子晶元的原材料是蛋白質分子,所以分子計算機既有自我修復的功能,又可直接與分子活體相聯。
4. spss主成分分析步驟是什麼
spss主成分分析法詳細步驟:
1、打開SPSS軟體,導入數據後,依次點擊分析,降維,因子分析。如圖1所示:
(4)特徵臉方法第一次將主成分分析擴展閱讀:
SPSS是世界上最早採用圖形菜單驅動界面的統計軟體,它最突出的特點就是操作界面極為友好,輸出結果美觀漂亮。它將幾乎所有的功能都以統一、規范的界面展現出來,使用Windows的窗口方式展示各種管理和分析數據方法的功能,對話框展示出各種功能選擇項。
用戶只要掌握一定的Windows操作技能,精通統計分析原理,就可以使用該軟體為特定的科研工作服務。SPSS採用類似EXCEL表格的方式輸入與管理數據,數據介面較為通用,能方便的從其他資料庫中讀入數據。
其統計過程包括了常用的、較為成熟的統計過程,完全可以滿足非統計專業人士的工作需要。輸出結果十分美觀,存儲時則是專用的SPO格式,可以轉存為HTML格式和文本格式。對於熟悉老版本編程運行方式的用戶,SPSS還特別設計了語法生成窗口。
5. 人臉識別的發展歷史是怎樣的
人臉識別是一個被廣泛研究著的熱門問題,大量的研究論文層出不窮,在一定程度上有泛濫成「災」之嫌。為了更好地對人臉識別研究的歷史和現狀進行介紹,本文將AFR的研究歷史按照研究內容、技術方法等方面的特點大體劃分為三個時間階段,如表1所示。該表格概括了人臉識別研究的發展簡史及其每個歷史階段代表性的研究工作及其技術特點。下面對三個階段的研究進展情況作簡單介紹:
第一階段(1964年~1990年)
這一階段人臉識別通常只是作為一個一般性的模式識別問題來研究,所採用的主要技術方案是基於人臉幾何結構特徵(Geometricfeature based)的方法。這集中體現在人們對於剪影(Profile)的研究上,人們對面部剪影曲線的結構特徵提取與分析方面進行了大量研究。人工神經網路也一度曾經被研究人員用於人臉識別問題中。較早從事AFR研究的研究人員除了布萊索(Bledsoe)外還有戈登斯泰因(Goldstein)、哈蒙(Harmon)以及金出武雄(Kanade Takeo)等。金出武雄於1973年在京都大學完成了第一篇AFR方面的博士論文,直到現在,作為卡內基-梅隆大學(CMU)機器人研究院的一名教授,仍然是人臉識別領域的活躍人物之一。他所在的研究組也是人臉識別領域的一支重要力量。總體而言,這一階段是人臉識別研究的初級階段,非常重要的成果不是很多,也基本沒有獲得實際應用。
第二階段(1991年~1997年)
這一階段盡管時間相對短暫,但卻是人臉識別研究的高潮期,可謂碩果累累:不但誕生了若干代表性的人臉識別演算法,美國軍方還組織了著名的FERET人臉識別演算法測試,並出現了若干商業化運作的人臉識別系統,比如最為著名的Visionics(現為Identix)的FaceIt系統。
美國麻省理工學院(MIT)媒體實驗室的特克(Turk)和潘特蘭德(Pentland)提出的「特徵臉」方法無疑是這一時期內最負盛名的人臉識別方法。其後的很多人臉識別技術都或多或少與特徵臉有關系,現在特徵臉已經與歸一化的協相關量(NormalizedCorrelation)方法一道成為人臉識別的性能測試基準演算法。
這一時期的另一個重要工作是麻省理工學院人工智慧實驗室的布魯內里(Brunelli)和波基奧(Poggio)於1992年左右做的一個對比實驗,他們對比了基於結構特徵的方法與基於模板匹配的方法的識別性能,並給出了一個比較確定的結論:模板匹配的方法優於基於特徵的方法。這一導向性的結論與特徵臉共同作用,基本中止了純粹的基於結構特徵的人臉識別方法研究,並在很大程度上促進了基於表觀(Appearance-based)的線性子空間建模和基於統計模式識別技術的人臉識別方法的發展,使其逐漸成為主流的人臉識別技術。
貝爾胡米爾(Belhumeur)等提出的Fisherface人臉識別方法是這一時期的另一重要成果。該方法首先採用主成分分析(PrincipalComponent Analysis,PCA,亦即特徵臉)對圖像表觀特徵進行降維。在此基礎上,採用線性判別分析(LinearDiscriminant Analysis, LDA)的方法變換降維後的主成分以期獲得「盡量大的類間散度和盡量小的類內散度」。該方法目前仍然是主流的人臉識別方法之一,產生了很多不同的變種,比如零空間法、子空間判別模型、增強判別模型、直接的LDA判別方法以及近期的一些基於核學習的改進策略。
麻省理工學院的馬哈丹(Moghaddam)則在特徵臉的基礎上,提出了基於雙子空間進行貝葉斯概率估計的人臉識別方法。該方法通過「作差法」,將兩幅人臉圖像對的相似度計算問題轉換為一個兩類(類內差和類間差)分類問題,類內差和類間差數據都要首先通過主成分分析(PCA)技術進行降維,計算兩個類別的類條件概率密度,最後通過貝葉斯決策(最大似然或者最大後驗概率)的方法來進行人臉識別。
人臉識別中的另一種重要方法——彈性圖匹配技術(Elastic GraphMatching,EGM) 也是在這一階段提出的。其基本思想是用一個屬性圖來描述人臉:屬性圖的頂點代表面部關鍵特徵點,其屬性為相應特徵點處的多解析度、多方向局部特徵——Gabor變換[12]特徵,稱為Jet;邊的屬性則為不同特徵點之間的幾何關系。對任意輸入人臉圖像,彈性圖匹配通過一種優化搜索策略來定位預先定義的若乾麵部關鍵特徵點,同時提取它們的Jet特徵,得到輸入圖像的屬性圖。最後通過計算其與已知人臉屬性圖的相似度來完成識別過程。該方法的優點是既保留了面部的全局結構特徵,也對人臉的關鍵局部特徵進行了建模。近來還出現了一些對該方法的擴展。
局部特徵分析技術是由洛克菲勒大學(RockefellerUniversity)的艾提克(Atick)等人提出的。LFA在本質上是一種基於統計的低維對象描述方法,與只能提取全局特徵而且不能保留局部拓撲結構的PCA相比,LFA在全局PCA描述的基礎上提取的特徵是局部的,並能夠同時保留全局拓撲信息,從而具有更佳的描述和判別能力。LFA技術已商業化為著名的FaceIt系統,因此後期沒有發表新的學術進展。
由美國國防部反毒品技術發展計劃辦公室資助的FERET項目無疑是該階段內的一個至關重要的事件。FERET項目的目標是要開發能夠為安全、情報和執法部門使用的AFR技術。該項目包括三部分內容:資助若干項人臉識別研究、創建FERET人臉圖像資料庫、組織FERET人臉識別性能評測。該項目分別於1994年,1995年和1996年組織了3次人臉識別評測,幾種最知名的人臉識別演算法都參加了測試,極大地促進了這些演算法的改進和實用化。該測試的另一個重要貢獻是給出了人臉識別的進一步發展方向:光照、姿態等非理想採集條件下的人臉識別問題逐漸成為熱點的研究方向。
柔性模型(Flexible Models)——包括主動形狀模型(ASM)和主動表觀模型(AAM)是這一時期內在人臉建模方面的一個重要貢獻。ASM/AAM將人臉描述為2D形狀和紋理兩個分離的部分,分別用統計的方法進行建模(PCA),然後再進一步通過PCA將二者融合起來對人臉進行統計建模。柔性模型具有良好的人臉合成能力,可以採用基於合成的圖像分析技術來對人臉圖像進行特徵提取與建模。柔性模型目前已被廣泛用於人臉特徵對准(FaceAlignment)和識別中,並出現了很多的改進模型。
總體而言,這一階段的人臉識別技術發展非常迅速,所提出的演算法在較理想圖像採集條件、對象配合、中小規模正面人臉資料庫上達到了非常好的性能,也因此出現了若干知名的人臉識別商業公司。從技術方案上看, 2D人臉圖像線性子空間判別分析、統計表觀模型、統計模式識別方法是這一階段內的主流技術。
第三階段(1998年~現在)
FERET』96人臉識別演算法評估表明:主流的人臉識別技術對光照、姿態等由於非理想採集條件或者對象不配合造成的變化魯棒性比較差。因此,光照、姿態問題逐漸成為研究熱點。與此同時,人臉識別的商業系統進一步發展。為此,美國軍方在FERET測試的基礎上分別於2000年和2002年組織了兩次商業系統評測。
基奧蓋蒂斯(Georghiades)等人提出的基於光照錐 (Illumination Cones) 模型的多姿態、多光照條件人臉識別方法是這一時期的重要成果之一,他們證明了一個重要結論:同一人臉在同一視角、不同光照條件下的所有圖像在圖像空間中形成一個凸錐——即光照錐。為了能夠從少量未知光照條件的人臉圖像中計算光照錐,他們還對傳統的光度立體視覺方法進行了擴展,能夠在朗博模型、凸表面和遠點光源假設條件下,根據未知光照條件的7幅同一視點圖像恢復物體的3D形狀和表面點的表面反射系數(傳統光度立體視覺能夠根據給定的3幅已知光照條件的圖像恢復物體表面的法向量方向),從而可以容易地合成該視角下任意光照條件的圖像,完成光照錐的計算。識別則通過計算輸入圖像到每個光照錐的距離來完成。
以支持向量機為代表的統計學習理論也在這一時期內被應用到了人臉識別與確認中來。支持向量機是一個兩類分類器,而人臉識別則是一個多類問題。通常有三種策略解決這個問題,即:類內差/類間差法、一對多法(one-to-rest)和一對一法(one-to-one)。
布蘭茲(Blanz)和維特(Vetter)等提出的基於3D變形(3D Morphable Model)模型的多姿態、多光照條件人臉圖像分析與識別方法是這一階段內一項開創性的工作。該方法在本質上屬於基於合成的分析技術,其主要貢獻在於它在3D形狀和紋理統計變形模型(類似於2D時候的AAM)的基礎上,同時還採用圖形學模擬的方法對圖像採集過程的透視投影和光照模型參數進行建模,從而可以使得人臉形狀和紋理等人臉內部屬性與攝像機配置、光照情況等外部參數完全分開,更加有利於人臉圖像的分析與識別。Blanz的實驗表明,該方法在CMU-PIE(多姿態、光照和表情)人臉庫和FERET多姿態人臉庫上都達到了相當高的識別率,證明了該方法的有效性。
2001年的國際計算機視覺大會(ICCV)上,康柏研究院的研究員維奧拉(Viola)和瓊斯(Jones)展示了他們的一個基於簡單矩形特徵和AdaBoost的實時人臉檢測系統,在CIF格式上檢測准正面人臉的速度達到了每秒15幀以上。該方法的主要貢獻包括:1)用可以快速計算的簡單矩形特徵作為人臉圖像特徵;2)基於AdaBoost將大量弱分類器進行組合形成強分類器的學習方法;3)採用了級聯(Cascade)技術提高檢測速度。目前,基於這種人臉/非人臉學習的策略已經能夠實現准實時的多姿態人臉檢測與跟蹤。這為後端的人臉識別提供了良好的基礎。
沙蘇哈(Shashua)等於2001年提出了一種基於商圖像[13]的人臉圖像識別與繪制技術。該技術是一種基於特定對象類圖像集合學習的繪制技術,能夠根據訓練集合中的少量不同光照的圖像,合成任意輸入人臉圖像在各種光照條件下的合成圖像。基於此,沙蘇哈等還給出了對各種光照條件不變的人臉簽名(Signature)圖像的定義,可以用於光照不變的人臉識別,實驗表明了其有效性。
巴斯里(Basri)和雅各布(Jacobs)則利用球面諧波(Spherical Harmonics)表示光照、用卷積過程描述朗博反射的方法解析地證明了一個重要的結論:由任意遠點光源獲得的所有朗博反射函數的集合形成一個線性子空間。這意味著一個凸的朗博表面物體在各種光照條件下的圖像集合可以用一個低維的線性子空間來近似。這不僅與先前的光照統計建模方法的經驗實驗結果相吻合,更進一步從理論上促進了線性子空間對象識別方法的發展。而且,這使得用凸優化方法來強制光照函數非負成為可能,為光照問題的解決提供了重要思路。
FERET項目之後,涌現了若幹人臉識別商業系統。美國國防部有關部門進一步組織了針對人臉識別商業系統的評測FRVT,至今已經舉辦了兩次:FRVT2000和FRVT2002。這兩次測試一方面對知名的人臉識別系統進行了性能比較,例如FRVT2002測試就表明Cognitec, Identix和Eyematic三個商業產品遙遙領先於其他系統,而它們之間的差別不大。另一方面則全面總結了人臉識別技術發展的現狀:較理想條件下(正面簽證照),針對37437人121,589 幅圖像的人臉識別(Identification)最高首選識別率為73%,人臉驗證(Verification)的等錯誤率(EER[14])大約為6%。FRVT測試的另一個重要貢獻是還進一步指出了目前的人臉識別演算法亟待解決的若干問題。例如,FRVT2002測試就表明:目前的人臉識別商業系統的性能仍然對於室內外光照變化、姿態、時間跨度等變化條件非常敏感,大規模人臉庫上的有效識別問題也很嚴重,這些問題都仍然需要進一步的努力。
總體而言,目前非理想成像條件下(尤其是光照和姿態)、對象不配合、大規模人臉資料庫上的人臉識別問題逐漸成為研究的熱點問題。而非線性建模方法、統計學習理論、基於Boosting[15]的學習技術、基於3D模型的人臉建模與識別方法等逐漸成為備受重視的技術發展趨勢。
總而言之, 人臉識別是一項既有科學研究價值,又有廣泛應用前景的研究課題。國際上大量研究人員幾十年的研究取得了豐碩的研究成果,自動人臉識別技術已經在某些限定條件下得到了成功應用。這些成果更加深了我們對於自動人臉識別這個問題的理解,尤其是對其挑戰性的認識。盡管在海量人臉數據比對速度甚至精度方面,現有的自動人臉識別系統可能已經超過了人類,但對於復雜變化條件下的一般人臉識別問題,自動人臉識別系統的魯棒性和准確度還遠不及人類。這種差距產生的本質原因現在還不得而知,畢竟我們對於人類自身的視覺系統的認識還十分膚淺。但從模式識別和計算機視覺等學科的角度判斷,這既可能意味著我們尚未找到對面部信息進行合理采樣的有效感測器(考慮單目攝像機與人類雙眼系統的差別),更可能意味著我們採用了不合適的人臉建模方法(人臉的內部表示問題),還有可能意味著我們並沒有認識到自動人臉識別技術所能夠達到的極限精度。但無論如何,賦予計算設備與人類似的人臉識別能力是眾多該領域研究人員的夢想。相信隨著研究的繼續深入,我們的認識應該能夠更加准確地逼近這些問題的正確答案。
6. 主成分分析的基本步驟
主成分分析的基本步驟:
1、對原始數據標准化
2、計算相關系數
3、計算特徵
4、確定主成分
5、合成主成分。
7. 如何進行主成分分析
主成分分析法的基本思想
主成分分析(Principal Component Analysis)是利用降維的思想,將多個變數轉化為少數幾個綜合變數(即主成分),其中每個主成分都是原始變數的線性組合,各主成分之間互不相關,從而這些主成分能夠反映始變數的絕大部分信息,且所含的信息互不重疊.採用這種方法可以克服單一的財務指標不能真實反映公司的財務情況的缺點,引進多方面的財務指標,但又將復雜因素歸結為幾個主成分,使得復雜問題得以簡化,同時得到更為科學、准確的財務信息。
具體的實際操作我也在學習,主要是在實驗室分析,用minitab
網上有很多這方面的資料,你可以自己去詳細地看
希望對你有用
8. 怎樣使用OpenCV進行人臉識別
1.1.介紹Introction
從OpenCV2.4開始,加入了新的類FaceRecognizer,我們可以使用它便捷地進行人臉識別實驗。本文既介紹代碼使用,又介紹演算法原理。(他寫的源代碼,我們可以在OpenCV的opencv\moles\contrib\doc\facerec\src下找到,當然也可以在他的github中找到,如果你想研究源碼,自然可以去看看,不復雜)
目前支持的演算法有
Eigenfaces特徵臉createEigenFaceRecognizer()
Fisherfaces createFisherFaceRecognizer()
LocalBinary Patterns Histograms局部二值直方圖 createLBPHFaceRecognizer()
下面所有的例子中的代碼在OpenCV安裝目錄下的samples/cpp下面都能找到,所有的代碼商用或者學習都是免費的。
1.2.人臉識別Face Recognition
對人類來說,人臉識別很容易。文獻[Tu06]告訴我們,僅僅是才三天的嬰兒已經可以區分周圍熟悉的人臉了。那麼對於計算機來說,到底有多難?其實,迄今為止,我們對於人類自己為何可以區分不同的人所知甚少。是人臉內部特徵(眼睛、鼻子、嘴巴)還是外部特徵(頭型、發際線)對於人類識別更有效?我們怎麼分析一張圖像,大腦是如何對它編碼的?David Hubel和TorstenWiesel向我們展示,我們的大腦針對不同的場景,如線、邊、角或者運動這些局部特徵有專門的神經細胞作出反應。顯然我們沒有把世界看成零散的塊塊,我們的視覺皮層必須以某種方式把不同的信息來源轉化成有用的模式。自動人臉識別就是如何從一幅圖像中提取有意義的特徵,把它們放入一種有用的表示方式,然後對他們進行一些分類。基於幾何特徵的人臉的人臉識別可能是最直觀的方法來識別人臉。第一個自動人臉識別系統在[Kanade73]中又描述:標記點(眼睛、耳朵、鼻子等的位置)用來構造一個特徵向量(點與點之間的距離、角度等)。通過計算測試和訓練圖像的特徵向量的歐氏距離來進行識別。這樣的方法對於光照變化很穩健,但也有巨大的缺點:標記點的確定是很復雜的,即使是使用最先進的演算法。一些幾何特徵人臉識別近期工作在文獻[Bru92]中有描述。一個22維的特徵向量被用在一個大資料庫上,單靠幾何特徵不能提供足夠的信息用於人臉識別。
特徵臉方法在文獻[TP91]中有描述,他描述了一個全面的方法來識別人臉:面部圖像是一個點,這個點是從高維圖像空間找到它在低維空間的表示,這樣分類變得很簡單。低維子空間低維是使用主元分析(Principal Component Analysis,PCA)找到的,它可以找擁有最大方差的那個軸。雖然這樣的轉換是從最佳重建角度考慮的,但是他沒有把標簽問題考慮進去。[gm:讀懂這段需要一些機器學習知識]。想像一個情況,如果變化是基於外部來源,比如光照。軸的最大方差不一定包含任何有鑒別性的信息,因此此時的分類是不可能的。因此,一個使用線性鑒別(Linear Discriminant Analysis,LDA)的特定類投影方法被提出來解決人臉識別問題[BHK97]。其中一個基本的想法就是,使類內方差最小的同時,使類外方差最大。
近年來,各種局部特徵提取方法出現。為了避免輸入的圖像的高維數據,僅僅使用的局部特徵描述圖像的方法被提出,提取的特徵(很有希望的)對於局部遮擋、光照變化、小樣本等情況更強健。有關局部特徵提取的方法有蓋伯小波(Gabor Waelets)([Wiskott97]),離散傅立葉變換(DiscreteCosinus Transform,DCT)([Messer06]),局部二值模式(LocalBinary Patterns,LBP)([AHP04])。使用什麼方法來提取時域空間的局部特徵依舊是一個開放性的研究問題,因為空間信息是潛在有用的信息。
1.3.人臉庫Face Database
我們先獲取一些數據來進行實驗吧。我不想在這里做一個幼稚的例子。我們在研究人臉識別,所以我們需要一個真的人臉圖像!你可以自己創建自己的數據集,也可以從這里(http://face-rec.org/databases/)下載一個。
AT&TFacedatabase又稱ORL人臉資料庫,40個人,每人10張照片。照片在不同時間、不同光照、不同表情(睜眼閉眼、笑或者不笑)、不同人臉細節(戴眼鏡或者不戴眼鏡)下採集。所有的圖像都在一個黑暗均勻的背景下採集的,正面豎直人臉(有些有有輕微旋轉)。
YaleFacedatabase A ORL資料庫對於初始化測試比較適合,但它是一個簡單的資料庫,特徵臉已經可以達到97%的識別率,所以你使用其他方法很難得到更好的提升。Yale人臉資料庫是一個對於初始實驗更好的資料庫,因為識別問題更復雜。這個資料庫包括15個人(14個男人,1個女人),每一個都有11個灰度圖像,大小是320*243像素。資料庫中有光照變化(中心光照、左側光照、右側光照)、表情變化(開心、正常、悲傷、瞌睡、驚訝、眨眼)、眼鏡(戴眼鏡或者沒戴)。
壞消息是它不可以公開下載,可能因為原來的伺服器壞了。但我們可以找到一些鏡像(比如 theMIT)但我不能保證它的完整性。如果你需要自己剪裁和校準圖像,可以閱讀我的筆記(bytefish.de/blog/fisherfaces)。
ExtendedYale Facedatabase B 此資料庫包含38個人的2414張圖片,並且是剪裁好的。這個資料庫重點是測試特徵提取是否對光照變化強健,因為圖像的表情、遮擋等都沒變化。我認為這個資料庫太大,不適合這篇文章的實驗,我建議使用ORL資料庫。
1.3.1. 准備數據
我們從網上下了數據,下了我們需要在程序中讀取它,我決定使用CSV文件讀取它。一個CSV文件包含文件名,緊跟一個標簽。
/path/to/image.ext;0
假設/path/to/image.ext是圖像,就像你在windows下的c:/faces/person0/image0.jpg。最後我們給它一個標簽0。這個標簽類似代表這個人的名字,所以同一個人的照片的標簽都一樣。我們對下載的ORL資料庫進行標識,可以獲取到如下結果:
./at/s1/1.pgm;0
./at/s1/2.pgm;0
...
./at/s2/1.pgm;1
./at/s2/2.pgm;1
...
./at/s40/1.pgm;39
./at/s40/2.pgm;39
想像我已經把圖像解壓縮在D:/data/at下面,而CSV文件在D:/data/at.txt。下面你根據自己的情況修改替換即可。一旦你成功建立CSV文件,就可以像這樣運行示常式序:
facerec_demo.exe D:/data/at.txt
1.3.2 Creating the CSV File
你不需要手工來創建一個CSV文件,我已經寫了一個Python程序來做這事。
[gm:說一個我實現的方法
如果你會cmd命令,或者稱DOS命令,那麼你打開命令控制台。假設我們的圖片放在J:下的Faces文件夾下,可以輸入如下語句:
J:\Faces\ORL>dir /b/s *.bmp > at.txt
然後你打開at.txt文件可能看到如下內容(後面的0,1..標簽是自己加的):
。。。。
J:\Faces\ORL\s1\1.bmp;0
J:\Faces\ORL\s1\10.bmp;0
J:\Faces\ORL\s1\2.bmp;0
J:\Faces\ORL\s1\3.bmp;0
J:\Faces\ORL\s1\4.bmp;0
J:\Faces\ORL\s1\5.bmp;0
J:\Faces\ORL\s1\6.bmp;0
J:\Faces\ORL\s1\7.bmp;0
J:\Faces\ORL\s1\8.bmp;0
J:\Faces\ORL\s1\9.bmp;0
J:\Faces\ORL\s10\1.bmp;1
J:\Faces\ORL\s10\10.bmp;1
J:\Faces\ORL\s10\2.bmp;1
J:\Faces\ORL\s10\3.bmp;1
J:\Faces\ORL\s10\4.bmp;1
J:\Faces\ORL\s10\5.bmp;1
J:\Faces\ORL\s10\6.bmp;1
。。。。
自然還有c++編程等方法可以做得更好,看這篇文章反響,如果很多人需要,我就把這部分的代碼寫出來。(遍歷多個文件夾,標上標簽)
]
特徵臉Eigenfaces
我們講過,圖像表示的問題是他的高維問題。二維灰度圖像p*q大小,是一個m=qp維的向量空間,所以一個100*100像素大小的圖像就是10,000維的圖像空間。問題是,是不是所有的維數空間對我們來說都有用?我們可以做一個決定,如果數據有任何差異,我們可以通過尋找主元來知道主要信息。主成分分析(Principal Component Analysis,PCA)是KarlPearson (1901)獨立發表的,而 Harold Hotelling (1933)把一些可能相關的變數轉換成一個更小的不相關的子集。想法是,一個高維數據集經常被相關變數表示,因此只有一些的維上數據才是有意義的,包含最多的信息。PCA方法尋找數據中擁有最大方差的方向,被稱為主成分。
演算法描述Algorithmic Description
令 表示一個隨機特徵,其中 .
計算均值向量
計算協方差矩陣 S
計算 的特徵值 和對應的特徵向量
對特徵值進行遞減排序,特徵向量和它順序一致. K個主成分也就是k個最大的特徵值對應的特徵向量。
x的K個主成份:
其中 .
PCA基的重構:
其中 .
然後特徵臉通過下面的方式進行人臉識別:
A. 把所有的訓練數據投影到PCA子空間
B. 把待識別圖像投影到PCA子空間
C. 找到訓練數據投影後的向量和待識別圖像投影後的向量最近的那個。
還有一個問題有待解決。比如我們有400張圖片,每張100*100像素大小,那麼PCA需要解決協方差矩陣 的求解,而X的大小是10000*400,那麼我們會得到10000*10000大小的矩陣,這需要大概0.8GB的內存。解決這個問題不容易,所以我們需要另一個計策。就是轉置一下再求,特徵向量不變化。文獻 [Duda01]中有描述。
[gm:這個PCA還是自己搜著看吧,這里的講的不清楚,不適合初學者看]
OpenCV中使用特徵臉Eigenfaces in OpenCV
給出示常式序源代碼
#include "opencv2/core/core.hpp"
#include "opencv2/contrib/contrib.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <fstream>
#include <sstream>
usingnamespace cv;
usingnamespace std;
static Mat norm_0_255(InputArray _src) {
Mat src = _src.getMat();
// 創建和返回一個歸一化後的圖像矩陣:
Mat dst;
switch(src.channels()) {
case1:
cv::normalize(_src, dst, 0,255, NORM_MINMAX, CV_8UC1);
break;
case3:
cv::normalize(_src, dst, 0,255, NORM_MINMAX, CV_8UC3);
break;
default:
src.To(dst);
break;
}
return dst;
}
//使用CSV文件去讀圖像和標簽,主要使用stringstream和getline方法
staticvoid read_csv(const string& filename, vector<Mat>& images, vector<int>& labels, char separator =';') {
std::ifstream file(filename.c_str(), ifstream::in);
if (!file) {
string error_message ="No valid input file was given, please check the given filename.";
CV_Error(CV_StsBadArg, error_message);
}
string line, path, classlabel;
while (getline(file, line)) {
stringstream liness(line);
getline(liness, path, separator);
getline(liness, classlabel);
if(!path.empty()&&!classlabel.empty()) {
images.push_back(imread(path, 0));
labels.push_back(atoi(classlabel.c_str()));
}
}
}
int main(int argc, constchar*argv[]) {
// 檢測合法的命令,顯示用法
// 如果沒有參數輸入則退出!.
if (argc <2) {
cout <<"usage: "<< argv[0]<<" <csv.ext> <output_folder> "<< endl;
exit(1);
}
string output_folder;
if (argc ==3) {
output_folder = string(argv[2]);
}
//讀取你的CSV文件路徑.
string fn_csv = string(argv[1]);
// 2個容器來存放圖像數據和對應的標簽
vector<Mat> images;
vector<int> labels;
// 讀取數據. 如果文件不合法就會出錯
// 輸入的文件名已經有了.
try {
read_csv(fn_csv, images, labels);
} catch (cv::Exception& e) {
cerr <<"Error opening file \""<< fn_csv <<"\". Reason: "<< e.msg << endl;
// 文件有問題,我們啥也做不了了,退出了
exit(1);
}
// 如果沒有讀取到足夠圖片,我們也得退出.
if(images.size()<=1) {
string error_message ="This demo needs at least 2 images to work. Please add more images to your data set!";
CV_Error(CV_StsError, error_message);
}
// 得到第一張照片的高度. 在下面對圖像
// 變形到他們原始大小時需要
int height = images[0].rows;
// 下面的幾行代碼僅僅是從你的數據集中移除最後一張圖片
//[gm:自然這里需要根據自己的需要修改,他這里簡化了很多問題]
Mat testSample = images[images.size() -1];
int testLabel = labels[labels.size() -1];
images.pop_back();
labels.pop_back();
// 下面幾行創建了一個特徵臉模型用於人臉識別,
// 通過CSV文件讀取的圖像和標簽訓練它。
// T這里是一個完整的PCA變換
//如果你只想保留10個主成分,使用如下代碼
// cv::createEigenFaceRecognizer(10);
//
// 如果你還希望使用置信度閾值來初始化,使用以下語句:
// cv::createEigenFaceRecognizer(10, 123.0);
//
// 如果你使用所有特徵並且使用一個閾值,使用以下語句:
// cv::createEigenFaceRecognizer(0, 123.0);
//
Ptr<FaceRecognizer> model = createEigenFaceRecognizer();
model->train(images, labels);
// 下面對測試圖像進行預測,predictedLabel是預測標簽結果
int predictedLabel = model->predict(testSample);
//
// 還有一種調用方式,可以獲取結果同時得到閾值:
// int predictedLabel = -1;
// double confidence = 0.0;
// model->predict(testSample, predictedLabel, confidence);
//
string result_message = format("Predicted class = %d / Actual class = %d.", predictedLabel, testLabel);
cout << result_message << endl;
// 這里是如何獲取特徵臉模型的特徵值的例子,使用了getMat方法:
Mat eigenvalues = model->getMat("eigenvalues");
// 同樣可以獲取特徵向量:
Mat W = model->getMat("eigenvectors");
// 得到訓練圖像的均值向量
Mat mean = model->getMat("mean");
// 現實還是保存:
if(argc==2) {
imshow("mean", norm_0_255(mean.reshape(1, images[0].rows)));
} else {
imwrite(format("%s/mean.png", output_folder.c_str()), norm_0_255(mean.reshape(1, images[0].rows)));
}
// 現實還是保存特徵臉:
for (int i =0; i < min(10, W.cols); i++) {
string msg = format("Eigenvalue #%d = %.5f", i, eigenvalues.at<double>(i));
cout << msg << endl;
// 得到第 #i個特徵
Mat ev = W.col(i).clone();
//把它變成原始大小,為了把數據顯示歸一化到0~255.
Mat grayscale = norm_0_255(ev.reshape(1, height));
// 使用偽彩色來顯示結果,為了更好的感受.
Mat cgrayscale;
applyColorMap(grayscale, cgrayscale, COLORMAP_JET);
// 顯示或者保存:
if(argc==2) {
imshow(format("eigenface_%d", i), cgrayscale);
} else {
imwrite(format("%s/eigenface_%d.png", output_folder.c_str(), i), norm_0_255(cgrayscale));
}
}
// 在一些預測過程中,顯示還是保存重建後的圖像:
for(int num_components =10; num_components <300; num_components+=15) {
// 從模型中的特徵向量截取一部分
Mat evs = Mat(W, Range::all(), Range(0, num_components));
Mat projection = subspaceProject(evs, mean, images[0].reshape(1,1));
Mat reconstruction = subspaceReconstruct(evs, mean, projection);
// 歸一化結果,為了顯示:
reconstruction = norm_0_255(reconstruction.reshape(1, images[0].rows));
// 顯示或者保存:
if(argc==2) {
imshow(format("eigenface_reconstruction_%d", num_components), reconstruction);
} else {
imwrite(format("%s/eigenface_reconstruction_%d.png", output_folder.c_str(), num_components), reconstruction);
}
}
// 如果我們不是存放到文件中,就顯示他,這里使用了暫定等待鍵盤輸入:
if(argc==2) {
waitKey(0);
}
return0;
}
我使用了偽彩色圖像,所以你可以看到在特徵臉中灰度值是如何分布的。你可以看到特徵臉不但對人臉特徵進行編碼,還對這些圖像中的光照進行編碼。(看第四張圖像是左側的光照,而第五張是右側的光照)[gm:PCA對光照變化圖像識別效果很差,自然有一些改進方法,有後再談]
9. 主成分分析的主要步驟包括
主成分分析是指通過將一組可能存在相關性的變數轉換城一組線性不相關的變數,轉換後的這組變數叫主成分。
主成分分析步驟:1、對原始數據標准化,2、計算相關系數,3、計算特徵,4、確定主成分,5、合成主成分。
主成分分析的原理是設法將原來變數重新組合成一組新的相互無關的幾個綜合變數,同時根據實際需要從中可以取出幾個較少的總和變數盡可能多地反映原來變數的信息的統計方法叫做主成分分析或稱主分量分析,也是數學上處理降維的一種方法。
主成分分析的主要作用
1.主成分分析能降低所研究的數據空間的維數。
2.有時可通過因子負荷aij的結論,弄清X變數間的某些關系。
3.多維數據的一種圖形表示方法。
4.由主成分分析法構造回歸模型。即把各主成分作為新自變數代替原來自變數x做回歸分析。
5.用主成分分析篩選回歸變數。
最經典的做法就是用F1(選取的第一個線性組合,即第一個綜合指標)的方差來表達,即Va(rF1)越大,表示F1包含的信息越多。因此在所有的線性組合中選取的F1應該是方差最大的,故稱F1為第一主成分。
10. 人臉識別方向就業怎麼樣啊
人臉識別技術在公安工作中的應用
人臉識別技術在公安工作中的應用
■郝新華
人臉識別技術的研究方法目前主要有基於整體的人臉識別和基於特徵分析的人臉識別兩個研究方向;並且人臉識別技術已經進入實際應用階段。公安工作中運用人臉識別技術在布控排查、犯罪嫌疑人識別、人像鑒定以及重點場所門禁等領域獲得了良好的應用效果。
人體生物特徵識別是通過計算機、各種感測器和
生物統計學原理等高科技手段密切結合,利用人體固有的生物特徵來進行個人身份識別。包括人臉識別技術在內的人體生物特徵識別技術是近年來在全球范圍內迅速發展起來的計算機安全技術。與虹膜識別、指紋識別、掌紋識別、簽名識別、聲音識別等人體生物特徵識別技術相比,人臉識別具有方便友好、易於接受、不易偽造等優點,目前可用於身份認證、視頻監測及視頻資料檢索分析等方面,是當前計算機視覺、模式識別和人工智慧領域的一個研究熱點。在9·11恐怖襲擊事件發生後,美國連續簽署了三個法案,要求必須採用生物識別技術。我國在第二代身份證上也嵌入了可機讀的人像信息。據報道,2008年北京奧運會期間也將人臉識別系統應用於安保。
一、人臉識別技術概述
人臉自動識別系統的研究開始於20世紀60年代末期,20世紀90年代後期人臉識別技術逐漸從實驗室走向了商用。如1998年德國西門
子公司的Nixdorf高技術公司開發成功Face VACS;2001年日本東芝旗下的E-Solution公司推出Face Pass;美國開發的Face It等專業的商業人臉識別系統開始進入市場。我國從1994年開始研究人臉識別問題;2000年5月銀晨網訊科技有限公司與中國科學院計算機所合作
組建了面像識別聯合實驗室。經過研發,課題組實現跨越式發展,
攻克了數十項技術難關,開發出具有完全自主知識產權的產品和系統;2005年1月18日,由清華大學電子系蘇光大教授擔任人臉識別課題組負責人主持承擔的國家「十五」攻關項目《人臉識別系統》通過了由公安部主持的專家鑒定,達到了國內領先水平和國際先進水平。人臉識別技術作為最容易隱蔽使用的識別技術成為當今國際反恐、安全防範以及刑事偵查等最重要的手段。目前我國人臉識別技術也開
始進入實際應用階段。作為國家863計劃成果產業化基地的銀晨網訊科技有限公司已經開發出人像識別布控機等系列產品。
二、人臉識別的技術方法
人臉作為具有復雜細節變化的自然結構目標,其特徵的可靠性往往受到表情、角度、光照、背景等細微變化的影響,消除這些影響成為人臉識別問題的關鍵。為此,研究人員設計了許多特徵提取演算法,希望在降低面像維數的同時提取穩健可靠的特徵。目前的研究主要有兩個方向:第一是基於整體的人臉識別研究方法,即將人臉圖像看作是一個二維的灰度分布,然後利用不同的降維和特徵提取方法獲得每個人的人臉表徵進行識別;第二是基於特徵分析的人臉識別方法,利用每個人的面部特徵如眼睛、鼻子、眉毛、嘴巴和面部輪廓等的具體位置、大小、形狀及其相對位置的不同來進行特徵提取以達到識別的目的,即將人臉基準點的相對比率和其它描述人臉臉部特徵的形狀參數或類別參數等一起構成識別特徵向量。這種基於整體臉的識別不僅保留了人臉局部之問的拓撲關系,而且也保留了各局部本身
的信息,而基於局部的識別則是通過提取出局部輪廓信息及灰度信息來設計具體識別演算法。
1.特徵臉演算法
1987年Sirovich 和 Kirby提出了主成分分析方法(Principal Component Analysis),Matthew Turk和Alex Pentland於1991年首次將PCA應用於人臉識別,將原始圖像投影到特徵空間中,得到一系列降維圖像,取其主元表示人臉,由於主元具有臉的形狀故稱為「特徵臉」。特徵臉方法中一個基本的方法是基於K-L變換的特徵臉方法,該方法是根據K-L變換得到人臉圖像的特徵,並根據人臉特徵空間進行識別的方法。基於K-L變換的特徵臉技術實質上依賴於圖像灰度在空間分布上的相關性來得到一系列的特徵向量和特徵值來表示。K-L變換主要是對模式樣本矢量的相關矩陣進行特徵值分解,選擇其中的主特徵矢量構成特徵空間。基於主成分分析方法,演算法簡單有效,研
究者在其基礎上進行了大量的改進和擴展,目前仍然是人臉識別領域流行的演算法之一,同時也是對比測試時的基準識別演算法。