如何使用CNN來檢測人臉?這裡有個簡單易學的教程!

一般我們作face detection最常用的選擇無非是OpenCV的Cascade classifier,如果要求高辨識率,那麼效果較好的Dlib則是考慮的選項,但,您有想過改用深度學習(CNN)方式來檢測人臉嗎?

使用Cascade classifier或Dlib的Face detection偵測臉孔的痛苦,就在於一些低照度場所或者非正面的角度經常檢測失敗,將背景誤報為人臉的情況更是屢見不鮮,這類問題尤以OpenCV 的Cascade classifier為甚,不過,透過deep learning方式相信可大幅減少這類的情況。

下面介紹如何用YOLO來訓練face detection,至於一般人所關心的face dataset從何而來?那就讓系統自動產生吧,我們可以先透過OpenCV或Dlib檢測出臉孔後,寫支程式將這些臉孔區域產生VOC格式的xml檔案,所以我們不需要費力的label照片,比較花時間的,反而是事後針對OpenCV或Dlib所自動label的臉孔進行review,以避免沒有未檢測出或誤報的錯誤資料

使用Dlib取得人臉並自動label

我特地撰寫了三個工具,分別針對實時影像、影片、相片取得大量的臉孔相片並進行自動face labeling。這三支程式都會自動識別影像中是否有人臉,若有的話便產生VOC xml格式的label檔,並且將image檔及label檔放置於指定的資料夾中。

1.grep_faces_from_webcam.py

只要執行該代碼,web camera便會持續的進行攝影、辨識、label人臉,併產生可用於訓練的人臉dataset。

2.grep_faces_from_video.py

你可以給它一個資料夾路徑,裡面放置各類型的影片(mp4, mov, avi…等),該代碼會把所有影片中所能抓出的人臉製作成人臉dataset。

3.grep_faces_from_image.py

與上一支代碼類似,但資料夾路徑裡面放置的是各類型的圖片(jpg, png, bmp…等),該程式會把該資料夾中所有能抓出的人臉製作成人臉dataset。

代碼說明:

將Dlib傳回的face bounding box資訊寫入VOC xml template。

VOC XML範本:由兩個部份所組成

xml_object.txt為xml_file.txt的一部份,位於<segmented>標籤後方,定義了相片中每一個bbox的左上角(x, y)及右下角(x, y)。

xml_file.txt

xml_object.txt

開始訓練

1.準備face dataset

利用上述的三種代碼,產生了3,042張已自動label完成的人臉dataset。

資料夾 Images/

資料夾 labels/

2.開始YOLO訓練

直接使用我寫好的YOLO快速訓練script:

git clone github.com/ch-tseng/mak

編輯train.py,修改下列參數:

path的分隔字元(for Windows和Linux users)

folderCharacter = 「/"

dataset的xml檔案路徑(VOC format)

xmlFolder = 「您的label資料夾path"

dataset的image檔案路徑

imgFolder = 「您的images資料夾path 「

你所label的class列表,請修改為您用於label臉的名稱。

classList = { 「face":0 }

指定轉換後的YOLO training dataset的放置路徑,建議與您的images資料夾path平行。

(若無此folder程式會自動create)

saveYoloPath = 「/XXX/XXX/yolo"

要產生那一版YOLO model(yolov3或yolov3-tiny)

modelYOLO = 「yolov3-tiny"

dataset要分出多少比例作為test dataset?

testRatio = 0.2

要產生的YOLO cfg目錄及相關檔案名稱

(若無此folder程式會自動create)

cfgFolder = 「cfg.yoloface"

cfg_obj_names = 「obj.names"

cfg_obj_data = 「obj.data"

訓練時每個batch及subdivision的數量,亦即每次會取numBatch除上numSubdivision個image來訓練,若您的GPU RAM不夠大,建議您可調整此兩個值。

numBatch = 24

numSubdivision = 8

darknet執行檔的path

darknetEcec = 「../darknet/darknet"

3.修改完上述的參數後,便可以執行python3 train.py開始訓練YOLO的臉部孔偵測模型了。

測試比較

我們找一個影片,然後同步執行OpenCV的cascade classifier、Dlib的face detect以及剛剛訓練好的YOLO偵測臉孔模型,三個同時來比較看看YOLO的臉孔偵測效果如何。

首先,我們發現YOLO很平順不間斷的持續偵測框選影片中的臉孔,Dlib及OpenCV則偶爾中斷,OpenCV尤其嚴重。此外,YOLO的泛化能力相當強,也就是它能學習到物體的generalizable representations,比如,在下方的影格中可看出YOLO比起另外兩種更能準確的偵測到所有的人臉:

最後

當我們需要高人臉檢出率,且硬體資源有GPU可使用時,採用YOLO是相當不錯的選擇,除了可偵測臉部外,同時間,還能偵測其它物件,創造出不同的應用。

除了臉部,我們還能利用Dlib提供的68點facial landmarks來訓練YOLO偵測臉部各個五官的位置,這部份待未來再續。

在這裡推薦一個谷歌的人臉檢測開發套件——AIY Vision Kit。谷歌AIY Vision Kit(視覺套件)可以處理圖像識別和計算機視覺, 支持離線識別上千種常見物體(動物、植物)以及人臉、面部表情等,可以使用機器學習查看和識別對象。所有這些都裝在一個方便的小紙板盒子里,由Raspberry Pi和Intel movidius提供動力。而且這款套件附帶了大量開箱即用的示例模型,用戶離線即可使用。

推薦閱讀:

TAG:教程 | 人臉識別 | 計算機視覺 |