faced:基於深度學習的CPU實時人臉檢測

人工智慧頻道發表於2018-09-28

在沒有采用GPU的情況下,有可能實現具有實時效能的物件檢測模型嗎?faced是一個概念證明,可以為在CPU上實時執行的單個類物件(在本例中為faced)構建自定義物件檢測模型。

faced:基於深度學習的CPU實時人臉檢測


問題是什麼?

在許多情況下需要單個類物件檢測。這意味著我們想要檢測屬於影像中特定類的所有物件的位置。例如,我們可以檢測面部識別系統的面部或需要跟蹤人員的面部。

更重要的是,大多數時候我們希望實時執行這些模型。為了實現這一目標,我們提供了以x為速率提供樣本的影像,並且我們需要一個模型,用於每個樣本以低於x的速率執行。然後,我們可以在影像可用時立即處理。

現在解決此任務(以及計算機視覺中的許多其他任務)的最容易訪問和使用的解決方案是在先前訓練的模型上進行轉移學習(通常在大資料集上訓練的標準模型,如Tensorflow Hub或TF Object Detection API中的那些)。

https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md

有許多訓練有素的物件檢測架構(例如FasterRCNN、SSD或YOLO)可以在GPU上執行的實時效能中實現令人印象深刻的準確性。  

faced:基於深度學習的CPU實時人臉檢測


GPU很昂貴,但在訓練階段是必需的。然而在推理中,具有專用GPU以實現實時效能是不可行的。所有通用物件檢測模型(如上所述)都無法在沒有GPU的情況下實時執行。然後,我們如何重新審視單個類物件的物件檢測問題,以實現CPU的實時效能?

主要思想:簡單的任務需要較少的可學習特徵

所有上述架構都設計用於檢測多個物件類(在COCO或PASCAL VOC資料集上訓練)。為了能夠將每個邊界框分類為適當的類,這些體系結構需要大量的特徵提取。這轉化為大量可學習的引數,大量的過濾器,大量的層。換句話說,這個網路很大。

如果我們定義更簡單的任務(而不是多類邊界框分類),那麼我們可以想到網路需要學習更少的特徵來執行任務。檢測影像中的面部顯然比檢測汽車、人員、交通標誌和狗(都在同一模型中)更簡單。深度學習模型為了識別面部(或任何單個類物件)所需的特徵量將小於同時檢測數十個類的特徵量。執行第一個任務所需的資訊少於後一個任務。

單個類物件檢測模型需要較少的可學習功能。引數越少意味著網路越小。較小的網路執行得更快,因為它需要更少的計算。

那麼,問題是:我們可以在CPU上實現實時效能但保持準確性有多大?

faced的主要概念是:建立儘可能小的網路(希望)在CPU中實時執行,同時保持準確性。

架構

faces是兩個神經網路的集合,都是使用Tensorflow實現的。

主要網路

faced的主要架構主要基於YOLO的架構。基本上,它是一個全卷積網路(FCN),通過一系列卷積層和池化層執行288×288輸入影像(不涉及其他層型別)。

卷積層負責提取空間感知特徵。彙集層增加了隨後的卷積層的感知域。

架構的輸出是9×9網格(與YOLO中的13×13網格相比)。每個網格單元負責預測面部是否在該單元內(相對於YOLO,每個單元可以檢測多達5個不同的物件)。

每個網格單元具有5個關聯值。第一個是包含面部中心的單元的概率p。其他4個值是檢測到的面部(相對於單元)的(x_center,y_center,width,height)。

faced:基於深度學習的CPU實時人臉檢測


主要架構

確切的體系結構定義如下:

  • 2×[288×288影像上的8個過濾卷積層]

  • 最大池(288×288到144×144特徵圖)

  • 在144×144特徵圖上的2×[16個過濾卷積層]

  • 最大池(144×144到72×72特徵圖)

  • 72×72特徵圖上的2×[32個過濾卷積層]

  • 最大池(72×72到36×36特徵圖)

  • 36×36特徵圖上的2× [64個過濾卷積層]

  • 最大池(36×36到18×18特徵圖)

  • 18×18特徵圖上的2×[128個過濾卷積層]

  • 最大池(18×18到9×9特徵圖)

  • 最大池(18×18到9×9特徵圖)

  • 9×9特徵圖上的4×[192個過濾卷積層]

  • 9×9特徵圖上的5個過濾卷積層,用於最終網格

所有啟用功能都是leaky_relu。

faced有6,993,517個引數。YOLOv2有51,000,657個引數。它的尺寸是YOLO尺寸的13%!

輔助網路

(x_center,y_center,width,height)主網的輸出不如預期的那麼準確。因此,實現了一個小型卷積神經網路(CNN),以將包含面部的小影像(用主體系結構輸出裁剪)作為輸入,並在面部的真實邊界框上輸出迴歸。

faced:基於深度學習的CPU實時人臉檢測


網路採用包含面部的裁剪並預測正確的邊界框

它的唯一任務是補充和改進主體系結構的輸出座標。

該網路的特定體系結構不相關。

資料集

兩個網路都在WIDER FACE資料集上進行了訓練。

faced:基於深度學習的CPU實時人臉檢測

WIDER的多場景

"WIDER FACE資料集是一個人臉檢測基準資料集。我們選擇了32,203張影像,標記了393,703張人臉,其尺寸、姿勢和遮擋程度都有很高的變化,如樣本影像所示。

訓練

訓練是在Nvidia Titan XP GPU上完成的。訓練時間約需20小時。批量歸一化技術用於幫助收斂和丟失(以40%的速率)作為正則化方法以避免過度擬合。

推理和非最大抑制

當使用faced推理時,首先將影像大小調整為288×288以便饋入網路。影像位於FCN下方,提供上述9×9網格輸出。

每個單元具有包含影像的概率p。通過可配置的閾值過濾單元(僅保留p>t的單元)。對於那些保留的單元格,使用單元格(x_center,y_center,width,height)定位人臉。

在某些情況下,多個單元可以競爭同一個面部。假設面部中心位於4個單元格相交的確切位置。這4個單元可能具有更高的p(在單元內包含面部中心的概率)。如果我們保留所有單元格並投影每個單元格的面部座標,那麼我們將看到相同的面部周圍有4個類似的邊界框。這個問題通過一種稱為非最大抑制的技術得以解決。結果如下圖所示:  

faced:基於深度學習的CPU實時人臉檢測

非最大抑制示例

效能 faced能夠在推理上達到以下速度:

faced:基於深度學習的CPU實時人臉檢測

考慮到YOLOv2在i5 2015 MBP上無法達到1FPS,相當不錯。

結果

讓我們看看一些結果!

faced:基於深度學習的CPU實時人臉檢測


faced:基於深度學習的CPU實時人臉檢測


faced:基於深度學習的CPU實時人臉檢測

面部影像

現在讓我們看看faced和Haar Cascades之間的比較,這是一種不使用深度學習的計算機視覺傳統方法。兩種方法都在相似的速度效能下執行faced表現出更高的準確性。  

faced:基於深度學習的CPU實時人臉檢測

Haar Cascades [左] vs faced [右]

faced怎麼用?

faced是一個非常簡單的程式,既可以嵌入Python程式碼中,也可以作為命令列程式使用。

登入github庫可以獲得進一步說明:

faced:基於深度學習的CPU實時人臉檢測


https://github.com/iitzco/faced

結論

faced是一個概念證明,在場景中,你並不總是需要依賴於通用的訓練模型,因為這些模型對於你的問題和效能問題來說過於簡單。不要過高估計花費時間設計特定於你的問題的自定義神經網路架構的能力。這些特定網路將是比一般網路更好的解決方案。

來自 “ https://towardsdatascience.com/faced-cpu-real-time ”,原文連結:http://blog.itpub.net/31545819/viewspace-2215106/,如需轉載,請註明出處,否則將追究法律責任。

相關文章