人臉檢測方法研究記錄
--------------------- 本文來自 HamTam12 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/sinat_14916279/article/details/71374059?utm_source=copy
常見的人臉檢測方法:
1.OpenCV人臉檢測方法 2.Dlib人臉檢測方法 3.libfacedetect人臉檢測方法 4.Seetaface人臉檢測方法5.單個CNN人臉檢測方法6.級聯CNN人臉檢測方法
1.OpenCV人臉檢測方法
採用的是harr-like特徵提取 + adaboost級聯分類器構成的人臉檢測演算法,可以設定要檢測的人臉大小範圍,召回率高,但有時會出現誤檢;當設定要檢測的人臉比較大時,檢測速度很快,可以達到實時檢測;檢測到的人臉框位置不夠精細。
2.Dlib人臉檢測方法
dlib人臉檢測採用的是經典的梯度方向直方圖(HOG特徵)提取 + 線性分類器 + 影象金字塔 + 滑動視窗的人臉檢測方法,速度很快,只能檢測80x80或更大的人臉,但可以通過影象上取樣來檢測更小的人臉。相比於opencv的人臉檢測,召回率更高,誤檢率更低,且人臉框更準確,檢測速度也同樣很快。
3.libfacedetect人臉檢測方法
libfacedetect,該庫呼叫非常簡單,只有一個函式,純C語言編譯而成,不依賴任何第三方庫。通過連續的優化,其人臉檢測演算法可以做到3.6毫秒處理一張VGA影象(最小48x48人臉),無論是檢測速度、效果和人臉框位置的準確性都勝過opencv!!! libfacedetect提供了四套介面,分別為frontal、frontal_surveillance、multiview、multiview_reinforce,其中multiview_reinforce效果最好,可以檢測側臉,速度比其它介面稍慢,但仍然比opencv的正臉檢測要快,總而言之,非常好用,用起來非常簡單!!! 此外,libfacedetect和dlib一樣提供了人臉特徵點檢測,且libfacedetect對側臉檢測仍有不錯的效果。
4.Seetaface人臉檢測方法
SeetaFace人臉識別引擎包括了搭建一套全自動人臉識別系統所需的三個核心模組,即:人臉檢測模組SeetaFace Detection、面部特徵點定位模組SeetaFace Alignment以及人臉特徵提取與比對模組SeetaFace Identification。它是一套包括所有技術模組的、完全開源的基準人臉識別系統。開源Github地址
其中,SeetaFace Detection採用了一種結合傳統人造特徵與多層感知機(MLP)的級聯結構,在FDDB上達到了84.4%的召回率(100個誤檢時),並可在單個i7 CPU上實時處理VGA解析度的影象。
人臉檢測模組SeetaFace Detection採用的是一種結合經典級聯結構和多層神經網路的人臉檢測方法實現,其所採用的漏斗型級聯結構(Funnel-Structured Cascade,FuSt)專門針對多姿態人臉檢測而設計,其中引入了由粗到精的設計理念,兼顧了速度和精度的平衡。
5.單個CNN人臉檢測方法
首先訓練一個判斷人臉非人臉的二分類器。例如採用卷積神經網路caffenet進行二分類,可以在imagenet資料集訓練過的模型,利用自己的人臉資料集,進行微調。也可以自定義卷積網路進行訓練,為了能檢測到更小的人臉目標,我們一般採用小一點的卷積神經網路作為二分類模型,減小影象輸入尺寸,加快預測速度。 然後將訓練好的人臉判斷分類網路的全連線層改為卷積層,這樣網路變成了全卷積網路,可以接受任意輸入影象大小,影象經過全卷積網路將得到特徵圖,特徵圖上每一個“點”對應該位置對映到原圖上的感受野區域屬於人臉的概率,將屬於人臉概率大於設定閾值的視為人臉候選框。 影象上人臉的大小是變化的,為了適應這種變化,最暴力的辦法就是使用影象金字塔的方式,將待檢測的影象縮放到不同大小,以進行多尺度人臉檢測。對多個尺度下檢測出來的所有人臉候選框,做非極大值抑制NMS,得到最後人臉檢測的結果。
6.級聯CNN人臉檢測方法
採用級聯網路來進行人臉檢測,參考2015年CVPR上的一篇論文A Convolution Neural Network Cascade for Face Detection,它採用了12-net,24-net,48-net級聯網路用於人臉檢測,12-calibration-net,24-calibration,48-calibration邊界校訂網路用於更好的定位人臉框。它最小能夠檢測12x12大小的人臉,相比於單個CNN的人臉檢測方法,大大加快了人臉檢測的速度,並提高了人臉框的準確度,人臉檢測的準確率和召回率也很高,在FDDB資料集上達到了當時最高的分數。
(1)12-net:首先用一個輸入為12 x 12影象的小網路來訓練人臉非人臉二分類器,將最後的全連線層修改成卷積層,這樣的全卷積網路即12-full-conv-net就可以接受任意大小的輸入影象,輸出的特徵圖表示對應感受野區域屬於人臉的概率。在檢測時,假設要檢測的最小人連尺寸為K x K,例如40 x 40,將待檢測的影象縮放到原來的12/K,然後將整幅影象輸入到訓練好的12 x 12的全卷積網路,得到特徵圖,設定閾值過濾掉得分低的,這樣就可以去除絕大部分不感興趣區域,保留一定數量的候選框。 (2)12-calibration-net:訓練一個輸入為12 x 12影象的校訂網路,來矯正上一步12-net得到的人臉框邊界,它實質上是一個45類分類器,判斷當前影象中包含的人臉是左右偏了、上下偏了還是大了小了,即包括: x方向上-0.17、0、0.17共3種平移 y方向上-0.17、0、0.17共3三種平移 以及0.83、0.91、1.0、1.1、1.21共5種縮放尺度 檢測時,將上一步12-net得到的所有人臉候選框作為12-calibration-net的輸入,根據其分類結果對候選框位置進行校訂。 (3)localNMS:對上述12-calibration-net矯正後的人臉候選框做區域性非極大值抑制,過濾掉其中重疊的得分較低的候選框,保留得分更高的人臉候選框。
(4)24-net:訓練輸入為24 x 24影象的人臉分類器網路。測試時,以上一步localNMS得到的人臉候選框縮放到24 x 24大小,作為24-net網路輸入,判定是否屬於人臉,設定閾值保留得分較高的候選框。 (5)24-calibration-net:同樣訓練一個輸入影象為24 x 24大小的邊界校訂分類網路,來矯正上一步24-net保留的人臉候選框的位置,候選框區域影象縮放到24 x 24大小,其它與12-calibration-net一致。 (6)localNMS:將24-calibration-net矯正後的人臉候選框進行區域性非極大值抑制,過濾掉重疊的得分較低的候選框,保留得分更高的。
(7)48-net:訓練一個更加準確的輸入為48 x 48的人臉非人臉分類器。測試時,將上一步localNMS得到的人臉候選框縮放到48 x 48大小,作為48-net輸入,保留得分高的人臉候選框。 (8)globalNMS:將48-net得到的所有人臉候選框進行全域性非極大值抑制,保留所有的最佳人臉框 (9)48-calibration-net:訓練一個輸入為48 x 48的邊界校訂分類網路。測試時,將globalNMS得到的最佳人臉框縮放到48 x 48作為輸入進行人臉框邊界校訂。
因此,我們需要先單獨訓練人臉非人臉二分類12-net,24-net,48-net網路,以及人臉框邊界校訂12-calibration-net,24-calibration,48-calibration網路。測試時,用影象金字塔來做多尺度人臉檢測,對於任意的輸入影象,依次經過12-net(12-full-conv-net) -> 12-calibration-net -> localNMS -> 24-net -> 24-calibration-net -> localNMS -> 48-net -> globalNMS -> 48-calibration-net,得到最終的人臉框作為檢測結果。 其中localNMS和globalNMS(Non-maximum Suppression,NMS,非極大值抑制)的區別主要在於前者僅使用了IoU(Intersection over Union),即交集與並集的比值,而後者還用到了IoM(Intersection over Min-area),即交集與兩者中最小面積的比值,來過濾重疊的候選框。 博主沒有自己訓練,而是直接用了作者訓練好的模型。使用CNN_face_detection-master\face_detection資料夾下的face_cascade_fullconv_single_crop_single_image.py指令碼可以對但張影象進行測試,程式碼如下,其中需要注意的是,我們可以根據需求來設定檢測最小的人臉尺寸min_face_size,它與檢測速度直接相關,如果我們需要檢測的人臉比較大,例如在128x128以上時,檢測可以達到實時水平。
小結
對比上述六種人臉檢測方法,其中opencv、dlib和libfacedetect、seetaface都提供了人臉檢測的介面可以直接呼叫,檢測效果上個人認為是dlib ≈ libfacedetect ≈ seetaface > opencv,檢測速度上,libfacedetect > dlib ≈ seetaface ≈ opencv。另外,後兩種是採用深度學習的方法,單個CNN做人臉檢測,效果一般速度較慢,但實現簡單,而級聯CNN人臉檢測方法檢測效果和速度都與dlib接近,但訓練起來可能麻煩點。對於一般的應用需求,除了單CNN的方法,另外五種基本都能達到要求,其中libfacedetect具有最好的實時性,seetaface優勢在於有一整套的人臉識別系統。 1.OpenCV人臉檢測方法 2.Dlib人臉檢測方法 3.libfacedetect人臉檢測方法 4.Seetaface人臉檢測方法 5.單個CNN人臉檢測方法 6.級聯CNN人臉檢測方法
--------------------- 本文來自 HamTam12 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/sinat_14916279/article/details/71374059?utm_source=copy
https://blog.csdn.net/sinat_14916279/article/details/71374059?utm_source=copy