作者:Adrian Rosebrock
今天我要和大家分享一個關于OpenCV圖書館的小秘密:
您可以使用OpenCV進行快速、準确的人臉檢測,使用預先訓練的深度學習臉部檢測器模型與庫一起裝運。
您可能已經知道,OpenCV船舶出箱前訓練Haar級聯,可用于人臉檢測…
……但我敢打賭,你不知道“隐藏”的深度學習為基礎的面部檢測器,它一直是OpenCV以來OpenCV 3.3的一部分。
在今天的部落格文章的其餘部分,我将讨論:
這個“隐藏”的深度學習人臉檢測器存在于OpenCV圖書館
如何使用OpenCV和深度學習進行圖像中的人臉檢測
如何利用OpenCV和深度學習實作視訊中的人臉檢測
正如我們将看到,很容易交換Haar級聯為他們更準确的深度學習臉部檢測器同行。
要了解更多關于OpenCV和深度學習的人臉檢測,請繼續閱讀!
今天的部落格文章分為三個部分。
在第一部分中,我們将讨論更精确的OpenCV人臉檢測器的起源以及它們在OpenCV庫内的位置。
從這裡我将示範如何使用OpenCV和深度學習在圖像中進行人臉檢測。
我将結束部落格文章,讨論如何使用OpenCV和深度學習将人臉檢測應用到視訊流。
這些“更好”的人臉檢測器在OpenCV生活,它們來自哪裡?
早在2017年8月,OpenCV 3.3正式釋出,它帶來了一個高度改進的“深度神經網絡”(DNN)子產品。
該子產品支援許多深度學習架構,包括CAFE、TunSoFrand和Trase/PyTr火炬。
DNN子產品的主要貢獻者,Aleksandr Rybnikov,投入了大量的工作使這個子產品成為可能(我們欠他一大堆的感謝和掌聲)。
自從OpenCV 3.3釋出以來,我一直在分享一些深度學習OpenCV教程,包括:
- Deep Learning with OpenCV
- Object detection with deep learning and OpenCV
- Real-time object detection with deep learning and OpenCV
- Deep learning on the Raspberry Pi with OpenCV
- Raspberry Pi: Deep learning object detection with OpenCV
- Deep learning: How OpenCV’s blobFromImage works
然而,大多數OpenCV使用者不知道的是,Rybnikov已經在OpenCV官方釋出中包含了一個更準确、更深入的基于學習的人臉檢測器(盡管如果你不知道去哪裡看,它可能有點難找到)。
基于Caffe的人臉檢測器可以在DNN樣本的FACESEL檢測器子目錄中找到:
當使用OpenCV的深度神經網絡子產品與CAFE模型時,您需要兩組檔案:
定義模型架構(即層本身)的原型檔案(s)
包含實際層權重的CalpMeMod檔案
這兩個檔案都需要在使用模型訓練的CAFE深度學習。
但是,您隻會在Github RePo中找到Primtxt檔案。
權重檔案不包括在OpenCV樣本目錄中,它需要更多的挖掘來找到它們。
我在哪裡可以得到更精确的OpenCV人臉檢測器?
為了友善起見,我已經包括:
FrasePrimtxt檔案
和Caffe模型重量檔案
在這篇部落格文章的“下載下傳”部分。
若要跳過下載下傳部分,請單擊此處。
OpenCV深度學習人臉檢測器是如何工作的?
OpenCV的深度學習臉部檢測器是基于具有RESNET基礎網絡的單鏡頭檢測器(SSD)架構(不像其他OpenCV SSD,您可能已經看到,它通常使用MobileNet作為基礎網絡)。
對SSDS和ResNet的全面審查超出了這篇部落格文章的範圍,是以如果您有興趣了解更多關于單鏡頭檢測器(包括如何訓練您自己的自定義深度學習對象檢測器),請從PyIGiSeLeCH部落格上的這篇文章開始,然後看一下我的書,深度學習計算機視覺與Python,其中包括深入的讨論和代碼,使您能夠訓練自己的對象探測器。
基于OpenCV和深度學習的人臉檢測
在第一個例子中,我們将學習如何将OpenCV的人臉檢測應用于單輸入圖像。
在下一節中,我們将學習如何修改此代碼,并将OpenCV的人臉檢測應用到視訊、視訊流和網絡攝像頭。
打開一個新檔案,命名為Debug TFACE.PY,并插入以下代碼:
在這裡,我們導入我們需要的包(第2-4行)和解析指令行參數(第7行到第16行)。
我們有三個必要的論點:
--圖像:輸入圖像的路徑。
--Pototxt:CAFE原型檔案的路徑。
模型:訓練前的CAFE模型的路徑。
一個可選的參數,即信心,可以覆寫預設門檻值0.5,如果你願意的話。
從那裡開始加載我們的模型并從我們的圖像中建立一個斑點:
首先,我們使用我們的-PrimTxt和模型檔案路徑加載模型。我們将模型存儲為Net(第20行)。
然後,我們加載圖像(第24行),提取次元(第25行),并建立一個BLB(第26行和第27行)。
DNN.BulbFoin圖像負責預處理,包括設定BLB尺寸和歸一化。如果您有興趣了解更多關于DNN.BLOBROVIGION的功能,我将在本部落格文章中詳細介紹。
接下來,我們将應用人臉檢測:
我們開始在第36行上進行檢測。
從那裡,我們提取信心(線39),并将其與置信門檻值(線43)進行比較。我們執行這個檢查過濾弱檢測。
如果置信度滿足最小門檻值,我們繼續繪制矩形,并在44-56行上檢測機率。
為了實作這一點,我們首先計算包圍盒(線46和47)的(x,y)坐标。
然後,我們建立我們的信心文本字元串(第51行),其中包含檢測的機率。
如果我們的文本将關閉圖像(例如當面部檢測發生在圖像的最上端)時,我們将其向下移動10像素(第52行)。
我們的臉矩形和可信度文本繪制線上53-56的圖像上。
從那裡我們循環傳回額外的檢測過程之後。如果沒有檢測,我們準備好在螢幕上顯示我們的輸出圖像(第59行和第60行)。
基于OpenCV圖像的人臉檢測
讓我們試一試OpenCV深度學習臉部檢測器。
確定你使用這個部落格文章的“下載下傳”部分下載下傳:
本部落格中使用的源代碼
用于深度學習人臉檢測的CAFFEPROTXT檔案
用于深度學習人臉檢測的CAFE權重檔案
在這個文章中使用的示例圖像
上面這張照片是我第一次去佛羅裡達州外伯城時的照片,那裡的雞可以在城市裡自由漫步。甚至有法律保護雞,我認為這很酷。雖然我是在農村農田長大的,但我還是很驚訝地看到一隻公雞過馬路——這當然産生了很多“雞為什麼要過馬路?”“笑話。
在這裡,你可以看到我的臉被檢測到74.30%的信心,即使我的臉是在一個角度。OpenCV的哈爾瀑布是著名的失蹤臉不在一個“直”的角度,但通過使用OpenCV的深度學習臉部探測器,我們能夠檢測到我的臉。
現在我們來看看另一個例子是如何工作的,這次有三張臉:
再一次,這僅僅顯示了在深度學習OpenCV人臉檢測器比标準HAAR級聯對應于庫的情況下有多好(在準确性方面)。
基于OpenCV和深度學習的視訊和攝像頭人臉檢測
現在我們已經學會了如何将OpenCV的人臉檢測應用到單個圖像上,讓我們也可以将人臉檢測應用到視訊、視訊流和網絡攝像頭。
幸運的是,我們在上一節中使用OpenCV的單個圖像中的大部分代碼可以在這裡重複使用!
打開一個新檔案,将其命名為Debug .FACESSYVIDOV.PY,并插入以下代碼: