人臉檢測背景介紹和發展現狀

查志強發表於2018-08-09

【原文:https://zhuanlan.zhihu.com/p/32702868

#if 0

寫這個系列的動機有兩點:(第零是農藥雙排隊友週末經常有事,沒人一起玩,)第一,檢測和跟蹤之間有斬不斷分不開的密切關係(官方CP),從應用角度和通用方法都非常相似相關,人臉檢測問題可以為您提供更開闊的思路;第二是打算寫自己正在做的深度學習相關內容,人臉檢測系列為以後CNN經典模型分析,CNN壓縮和加速等內容做個鋪墊,證明CNN真的非常有用不難落地(當然理論欠缺、訓練難、需要大資料是客觀問題)。
雖然檢測的博文千千萬萬,但我還是希望能從工程師的角度出發,能給您完全不一樣的觀點和感受。最後,專欄會持續更新,請放心關注!

#endif

背景介紹

人臉檢測(Face Detection),就是給一幅影象,找出影象中的所有人臉位置,通常用一個矩形框框起來,輸入是一幅影象img,輸出是若干個包含人臉的矩形框位置(x,y,w,h),就像這樣。

人臉檢測對於我們人類非常容易,出於社會生活的需要,我們大腦中有專門的人臉檢測模組,對人臉非常敏感,即使下面這樣的簡筆畫,大腦也能輕易檢測出人臉,和各自的表情。人臉檢測非常重要,那到底有什麼用呢?(2015的A Survey)

  • 自動人臉檢測是圍繞自動人臉影象分析的所有應用的基礎,包括但不限於:人臉識別和驗證,監控場合的人臉跟蹤,面部表情分析,面部屬性識別(性別/年齡識別,顏值評估),面部光照調整和變形,面部形狀重建,影象視訊檢索,數字相簿的組織和演示。
  • 人臉檢測是所有現代基於視覺的人與電腦,和人與機器人,互動系統的初始步驟。
  • 主流商業數碼相機都內嵌人臉檢測,輔助自動對焦。
  • 很多社交網路如FaceBook,用人臉檢測機制實現影象/人物標記。

從問題的領域來看,人臉檢測屬於目標檢測領域,目標檢測通常有兩大類:

  • 通用目標檢測:檢測影象中多個類別的目標,比如ILSVRC2017的VID任務檢測200類目標,VOC2012檢測20類目標,通用目標檢測核心是n(目標)+1(背景)=n+1分類問題。這類檢測通常模型比較大,速度較慢,很少有STOA方法能做到CPU real-time。
  • 特定類別目標檢測:僅檢測影象中某一類特定目標,如人臉檢測,行人檢測,車輛檢測等等,特定類別目標檢測核心是1(目標)+1(背景)=2分類問題。這類檢測通常模型比較小,速度要求非常高,這裡問題的基本要求就是CPU real-time。

從發展歷史來看,深度學習在其中的作用非常明顯:

  • 非深度學習階段:這段時間經典檢測演算法都是針對特定目標提出的,比如CVPR 2001的Viola-Jones (VJ)是針對人臉檢測問題,CVPR 2005的HOG+SVM是針對行人檢測問題,TPAMI 2010的DPM,雖然可以檢測各類目標,但要用於多目標檢測,需要每個類別分別訓練模板,相當於200個特定類別檢測問題。
  • 深度學習階段:這段時間經典檢測演算法都是針對通用目標提出的,比如效能更好的Faster-RCNN, R-FCN系列,速度更快的YOLO, SSD系列,強大的深度學習只要一個CNN就可以搞定多類別檢測任務(模型數量1 vs. 200,CNN真的慢嗎?)。雖然這些都是多類別方法,但它們都可以用來解決單類別問題,目前人臉檢測、行人檢測等特定目標檢測問題的State-of-the-art(SOTA)都是這類方法的針對性改進。

目前以深度學習為主的CV演算法,研究重點是通用目標檢測,這些方法在人臉檢測問題上效果都不錯,那直接用就好了,為什麼還要研究這個問題呢?

  • Faster-RCNN系列:這類方法的優點是效能高,缺點是速度慢,在GPU上都無法實時,無法滿足人臉檢測對速度的極高要求,既然效能不是問題,這類方法的研究重點是提高效率。
  • SSD系列:這類方法的優勢是速度快,在GPU上能實時,缺點是對密集小目標的檢測比較差,而人臉剛好是密集小目標,這類方法的研究重點是提高密集小目標的檢測效能,同時速度也需要儘可能快,GPU實時演算法在應用中依然受限。

人臉檢測還有特殊的級聯CNN系列,後面會介紹。目前人臉檢測研究抱通用目標檢測的大腿,這是事實和現狀,但其速度和效能雙高的要求還是有挑戰性的。

評價指標

評價一個人臉檢測演算法(detector)好壞,常用三個指標:

  • 召回率(recall):detector能檢測出來的人臉數量越多越好,由於每個影象中包含人臉的數量不一定,所以用檢測出來的比例來衡量,這個指標就是召回率recall。detector檢測出來的矩形框越接近人工標註的矩形框,說明檢測結果越好,通常交併比IoU大於0.5就認為是檢測出來了,所以 recall = 檢測出來的人臉數量/影象中總人臉數量。
  • 誤檢數(false positives):detector也會犯錯,可能會把其他東西認為是人臉,這種情況越少越好,我們用檢測錯誤的絕對數量來表示,這個指標就是誤檢數false positives。與recall相對,detector檢測出來的矩形框與任何人工標註框的IoU都小於0.5,則認為這個檢測結果是誤檢,誤檢越少越好,比如FDDB上,論文中一般比較1000個或2000個誤檢時的召回率情況,工業應用中通常比較100或200個誤檢的召回率情況。
  • 檢測速度(speed):是個演算法都要比速度,人臉檢測更不用說,detector檢測一幅影象所用的時間越少越好,通常用幀率(frame-per-second,FPS)來表示。不過這裡有點小問題,很多detector都是影象越小、影象中人臉越少、檢測最小人臉越大,檢測速度越快,需要注意不同論文的測試環境和測試影象可能不一樣:測試影象,最常用的配置是VGA(640*480)影象檢測最小人臉80*80給出速度,但都沒有表明測試影象背景是否複雜,影象中有幾個人臉(甚至是白底一人臉的影象測速度);測試環境,差別就更大了,CPU有不同型號和主頻,有多核多執行緒差異,GPU也有不同型號,等等。

一般情況下誤檢數越多召回率越高,同等誤檢數量下比較召回率,同等測試環境和影象比較速度,請儘可能保持公平正義。下圖是評價指標的簡單示例,影象總共包含7個人臉(黃色橢圓),某detector給出了8個檢測結果(綠色框),其中5個正確,3個錯誤,這時候誤檢數為3,召回率為5/7=71.43%。

常用資料庫

人臉檢測的測試資料庫有很多,這裡僅選擇FDDB和WIDER FACE,這個兩個資料庫都有官方長期維護,各種演算法都會提交結果進行比較,而且很多早期資料庫目前都已經飽和,沒有比較意義。

第一個是2010年非約束環境人臉檢測資料庫FDDB FDDB : Main

  • Jain V, Learned-Miller E. Fddb: A benchmark for face detection in unconstrained settings [R]. Technical Report UM-CS-2010-009, University of Massachusetts, Amherst, 2010.

FDDB總共2845張影象,5171張,人臉非約束環境,人臉的難度較大,有面部表情,雙下巴,光照變化,穿戴,誇張髮型,遮擋等難點,是目標最常用的資料庫。有以下特點:

  • 影象解析度較小,所有影象的較長邊縮放到450,也就是說所有影象都小於450*450,最小標註人臉20*20,包括彩色和灰度兩類影象;
  • 每張影象的人臉數量偏少,平均1.8人臉/圖,絕大多數影象都只有一人臉;
  • 資料集完全公開,published methods通常都有論文,大部分都開原始碼且可以復現,可靠性高;unpublished methods沒有論文沒有程式碼,無法確認它們的訓練集是否完全隔離,持懷疑態度最好,通常不做比較。(扔幾張FDDB的影象到訓練集,VJ也可以訓練出很高的召回率。。需要考慮人品能不能抵擋住利益的誘惑)
  • 有其他隔離資料集無限制訓練再FDDB測試,和FDDB十折交叉驗證兩種,鑑於FDDB影象數量較少,近幾年論文提交結果也都是無限制訓練再FDDB測試方式,所以,如果要和published methods提交結果比較,請照做。山世光老師也說十折交叉驗證通常會高1~3%。
  • 結果有離散分數discROC和連續分數contROC兩種,discROC僅關心IoU是不是大於0.5,contROC是IoU越大越好。鑑於大家都採用無限制訓練加FDDB測試的方式,detector會繼承訓練資料集的標註風格,繼而影響contROC,所以discROC比較重要,contROC看看就行了,不用太在意。

FDDB在非深度學習的年代是極具挑戰性的,很少能做到2000誤檢0.9以上,經典VJ detector在2000誤檢也只有0.6593,但在深度學習的年代,這個資料庫目前也快接近飽和了,FDDB可以看做是資格賽,選手的正式水平請看下面的WIDER FACE。

第二個是目前2016年提出的,目前難度最大的WIDER FACE WIDER FACE: A Face Detection Benchmark

  • Yang S, Luo P, Loy C C, et al. Wider face: A face detection benchmark [C]// CVPR, 2016: 5525-5533.

WIDER FACE總共32203影象,393703標註人臉,目前難度最大,各種難點比較全面:尺度,姿態,遮擋,表情,化妝,光照等。有以下特點有:

  • 影象解析度普遍偏高,所有影象的寬都縮放到1024,最小標註人臉10*10,都是彩色影象;
  • 每張影象的人臉資料偏多,平均12.2人臉/圖,密集小人臉非常多;
  • 分訓練集train/驗證集val/測試集test,分別佔40%/10%/50%,而且測試集的標註結果(ground truth)沒有公開,需要提交結果給官方比較,更加公平公正,而且測試集非常大,結果可靠性極高;
  • 根據EdgeBox的檢測率情況劃分為三個難度等級:Easy, Medium, Hard。

WIDER FACE是目前最常用的訓練集,也是目前最大的公開訓練集,人工標註的風格比較友好,適合訓練。總之,WIDER FACE最難,結果最可靠(頂會論文也有不跑WIDER FACE的,即使論文中用WIDER FACE訓練),論文給出經典方法VJ, DPM, ACF和Faceness在這個庫上的效能水平,可以看出難度確實很大。

發展現狀

FDDB上人臉檢測演算法的水平:

結果太多比較亂,先跳過。

WIDER FACE上人臉檢測演算法的水平,SOTA都在這裡了:

  • 經典方法VJ,在這個庫上只有0.412/0.333/0.137;
  • 2015年的STOA,深度學習方法Faceness在這個庫上也只有0.716/0.604/0.315;
  • 2016年的STOA,深度學習方法MTCNN是0.85/0.82/0.6,最好的非深度學習方法LDCF+是0.797/0.772/0.564;
  • 2017上半年CVPR的HR是0.923/0.910/0.819,下半年ICCV的SSH是0.927/0.915/0.844,SFD是0.935/0.921/0.858,進步神速,深度學習刷榜真的非常恐怖,WIDER FACE離飽和也不遠了。

WIDER FACE上結果還是清晰明瞭的,這個資料庫是2015年底提出來的,發表在CVPR 2016,到現在也有兩年了,再看這期間ECCV 2016, CVPR 2017和ICCV 2017人臉檢測相關工作,也有很多論文沒有提交WIDER FACE。

FDDB上結果有點多有點亂,我這裡整理了一下FDDB的提交結果,挑選了有代表性的detector,分非深度學習和深度學習兩個表格,分別比較100/200/500/1000/2000誤檢時的召回率,並給出了對應論文中的速度情況,方便大家比較。注意速度直接是論文資料,不同論文的電腦配置不同,多核多執行緒情況不同,測試影象大小和複雜程度不同,等等因素,僅供參考,具體配置請看原論文,有source code的自己實測。有的論文並未提交FDDB,下表中召回率只有小數點後兩位的資料是根據論文ROC曲線估計的。

非深度學習的人臉檢測演算法比較:

包括2011~2017年的非深度學習人臉檢測方法,還有github上著名專案,深圳大學於仕琪老師的libfacedetection速度最快,和中科院山世光老師的SeetaFaceEngine中的人臉檢測部分召回率很高。注意非深度學習方法有時候給出的速度是正臉檢測模型,多角度模型通常慢數倍。

  • 簡單特徵級聯絡列,有VJ框架不同特徵(Haar-like, LBP, SURF), 有二值特徵JointCascade, Pico, NPD,這系列佔比較大,速度優勢非常明顯,在CPU上單核單執行緒就能實時,甚至上百FPS;
  • DPM系列,有Zhu, Structured Models, vanilla DPM,效能中上但速度都比較慢,FastestDPM較快但也需要多執行緒才能實時;
  • 通道特徵(channel feature)系列,有HeadHuner, ACF-multiscale, ACF+和LDCF+,這一系列是非深度學習方法中效能最好的,僅ACF+和LDCF+在2000誤檢時超過了0.9,這兩年非深度學習方法比較少,所以在WIDER FACE也只能看到ACF-multiscale和LDCF+。

深度學習的人臉檢測演算法比較:

包括2015~2017的深度學習人臉檢測方法,最後是我優化MTCNN的快速版本fastMTCNN。深度學習方法一般不會有正臉和多角度人臉模型的說法,速度都是召回率對應的。

這裡跳過了一些只有report的方法,其中有騰訊的兩個結果,基於Faster R-CNN的Face R-CNN,和基於R-FCN的Face R-FCN,在FDDB和WIDER FACE都是頂尖水平,說明Faster R-CNN/R-FCN在人臉檢測中表現也很不錯,不過並沒有做速度方面的優化,都極慢就不關注了。

  • 級聯CNN系列,有CNN Cascade, FaceCraft, MTNN, ICC-CNN,這一系列是深度學習方法中速度最快的,CPU都在10 FPS以上,級聯CNN系列優化後輕鬆可以在CPU上實時,全面優化後的fastMTCNN甚至可以在ARM上跑起來;
  • Faster R-CNN系列,效能可以做到極高,但速度都很慢,甚至不能在GPU上實時;
  • SSD/RPN系列:有SSH和SFD,都是目前FDDB和WIDER FACE上的最高水平,效能水平與Faster R-CNN系列不相上下,同時也可以保持GPU實時速度,SFD的簡化版FaceBoxes甚至可以CPU上實時,極有潛力上ARM。

以上就是截至到2017.12.31的人臉檢測演算法召回率和速度情況,如有疏漏,歡迎補充。

最後,CNN到底能做到多快呢?我們拿非深度學習中最快的libfacedetection中的multiview_reinforce版本,和深度學習中我優化的fastMTCNN(MTCNN的加速版)做速度對比:

  • 測試環境:multiview_reinforce是Intel(R) Core(TM) i7-4770 CPU @ 3.4GHz;fastMTCNN是Intel(R) Core(TM) i3-6100 CPU @ 3.7GHz,算是持平吧,我們僅比較單核單執行緒的速度。
  • 速度測試:multiview_reinforce是640x480(VGA), 最小人臉48,速度109.3 FPS;fastMTCNN是640x480(VGA), 最小人臉80,速度100 FPS以上,這裡multiview_reinforce略快一點點。這一對比其實也是公平的,因為MTCNN中有邊框迴歸,實際檢測的最小人臉在50以下,這一點如果您暫時不能理解,請根據最後部分實測。
  • 效能測試:multiview_reinforce在FDDB上2000誤檢是0.85,fastMTCNN在FDDB上2000誤檢是0.92。這裡需要強調,fastMTCNN的效能測試和速度測試的配置,僅最小人臉大小不同(20和80),而multiview_reinforce的效能測試和速度測試,除了最小人臉大小不同(16和48)之外,scale也不同,分別是1.08和1.2,做過人臉檢測的都知道,這個意味著,如果按照速度測試的配置,multiview_reinforce的召回率還要掉一大截,或者說,如果按照效能測試的配置,multiview_reinforce的速度會慢很多。

當然libfacedetection一直在更新,這裡對比的僅是2014年提交FDDB的召回率,用於證明深度學習在很高召回率的情況下,也可以做到實時。

深度學習的人臉檢測演算法實測

合理懷疑,fastMTCNN真的能跑這麼快嗎?如果您有興趣,可以先測試一下MTCNN,看看優化之前有多快:

AlphaQi同學實現的C++版MTCNN-light: AlphaQi/MTCNN-light

程式碼有幾處小錯誤需要修改,按照Issue 10 你好,這兩個地方可能導致錯誤 · Issue #10 · AlphaQi/MTCNN-light,稍微修改一下就可以測試了。

另一個錯誤是mtcnn.cpp中596行,第三階不應該再矯正為正方形:

refineAndSquareBbox(thirdBbox_, image.rows, image.cols);

另外,MTCNN-light的畫框程式碼是寫在檢測裡面的,這部分不應該計入檢測時間。

C++版MTCNN-light只需要OpenBLAS和OpenCV就可以跑了,不需要其他第三方庫,用於測試效能完全夠用了,但請不要用於實際專案和產品中,因為程式碼問題較多,具體實現以kaipeng的MATLAB程式碼為準。動手實測,一起來感受一下吧:

  • 輸入VGA影象,最小人臉設定80,簡單背景單人臉速度應該在40 fps以上。但複雜背景或人臉數量增加時,速度會嚴重下降,這就是級聯演算法的通病,在MTCNN中尤為嚴重,以後會詳細分析成因和解決辦法;
  • 設定最小人臉80,實際檢測到的最小人臉理論上可以到達52甚至更小。這是由於MTCNN是分類加回歸的多工方法(深度學習都是),迴歸機制可以檢測到最大IoU = 0.65的更大人臉和最小IoU = 0.65更小人臉,這一點算是深度學習的天然優勢吧,傳統方法做不到。

END

以上內容,錯誤肯定是有的,而且是難免的,歡迎所有講道理的批評指正,所有腦洞大開的探討,以及所有莫名其妙的互懟。

時間原因,沒有繼續寫完,抱歉!

相關文章