1. 程式人生 > >OpenCV用於人臉檢測

OpenCV用於人臉檢測

from: http://www.rs-online.com/designspark/electronics/knowledge-item/content-862

一個人的臉部特徵可以傳達很多資訊,如性別,大致年齡,性別以及情感等,因此,在過去三十多年的時間裡有大量學者熱衷於對人臉檢測與人臉識別的研究。

title

人臉檢測(Face Detection)是指在輸入影象中確定所有人臉(如果存在) 的位置、大小和位姿的過程。人臉檢測作為人臉資訊處理中的一項關鍵技術,近年來已成為模式識別與計算機視覺領域內一項受到普遍重視,研究十分活躍的課題。人臉識別或辨認、人臉定位以及人臉追蹤等都與人臉檢測密切相關。

人臉定位的目的是確定影象中人臉的位置。假設一幅影象中只存在一張臉,則面部特徵檢測的目的是檢測特徵的存在和位置,如眼睛、鼻子(鼻孔) (眉毛) (嘴) (嘴脣)耳朵等。人臉識別或辨認是將輸入影象與資料庫中的影象比對,如果存在,報告匹配結果。人臉識別的目的是檢驗輸入影象中的個體的身份,而人臉追蹤方法是實時地、連續地估計在影象序列中的人臉的位置和可能的方向。面部表情識別涉及識別人類的情感狀態(高興、悲傷、厭惡等) 。很明顯,在任何解決上述問題的自動識別系統中,人臉檢測是第一步。

人臉檢測應用

人臉檢測可用於生物特徵識別,通常做為人臉識別系統的一部分。人臉檢測也可以用於視訊監聽、人機互動和影象資料庫管理。一些最新的數碼相機使用人臉檢測來自動對焦。人臉檢測也獲得了市場的興趣。電視機上可以整合攝像頭來檢測任何走過的人臉,然後計算該使用者的種族、性別和年齡範圍。一旦獲得這些資訊,可以針對性的播放廣告。

title

人臉檢測也可以用於節約能源。人們看電視或電腦的時候往往會做其他工作,這時候普通的顯示器不能自動降低亮度來節省能源。智慧系統可以識別使用者的面部朝向,當用戶不看螢幕時,可以自動降低亮度;在使用者重新看螢幕時,再增加亮度。

隨著近些年來國際形勢的變化,特別是 9.11 事件之後,各國對自身重要設施的安保效能越發重視,也積極研發了一些自動人臉識別系統並投入實用。比如,美國 Identix 公司的 FaceIt系統,該系統基於區域性特徵分析(LFA),能在不同的光照,膚色,姿態,表情情況下得到良好的檢測效能。我國的生物特徵認證與安全技術研究中心(CBSR)則在 2004 年成功研製出了基於人臉、指紋、虹膜三種識別方法的快速通關係統(MRTD),取得了國際先進的整體效能。

人臉檢測主要難點

人臉的自動檢測是一類具有很大挑戰性的問題,其主要難點在於:

(1)人臉是一類高度非剛性的目標,存在相貌,表情,膚色等差異;

(2)人臉上可能會存在一些附屬物,諸如,眼鏡,鬍鬚等;

(3)人臉的姿態變化萬千,並且可能存在遮擋物;

(4)待檢測影象性質的差異。比如:待檢影象的解析度;攝錄器材的質量等;

(5)光源的種類和角度。不同種類和角度的光源會對待檢測的人臉產生不同性質的反射和不同區域的陰影。

人臉檢測演算法實現

到2000年為止,已經出現非常多的技術應用於檢測人臉,但是都存在處理速度太慢或可靠性低的問題。直到2001年Viola和Jones提出了基於Haar特徵的級聯分類器用於物件檢測,並於2002年由Lienhart和Maydt經過改進,狀況才得到改變。這種物件檢測器即快速又可靠,並且可以直接在OpenCV中使用這種分類器。還有一種是基於LBP特徵的級聯分類器,速度比Haar分類器快好幾倍。Haar分類器的訓練是獨立於人臉檢測過程的。分類器的訓練分為兩個階段: 

A. 建立樣本,用OpenCV自帶的creatsamples.exe完成。 

B. 訓練分類器,生成xml檔案,由OpenCV自帶的haartraining.exe完成。

OpenCV中的這兩種分類器都已經是訓練好的,可以直接使用。檢測流程如下:

 title

Viola-Jones人臉檢測演算法的主要貢獻:

1. 提出積分影象(integral image),從而可以快速計算Haar-like特徵。

Haar-like型特徵是Viola等人提出的一種簡單矩形特徵,因為類似Haar小波而得名。Haar型特徵的定義是黑色矩形和白色矩形在影象子視窗中對應的區域的權重灰度級總和之差。運算元數量龐大時上述計算量顯得太大,Viola等人發明了積分圖方法,使得計算速度大大加快。

2. 利用Adaboost學習演算法進行特徵選擇和分類器訓練,把弱分類器組合成強分類器。

在離散Adaboost演算法中,Haar-like特徵運算元計算結果減去某閾值,便可視為一個人臉檢測器。因為其準確率不高,稱為弱分類器。Adaboost演算法的迴圈中,首先利用各種弱分類器對訓練圖片庫進行分類,準確度最高的弱分類器保留下來,同時提高判斷錯誤的圖片的權重,進入下一迴圈。最終將每次迴圈所保留的弱分類器組合起來,成為一個準確的人臉檢測器,稱為強分類器。

3. 採用分類器級聯提高效率。

瀑布型級聯檢測器是針對人臉檢測速度問題提出的一種檢測結構。瀑布的每一層是一個由adaboost演算法訓練得到的強分類器。設定每層的閾值,是的大多數人臉能夠通過,在此基礎上儘量拋棄反例。位置越靠後的層越複雜,具有越強的分類能力。 這樣的檢測器結構就想一系列篩孔大小遞減的篩子,每一步都能篩除一些前面篩子樓下的反例,最終通過所有篩子的樣本被接受為人臉。

OpenCV人臉檢測原理

人臉檢測屬於目標檢測(object detection) 的一部分,主要涉及兩個方面:

  1. 先對要檢測的目標物件進行概率統計,從而知道待檢測物件的一些特徵,建立起目標檢測模型。
  2. 用得到的模型來匹配輸入的影象,如果有匹配則輸出匹配的區域,否則什麼也不做。

OpenCV中Haar分類器的路徑:

title

haarcascades目錄下還有人的全身,眼睛,嘴脣,側臉,鼻子,上半身等的Haar分類器。

這篇博文寫的非常詳細。以下摘錄一些主要內容。

使用人臉的Haar特徵分類器非常之簡單,直接使用cvHaarDetectObjects。下面來看看這個函式的介紹。

函式功能:檢測影象中的目錄

函式原型

CVAPI(CvSeq*) cvHaarDetectObjects(

  const CvArr* image,

  CvHaarClassifierCascade* cascade,

  CvMemStorage* storage,

  double scale_factor CV_DEFAULT(1.1),

  int min_neighbors CV_DEFAULT(3),

  int flags CV_DEFAULT(0),

  CvSize min_size CV_DEFAULT(cvSize(0,0)),

  CvSize max_size CV_DEFAULT(cvSize(0,0))

);

函式說明

第一個引數表示輸入影象,儘量使用灰度圖以加快檢測速度。

第二個引數表示Haar特徵分類器,可以用cvLoad()函式來從磁碟中載入xml檔案作為Haar特徵分類器。

第三個引數為CvMemStorage型別,大家應該很熟悉這個CvMemStorage型別了,《OpenCV入門指南》中很多文章都介紹過了。

第四個引數表示在前後兩次相繼的掃描中,搜尋視窗的比例係數。預設為1.1即每次搜尋視窗依次擴大10%

第五個引數表示構成檢測目標的相鄰矩形的最小個數(預設為3個)。如果組成檢測目標的小矩形的個數和小於 min_neighbors - 1 都會被排除。如果min_neighbors 為 0, 則函式不做任何操作就返回所有的被檢候選矩形框,這種設定值一般用在使用者自定義對檢測結果的組合程式上。

第六個引數要麼使用預設值,要麼使用CV_HAAR_DO_CANNY_PRUNING,如果設定為CV_HAAR_DO_CANNY_PRUNING,那麼函式將會使用Canny邊緣檢測來排除邊緣過多或過少的區域,因此這些區域通常不會是人臉所在區域。

第七個,第八個引數表示檢測視窗的最小值和最大值,一般設定為預設即可。

函式返回值

函式將返回CvSeq物件,該物件包含一系列CvRect表示檢測到的人臉矩形。

這是該博文的其中一個執行結果:

title

如果你對OpenCV有所瞭解,可以到上面提出的博文頁面參考具體的原始碼。