人臉識別經典算法一:特征臉方法(Eigenface)

這篇文章是擼主要介紹人臉識別經典方法的第一篇,后續會有其他方法更新。特征臉方法基本是將人臉識別推向真正可用的第一種方法,了解一下還是很有必要的。特征臉用到的理論基礎PCA在另一篇博客里:特征臉(Eigenface)理論基礎-PCA(主成分分析法)?。本文的參考資料附在最后了^_^

步驟一:獲取包含M張人臉圖像的集合S。在我們的例子里有25張人臉圖像(雖然是25個不同人的人臉的圖像,但是看著怎么不像呢,難道我有臉盲癥么),如下圖所示哦。每張圖像可以轉換成一個N維的向量(是的,沒錯,一個像素一個像素的排成一行就好了,至于是橫著還是豎著獲取原圖像的像素,隨你自己,只要前后統一就可以),然后把這M個向量放到一個集合S里,如下式所示。



步驟二:在獲取到人臉向量集合S后,計算得到平均圖像Ψ?,至于怎么計算平均圖像,公式在下面。就是把集合S里面的向量遍歷一遍進行累加,然后取平均值。得到的這個Ψ?其實還挺有意思的,Ψ?其實也是一個N維向量,如果再把它還原回圖像的形式的話,可以得到如下的“平均臉”,是的沒錯,還他媽的挺帥啊。那如果你想看一下某計算機學院男生平均下來都長得什么樣子,用上面的方法就可以了。



步驟三:計算每張圖像和平均圖像的差值Φ??,就是用S集合里的每個元素減去步驟二中的平均值。


步驟四:找到M個正交的單位向量un?,這些單位向量其實是用來描述Φ??(步驟三中的差值)分布的。un?里面的第k(k=1,2,3...M)個向量uk?是通過下式計算的,

當這個λk(原文里取了個名字叫特征值)取最小的值時,uk??基本就確定了。補充一下,剛才也說了,這M個向量是相互正交而且是單位長度的,所以啦,uk??還要滿足下式:


上面的等式使得uk?為單位正交向量。計算上面的uk?其實就是計算如下協方差矩陣的特征向量:


其中


對于一個NxN(比如100x100)維的圖像來說,上述直接計算其特征向量計算量實在是太大了(協方差矩陣可以達到10000x10000),所以有了如下的簡單計算。

步驟四另解:如果訓練圖像的數量小于圖像的維數比如(M<N^2),那么起作用的特征向量只有M-1個而不是N^2個(因為其他的特征向量對應的特征值為0),所以求解特征向量我們只需要求解一個NxN的矩陣。這個矩陣就是步驟四中的AAT?,我們可以設該矩陣為L,那么L的第m行n列的元素可以表示為:


一旦我們找到了L矩陣的M個特征向量vl,那么協方差矩陣的特征向量ul就可以表示為:


這些特征向量如果還原成像素排列的話,其實還蠻像人臉的,所以稱之為特征臉(如下圖)。圖里有二十五個特征臉,數量上和訓練圖像相等只是巧合。有論文表明一般的應用40個特征臉已經足夠了。論文Eigenface for recognition里只用了7個特征臉來表明實驗。


步驟五:識別人臉。OK,終于到這步了,別繞暈啦,上面幾步是為了對人臉進行降維找到表征人臉的合適向量的。首先考慮一張新的人臉,我們可以用特征臉對其進行標示:


其中k=1,2...M,對于第k個特征臉uk,上式可以計算其對應的權重,M個權重可以構成一個向量:


perfect,這就是求得的特征臉對人臉的表示了!

那如何對人臉進行識別呢,看下式:


其中Ω代表要判別的人臉,Ωk代表訓練集內的某個人臉,兩者都是通過特征臉的權重來表示的。式子是對兩者求歐式距離,當距離小于閾值時說明要判別的臉和訓練集內的第k個臉是同一個人的。當遍歷所有訓練集都大于閾值時,根據距離值的大小又可分為是新的人臉或者不是人臉的兩種情況。根據訓練集的不同,閾值設定并不是固定的。

后續會有對PCA理論的補充^_^.已補充理論:特征臉(Eigenface)理論基礎-PCA(主成分分析法)

參考資料:

1、Eigenface for Recognition:http://www.cs.ucsb.edu/~mturk/Papers/jcn.pdf

2、特征臉維基百科:http://zh.wikipedia.org/wiki/%E7%89%B9%E5%BE%81%E8%84%B8

3、Eigenface_tutorial:http://www.pages.drexel.edu/~sis26/Eigenface%20Tutorial.htm

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387300.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387300.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387300.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java05泛型

12 泛型 12.1 為什么使用泛型 泛型程序設計&#xff08;Generic programming&#xff09;&#xff1a;意味著編寫的代碼可以被很多不同類型的對象所重用。 類型參數&#xff08;type parameters&#xff09; 通配符類型&#xff08;wildcard type&#xff09; 可以將Manage…

bitmap轉換為drawable

Bitmap bitmap MediaStore.Images.Media.getBitmap(this, Uri.parse(string)); Drawable drawable new BitmapDrawable(bitmap);// 這樣就轉換成drawable格式&#xff0c;可以設置背景圖片了轉載于:https://www.cnblogs.com/Nigeria/p/10471028.html

numpy的下載與安裝教程——(解決No module named numpy問題)

NumPy函數庫是Python開發環境的一個獨立模塊&#xff0c;而且大多數Python發行版沒有默認安裝NumPy數據庫&#xff0c;因此在安裝Python之后必須單獨安裝NumPy數據庫。 進入Python shell開發環境后輸入 [python] view plaincopy from numpy import* 如果出現No module named …

Xception

The First ColumnThe Second Columnpadding 方式&#xff1a;same and valid The First ColumnThe Second ColumnSame 就是 增加一列相同的數 &#xff08;一般是0&#xff09;valid只保留有效的轉載于:https://www.cnblogs.com/hugeng007/p/10477430.html

1.蒼穹外賣-day01

蒼穹外賣-day01 課程內容 軟件開發整體介紹 蒼穹外賣項目介紹 開發環境搭建 導入接口文檔 Swagger 項目整體效果展示&#xff1a; 管理端-外賣商家使用 用戶端-點餐用戶使用 當我們完成該項目的學習&#xff0c;可以培養以下能力&#xff1a; 1. 軟件開發整體介紹 作為一名…

7 用戶和用戶組

7.1 用戶配置文件 7.1.1 用戶信息文件 /etc/passwd man 5 passwd 查看配置文件功能 第1字段&#xff1a; 用戶名稱 第2字段&#xff1a; 密碼標志 X代表有密碼 如果用戶沒有密碼&#xff0c;則只允許本地登錄 第3字段&#xff1a; UID&#xff08;用戶ID&#xff09; 0…

C#調用Python模塊

編程&#xff1a;C#調用Python模塊 當下&#xff0c;C#與Python都是比較熱門的計算機編程語言&#xff0c;他們各有優缺點&#xff0c;如果能讓他們互相配合工作&#xff0c;那是多么美好的事情&#xff0c;今天我來講解一下如何利用C#來調用Python。 如果讓C#支持調用Python模…

面試簡單整理之克隆

61.為什么要使用克隆&#xff1f; 克隆獲取對象的副本&#xff0c;直接用復制還是一個引用。 62.如何實現對象克隆&#xff1f; 1.被clone的類實現cloneable接口&#xff0c;重寫object類的clone&#xff08;&#xff09;方法 2.如果深克隆則克隆對象的引用對象也要實現接口、重…

8 權限管理

8.1 ACL權限 8.1.1 簡介與開啟 用于解決身份不夠用的問題 ACL(access control list) 訪問控制表 ACL是存在于計算機中的一張表&#xff0c;它使操作系統明白每個用戶對特定系統對象&#xff0c;例如文件目錄或單個文件的存取權限。 這張表對于每個系統用戶有擁有一個訪問…

windows下GitHub的SSH Key 配置

https://www.jianshu.com/p/9317a927e844轉載于:https://www.cnblogs.com/lishidefengchen/p/10481889.html

PyCharm調試錯誤

JetBrains PyCharm 2017.3.2 這就說明python.exe的環境沒有配&#xff0c;點擊藍色的configure Python Interpreter&#xff0c;然后選擇對應的路徑就可以了

Java06集合

13 集合 實現方法時&#xff0c;不同的數據結構會導致性能有很大差異。 13.1 集合接口 Java集合類庫將接口&#xff08;interface&#xff09;與實現&#xff08;implementation&#xff09;分離。 可以使用接口類型存放集合的應用&#xff0c;一旦改變了想法&#xff0c;可…

Tensorflow驗證碼識別應用

簡單的Tensorflow驗證碼識別應用&#xff0c;供大家參考&#xff0c;具體內容如下 1.Tensorflow的安裝方式簡單,在此就不贅述了. 2.訓練集訓練集以及測試及如下(純手工打造,所以數量不多): 3.實現代碼部分(參考了網上的一些實現來完成的) main.py(主要的神經網絡代碼) ?123456…

9 文件系統管理

9.1 回顧分區和文件系統 分區類型 主分區&#xff1a;總共最多只能分四個 擴展分區&#xff1a;只能有一個&#xff0c;主分區加擴展分區最多有四個&#xff0c;必須再劃分成邏輯分區才能使用。 邏輯分區&#xff1a;在擴展分區中劃分的 IDE硬盤最多支持59個邏輯分區 SCSI…

Linux 桌面玩家指南:09. X Window 的奧秘

Linux 桌面玩家指南&#xff1a;09. X Window 的奧秘 原文:Linux 桌面玩家指南&#xff1a;09. X Window 的奧秘特別說明&#xff1a;要在我的隨筆后寫評論的小伙伴們請注意了&#xff0c;我的博客開啟了 MathJax 數學公式支持&#xff0c;MathJax 使用$標記數學公式的開始和結…

Storm教程1理論介紹

流式計算的歷史: 早在7、8年前諸如UC伯克利、斯坦福等大學就開始了對流式數據處理的研究&#xff0c;但是由于更多的關注于金融行業的業務場景或者互聯網流量監控的業務場景&#xff0c;以及當時互聯網數據場景的限制&#xff0c;造成了研究多是基于對傳統數據庫處理的流式化&…

梯度下降原理及Python實現

梯度下降算法是一個很基本的算法&#xff0c;在機器學習和優化中有著非常重要的作用&#xff0c;本文首先介紹了梯度下降的基本概念&#xff0c;然后使用python實現了一個基本的梯度下降算法。梯度下降有很多的變種&#xff0c;本文只介紹最基礎的梯度下降&#xff0c;也就是批…

dagger2的初次使用

一、使用前準備 1、打開app的build.gradle文件&#xff1a; 頂部停用apt插件&#xff1a; //添加如下代碼&#xff0c;應用apt插件 apply plugin: com.neenbedankt.android-apt dependencies中添加依賴&#xff1a; //Dagger2compile com.google.dagger:dagger:2.4apt com.goog…

Storm教程2安裝部署

Storm 安裝部署 部署Storm集群需要依次完成的安裝步驟&#xff1a; 1.安裝jdk6及以上版本;   2. 搭建Zookeeper集群&#xff1b;   3. 安裝Storm依賴庫&#xff1b;   4. 下載并解壓Storm發布版本&#xff1b;   5. 修改storm.yaml配置文件&#xff1b;   6…

matplotlib一些常用知識點的整理,

本文作為學習過程中對matplotlib一些常用知識點的整理&#xff0c;方便查找。 強烈推薦ipython 無論你工作在什么項目上&#xff0c;IPython都是值得推薦的。利用ipython --pylab&#xff0c;可以進入PyLab模式&#xff0c;已經導入了matplotlib庫與相關軟件包&#xff08;例如…