天天看點

基于OpenCV和深度學習的人臉檢測

作者:Adrian Rosebrock

基于OpenCV和深度學習的人臉檢測

今天我要和大家分享一個關于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和深度學習的人臉檢測

當使用OpenCV的深度神經網絡子產品與CAFE模型時,您需要兩組檔案:

定義模型架構(即層本身)的原型檔案(s)

包含實際層權重的CalpMeMod檔案

這兩個檔案都需要在使用模型訓練的CAFE深度學習。

但是,您隻會在Github RePo中找到Primtxt檔案。

權重檔案不包括在OpenCV樣本目錄中,它需要更多的挖掘來找到它們。

我在哪裡可以得到更精确的OpenCV人臉檢測器?

為了友善起見,我已經包括:

FrasePrimtxt檔案

和Caffe模型重量檔案

在這篇部落格文章的“下載下傳”部分。

若要跳過下載下傳部分,請單擊此處。

OpenCV深度學習人臉檢測器是如何工作的?

基于OpenCV和深度學習的人臉檢測

OpenCV的深度學習臉部檢測器是基于具有RESNET基礎網絡的單鏡頭檢測器(SSD)架構(不像其他OpenCV SSD,您可能已經看到,它通常使用MobileNet作為基礎網絡)。

對SSDS和ResNet的全面審查超出了這篇部落格文章的範圍,是以如果您有興趣了解更多關于單鏡頭檢測器(包括如何訓練您自己的自定義深度學習對象檢測器),請從PyIGiSeLeCH部落格上的這篇文章開始,然後看一下我的書,深度學習計算機視覺與Python,其中包括深入的讨論和代碼,使您能夠訓練自己的對象探測器。

基于OpenCV和深度學習的人臉檢測

在第一個例子中,我們将學習如何将OpenCV的人臉檢測應用于單輸入圖像。

在下一節中,我們将學習如何修改此代碼,并将OpenCV的人臉檢測應用到視訊、視訊流和網絡攝像頭。

打開一個新檔案,命名為Debug TFACE.PY,并插入以下代碼:

基于OpenCV和深度學習的人臉檢測

在這裡,我們導入我們需要的包(第2-4行)和解析指令行參數(第7行到第16行)。

我們有三個必要的論點:

--圖像:輸入圖像的路徑。

--Pototxt:CAFE原型檔案的路徑。

模型:訓練前的CAFE模型的路徑。

一個可選的參數,即信心,可以覆寫預設門檻值0.5,如果你願意的話。

從那裡開始加載我們的模型并從我們的圖像中建立一個斑點:

基于OpenCV和深度學習的人臉檢測

首先,我們使用我們的-PrimTxt和模型檔案路徑加載模型。我們将模型存儲為Net(第20行)。

然後,我們加載圖像(第24行),提取次元(第25行),并建立一個BLB(第26行和第27行)。

DNN.BulbFoin圖像負責預處理,包括設定BLB尺寸和歸一化。如果您有興趣了解更多關于DNN.BLOBROVIGION的功能,我将在本部落格文章中詳細介紹。

接下來,我們将應用人臉檢測:

基于OpenCV和深度學習的人臉檢測

我們開始在第36行上進行檢測。

從那裡,我們提取信心(線39),并将其與置信門檻值(線43)進行比較。我們執行這個檢查過濾弱檢測。

如果置信度滿足最小門檻值,我們繼續繪制矩形,并在44-56行上檢測機率。

為了實作這一點,我們首先計算包圍盒(線46和47)的(x,y)坐标。

然後,我們建立我們的信心文本字元串(第51行),其中包含檢測的機率。

如果我們的文本将關閉圖像(例如當面部檢測發生在圖像的最上端)時,我們将其向下移動10像素(第52行)。

我們的臉矩形和可信度文本繪制線上53-56的圖像上。

從那裡我們循環傳回額外的檢測過程之後。如果沒有檢測,我們準備好在螢幕上顯示我們的輸出圖像(第59行和第60行)。

基于OpenCV圖像的人臉檢測

讓我們試一試OpenCV深度學習臉部檢測器。

確定你使用這個部落格文章的“下載下傳”部分下載下傳:

本部落格中使用的源代碼

用于深度學習人臉檢測的CAFFEPROTXT檔案

用于深度學習人臉檢測的CAFE權重檔案

在這個文章中使用的示例圖像

基于OpenCV和深度學習的人臉檢測

上面這張照片是我第一次去佛羅裡達州外伯城時的照片,那裡的雞可以在城市裡自由漫步。甚至有法律保護雞,我認為這很酷。雖然我是在農村農田長大的,但我還是很驚訝地看到一隻公雞過馬路——這當然産生了很多“雞為什麼要過馬路?”“笑話。

在這裡,你可以看到我的臉被檢測到74.30%的信心,即使我的臉是在一個角度。OpenCV的哈爾瀑布是著名的失蹤臉不在一個“直”的角度,但通過使用OpenCV的深度學習臉部探測器,我們能夠檢測到我的臉。

現在我們來看看另一個例子是如何工作的,這次有三張臉:

基于OpenCV和深度學習的人臉檢測

再一次,這僅僅顯示了在深度學習OpenCV人臉檢測器比标準HAAR級聯對應于庫的情況下有多好(在準确性方面)。

基于OpenCV和深度學習的視訊和攝像頭人臉檢測

現在我們已經學會了如何将OpenCV的人臉檢測應用到單個圖像上,讓我們也可以将人臉檢測應用到視訊、視訊流和網絡攝像頭。

幸運的是,我們在上一節中使用OpenCV的單個圖像中的大部分代碼可以在這裡重複使用!

打開一個新檔案,将其命名為Debug .FACESSYVIDOV.PY,并插入以下代碼:

基于OpenCV和深度學習的人臉檢測
基于OpenCV和深度學習的人臉檢測
基于OpenCV和深度學習的人臉檢測

繼續閱讀