人脸识别实践总结
2019獨角獸企業重金招聘Python工程師標準>>>
[個人站點](http://whbzju.github.io/blog/archives/)
#概述 前段時間接觸了一陣子人臉識別,只能說是初窺門道,在這里做個總結。本文不涉及具體的算法原理,因為我都是參考別人的資料,只認為無法寫的更好,在這邊做個歸納總結。 現需求如下:從攝像頭視頻中識別出你自己或朋友的人臉
要實現這個需求,大體分為兩個步驟,分別為人臉檢測和人臉識別,即先要從攝像頭中識別出人臉,即人臉檢測,其次對檢測到的人臉進行識別,即人臉識別。本文基于Opencv的人臉算法實現。
##人臉檢測流程
- 選取特征(本文采用Haar-like特征)
- 選取分類器算法,訓練人臉分類器(本文采用Adaboost級聯分類器)
- 對圖像進行人臉檢測
##人臉識別流程
- 選取人臉識別算法(本文包括PCA、FDA和LBP)
- 訓練識別模型
- 對目標進行識別
#Opencv相關資料介紹 opencv在2.4后引入了人臉識別相關模塊,原來只有人臉檢測部分。在Opencv官網,有較詳細的介紹,看 !目錄,在該目錄中重點要看這篇!Face Recognition with OpenCV.
這應該是一個德國人寫的,在教程中他提到了3個算法:
- EigenFaces
- FisherFace
- Local Binary Patterns Histograms
前面兩個算法都是利用子空間的原理,有一定的相似性,分別以PCA和LDA為基礎。后者以特征選取為主,做法思路都不大一樣,建議分開看。該教程中對算法的描述過于簡潔,不適合初學者看,建議尋找相關資料進一步閱讀。 ##PCA-主成分分析法 PCA在很多地方都有應用,是一個十分簡單有效的方法。其思想概括起來即降維,它認為原始數據中包含了大量的噪音和冗余,通過協方差矩陣的對角化可以得到一個子空間,該子空間的維度大大降低,卻神奇的保留了原始數據中的顯著特征。
該算法的具體原理可參考斯坦福大學的公開課,Andrew.Ng的機器學習課程,里面有一章節專門講pca,若覺得看視頻太慢,可以直接看講義,講的很清楚。國內有幾個博客作者對它進行了翻譯,推薦:
!主成分分析(Principal components analysis)-最大方差解釋
!機器學習中的數學(4)-線性判別分析(LDA), 主成分分析(PCA)
該算法涉及較多的線性代數知識,忘掉的同學建議復習下相關內容。
##LDA-線性判別分析 fisherface的FDA是在LDA基礎之上的一種算法。關于線性判別的思想如下:它認為在PCA中,PCA把數據作為一個整體來看,即數據源中所有的顯著特征都會被保留下來,如果一個人的臉在強光下和弱光下,pca生成的子空間有顯著的差異,而他們卻是同一張臉。LDA的思想是尋找一個分割平面(在二維中即直線),來區分兩種不同類別的數據,既能夠區分兩個不同的人臉,進行歸類。因此,它的目標就是怎么要找到這個平面,達到最好的區分效果。
同樣,該算法的具體原理還是推薦Andrew.Ng的機器學習公開課。國內也有相關介紹,但是他們的數學推導讓我不滿意。
!線性判別分析(Linear Discriminant Analysis)(一) !線性判別分析(Linear Discriminant Analysis)(二)
##LBPH 該算法較上面二者容易理解,這里不做詳細介紹,大家自己查找相關資料即可。
##Demo 上面教程中提到幾個算法opencv中都有例子實現,當然要做2.4以上。教程講了demo的位置和具體的使用。 所有的Demo需要一個人臉庫,教程中提供了幾個,可以下載。下載下來的人臉庫需要預處理,即打上標簽,作者提供了python腳步,大家可以使用。
有個demo值得關注,它實現了我們的需求,它有個專門的教程:!Face Recognition in Videos with OpenCV. 不過要想識別自己的臉,必須將自己的臉裁剪下來保存到人臉庫中進行訓練。
我不想自己拍照片去裁剪,我的做法是利用demo中的人臉檢測算法,將我的人臉檢測到,然后保存成灰度圖,放到人臉庫中。PS:這里有個問題,opencv自帶的人臉檢測分類器有可能會誤撿,會把空白的墻壁當做人臉。我的做法是,在視頻中指定一個矩形框,在這個矩形框中進行人臉檢測,這樣可以大大降低誤撿率。實際操作中可以調整位置,讓自己的人臉出現在矩形框中。
#Haar-like特征Adaboost級聯分類器 完成了人臉識別的Demo驗證,大家一定很好奇人臉檢測是怎么實現的。opencv里面自帶的檢測算法原至兩篇論文: P. Viola and M. Jones. Rapid object detection using a boosted cascade of simple features. R. Lienhart and J. Maydt. An Extended Set of Haar-like Features for Rapid Object Detection.
##整體感覺--如何訓練自己的分類器 大家可以參考這篇!教程,利用opencv自帶的例子訓練一個分類器感覺感覺。 訓練分類器會遇到很多問題,人臉樣本和非人類樣本的比例有較高的要求,stage越高越難訓練,訓練時間也會隨之快速增長,而且效果還不能保證,博主訓練出來的分類器和opencv自帶的分類器效果是沒法比啊!
##算法原理 我不打算這這里描述它的原理,首先是這方面資料已經很多,我無法做到寫的更好,其次是展開后篇幅太長,內容太多,我不想寫了,哈哈。 若想較好的理解,直接看上面提到的兩篇論文。若英文水平不行,可以看北大有個學生寫的畢業論文:基于 AdaBoost 算法的人臉檢測,作者:趙楠,還不錯。
Haar-like特征需要理解積分圖的概念,Adaboost包括弱分類器、強分類器和級聯分類器。其中級聯分類器較比較麻煩。
#總結 Opencv是個好東西,有個直接能運行的demo,比光禿禿的理論好多了,依靠它搭個自娛自樂的小工程沒問題。人臉識別的水很深,本文提到的算法是opencv里面就有的,還有很多算法待各位自己有興趣去研究。
轉載于:https://my.oschina.net/u/941509/blog/220466
總結
- 上一篇: vs2017+ivf+abaqus
- 下一篇: [Unity3D]Unity3D游戏开发