1. 程式人生 > >人臉檢測(十五)--改進版VJ人臉檢測(LBP特徵,VISAPP2017)

人臉檢測(十五)--改進版VJ人臉檢測(LBP特徵,VISAPP2017)

老實說,評估了從傳統VJ到深度學習人臉檢測各種演算法後,我還是喜歡LBP+級聯Adaboost這種架構的人臉檢測,畢竟,boost框架還是最快的。在某些限制性場景應用中,大量的掃描窗方式雖然很low,但可以通過各種方式優化。自己其實也訓練出來了比CV demo好很多的模型,但是,很不幸,看到這篇文論,作者也開源了自己的模型。我就不高興再去測試評估自己的模型了。。。

論文:https://lirias.kuleuven.be/bitstream/123456789/560283/2/VISAPP2017.pdf

參考:http://baijiahao.baidu.com/s?id=1568246787744922&wfr=spider&for=pc,略刪改。

Abstract:

使用諸如卷積神經網路的複雜技術,計算機視覺幾乎已經解決了在野外的人臉檢測課題。相反,許多像opencv這樣的開源計算機視覺框架還沒有切換到這些複雜的技術,並且往往依賴於成熟的人臉檢測演算法,比如V-J所建議的級聯分類流程。在FDDB等公共資料集上,這些基本面部檢測器的準確率保持在較低水平,主要是由於假陽性的檢測數量較多。我們提出了對現存的OpenCV人臉檢測模型訓練流水線的幾種改進措施。我們改進了訓練樣本的生成和標註過程,並應用了主動學習(activelearning)策略。這大大提高了FDDB資料集人臉檢測的準確性,縮小了基於CNN人臉檢測的精度差距。這些提出的改進使我們為OpenCV提供了更先進的人臉檢測模型,在可接受的recall下實現非常高的精度,而recall和presicion兩個必要的條件使得進一步的處理成為可能,比如人員識別。

1 INTRODUCTION

人臉檢測在計算機領域中是研究比較好的課題,而各種文獻中也提出了良好的解決方案。但我們也注意到像OpenCV之類的開源計算機視覺框架,只提供基於現存機器學習技術的人臉檢測器,但無法在公開的資料集達到很高的準確率。一個根本的原因可能是,大多數模型是在計算機視覺早期訓練的,當時的學術研究仍然對較舊的級聯分類器技術感興趣,比如V-J結構的人臉檢測。隨著學術研究的發展,科研人員更傾向於發現更有前景的技術,如卷積神經網路,但失去了對成熟和經驗證的演算法的興趣。這使得一個著名的計算機視覺庫仍提供一個基礎人臉檢測器,僅在任何給定資料集上實現中等的檢測結果。

圖1:OpenCV的人臉檢測

另一方面,來自工業界的使用者致力於將這些開源計算機視覺框架轉化為工業應用程式,不斷改進現有的人臉檢測技術的效能。他們的內部組織結構,不允許他們將精力放在提高當前演算法的效能上。當嘗試提高這些現存技術時有兩個最大的問題,1.如何尋找可供訓練的大量資料,2.當使用基礎監測模型時,如何去報告在不同檢測引數下學術研究所能達到的準確率上限。

為了彌補差距,我們決定研究在OpenCV內訓練人臉檢測器的級聯分級結構,從而提高檢測精度。為了達成這個目標,我們調整了人臉標註,改善負樣本的收集,使用activelearning策略來迭代地增加hardpositive(在前面的級聯器中,正樣本被誤檢為負樣本)和hardnegative(在前面的級聯器中,負樣本誤檢為正樣本)樣本增加到物體檢測的過程中。

另外,我們認為,由於檢測後處理步驟取決於可檢測到的人臉,因此如圖1所示,由於假陽性檢測,人臉檢測的工業應用將失敗。在人臉識別應用的情況中,人臉檢測是收集訓練標註和測試標註的基礎。因此,我們致力於改進Opencv3.1的人臉檢測模型,基於LBP,希望能在可接受的召回率下得到極高的精度。

本文的其餘部分的結構如下。第2節介紹相關研究,第3節討論了使用的框架和資料集。接下來是第4節詳細討論提出的方法。最後第5節,詳細闡述了獲得的結果,而第6節作了總結第7節提出了未來可能的改進措施。

2 RELATED WORK

OpenCV框架是一個開源的計算機視覺框架,提供了一系列的技術,從基礎的影象分割到複雜的3D模型構造。由於學術研究人員和工業合作伙伴的社群貢獻,其規模穩步增長,增加了計算機視覺最近的演算法,同時努力保持現有的基礎演算法的質量。我們注意到,一旦新功能集成了更長的時間並被社群大量使用,對該功能的改進就會停止。這可以解釋為,計算機視覺社群對實際的相關工業實施沒有興趣,而是傾向於進一步推動最先進的技術。

計算機視覺最新的進展是通過各種複雜技術來解決人臉檢測問題,比如多工級聯卷積神經網路,與3D資訊配合的卷積神經網路,遞迴神經網路。這些技術產出了非常有前途的結果,但在實際應用中實現相當複雜。文件和支援的開源軟體庫仍然缺乏易用性。此外,我們注意到OpenCV正在為整合這些新技術鋪平道路,但到目前為止,OpenCV框架內的效能仍然不能滿足工業公司的要求。

Viola和Jones在使用弱分類器的增強級聯器進行人臉檢測已經有段時間了。目前為止,它是很多工業應用的正臉檢測器,比如數碼相機。缺點是許多公司使用軟體來訓練自己更復雜的面部檢測模型,但不會與社群共享。這主要是由於OpenCV以BSD許可開源,允許公司使用程式碼,而不會分享任何重要的修改或改進。通過我們的工作,我們的目標是基於LBP來改進當前可用的正臉模型,並實現能夠準確檢測各種設定中的正面模型。

人們可以認為,用這種舊技術進行工作基本上是浪費時間投入。然而,一些最近的研究論文證明了對於特定的工業界的目標檢測的任務,對於現存的技術的改進是至關重要的。

3 FRAMEWORK AND DATASET

為了構建我們的方法我們依賴於OpenCV3.1架構,這個架構由Intel組織和維護。我們著重使用C++介面下的CascadeClassifier物體檢測功能和opencv_traincascade應用,包含使用V-J方法構建弱分類器的增強級聯器的所有功能。

由於現存的Opencv人臉檢測模型的訓練資料已經無法獲得,我們自己蒐集了一系列人臉圖片來訓練我們的正臉模型。這些影象是從各種來源(YouTube視訊)收集的,並在社交媒體,影象版和谷歌影象搜尋結果中大量使用影象抓取工具。請注意所有的這些圖片都沒有標準的人臉標註。此外,我們建立了一個多執行緒工具,可以使用現有的人臉檢測模型來有效地在給定視訊中搜索有價值的人臉資料,然後可以將其再次新增到訓練資料集中作為hardpositive和hardnegative樣本。

為了訓練我們的新模型,我們手工標註了1000個人臉區域作為正訓練框,然後和750000負訓練框合併,這些負訓練框從大解析度的負樣本圖片(不含人臉)中自動抓取。如表1所示,我們然後增加每個新迭代的正資料集250個額外的hardpositive樣本。這些都是從一大堆正樣本影象中收集出來的,我們知道這些影象有臉。每當初始檢測器無法找到臉部區域時,需要進行手動干預,尋求面部標籤,並將其作為訓練樣本新增到下一代訓練樣本中。用於訓練我們最終的IterativeHardPositives+model的正樣本訓練集可以用過聯絡其中一位論文作者來得到。

為了驗證我們的新模型並於現存的OpenCV基準進行比較,我們使用FDDB資料集。這個資料集包含來自LFW的2845張圖,共有5171張臉。這個資料集致力於探尋無限制條件下人臉檢測的極限。為了獲得一個好的基準,我們將現有的影象註釋轉換為OpenCV使用的格式,並將其公開。

4 SUGGESTED APPROACH

在以下小節中,我們將討論對現有級聯分類器訓練架構的不同調整,從而總體上提高效能,得到第5節的結果。

4.1 Changing the face’s region of interest during annotation

當仔細觀察OpenCVLBP正臉檢測的輸出時,我們注意到,在許多情況下,檢測輸出包含完整的頭部,包括耳朵,頭髮甚至背景資訊。這是由於OpenCV訓練集的標註問題。圖2表示OpenCV旨在包含儘可能多的面部資訊以饋送到訓練演算法。由於人臉檢測器通用需求,因此我們專注於包含任何給定人臉資料中最常見特徵的面部部分。為了減少非平凡面部資訊,我們決定僅將內臉部區域標註為臉部,如圖1的紅色註釋,並且與之前提出的近似地人臉檢測技術相一致。這種方式有幾個益處。它從boosting演算法的特徵池中減少了大量特徵,從而減少了模型訓練過程中需要評估的特徵量。此外,內臉區域對旋轉(平面內和平面外)具有更佳的魯棒性。在第5節,我們詳細闡述了這些在平面內和平面外旋轉的部分。

圖2:將人臉標註從整張臉到臉內部區域

4.2 Adapting the negative training sample collection

Opencv提供了一種從不包含物件的一組隨機背景影象中自動收集負樣本的方式。該演算法將給定的負樣本影象重新調整為不同的大小,並使用基於滑動視窗順序收集負樣本視窗,而後續視窗沒有任何重疊。一旦完成了負樣本影象的集合,就重複該過程並在每個影象中新增一個畫素偏移,以獲得略微不同的樣本(在畫素級)。如果多次遍歷一個集合,則每次增加偏移量,則該過程等於應用畫素移位滑動視窗方法,如圖3(a)所示。雖然捕獲資料中的微小差異的基本思想可能是個很好的起點,但是這種方法會產生大量的負面樣本,這些樣本不會為流程增加額外的有意義的知識,因此也不能被視為獨一無二的樣本。

圖3:負樣本的收集調整

檢視用於訓練級聯分類器的boosting過程,我們注意到,如果以前階段不拒絕,每個新的負視窗可以作為新階段的負訓練樣本。如果不同的負面樣本只有輕微的畫素移位,那麼這個拒絕階段會評估很多視窗,而我們已經知道它們將被拒絕。因此我們調整了介面刪除了畫素位移過程。通過刪除這個過程並且在後續的負視窗沒有重疊,我們也引入了有可能的損失,後續樣本的邊界周圍有價值的資訊無法共享。這個損失的資訊有可能包含構建一個高魯棒性的檢測器的關鍵知識。為了減少資訊的丟失,我們改進了影象金字塔中的尺度生成。在OpenCV生成尺度引數為1.4的影象金字塔情況下,我們決定降低此比例引數值1.1,以確保收集在不同金字塔尺度上的負樣本足夠多,同時保留儘可能多的有價值資訊。這在圖3(b)中說明。通過這樣做,一個比例的樣本邊界丟失的資訊將被前一個或後續的比例捕獲。改進尺度金字塔的額外好處是,所得到的物件檢測模型對目標的尺度變化魯棒性更高,能夠捕獲更小的尺寸變化。

基於這些調整,收集大量的負樣本資料是非常簡單的,這是為在野外應用中建立強健的人臉檢測模型所必需的。考慮到1080x1920的高解析度圖片,我們可以收集30000個負訓練樣本。這使得我們可以將我們訓練的級聯分類器中的每個階段的負樣本數量增加到數十萬個樣本,嘗試將背景建模儘可能地好。這會使得每個階段的訓練時間增加,但會減少階段數量,從而在檢測時使得模型更快更簡單更準確。

4.3 Iterative active learning strategy for hard training samples

為機器學習演算法提供大量資料堆可以學習非常複雜的目標檢測模型。不利的是,在收集正面和負面的訓練資料時,很難判斷哪個新的樣本將真正提高檢測模型的效率。為了確定哪些樣本有新增到訓練過程的實際價值,我們用一種稱為activatelearning的技術。這個想法是使用上一次迭代訓練的模型,並使用該模型告訴我們哪些樣本是有價值的(接近決策邊界),哪些是新增到下一個迭代訓練過程的(沒有歧義的標籤),如圖4所示。我們通過如下準確區分hardnegatives和hardpositive。此外,activelearning的優勢在於我們大大限制了人工勞動的數量,因為我們只需要為新的訓練樣本提供標籤,從而為受過訓練的分類器新增額外的知識。

圖4:active learning過程的概要圖。

4.3.1 Hard negative samples

通過收集一組負樣本影象,並在其執行我們先前訓練過的面部檢測器,來收集Hardnegative樣本。在負視窗上,檢測器仍有觸發的那些就是我們當前模型需要的負樣本。基本上,這些樣本包含以前收集的負樣本尚未捕獲的資訊,從而為訓練過程提供有價值的資訊。

4.3.2 Hard positive samples

通過收集包含面孔的大量未標記影象來收集hardpositive樣本。我們只知道影象包含一個(或多個)人臉,但是我們沒有標記的位置。在這些影象上,執行當前的人臉檢測器(低檢測確定性閾值),並且用軟體跟蹤不觸發檢測的影象。在這種情況下,要求操作者為這些未觸發檢測器影象手動選擇面部區域,從而提供標籤。該區域被儲存為一個hard positive樣本,仍然可以給模型學習介面足夠多的有價值的知識,在如何學習模型方面。

4.4 Halting training when negative dataset is consumed

原始的OpenCV實現使用畫素點偏移來抓取負樣本,以避免在初始提供的資料集在第一次執行中完全消耗時停止訓練。在4.2節中,我們已經描述了使用這些畫素移位的視窗是過度的,並增加了大量的冗餘資料。當負樣本資料集完全消耗時,我們停止訓練。一旦發生,就會有兩種可能性。我們可以增加額外的圖片到負樣本圖片集,或者我們在停止訓練之前,返回最後階段抓取的負樣本數量。這允許操作者使用這個確定數量的樣本來確定最後一個階段,並且因此使用每一個負樣本視窗訓練模型,從而完全消耗可用的負樣本資料集。

4.5 Using the adaptations to train different face detection models

通過巧妙地組合4.1,4.2和4.3提出的所有調整,我們訓練了不同的人臉檢測模型,我們嘗試迭代地提高獲得模型的準確性。表1描述了用於這些模型的訓練資料,結合訓練模型的階段數量和boosting過程中所選擇的特徵(每個形成stump/二進位制決策樹)的數量。

表1:不同模型的訓練資料

我們第一個模型(簡稱'BoostedBaseline')可以被看作是我們通過應用activelearning策略迭代嘗試改進的基準。我們限制訓練為單層決策樹。人們可能會認為,使用更復雜的決策樹是有利可圖的,但以前的研究表明,使用更復雜的決策樹實際上會減慢檢測過程,因為更多的特徵需要在早期階段進行評估。對於每個boostedlearning的模型,當增加特徵數量時,效能的提高應該比提高複雜度重要,從而降低處理時間。當收集的隨機負樣本背景圖片被完全消耗時,我們的模型訓練停止。

對於第二個模型,稱為“IterativeHardPositives”,我們通過activelearning程式添加了250個hardpositive訓練樣本,嘗試提高檢測器的召回率。我們也收集了一系列hardnegatives集合,並將它們新增到訓練集中。我們注意到,新增這些額外質量的樣品推動了召回率,同時略微提高了精確率。通過提供250個額外的hardpositive樣本,再次改進了第三個也是最後一個模型,稱為(IterativeHardPositives+),試圖進一步提高召回率。

5 RESULTS

5.1 Performance of trained models

圖5比較了FDDB測試資料集上的第4.5節與OpenCVBaseline檢測器的訓練好的模型。使用presicion-recall圖來測量效能。我們注意到,通過OpenCVbaseline(黑色曲線),我們訓練的模型(綠色,紅色和藍色曲線)有大大的改善。OpenCV基準模型在它的最佳點只能以40%(所有返回的檢測框,只有4成是真正的物體)的精度實現約40%(10個物體只有4個被檢測到)的迴歸。當然我們可以做出權衡,以犧牲精度的方式獲得更高的精度。儘管如此,目前的OpenCV模型無法在給定的FDDB資料集中確定高於50%的目標物件,因為在非常具有挑戰性的條件下包含各種各樣的面孔。

圖5:FDDB資料集上所有模型的Precision-Recall曲線。

與OpenCVBaseline檢測器相比,該模型的最佳召回率為40%,我們的Boosted-Baseline檢測器已經將精度提升到99.5%,幾乎完全消除了假陽性的存在。此外,如圖6中的特寫所示,我們的每個隨後的模型都會進一步增加召回率,而不會犧牲本來就非常高的精度。在召回率為60%時,與OpenCVBaseline檢測器相比增加了50%,我們的IterativeHardPositives+檢測器只有輕微地下降到99%的精度。作為最佳工作點,我們的IterativeHardPositives+模型達到了90%的精度,召回率為68%。

圖6:我們檢測模型的PR曲線的特寫

雖然許多關於人臉檢測的論文使用precision-recall曲線來有效地比較檢測模型,但官方FDDB評估標準是基於準確率和falsepositve檢測數量的曲線。如圖7所示,我們也包含了OpenCVBaseline檢測器和IterativeHardPositive+檢測器的比較。我們還將我們的技術與基於神經網路的最先進的人臉檢測演算法進行比較,比如FastRCNN和MultiTaskCNN。這清楚地表明,我們已經縮小了級聯分類器和神經網路之間的差距,同時仍然有改進的餘地。

圖7:FDDB資料集的評估,與基於神經網路的演算法比較。

5.2 Influence of adaptations to processing time

有一點必須要保證,那就是增加這些額外的訓練資料集不會在檢測時間內使模型過於複雜和緩慢。如表1所示,我們對樹樁分類器所使用的特徵有限度的增加,同時增加了50%的有價值的正樣本訓練資料。此外,我們模型的階段數量反而下降。由於處理時間是嵌入式系統中使用計算機視覺方法的關鍵特性,因此我們可以自由地在整個FDDB測試集上測量處理時間,這可以從表2中看出。考慮到測試影象的平均解析度為400x300畫素,我們會平均計算每個影象接受定時的時間。這些時間是在Intel(R)Xeon(R)CPUE5-2630v2系統設定下執行的。我們的OpenCV構建使用執行緒構建塊進行優化,用於並行處理。我們清楚地看到,儘管我們在我們的模型中使用了更多的特徵,但IterativeHardPositives+模型的處理時間並不超過OpenCVBaseline模型的處理時間。此外,如果我們使用BoostedBaseline或IterativeHardPositives檢測器,我們比OpenCVBaseline檢測器更快地處理影象。

表2:各種模型的時間比較

5.3 A visual confirmation

圖8顯示了我們演算法的一些視覺化檢測輸出。我們首先選擇低檢測確定性閾值(圖8(a)),這清楚地表明兩個模型都能夠找到人臉,但是立即顯示了OpenCV模型的缺點,這產生了大量的假陽性檢測。我們將檢測確定性閾值提高到中等水平(圖8(b)),並注意到OpenCV和我們自己的訓練模型都能夠找到人臉,但是OpenCV會逐漸錯過一些臉孔,而我們的模型仍然能檢測到。最後,當設定高檢測確定性閾值(圖8(c))時,我們看到OpenCV錯過了很多我們的模型仍能找到的臉孔。但即使我們的模型檢測到比OpenCV更多的面孔的情況下,我們仍然會發現兩個模型都失敗的情況,或者OpenCV實際上找到了我們的模型未捕獲的情況,如圖8(d)所示。這些未被發現的面孔可以用作hardpositive訓練樣本,但是為了不引入資料集偏差,我們需要找到一個新的資料庫進行評估。

圖8:檢測結果

5.4 Testing out-of-plane rotation robustness

如4.1節所述,減小標註區域,將直接影響檢測器返回的人臉區域,有助於改善人臉檢測器的out-of-plane旋轉的魯棒性。為了測試這個,我們在頭部影象資料庫上評估了OpenCVBaseline和IterativeHardPositive+檢測器,如圖9所示。這個資料集包含一組30個序列(15個人,每人人兩個序列),其中人們依次觀察不同的位置,每個位置與pan(【-90,,9】)和titl(【-60,60】)角度相關聯。對每一個姿勢,我們都同時運行了兩種檢測器並返回模型的檢測確定性,並對30個序列做平均。我們使用資料集上的最高返回檢測分數作為我們得分範圍的外界,並將所有其他值在最大值基礎上歸一化。我們看到在pan和tilt角度評估中,我們的IterativeHardPositives+檢測器明顯優於OpenCVBaseline檢測器。特別是在tilt角度圖上,我們可以在效率上看到極大的提高。這個額外的測試也證實了對於一個完整的正臉,IterativeHardPositives+檢測器大概比OpenCVBaseline檢測器擁有兩倍的置信度,如圖5所示。

圖9:out-of-plane旋轉魯棒性測試

6 CONCLUSIONS

本文的目的是提出建議,對開源計算機視覺框架OpenCV中當前現有的級聯分類器架構進行調整,著眼於改進其正臉檢測器模型。我們的目標是通過保證高精度,同時保持儘可能高的召回率,以儘可能多的檢測面部來減少大量的假陽性檢測。我們在公開的FDDB人臉資料集上測試了我們的方法,並證明了我們對訓練架構的調整產生了巨大的效能提升。在使用IterativeHardPositives+檢測器時,我們將召回率提高到68%,同時保持90%的高精度。相比之下,目前的實現中在40%召回率下精度只有40%,我們的結果相當令人印象深刻。

對於框架和模型的調整顯然對於現存的模型訓練有好處。想象一下,人臉檢測器的輸出是用來做人臉識別的。這種情況下,我們的目標是儘可能高的精度,因為我們希望確保實際檢測的管道中,提供的是真實的面孔而不是無效檢測圖。此外,與OpenCVBaseline模型相比,我們的模型能夠在野外環境找到更多的人臉,並且對於out-of-plane的旋轉更具有魯棒性。

我們應該明白,如圖8(d)所示,由於某些極端的out-of-plane旋轉,我們將永遠不會再資料集(比如FDDB)達到100%的召回率。然而,人們可以認為,out-of-plane旋轉角度大於45度的人臉應該由側臉檢測器找到,並且和正臉檢測器一起合作檢測。

7 FUTUREWORK

作為未來的工作,我們建議進一步推動OpenCV框架中人臉檢測器模型的準確性。我們還有空間增加hardpositive的樣本,旨在提高召回率。一個好的起點可以是在FDDB資料集上執行我們的IterativeHardPositives+檢測器,然後蒐集hardpositive人臉作為訓練資料。然而這將迫使我們找到新的測評資料集來避免資料集偏見。

目前模型僅對於in-plane旋轉進行評測。我們可以構建影象的旋轉3D矩陣,並應用我們的IterativeHardPositives+檢測器多次合併這些in-plane旋轉。這將使我們能夠找到更多的面孔,進一步推動我們的架構的表現。