如何使用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 https://github.com/ch-tseng/makeYOLOv3
編輯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提供動力。而且這款套件附帶了大量開箱即用的示例模型,用戶離線即可使用。
推薦閱讀: