实时人脸检测
實時人臉檢測?(Real-Time?Face?Detection)
?(2014-08-24 17:23:16)??最近需要用到人臉檢測,于是找了篇引用廣泛的論文實現了一下:Robust Real-Time Face Detection。實現的過程主要有三個步驟:人臉數據準備,算法實現,算法調試。 ????人臉數據集的準備:網上有很多免費的和付費的。比如這里有個網頁介紹了一些常用的人臉數據庫。我這里只是人臉檢測(不是人臉識別),只要有人臉就可以了,所以我下載了幾個數據集,然后把它們混在一起用(后面也因此產生了一些問題)。 ????算法大意很簡單:可以把它看作是一個二分類的問題。給定一張圖片后,程序會用一個矩形框掃描整張圖片,然后每次判斷當前矩形框是不是人臉。 ???方法的核心在于掃描框的分類。這里采用了AdaBoost的學習方法。AdaBoost的思想是,把一些簡單的弱分類器組合起來得到一個強大的分類器。學習過程中,每個弱分類器會根據數據學到一個權重,一般由它的分類誤差來確定,誤差越小,權重越大。數據也有權重,根據每次弱分類器的分類結果來定,比如當前分錯的數據權重需要增加。 ????因為AdaBoost由很多弱分類器構成,理論上弱分類器越多,分類能力越強,但是計算量也更大。由于實時性的要求,這里采用了分層的思想:訓練出多層的AdaBoost分類器,層次靠前的分類器包含的弱分類器數量少一些。這是一個樹結構。每層的AdaBoost分類器會過濾掉非人臉數據,只有完全通過的數據才會判定為人臉。 ????大致步驟理解起來很容易,實現過程中也會遇到很多參數需要調節,下面就我遇到的一些問題做一些討論:
- 首先是數據集的準備。人臉數據好說,非人臉數據怎么準備呢?可以找一些有人臉的圖片作為訓練集,目的是使得分類器在這些訓練集中的誤判率(false positive rate)最小。窮舉出所有的掃描框會掃到的子圖片不太現實,因為這樣數據量實在是太大了。我這里先隨機采樣一些圖片,然后用這些圖片作為非人臉數據,學習出一個分類器,然后再用這個分類器去測試訓練集,把誤判的數據收集起來,和前面的非人臉數據混合起來,再訓練。訓練過程中我發現,第一次隨機采樣的數據很好分類,很快就能訓練出一個分類器,越到后面,數據越不好分,訓練的時間也越久。原文說他們第一次的分類器采用了兩個弱分類器就能過濾掉50%的非人臉數據,其實這句話是沒有意義的,并不能說明它的分類器好,只能說明它的數據集比較弱。
- 數據噪音問題:在訓練的過程中,數據剛開始還比較容易分類,前面幾層AdaBoost能過濾掉大半部分的非人臉數據,但是到了后面,每層AdaBoost能過濾掉的非人臉數據就很少了(因為每層AdaBoost分類器要保證人臉分對的幾率在99.9%以上)。后來我查看了數據,發現人臉數據集中有一些非人臉數據,并且非人臉數據集中有一些人臉。這就是數據噪音。可以考慮先過濾掉噪音再進行訓練。其實在多層次的AdaBoost訓練過程中,每層過濾出來的人臉數據差不多就是質量不好的,里面也會包含噪音。訓練到最后很難過濾掉的非人臉數據,也往往包含了大量的噪音數據。可以通過多次的快速訓練(調節參數使其訓練速度加快),來過濾掉這些噪音數據。
- 每一層AdaBoost的弱分類器數量:理論上弱分類器的數量可以根據檢測率和誤判率來確定,但是這樣確定出來的數量往往偏小。雖然這樣分類速度會很快,由于這里每一個弱分類器就代表了一個Haar Feature,Feature過少的話,即使訓練集上誤差很小,測試的時候,分類能力也很弱。這里可以人為的制定一些策略,比如某層的弱分類器數量有個下限之類的,來權衡速度與分類能力。
- 理想的情況下,一個人臉只響應一個掃描框。但是實際情況是,人臉附近可能會響應幾個掃描框。這就需要合并這些掃描框。合并的策略也是很多的,簡單的可以通過重疊率來合并,也可以通過聚類方法合并。但是要考慮到速度問題,我采用了重疊率的計算來合并,簡單快速。
- 訓練過程中,最好能可視化一些中間結果。一來可以檢測代碼實現是否有Bug,二來也可以通過這些中間結果,來幫助自己更好的理解這個算法的過程。比如每層過濾掉的人臉和非人臉數據,每層AdaBoost選擇了哪些Feature,每層AdaBoost的誤判率是多少等等。其中特別是Feature的選擇,不同的訓練集,選擇出來的Feature是不一樣的。如果訓練集里的人臉對齊的比較好,那么Haar Feature的矩形塊會比較大,如果人臉對齊不好或者顏色差異大,那么Haar Feature的矩形框會比較的窄小。仔細想想,好像確實是這樣。
- Haar Feature的選擇:窮舉出所有可能的Feature,計算量和存儲量會比較大,可以考慮均勻采樣出可接受的數量的Feature。采樣也可以加入一些隨機性。采樣也會影響弱分類器數量的選擇,因為采樣的緣故,可能某些好的Feature沒有采樣到,那么在增加弱分類器數量之前可以考慮嘗試多次采樣不同的Feature來訓練。訓練過程中我發現,多次嘗試不同的采樣結果確實是有幫助的。另外Haar Feature的矩形框不能太小,不然在計算多分辨率的時候,Feature值誤差會比較大。
人臉檢測做好后,可以利用這個檢測器,生成更多的人臉數據。我在網上下載了很多圖片,特別是一些集體照,然后把這些人臉檢測出來,再均勻縮放到128*128大小。這樣就可以得到了一些人臉數據,下面是一個文件小截圖:
總結
- 上一篇: opencv grabcut
- 下一篇: 像素级动态模糊(Pixel Motion