① 人臉識別的演算法,怎麼從兩張圖片中找出人臉 的部分,並比較兩個人是否是同一個人。
OPENCV里就有,我大4的時候用過。安裝後,DATA目錄下,haarcascades目錄下,haarcascade_frontalface_default.xml就不錯。這是人臉識別的數據。
用法請根據這個文件名找吧,我記得就是調用OPENCV里的某個函數(C++),用這個文件名和圖作參數,返回的就是圖中人臉的位置。
嘿嘿,50分么,下面是我以前的代碼,這里是你用得著的部分:
const char* cascadeFile = "haarcascade_frontalface_alt.xml";
const char* folder = "C:\\Program Files\\OpenCV\\data\\haarcascades\\";
char path[1024];
sprintf(path, "%s%s", folder, cascadeFile);
CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*) cvLoad(path, 0, 0, 0);
//然後cascade就存著需要的那個CvHaarClassifierCascade了。
......
CvSeq* faces = cvHaarDetectObjects(img, cascade, storage,
1.1, 2, CV_HAAR_DO_CANNY_PRUNING,
cvSize(source->getWidth() >> 7, source->getHeight() >> 7));
這句中,img是一個IplImage*,我自己的項目是從攝像頭弄來的,我估計你需要直接用opencv載入圖片。cascade就是載入的OPENCV的樣本數據,storage是一個空間,我用的CvMemStorage* storage = cvCreateMemStorage(0)創建的,detect objects之前我還用了cvClearMemStorage(storage),1.1是縮放,2是檢測像素大小,CV_HAAR_DO_CANNY_PRUNING是比較方法, 一個OPENCV自帶的常量。最後cvSize的返回值是允許的最小臉部大小。每個變數都解釋到了吧。
之後faces->total就是找到幾個臉。用cvGetSeqElem(faces, i)來取每個臉的數據,取出來的東西是(CvRect*),要記得TYPECAST,例如CvRect face1 = *((CvRect*) cvGetSeqElem(faces, 0))。這樣得到的CvRect有4個變數face1.x,face1.y,face1.width,face1.height就是人臉在圖片中的位置了。
② 百度ai的人臉對比准確嗎,百度ai與騰訊ai哪個准哪個好 比如人臉識別
提起ai的人臉對比准確嗎,大家都知道,有人問ai與騰訊ai哪個准哪個好 比如人臉識別相似度?另外,還有人想問請問人臉識別靠什麼認證的?識別率高嗎?你知道這是怎麼回事?其實更美AI裡面的面孔起源真的還挺准確的,想知道它的原理?下面就一起來看看ai與騰訊ai哪個准哪個好 比如人臉識別相似度?希望能夠幫助到大家!
人臉相似度對比在線測試。
人臉識別技術主要是通過識別人臉的特徵來識別身份的。識別率因系統而異吧,每家的產品都有自己的優缺點。我們公司使用的人臉識別考勤系統是雲脈的,在識別率和識別速度方面都挺靠譜,戴眼鏡、戴帽子、化妝啥的也都沒啥影響,好用的。測顏值92分算高嗎。
更美AI通過對全國各地不同地域的上萬張人臉進行測試分析,形成了這樣一套十分具有科學性的一套面孔起源報告,值得大家一起嘗試體驗。測臉型的app有哪些。
這個人臉對比比較靠譜,騰訊AI的人臉識別程度可以達到98%,比我們正常手機的面部解鎖還有準確。
可以用AI軟體來對比。AI人臉比對已經變成非常常用的AI場景之一。步驟如下:ai人臉識別顏值在線。
1、瀏覽器輸入AI應用,AI人臉比對。
2、進入人臉比對的功能演示模塊。
3、點擊左側的『本地上傳』按鈕,上傳本地照片1。兩張照片 在臉比對。
4、點擊右側的『本地上傳』按鈕,上傳本地照片2。
5、稍等片刻,便會得出兩個照片的相似度。如圖所示。
AI的功能:騰訊ai人臉對比准確率。
是用於研究、用於模擬、延伸和擴展人的智能的理論、方法、技術及應用系統的一門新的技術科學,人工智慧研究是為了使機器能夠勝任一些通常需要人類智能才能完成的復雜工作。
主要功能:自然科學方面,能幫助使用數學計算機工具解決問題學科,有助於人類最終認識自身智能形成;經濟方面,I能深入各行各業帶來巨大宏觀效益,促進計算機網路工業發展,能代替人類進行各種技術工作和腦力勞動,造成結構變化;方面,為人類文化生活提供新的。
AI是繪圖的幫手,勾線,繪圖,比如插畫類型的,其工具的度更強,實時上色更為方便。對線條的調整、補充更有優勢。
屏管家人臉識別准確率達到98%以上,甚至更高,因為採用深度AI學習演算法,加上寬動態紅處頭,對人臉有的一個抓拍,准確率極高的…ai顏值60分什麼水平。
1、微信免費人臉識別網站。
打開微信,選擇底部「發現」,點擊進入「小程序」,在搜索欄輸入「騰旭AI體驗中心」,進入小程序。選擇「人臉對比」,上傳圖片後點擊「人臉對比」即可。
2、本地化人臉相似度比對軟體
本地化人臉相似度比對軟體是一款比較兩張面孔相似度的軟體,在電腦本地選擇兩張人頭像照片,選好照片以後即可自動顯示兩張照片的相似程度,不需要連網操作,軟體親測,比較結果還是挺準的,有需要的朋友不妨試試!
3、人臉識別對比軟體
本地化人臉識別對比軟體,本地選擇兩張需要對比相似度的人臉圖片即可看到相似度,不需要網路,完全可以離線使用!比對2張人臉圖像相似度的技術技術主要分為兩部分:部為前端人臉檢測技術,主要支持在前端通過眨眼、張嘴、搖頭、點頭等組合動作,確保操作的為真實人臉。全網人臉搜索免費。
第二部為比對2張人臉圖像相似度的技術,該環節通過在檢測技術環節取得整張人臉圖像後,再通過掃描識別,取到頭像後,將現場人臉與上的人臉進行比對識別,判斷是否為同一張人臉。
以上就是與ai與騰訊ai哪個准哪個好 比如人臉識別相似度?相關內容,是關於ai與騰訊ai哪個准哪個好 比如人臉識別相似度?的分享。看完ai的人臉對比准確嗎後,希望這對大家有所幫助!
③ 人臉識別怎麼實現
人臉識別的實現方法如下:
(1)參考模板法:首先設計一個或數個標准人臉的模板,然後計算測試採集的樣品與標准模板之間的匹配程度,並通過閾值來判斷是否存在人臉。
(2)人臉規則法:由於人臉具有一定的結構分布特徵,所謂人臉規則的方法即提取這些特徵生成相應的規則以判斷測試樣品是否包含人臉。
(3)樣品學習法:這種方法即採用模式識別中人工神經網路的方法,即通過對面像樣品集和非面像樣品集的學習產生分類器。
(4)膚色模型法:這種方法是依據面貌膚色在色彩空間中分布相對集中的規律來進行檢測。
(5)特徵子臉法:這種方法是將所有面像集合視為一個面像子空間,並基於檢測樣品與其在子空間的投影之間的距離判斷是否存在面像。
④ 人臉識別的演算法
1、人體面貌識別技術的內容
人體面貌識別技術包含三個部分:
(1) 人體面貌檢測
面貌檢測是指在動態的場景與復雜的背景中判斷是否存在面像,並分離出這種面像。一般有下列幾種方法:
①參考模板法
首先設計一個或數個標准人臉的模板,然後計算測試採集的樣品與標准模板之間的匹配程度,並通過閾值來判斷是否存在人臉;
②人臉規則法
由於人臉具有一定的結構分布特徵,所謂人臉規則的方法即提取這些特徵生成相應的規則以判斷測試樣品是否包含人臉;
③樣品學習法
這種方法即採用模式識別中人工神經網路的方法,即通過對面像樣品集和非面像樣品集的學習產生分類器;
④膚色模型法
這種方法是依據面貌膚色在色彩空間中分布相對集中的規律來進行檢測。
⑤特徵子臉法
這種方法是將所有面像集合視為一個面像子空間,並基於檢測樣品與其在子孔間的投影之間的距離判斷是否存在面像。
值得提出的是,上述5種方法在實際檢測系統中也可綜合採用。
(2)人體面貌跟蹤
面貌跟蹤是指對被檢測到的面貌進行動態目標跟蹤。具體採用基於模型的方法或基於運動與模型相結合的方法。
此外,利用膚色模型跟蹤也不失為一種簡單而有效的手段。
(3)人體面貌比對
面貌比對是對被檢測到的面貌像進行身份確認或在面像庫中進行目標搜索。這實際上就是說,將采樣到的面像與庫存的面像依次進行比對,並找出最佳的匹配對象。所以,面像的描述決定了面像識別的具體方法與性能。目前主要採用特徵向量與面紋模板兩種描述方法:
①特徵向量法
該方法是先確定眼虹膜、鼻翼、嘴角等面像五官輪廓的大小、位置、距離等屬性,然後再計算出它們的幾何特徵量,而這些特徵量形成一描述該面像的特徵向量。
②面紋模板法
該方法是在庫中存貯若干標准面像模板或面像器官模板,在進行比對時,將采樣面像所有象素與庫中所有模板採用歸一化相關量度量進行匹配。
此外,還有採用模式識別的自相關網路或特徵與模板相結合的方法。
人體面貌識別技術的核心實際為「局部人體特徵分析」和「圖形/神經識別演算法。」這種演算法是利用人體面部各器官及特徵部位的方法。如對應幾何關系多數據形成識別參數與資料庫中所有的原始參數進行比較、判斷與確認。一般要求判斷時間低於1秒。
2、人體面貌的識別過程
一般分三步:
(1)首先建立人體面貌的面像檔案。即用攝像機採集單位人員的人體面貌的面像文件或取他們的照片形成面像文件,並將這些面像文件生成面紋(Faceprint)編碼貯存起來。
(2)獲取當前的人體面像
即用攝像機捕捉的當前出入人員的面像,或取照片輸入,並將當前的面像文件生成面紋編碼。
(3)用當前的面紋編碼與檔案庫存的比對
即將當前的面像的面紋編碼與檔案庫存中的面紋編碼進行檢索比對。上述的「面紋編碼」方式是根據人體面貌臉部的本質特徵和開頭來工作的。這種面紋編碼可以抵抗光線、皮膚色調、面部毛發、發型、眼鏡、表情和姿態的變化,具有強大的可靠性,從而使它可以從百萬人中精確地辯認出某個人。
人體面貌的識別過程,利用普通的圖像處理設備就能自動、連續、實時地完成。
⑤ 深度學習做人臉識別,和傳統方式比有啥好處
傳統方法中特徵提取主要依賴人工設計的提取器,需要有專業知識及復雜的調參過程,同時每個方法都是針對具體應用,泛化能力及魯棒性較差。
深度學習主要是數據驅動進行特徵提取,根據大量樣本的學習能夠得到深層的、數據集特定的特徵表示,其對數據集的表達更高效和准確,所提取的抽象特徵魯棒性更強,泛化能力更好,並且可以是端到端的。缺點是樣本集影響較大,算力要求較高。
⑥ 想問一下有沒有比較方便的人臉識別演算法,求推薦
主流的人臉識別技術基本上可以歸結為三類,即:基於幾何特徵的方法、基於模板的方法和基於模型的方法。
1. 基於幾何特徵的方法是最早、最傳統的方法,通常需要和其他演算法結合才能有比較好的效果;
2. 基於模板的方法可以分為基於相關匹配的方法、特徵臉方法、線性判別分析方法、奇異值分解方法、神經網路方法、動態連接匹配方法等。
3. 基於模型的方法則有基於隱馬爾柯夫模型,主動形狀模型和主動外觀模型的方法等。
1. 基於幾何特徵的方法
人臉由眼睛、鼻子、嘴巴、下巴等部件構成,正因為這些部件的形狀、大小和結構上的各種差異才使得世界上每個人臉千差萬別,因此對這些部件的形狀和結構關系的幾何描述,可以做為人臉識別的重要特徵。幾何特徵最早是用於人臉側面輪廓的描述與識別,首先根據側面輪廓曲線確定若干顯著點,並由這些顯著點導出一組用於識別的特徵度量如距離、角度等。Jia 等由正麵灰度圖中線附近的積分投影模擬側面輪廓圖是一種很有新意的方法。
採用幾何特徵進行正面人臉識別一般是通過提取人眼、口、鼻等重要特徵點的位置和眼睛等重要器官的幾何形狀作為分類特徵,但Roder對幾何特徵提取的精確性進行了實驗性的研究,結果不容樂觀。
可變形模板法可以視為幾何特徵方法的一種改進,其基本思想是 :設計一個參數可調的器官模型 (即可變形模板),定義一個能量函數,通過調整模型參數使能量函數最小化,此時的模型參數即做為該器官的幾何特徵。
這種方法思想很好,但是存在兩個問題,一是能量函數中各種代價的加權系數只能由經驗確定,難以推廣,二是能量函數優化過程十分耗時,難以實際應用。 基於參數的人臉表示可以實現對人臉顯著特徵的一個高效描述,但它需要大量的前處理和精細的參數選擇。同時,採用一般幾何特徵只描述了部件的基本形狀與結構關系,忽略了局部細微特徵,造成部分信息的丟失,更適合於做粗分類,而且目前已有的特徵點檢測技術在精確率上還遠不能滿足要求,計算量也較大。
2. 局部特徵分析方法(Local Face Analysis)
主元子空間的表示是緊湊的,特徵維數大大降低,但它是非局部化的,其核函數的支集擴展在整個坐標空間中,同時它是非拓撲的,某個軸投影後臨近的點與原圖像空間中點的臨近性沒有任何關系,而局部性和拓撲性對模式分析和分割是理想的特性,似乎這更符合神經信息處理的機制,因此尋找具有這種特性的表達十分重要。基於這種考慮,Atick提出基於局部特徵的人臉特徵提取與識別方法。這種方法在實際應用取得了很好的效果,它構成了FaceIt人臉識別軟體的基礎。
3. 特徵臉方法(Eigenface或PCA)
特徵臉方法是90年代初期由Turk和Pentland提出的目前最流行的演算法之一,具有簡單有效的特點, 也稱為基於主成分分析(principal component analysis,簡稱PCA)的人臉識別方法。
特徵子臉技術的基本思想是:從統計的觀點,尋找人臉圖像分布的基本元素,即人臉圖像樣本集協方差矩陣的特徵向量,以此近似地表徵人臉圖像。這些特徵向量稱為特徵臉(Eigenface)。
實際上,特徵臉反映了隱含在人臉樣本集合內部的信息和人臉的結構關系。將眼睛、面頰、下頜的樣本集協方差矩陣的特徵向量稱為特徵眼、特徵頜和特徵唇,統稱特徵子臉。特徵子臉在相應的圖像空間中生成子空間,稱為子臉空間。計算出測試圖像窗口在子臉空間的投影距離,若窗口圖像滿足閾值比較條件,則判斷其為人臉。
基於特徵分析的方法,也就是將人臉基準點的相對比率和其它描述人臉臉部特徵的形狀參數或類別參數等一起構成識別特徵向量,這種基於整體臉的識別不僅保留了人臉部件之間的拓撲關系,而且也保留了各部件本身的信息,而基於部件的識別則是通過提取出局部輪廓信息及灰度信息來設計具體識別演算法。現在Eigenface(PCA)演算法已經與經典的模板匹配演算法一起成為測試人臉識別系統性能的基準演算法;而自1991年特徵臉技術誕生以來,研究者對其進行了各種各樣的實驗和理論分析,FERET'96測試結果也表明,改進的特徵臉演算法是主流的人臉識別技術,也是具有最好性能的識別方法之一。
該方法是先確定眼虹膜、鼻翼、嘴角等面像五官輪廓的大小、位置、距離等屬性,然後再計算出它們的幾何特徵量,而這些特徵量形成一描述該面像的特徵向量。其技術的核心實際為「局部人體特徵分析」和「圖形/神經識別演算法。」這種演算法是利用人體面部各器官及特徵部位的方法。如對應幾何關系多數據形成識別參數與資料庫中所有的原始參數進行比較、判斷與確認。Turk和Pentland提出特徵臉的方法,它根據一組人臉訓練圖像構造主元子空間,由於主元具有臉的形狀,也稱為特徵臉 ,識別時將測試 圖像投影到主元子空間上,得到一組投影系數,和各個已知人的人臉圖像比較進行識別。Pentland等報告了相當好的結果,在 200個人的 3000幅圖像中得到 95%的正確識別率,在FERET資料庫上對 150幅正面人臉象只有一個誤識別。但系統在進行特徵臉方法之前需要作大量預處理工作如歸一化等。
在傳統特徵臉的基礎上,研究者注意到特徵值大的特徵向量 (即特徵臉 )並不一定是分類性能好的方向,據此發展了多種特徵 (子空間 )選擇方法,如Peng的雙子空間方法、Weng的線性歧義分析方法、Belhumeur的FisherFace方法等。事實上,特徵臉方法是一種顯式主元分析人臉建模,一些線性自聯想、線性壓縮型BP網則為隱式的主元分析方法,它們都是把人臉表示為一些向量的加權和,這些向量是訓練集叉積陣的主特徵向量,Valentin對此作了詳細討論。總之,特徵臉方法是一種簡單、快速、實用的基於變換系數特徵的演算法,但由於它在本質上依賴於訓練集和測試集圖像的灰度相關性,而且要求測試圖像與訓練集比較像,所以它有著很大的局限性。
基於KL 變換的特徵人臉識別方法
基本原理:
KL變換是圖象壓縮中的一種最優正交變換,人們將它用於統計特徵提取,從而形成了子空間法模式識別的基礎,若將KL變換用於人臉識別,則需假設人臉處於低維線性空間,且不同人臉具有可分性,由於高維圖象空間KL變換後可得到一組新的正交基,因此可通過保留部分正交基,以生成低維人臉空間,而低維空間的基則是通過分析人臉訓練樣本集的統計特性來獲得,KL變換的生成矩陣可以是訓練樣本集的總體散布矩陣,也可以是訓練樣本集的類間散布矩陣,即可採用同一人的數張圖象的平均來進行訓練,這樣可在一定程度上消除光線等的干擾,且計算量也得到減少,而識別率不會下降。
4. 基於彈性模型的方法
Lades等人針對畸變不變性的物體識別提出了動態鏈接模型 (DLA),將物體用稀疏圖形來描述 (見下圖),其頂點用局部能量譜的多尺度描述來標記,邊則表示拓撲連接關系並用幾何距離來標記,然後應用塑性圖形匹配技術來尋找最近的已知圖形。Wiscott等人在此基礎上作了改進,用FERET圖像庫做實驗,用 300幅人臉圖像和另外 300幅圖像作比較,准確率達到 97.3%。此方法的缺點是計算量非常巨大 。
Nastar將人臉圖像 (Ⅰ ) (x,y)建模為可變形的 3D網格表面 (x,y,I(x,y) ) (如下圖所示 ),從而將人臉匹配問題轉化為可變形曲面的彈性匹配問題。利用有限元分析的方法進行曲面變形,並根據變形的情況判斷兩張圖片是否為同一個人。這種方法的特點在於將空間 (x,y)和灰度I(x,y)放在了一個 3D空間中同時考慮,實驗表明識別結果明顯優於特徵臉方法。
Lanitis等提出靈活表現模型方法,通過自動定位人臉的顯著特徵點將人臉編碼為 83個模型參數,並利用辨別分析的方法進行基於形狀信息的人臉識別。彈性圖匹配技術是一種基於幾何特徵和對灰度分布信息進行小波紋理分析相結合的識別演算法,由於該演算法較好的利用了人臉的結構和灰度分布信息,而且還具有自動精確定位面部特徵點的功能,因而具有良好的識別效果,適應性強識別率較高,該技術在FERET測試中若干指標名列前茅,其缺點是時間復雜度高,速度較慢,實現復雜。
5. 神經網路方法(Neural Networks)
人工神經網路是一種非線性動力學系統,具有良好的自組織、自適應能力。目前神經網路方法在人臉識別中的研究方興未艾。Valentin提出一種方法,首先提取人臉的 50個主元,然後用自相關神經網路將它映射到 5維空間中,再用一個普通的多層感知器進行判別,對一些簡單的測試圖像效果較好;Intrator等提出了一種混合型神經網路來進行人臉識別,其中非監督神經網路用於特徵提取,而監督神經網路用於分類。Lee等將人臉的特點用六條規則描述,然後根據這六條規則進行五官的定位,將五官之間的幾何距離輸入模糊神經網路進行識別,效果較一般的基於歐氏距離的方法有較大改善,Laurence等採用卷積神經網路方法進行人臉識別,由於卷積神經網路中集成了相鄰像素之間的相關性知識,從而在一定程度上獲得了對圖像平移、旋轉和局部變形的不變性,因此得到非常理想的識別結果,Lin等提出了基於概率決策的神經網路方法 (PDBNN),其主要思想是採用虛擬 (正反例 )樣本進行強化和反強化學習,從而得到較為理想的概率估計結果,並採用模塊化的網路結構 (OCON)加快網路的學習。這種方法在人臉檢測、人臉定位和人臉識別的各個步驟上都得到了較好的應用,其它研究還有 :Dai等提出用Hopfield網路進行低解析度人臉聯想與識別,Gutta等提出將RBF與樹型分類器結合起來進行人臉識別的混合分類器模型,Phillips等人將MatchingPursuit濾波器用於人臉識別,國內則採用統計學習理論中的支撐向量機進行人臉分類。
神經網路方法在人臉識別上的應用比起前述幾類方法來有一定的優勢,因為對人臉識別的許多規律或規則進行顯性的描述是相當困難的,而神經網路方法則可以通過學習的過程獲得對這些規律和規則的隱性表達,它的適應性更強,一般也比較容易實現。因此人工神經網路識別速度快,但識別率低 。而神經網路方法通常需要將人臉作為一個一維向量輸入,因此輸入節點龐大,其識別重要的一個目標就是降維處理。
PCA的演算法描述:利用主元分析法 (即 Principle Component Analysis,簡稱 PCA)進行識別是由 Anderson和 Kohonen提出的。由於 PCA在將高維向量向低維向量轉化時,使低維向量各分量的方差最大,且各分量互不相關,因此可以達到最優的特徵抽取。
⑦ 人臉識別演算法是指什麼
本教程操作環境: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等在小規模數據中可以很容易進行訓練學習。但是對於大量數據,這些方法其訓練過程難以進行,甚至有可能崩潰。
大規模人臉識別
隨著人臉資料庫規模的增長,人臉演算法的性能將呈現下降。
⑧ 人臉識別的識別演算法
人臉識別的基本方法
人臉識別的方法很多,以下介紹一些主要的人臉識別方法。
(1)幾何特徵的人臉識別方法
幾何特徵可以是眼、鼻、嘴等的形狀和它們之間的幾何關系(如相互之間的距離)。這些演算法識別速度快,需要的內存小,但識別率較低。
(2)基於特徵臉(PCA)的人臉識別方法
特徵臉方法是基於KL變換的人臉識別方法,KL變換是圖像壓縮的一種最優正交變換。高維的圖像空間經過KL變換後得到一組新的正交基,保留其中重要的正交基,由這些基可以張成低維線性空間。如果假設人臉在這些低維線性空間的投影具有可分性,就可以將這些投影用作識別的特徵矢量,這就是特徵臉方法的基本思想。這些方法需要較多的訓練樣本,而且完全是基於圖像灰度的統計特性的。目前有一些改進型的特徵臉方法。
(3)神經網路的人臉識別方法
神經網路的輸入可以是降低解析度的人臉圖像、局部區域的自相關函數、局部紋理的二階矩等。這類方法同樣需要較多的樣本進行訓練,而在許多應用中,樣本數量是很有限的。
(4)彈性圖匹配的人臉識別方法
彈性圖匹配法在二維的空間中定義了一種對於通常的人臉變形具有一定的不變性的距離,並採用屬性拓撲圖來代表人臉,拓撲圖的任一頂點均包含一特徵向量,用來記錄人臉在該頂點位置附近的信息。該方法結合了灰度特性和幾何因素,在比對時可以允許圖像存在彈性形變,在克服表情變化對識別的影響方面收到了較好的效果,同時對於單個人也不再需要多個樣本進行訓練。
(5)線段Hausdorff 距離(LHD) 的人臉識別方法
心理學的研究表明,人類在識別輪廓圖(比如漫畫)的速度和准確度上絲毫不比識別灰度圖差。LHD是基於從人臉灰度圖像中提取出來的線段圖的,它定義的是兩個線段集之間的距離,與眾不同的是,LHD並不建立不同線段集之間線段的一一對應關系,因此它更能適應線段圖之間的微小變化。實驗結果表明,LHD在不同光照條件下和不同姿態情況下都有非常出色的表現,但是它在大表情的情況下識別效果不好。
(6)支持向量機(SVM) 的人臉識別方法
近年來,支持向量機是統計模式識別領域的一個新的熱點,它試圖使得學習機在經驗風險和泛化能力上達到一種妥協,從而提高學習機的性能。支持向量機主要解決的是一個2分類問題,它的基本思想是試圖把一個低維的線性不可分的問題轉化成一個高維的線性可分的問題。通常的實驗結果表明SVM有較好的識別率,但是它需要大量的訓練樣本(每類300個),這在實際應用中往往是不現實的。而且支持向量機訓練時間長,方法實現復雜,該函數的取法沒有統一的理論。
人臉識別的方法很多,當前的一個研究方向是多方法的融合,以提高識別率。
在人臉識別中,第一類的變化是應該放大而作為區分個體的標準的,而第二類的變化應該消除,因為它們可以代表同一個個體。通常稱第一類變化為類間變化,而稱第二類變化為類內變化。對於人臉,類內變化往往大於類間變化,從而使在受類內變化干擾的情況下利用類間變化區分個體變得異常困難。正是基於上述原因,一直到21 世紀初,國外才開始出現人臉識別的商用,但由於人臉識別演算法非常復雜,只能採用龐大的伺服器,基於強大的計算機平台。
如果可以的話,可以Te一下colorreco,更好的技術解答。