CPU 實時人臉檢測,各種朝向都逃不過
作為 CV 重要的組成部分,人臉檢測旨在利用卷積神經網路從人臉影象中抽取足夠的資訊。然而雖然 CNN 能高效處理影象資料,但大多數情況下它的設計都是針對一般影象處理任務。卷積網路本身並不會太考慮旋轉等情況,即使考慮也只是通過資料增強稍微優化一點。在這個專案及對應的論文中,作者提出並實現了一種完全旋轉平面(RIP)不變的人臉檢測。如下圖所示它能檢測出人臉的正確朝向,並從任何 RIP 角度捕獲面部檢測框。
如上所示很多計算機視覺任務或目標檢測需要處理不同的旋轉方向,而為了解決這樣的問題,Xuepeng Shi 等研究者提出了一種用於旋轉不變性人臉檢測的 PCN(progressive calibration networks)。這種 PCN 能逐步校準每個候選面部的 PIP 方向為垂直方向,並更好地從非面部影象中區分出面部影象。
-
論文:Real-Time Rotation-Invariant Face Detection with Progressive Calibration Networks
-
論文地址:https://arxiv.org/pdf/1804.06039.pdf
具體而言,PCN 會抽選識別候選面部影象塊,並將朝下的影象塊翻轉至正向,這樣就會減半 RIP 的角度範圍,即從 [−180° , 180°] 到 [−90° , 90° ]。然後旋轉過的面部影象塊會進一步區分朝向並校準到垂直向的 [−45° , 45° ] 範圍,這樣又會減半 RIP 的角度範圍。最後,PCN 會分辨到底這些候選影象塊是不是人臉,並預測出精確的 RIP 角度。
通過將校準過程分割為幾個漸進的步驟,且在早期校準步驟只預測粗略的朝向,PCN 最後能實現精確的校準。此外,每一個校準步驟可以簡單地旋轉 - 90°、90° 和 180°,因此額外的計算量非常低,這也就是為什麼該檢測專案能在 CPU 上實時執行的重要原因。通過在逐漸降低的 RIP 範圍內執行二元分類(是人臉或不是人臉),PCN 能在 360° RIP 旋轉角度內準確地檢測到人臉,而本專案重點就是實現這樣旋轉不變的人臉檢測器。
原論文圖 3:uepeng Shi 等研究者提出的 PCN 概覽,它會逐漸降低旋轉的角度範圍,並最終預測人臉及其旋轉的角度。
這種能處理不同旋轉方向的人臉檢測器有非常高的準確率,因為它會先將候選人臉旋轉至正向再預測。此外,這種方法同樣有非常小的計算量,該 GitHub 專案表示它甚至可以在 CPU 上實時檢測人臉。
PCN 多角度實時人臉檢測專案地址:https://github.com/Jack-CV/PCN-FaceDetection
下圖展示了 PCN 專案在不同情境下的檢測效果,我們會發現即使面部的朝向多種多樣,它也能非常準確地檢測出來。
PCN 的目標是在準確地檢測人臉及朝向的情況下儘可能降低計算力。Xuepeng Shi 等研究者同樣在標準 VGA 影象(640x480)上對比了 PCN 與其它旋轉不變的人臉檢測器。這些檢測器分別在帶有 3.4GHz CPU 和 GTX Titan X GPU 的臺式電腦上進行測試,速度測試結果與召回率都展示在下表,更詳細的內容請檢視原論文。值得注意的是,將方形結果轉換為矩形或橢圓型有助於更好地擬合標註值,因此能實現更高的準確率,不過下表並沒有做這樣的轉換。
專案使用方法
根據 GitHub 專案所示,目前該專案所測試的環境主要在 Linux,且需要 Caffe 和OpenCV(2.4.10 或其它相容版本)的支援。因為該專案採用的是 Caffe 框架,所以小編放棄測試了~
以下是一些簡要的配置,首先可以設定人臉的最小檢測尺寸(size >= 20):
-
detector.SetMinFaceSize(size);
配置影象金字塔的縮放因子(1.4 <= factor <= 1.6):
-
detector.SetImagePyramidScaleFactor(factor);
配置人臉檢測的置信度閾值(0 <= thresh1, thresh2, thresh3 <= 1):
-
detector.SetScoreThresh(thresh1, thresh2, thresh3);
是否平滑人臉檢測框(smooth = true or false),推薦在視訊中使用,它可以獲得更加穩定的人臉檢測框。
-
detector.SetVideoSmooth(smooth);
讀者可檢視 picture.cpp 和 video.cpp 檢視細節,如果你們想在 FDDB 上覆現結果,可以直接執行 fddb.cpp。我們可以在 FDDB 中旋轉影象以獲得 FDDB-left、FDDB-right 和 FDDB-down,然後分別測試它們。具體而編譯並執行:
cd $PCN_ROOT/code# You should set "CAFFEROOT" in lib.sh, compile.sh, and run.sh first. sh lib.sh sh compile.sh picture/video/fddb sh run.sh picture/video/fddb