人臉檢測算法落地詳解

人臉檢測 Face Detection

目標:人臉檢測的目的是找出一張圖片中的所有人臉的位置信息

人臉檢測是人臉其他應用的基礎,只有獲取到了是否有人臉和人臉的精確的位置信息,其它的應用才能繼續開展,所以說人臉檢測是一個基礎且重要的一個技術。

本篇文章包含內容

  • 人臉檢測工程應用中面臨的問題
  • 人臉檢測算法的發展過程
  • 工程中常用的人臉檢測算法
  • 人臉檢測算法案例詳細說明

一、人臉檢測工程應用中面臨的問題

在實際工程應用中,常常會面臨非常複雜的工況。一方面算法準確度會受到很多因素影響,例如目標遮擋、光線變化、小尺寸人臉等等。另一方面算法的推理時間也會受到很多因素的影響,例如硬件性能,目標數量,圖片尺寸等等。下面是幾種工程中常見的問題。

  • 人臉遮擋,或者人臉角度較大,都會直接導致目標不完整,對於檢測算法召回率有很大影響
  • 暗光,光線不充足條件下,導致成像質量不高,會影響檢測算法召回率
  • 低分辨率,低分辨率導致人臉尺寸過小
  • 人臉數量過多,圖片中人臉數量多,對檢測算法要求較高。例如多目標靠的太近,對於NMS算法會是一種考驗,另外數量過多會影響某些算法(圖像金字塔類型)的時間複雜度,例如MTCNN

二、人臉檢測算法的發展過程

自從數字圖像誕生,人臉檢測算法就開始有人研究,歷史可謂悠久。

人臉檢測算法按照方法可以被分爲兩大類,基於特徵的算法、基於圖像的算法。

人臉檢測技術分類

基於特徵的算法就是通過提取圖像中的特徵和人臉特徵進行匹配,如果匹配上了就說明是人臉,反之則不是。提取的特徵是人爲設計的特徵,例如Haar,FHOG,特徵提取完之後,再利用分類器去進行判斷。通俗的說就是採用模板匹配,就是用人臉的模板圖像與待檢測的圖像中的各個位置進行匹配,匹配的內容就是提取的特徵,然後再利用分類器進行判斷是否有人臉。

在早期工業界,具有里程碑意義的人臉檢測算法----VJ算法(Viola-Jones),它是使用Haar-like特徵和級聯的AdaBoost分類器來進行人臉檢測,在提升了精度的同時也兼顧了時間性能,VJ算法是一個框架,之後一段時間大家都是基於這個框架在做文章,例如Haar–AdaBoost, LBP–AdaBoost, GF-SVM

adaboost示例

在基於特徵的方法中,學術界的人一直在嘗試尋找面部的不變特徵來進行更加魯棒的檢測。基於特徵的方法如果要做到百分之百準確,有這樣一個前提,必須存在不變的特性或特徵,這樣提取出來的特徵百分之百存在並且很穩定。例如輪廓,膚色,眉毛,眼睛,鼻子,嘴巴和髮際線。基於提取的特徵,建立統計模型來描述它們的關係並驗證人臉的存在。但是這些圖像特徵可能由於光照,噪聲和遮擋而受到影響。臉部的特徵邊界可能會變弱,且陰影可能會導致大量強邊緣,這些都會使檢測算法失效。

基於圖像的算法,將圖像分爲很多小窗口,然後分別判斷每個小窗是否有人臉。通常基於圖像的方法依賴於統計分析和機器學習,通過統計分析或者學習的過程來找到人臉和非人臉之間的統計關係來進行人臉檢測。最具代表性的就是CNN,CNN用來做人臉檢測也是目前效果最好,速度最快的。後面着重介紹CNN相關人臉檢測算法。

三、工程中常用的人臉檢測算法

自從2018年以來,不管是什麼硬件平臺,基本上都看不到傳統算法做人臉檢測了,幾乎全部都是使用深度學習也就是CNN,來做人臉識別。早起2016年以前,由於很多硬件設備是不具備強大的並行計算能力的,也就是沒有GPU,所以很多算法只能運行在CPU上,而傳統CNN算法在CPU上運行時間簡直是不能忍受,所以那段時間CPU平臺運行的算法幾乎都是AdaBoost之類的算法。

後來,隨着深度學習的發展,有兩個重要的原因導致CNN算法直接吞併傳統算法。1,硬件計算能力爆發式增長;2,CNN模型壓縮和量化部署技術快速發展。正是因爲這兩個原因,所以現在連樹莓派這種純arm的都可以直接部署CNN,並且效果還不錯。

常用算法

這裏常用的算法有

FDDB上數據

Algorithm FDDB Disc ROC curves score
MTCNN 94.0@1000
FaceBoxes
RetinaFace-mnet 96.0@1000
LFFD 97.3@1000
CenterFace 98.1@1000

在WIDER FACE 的test數據集上數據

Algorithm Easy Set Medium Set Hard Set
MTCNN 0.851 0.820 0.607
FaceBoxes 0.791 0.794 0.715
RetinaFace-mnet 0.896 0.871 0.681
LFFD 0.910 0.881 0.780
CenterFace 0.932 0.921 0.873

1、MTCNN

MTCNN是kaipeng Zhang在本科階段研究出來的,它是一個3級聯的CNN網絡,分爲PNet,RNet,ONet,層層遞進。PNet的輸入是原圖經過圖像金字塔之後不同尺寸的圖片,最後結果由ONet輸出。
MTCNN

優點:網絡輕量推理時間快,工程部署靈活性大,能夠輸出5點landmark

缺點:檢測時間受人臉數量影響,模型訓練複雜

2、FaceBoxes、RetinaFace mnet、LFFD

以上都屬於輕量級人臉檢測算法,也屬於One Stage 算法,FaceBoxes類似於SSD算法框架,採用多尺度特徵層融合方式,採用anchor proposal,在不同尺度特徵層上進行檢測,這樣就顧及到多尺度的人臉檢測,FaceBoxes的文章旨在CPU上實現實時檢測。

3、CenterFace

最新開源的一個人臉檢測算法,github上同名項目。目前從數據來看,效果最好。

在實際工程應用中,要根據部署環境來選擇人臉檢測算法。例如在多人臉抓拍的場景,就不能選擇MTCNN這類級聯的算法,因爲級聯網絡的推理速度與人臉數成反比,受人臉數量影響較大,MTCNN適用於人臉考勤或者人證對比的場景,只可能出現固定數量人臉的場景。

4、另外

還有一種,開袋即食。那就是dlib,這是一個人臉算法庫,並且開源。不管你是用c++還是python,都可以直接使用dlib來做檢測。如果想用python做實驗,直接 import dlib,直接搞定。

這種自己學習一下可以,但是工程部署中一般不用。

四、人臉檢測算法案例詳細說明

人臉檢測算法的選取跟應用場景息息相關,本人使用過以下幾種算法

  • MTCNN
  • 改進過的MTCNN
  • resnet10-SSD 人臉檢測
  • pelee 人臉檢測

因爲本人工作傾向於嵌入式部署,所以選擇模型都會考慮硬件推理時間消耗,而每一個新的人臉檢測算法發表出來,很大一部分的都是爲了刷榜來表現自己的實力,一般不考慮推理實時性。所以算法實際工程落地,一般都會去修改一些東西達到自己的應用目的。

MTCNN由於是級聯結構,所以其可玩性非常大,例如將RNet金字塔層數降低或者ONet通道數減半,加速推理時間;例如單獨使用ONet做人臉跟蹤;例如MTCNN魔改之後輸出最大人臉消耗非常短時間,等等

詳細案例、網絡搭建細節、檢測器訓練過程將會在下一篇文章中寫出。

最後,求一個關注

公衆號

參考:

Filali H, Riffi J, Mahraz AM, Tairi H (2018) Multiple face detection based on machine learning. In: Proceeding of international conference on intelligent systems and computer vision, pp 1–8

Kaipeng Zhan, Zhanpeng Zhang, Zhifeng L, Yu Qiao. Joint Face Detection and Alignment Using Multitask Cascaded Convolutional Networks. 2016, IEEE Signal Processing Letters

發佈了62 篇原創文章 · 獲贊 61 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章