OpenCV 人臉識別 源代碼

請直接查看原文 OpenCV 人臉識別 源代碼 https://hotdog29.com/?p=553

在 2019年7月6日 上張貼 由 hotdog發表回覆
opencv 人臉識別

在本教程中,您將學習如何使用 opencv 人臉識別 。爲了構建我們的人臉識別系統,我們首先進行人臉檢測,使用深度學習從每個人臉提取人臉嵌入,在嵌入上訓練人臉識別模型,然後用 OpenCV 識別圖像和視頻流中的人

您當然可以換成自己的面部數據集!您需要做的就是按照我的目錄結構插入您自己的面部

OpenCV人臉識別
在今天的教程中,您將學習如何使用OpenCV庫執行面部識別。

您可能想知道本教程與我幾個月前用dlib進行人臉識別時所寫的教程有何不同?

好吧,請記住,dlib人臉識別帖子依賴於兩個重要的外部庫:

dlib(顯然)
face_recognition(這是一組易於使用的面部識別實用程序,包含dlib)
雖然我們使用OpenCV來促進面部識別,但OpenCV 本身並不負責識別面部。

在今天的教程中,我們將學習如何將深度學習和OpenCV一起應用(除了 scikit-learn 之外沒有其他庫):

檢測面部
計算128-d面部嵌入以量化面部
在嵌入之上訓練支持向量機(SVM)
識別圖像和視頻流中的面部
所有這些任務都將通過OpenCV完成,使我們能夠獲得“純粹的” OpenCV 人臉識別管道。

OpenCV的人臉識別是如何工作的

圖1: OpenCV人臉識別管道概述。關鍵步驟是CNN特徵提取器,可生成128維面部嵌入。(來源)

爲了構建我們的OpenCV人臉識別管道,我們將在兩個關鍵步驟中應用深度學習:

應用面部檢測,其檢測圖像中面部的存在和位置,但不識別它
提取量化圖像中每個面部的128維特徵向量(稱爲“嵌入”)
我已經討論過OpenCV的人臉檢測之前是如何工作的,所以如果你以前沒有檢測到面部,請參考它。

負責實際量化圖像中每個面部的模型來自OpenFace項目,這是一個Python和Torch實現的面部識別和深度學習。該實現來自Schroff等人的2015年CVPR出版物,FaceNet: 用於人臉識別和聚類的統一嵌入。

查看整個FaceNet實現超出了本教程的範圍,但管道的要點可以在上面的圖1中看到。

首先,我們將圖像或視頻幀輸入到人臉識別管道。給定輸入圖像,我們應用面部檢測來檢測圖像中面部的位置。

我們可以選擇計算面部標誌,使我們能夠預處理和對齊面部。

顧名思義,面部對齊是(1)識別面部的幾何結構和(2)基於平移,旋轉和縮放來嘗試獲得面部的規範對齊的過程。

雖然可選,但已經證明面部對齊可以提高某些管道中的面部識別精度。

在我們(可選)應用面對齊和裁剪之後,我們通過深度神經網絡傳遞輸入面:

圖2:深度學習人臉識別模型如何計算人臉嵌入。

FaceNet深度學習模型計算128-d嵌入,量化面部本身。

但網絡如何實際計算面部嵌入?

答案在於培訓過程本身,包括:

輸入數據到網絡
三重損失功能
爲了訓練具有深度學習的人臉識別模型,每個輸入批量數據包括三個圖像:

1, The anchor( 錨 )
2, The positive image
3, The negative image

錨是我們目前的臉,有身份的一個。

第二張圖像是我們的正面圖像 – 此圖像還包含人物A的臉部。

另一方面,負面圖像不具有相同的身份,可能屬於人B,C甚至Y!

關鍵是錨和正圖像都屬於同一個人/面部,而負面圖像不包含相同的面部。

神經網絡計算每個面的128-d嵌入,然後調整網絡的權重(通過三元組丟失函數),這樣:

錨和正像的128-d嵌入更靠近在一起
與此同時,推動負面圖像父親的嵌入
以這種方式,網絡能夠學習量化面部並返回適合於面部識別的高度魯棒且有區別的嵌入。

進而,我們實際上可以重用爲我們自己的應用程序OpenFace模型,而無需顯式地訓練它!

即使我們今天使用的深度學習模型(很可能)從未見過我們即將通過它的面部,模型仍然能夠計算每個面部的嵌入 – 理想情況下,這些面部嵌入將足夠不同的是,我們可以在面部嵌入的基礎上訓練“標準”機器學習分類器(SVM,SGD分類器,隨機森林等),從而獲得我們的OpenCV人臉識別管道。

如果您有興趣瞭解有關三聯體丟失的詳細信息以及如何使用它來訓練面部嵌入模型,請務必參考我之前的博客文章 以及Schroff等人。出版。

我們的人臉識別數據集

圖3:使用OpenCV進行人臉識別的小型示例人臉數據集。

我們今天使用的數據集包含三個人:


特麗莎(我的妻子)
“未知”,用於表示我們不知道並希望標記的人的面孔(這裏我只是從我之前的帖子中使用的電影“ 侏羅紀公園”中採樣- 你可能想要插入自己的“未知” “數據集”
每個類包含總共六個圖像。

如果您正在構建自己的人臉識別數據集,理想情況下,我建議每個人想要識別10-20張圖像 – 請務必參考“缺點,限制以及如何獲得更高的人臉識別準確度”部分博客文章瞭解更多詳情。

項目結構
“下載”代碼後,繼續解壓縮歸檔並導航到目錄。

從那裏,您可以使用 tree 命令在終端中打印目錄結構

現在花點時間仔細閱讀本節,以便熟悉當今項目中的所有文件。

我們的項目在根文件夾中有四個目錄:

dataset / :包含按名稱組織到子文件夾中的面部圖像。
images / :包含三個測試圖像,我們將用它們來驗證模型的運行。
face_detection_model / :包含OpenCV提供的預先訓練的Caffe深度學習模型,用於檢測 面部。該模型 檢測並 定位圖像中的面部。
output / :包含我的輸出pickle文件。如果您正在使用自己的數據集,則也可以將輸出文件存儲在此處。輸出文件包括:
embeddings.pickle :一個序列化的面部嵌入文件。已爲數據集中的每個面計算嵌入並將其存儲在此文件中。
le.pickle :我們的標籤編碼器。包含我們的模型可識別的人員的名稱標籤。
recognizer.pickle :我們的線性支持向量機(SVM)模型。這是一個機器學習模型而不是深度學習模型,它負責實際識別 面部。
讓我們總結一下根目錄中的五個文件:

extract_embeddings .py :我們將在步驟#1中查看此文件,該文件 負責使用深度學習特徵提取器生成描述面部的128-D向量。我們的數據集中的所有面將通過神經網絡傳遞以生成嵌入。
openface_nn4 .small2 .v1 .t7 :Torch深度學習模型,可生成128-D面部嵌入。我們將在步驟#1,#2和#3以及 獎金部分中使用這種深度學習模型 。
train_model .py :我們的線性SVM模型將在步驟#2中通過此腳本進行訓練 。我們將 檢測面部, 提取嵌入,並使 我們的SVM模型適合嵌入數據。
recognize .py :在 步驟#3中 ,我們將 識別圖像中的面部。我們將 檢測面部, 提取嵌入並 查詢 我們的SVM模型以確定 圖像中的人物。我們將在面部周圍繪製框並用名稱註釋每個框。
recognize_video .py :介紹如何 識別誰是就像我們在視頻流的幀 第3步的靜態圖像。
讓我們繼續第一步吧!

步驟#1:從面部數據集中提取嵌入
現在我們瞭解了人臉識別的工作原理並審查了我們的項目結構,讓我們開始構建我們的OpenCV人臉識別管道。

打開 extract_embeddings .py 文件

我們在第2-8行導入我們所需的包 。您需要 安裝OpenCV和 imutils。要安裝OpenCV。可以參考我的教程 pip 安裝 opencv 我的imutils軟件包可以用pip安裝

1 $ pip install --upgrade imutils
接下來,我們處理命令行參數:

– dataset :面部圖像輸入數據集的路徑。
– embeddings :輸出嵌入文件的路徑。我們的腳本將計算我們將序列化到磁盤的面嵌入。
– detector :OpenCV基於Caffe的深度學習人臉探測器的路徑,用於實際定位圖像中的人臉。
– -embedding-model :OpenCV深度學習Torch嵌入模型的路徑。該模型將允許我們 提取128-D面部嵌入向量。
– -confidence :過濾周面檢測的可選閾值。
現在我們已經導入了包和解析的命令行參數,讓我們從磁盤加載面部檢測器和嵌入器

在這裏我們加載面部檢測器和嵌入器:

探測器 :通過26-29號線加載 。我們使用基於Caffe的DL人臉檢測器來定位圖像中的面部。
嵌入器 :裝在 33號線上。該模型基於Torch,負責通過深度學習特徵提取提取面部嵌入。
請注意,我們正在使用相應的 cv2 。dnn 用於加載兩個單獨的模型。在OpenCV 3.3 之前,dnn模塊不能像這樣提供,但我建議您在此博客文章中使用OpenCV 3.4.2或更高版本。

繼續前進,讓我們抓住我們的圖像路徑並執行初始化

基於第37行構建的 imagePaths列表 包含數據集中每個圖像的路徑。我已經通過 imutils function, paths.list_images 簡化了

我們的嵌入和相應的名稱將保存在兩個列表中: knownEmbeddings 和 knownNames (第41和42行)。

我們還將通過名爲total的變量 (第45行)跟蹤我們處理的面數 。

讓我們開始在圖像路徑上循環 – 這個循環將負責從每個圖像中找到的面中提取嵌入

我們開始 在第48行上循環遍歷 imagePath。

首先,我們 從路徑中提取人的 名字(第52行)。要解釋這是如何工作的,請在我的Python shell中運行以下示例

請注意如何使用 imagePath 。拆分 並提供拆分字符(OS路徑分隔符 – 在unix上爲“/”,在Windows上爲“\”),該函數生成一個文件夾/文件名(字符串)列表,它沿着目錄樹向下走。我們抓住倒數第二個索引, 人名 ,在這種情況下是 ‘adrian’ 。

最後,我們通過加載圖像 並將其調整爲已知寬度(第57和58行)來 包裝上面的代碼塊。

讓我們檢測並定位面孔

在 62-64行,我們構造了一個blob。要了解有關此過程的更多信息,請閱讀 深度學習:OpenCV的blobFromImage如何工作。

從那裏我們通過將imageBlob 傳遞到探測器網絡來 檢測圖像中的 面部(第68和69行)。

讓我們處理 檢測

該 檢測 列表包含概率和座標圖像中的定位面。

假設我們至少有一個檢測,我們將進入if語句的主體(第72行)。

我們假設圖像中只有一個面,因此我們以最高置信度提取檢測 並檢查以確保置信度滿足用於濾除弱檢測的最小概率閾值(第75-81行)。

假設我們已達到該閾值,我們提取 面部 ROI並抓取/檢查尺寸以確保面部 ROI足夠大(第84-93行)。

從那裏,我們將利用我們的優勢, 嵌入 CNN和提取臉的嵌入

我們構建另一個blob,這次是從第98行和第99行的面部ROI(不是我們之前做過的整個圖像) 。

隨後,我們將faceBlob傳遞給 嵌入器CNN(第100和101行)。這將生成 描述面部的128-D向量( vec)。我們將利用這些數據通過機器學習識別新面孔。

然後我們分別添加 名稱 並將vec嵌入 到 knownNames 和 knownEmbeddings (第105和106行)。

我們也不能忘記我們設置的跟蹤總 面數的變量 – 我們繼續並在第107行增加值 。

我們繼續這個循環圖像,檢測面部,併爲我們的數據集中的每個圖像提取面部嵌入的過程 。

循環結束時剩下的就是將數據轉儲到磁盤

我們將名稱和嵌入數據添加到字典中,然後 在第110-114行的pickle文件中序列化 數據。

此時我們已準備好通過運行腳本來提取嵌入

從那裏,打開一個終端並執行以下命令來計算OpenCV的面嵌入

在這裏你可以看到我們已經提取了18個面嵌入,每個圖像一個(每個類6個)在我們的輸入面數據集中。

步驟#2:訓練人臉識別模型
此時我們已經爲每張臉提取了128-d嵌入 – 但是我們如何根據這些嵌入實際識別出一個人呢?答案是我們需要在嵌入之上訓練“標準”機器學習模型(例如SVM,k-NN分類器,隨機森林等)。

在我之前的人臉識別教程中, 我們發現了k-NN的修改版本如何用於通過dlib和face_recognition庫創建的128-d嵌入的人臉識別。

今天,我想分享一下我們如何在嵌入之上構建一個更強大的分類器 – 如果您願意,您也可以在基於dlib的人臉識別管道中使用相同的方法。

打開 train_model .py 文件並

在運行此腳本之前,我們需要在我們的環境中安裝scikit-learn,一個機器學習庫。你可以通過pip安裝它

1 $ pip install scikit-learn
我們在第2-5行導入我們的包和模塊 。我們將使用scikit-learn的支持向量機(SVM)實現,這是一種常見的機器學習模型。

從那裏我們解析命令行參數:

– embeddings :序列化嵌入的路徑(我們通過運行之前的 extract_embeddings .py 腳本導出它 )。
– recognizer :這將是我們識別面部的輸出模型。它基於SVM。我們將保存它,以便我們可以在接下來的兩個識別腳本中使用它。
– le :我們的標籤編碼器輸出文件路徑。我們將標籤編碼器序列化爲磁盤,以便我們可以在圖像/視頻人臉識別腳本中使用它和識別器模型。
每個參數都是必需的。

讓我們加載面部嵌入並編碼我們的標籤

在這裏,我們從載入我們的嵌入 從步驟#1的 第19行。我們不會在此模型訓練腳本中生成任何嵌入 – 我們將使用先前生成和序列化的嵌入。

然後我們初始化我們的scikit-learn LabelEncoder 並編碼我們的名稱 標籤 (第23和24行)。

現在是時候訓練我們的SVM模型識別面部了

在 第29行,我們初始化我們的SVM模型,在 第30行,我們 擬合 模型(也稱爲“訓練模型”)。

在這裏,我們使用線性支持向量機(SVM),但如果您願意,可以嘗試使用其他機器學習模型。

訓練模型後,我們將模型和標籤編碼器輸出到磁盤作爲pickle文件。

我們在這個塊中將兩個pickle文件寫入磁盤 – 面部識別器模型和標籤編碼器

現在我們已經完成了train_model .py的編碼 ,讓我們將它應用於我們提取的面嵌入

在這裏,您可以看到我們的SVM已經通過嵌入式培訓,並且(1)SVM本身和(2)標籤編碼已寫入磁盤,使我們能夠將它們應用於輸入圖像和視頻。

第3步:使用OpenCV識別人臉
我們現在準備用OpenCV進行人臉識別!

我們將首先識別本節中圖像中的面部,然後繼續在下一節中識別視頻流中的面部。

打開了 recognize .py 文件在您的項目

我們 在第2-7行導入我們所需的包 。此時,您應該安裝每個軟件包。

我們的六個命令行參數在第10-23行解析 :

– image :輸入圖像的路徑。我們將嘗試識別此圖像中的面部。
– detector :OpenCV深度學習人臉探測器的路徑。我們將使用此模型來 檢測圖像中面部ROI的位置。
– embedding-model :OpenCV深度學習面嵌入模型的路徑。我們將使用此模型從面部ROI中提取128-D面部嵌入 – 我們將數據提供給識別器。
– -recognizer :識別器模型的路徑。我們在步驟#2中訓練了我們的SVM識別器 。這實際上 決定了一張臉是誰。
– le :標籤編碼器的路徑。這包含我們的臉部標籤,如 ‘adrian’ 或 ‘trisha’ 。
– confidence :過濾弱臉檢測的可選閾值。
一定要研究這些命令行參數 – 瞭解兩個深度學習模型和SVM模型之間的區別非常重要。如果您在此腳本中稍後發現自己感到困惑,請參閱此處。

現在我們已經處理了導入和命令行參數,讓我們將三個模型從磁盤加載到內存中

我們在這個塊中加載了三個模型。存在冗餘的風險,我想明確提醒您模型之間的差異:

detector :預先訓練的Caffe DL模型,用於探測人臉在圖像中的位置(第27-30行)。
embedder :預訓練的 Torch DL模型,用於計算我們的128-D面嵌入(第34行)。
recognizer :我們的線性SVM人臉識別模型(第37行)。我們在第2步訓練了這個模型 。
1和2都是 預先訓練的,這意味着它們是由OpenCV按原樣提供給您的。它們被上傳在GitHub上的OpenCV項目中,但爲了方便起見,我將它們包含在今天帖子的 源代碼部分中。我還按照我們將它們用於識別OpenCV面部的順序對模型進行編號。

我們還加載了標籤編碼器,其中包含我們模型可識別的人員的姓名(第38行)。

現在讓我們加載我們的圖像並 檢測面部

在這裏,我們:

將圖像加載到內存中並構造一個blob(第42-49行)。瞭解 Learn about cv2.dnn.blobFromImage here. 。
通過我們的探測器定位圖像中的面 (第53和54行)。
鑑於我們的新 檢測 ,讓我們識別圖像中的面孔。但首先我們需要過濾弱 檢測 並提取 面部 ROI

您將從步驟#1中識別出此塊 。我將在此再解釋一下:

我們遍歷所有的 檢測 在 57行和提取 confidence 在60行。
然後我們將置信度 與命令行args 字典中包含的最小概率檢測閾值 進行比較 ,確保計算出的概率大於最小概率(第63行)。
從那裏,我們提取 面部 ROI(第66-70行)以及確保其空間尺寸足夠大(第74和75行)。
識別面部 ROI 的名稱 只需幾個步驟

首先,我們構造一個faceBlob (來自 面部 ROI)並將其傳遞 給 嵌入器 以生成描述面部的128-D向量(第80-83行)

然後,我們 通過我們的SVM識別器模型(第86行)傳遞 vec,其結果是我們對面對ROI的人的預測 。

我們採用最高概率指數(第87行)並查詢我們的標籤編碼器以找到 名稱 (第89行)。在兩者之間,我在第88行提取概率 。

注意: 您可以通過對概率應用額外的閾值測試來進一步濾除弱臉識別。例如,如果proba < T (其中 T 是您定義的變量),則插入 可以提供額外的過濾層,以確保較少的假陽性面部識別。

現在,讓我們顯示OpenCV人臉識別結果

對於我們在循環中識別的每個面孔(包括“未知”)人:

我們 在第93行構造一個 包含名稱和概率的 文本字符串 。
然後我們在臉部周圍畫一個矩形並將文本放在盒子上方(第94-98行)。
然後我們最終在屏幕上顯示結果,直到按下一個鍵(第101和102行)。

是時候使用OpenCV識別圖像中的面部了!

要將我們的OpenCV面部識別管道應用於我提供的圖像(或您自己的數據集+測試圖像),請確保使用博客文章的“下載”部分下載代碼,訓練模型和示例圖像。

從那裏,打開一個終端並執行以下命令

圖4: OpenCV的人臉識別已經認識到我在侏羅紀世界:墮落王國電影放映。

我的面部預測只有47.15%的信心; 但是,這種信心高於 “未知”類。

讓我們嘗試另一個 opencv 人臉識別 示例

圖5:我的妻子Trisha和我在OpenCV +深度學習面部識別的飛機上拍照。

以下是Trisha和我,準備開始我們的假期!

在最後一個例子中,讓我們看看當我們的模型無法識別實際面部時會發生什麼

圖6:使用OpenCV進行面部識別已確定此人是“未知”。

第三張圖片是一個“未知”人物的例子,實際上是來自American Psycho的 Patrick Bateman – 相信我,這不是一個你想要看到的人出現在你的圖像或視頻流中!

識別視頻流中的面孔
作爲獎勵,我決定在視頻流中加入專門用於OpenCV人臉識別的部分!

實際的管道本身幾乎與識別圖像中的面部相同,只有一些更新,我們將在此過程中進行檢查。

開拓 recognize_video .py 文件,讓我們開始吧

我們的導入與 上面的步驟#3部分相同 ,除了 我們使用 imutils的第2行和第3 行。視頻 模塊。我們將使用 VideoStream 從我們的相機和FPS捕獲幀 以計算每秒幀數統計數據。

除了我們沒有通過命令行將路徑傳遞給靜態圖像之外,命令行參數也是相同的。相反,我們將獲取對我們網絡攝像頭的引用,然後處理視頻。如果需要查看參數,請參閱 步驟3。

我們的三個模型和標籤編碼器在這裏加載

在這裏我們加載面部 檢測器 ,面部 嵌入器 模型,面部 識別器 模型(線性SVM)和標籤編碼器。

如果您對三種型號或標籤編碼器感到困惑,請務必參考 步驟#3。

讓我們初始化我們的視頻流並開始處理幀

我們的 VideoStream 對象已初始化並在第43行啓動 。我們等待相機傳感器在44號線上預熱 。

我們還初始化每秒幀數(第47行)並開始在第50行的幀上循環 。我們 從第52行的網絡攝像頭 抓取一個 框架。

從這裏開始,一切都與第3步相同。我們 調整 幀的大小(L ine 57),然後我們從幀構造一個blob +檢測面的位置(第61-68行)。

現在讓我們處理檢測

正如在上一節中一樣,我們開始循環 檢測 並濾除弱檢測(第71-77行)。然後我們提取 面部 ROI以及確保空間尺寸足夠大以用於後續步驟(第84-89行)。

現在是時候進行OpenCV人臉識別了

在這裏,我們:

構造 faceBlob (第94和95行)並通過深度學習計算面部嵌入(第96和97行)。
在計算概率時識別最可能 的面部名稱(第100-103行)。
在臉部周圍繪製一個邊界框和 人名 +概率(第107-112行)。
我們的 fps 計數器在115行更新 。

讓我們顯示結果並清理

要關閉腳本,我們:

顯示帶註釋的 幀 (第118行)並等待按下“q”鍵,此時我們突破循環(第119-123行)。
停止我們的 fps 計數器並在終端中打印統計數據(第126-128行)。
通過關閉窗口並釋放指針進行清理(第131和132行)。
要在視頻流上執行OpenCV人臉識別管道,請打開終端並執行以下命令

圖7: 使用OpenCV進行視頻中的人臉識別。

正如你所看到的,Trisha和我的臉都被正確識別了!我們的OpenCV人臉識別管道也在我的iMac上獲得了~16 FPS。在我的MacBook Pro上,我獲得了大約14 FPS的吞吐率。

缺點,限制以及如何獲得更高的人臉識別準確度

圖8:所有人臉識別系統都容易出錯。永遠不會有100%準確的人臉識別系統。

不可避免地,你會遇到OpenCV無法正確識別臉部的情況。

你在那些情況下做什麼?

您如何提高您的OpenCV人臉識別準確度?在本節中,我將詳細介紹一些建議的方法,以提高人臉識別管道的準確性

您可能需要更多數據

圖9:大多數人沒有用足夠的數據訓練他們的OpenCV人臉識別模型。(圖片來源)

我的第一個建議可能是最明顯的建議,但值得分享。

在我之前的人臉識別教程中,少數PyImageSearch讀者詢問爲什麼他們的面部識別準確度很低而且面孔被錯誤分類

我得到的印象是大多數讀者已經知道他們需要更多的面部圖像,因爲他們每個人只有一個或兩個示例面孔,但我懷疑他們希望我從我的一些提示和技巧中解決計算機視覺技術問題。

它不像那樣工作。

如果你發現自己的人臉識別準確率低,並且每個人只有一些示例面孔,那麼收集更多數據 – 沒有“計算機視覺技巧”可以幫助你避免數據收集過程。

加大您的數據,您將擁有更好的OpenCV人臉識別渠道。 一般來說,我建議每人至少10-20張面孔。

注意:你可能會想,今天的帖子中每人只收集了6張圖片!”是的,你是對的 – 我這樣做是爲了證明這一點。我們今天在這裏討論的OpenCV人臉識別系統有效,但總是可以改進。有時,較小的數據集會爲您提供所需的結果,並且嘗試使用小型數據集沒有任何問題 – 但是當您未達到所需的準確度時,您將需要收集更多數據。

執行面部對齊

圖9:爲OpenCV進行面部對齊面部識別可以顯着提高面部識別性能。

人臉識別模型OpenCV用於計算來自OpenFace項目的128-d面嵌入。

OpenFace模型在已對齊的面上表現更好。

面部對齊是以下過程:

識別圖像中面部的幾何結構。
嘗試基於平移,旋轉和縮放獲得面部的規範對齊。
從 本節頂部的圖9中可以看出,我有:

檢測到圖像中的面部並提取ROI(基於邊界框座標)。
應用面部標誌檢測 來提取眼睛的座標。
計算每個眼睛的質心以及眼睛之間的中點。
並且基於這些點,應用仿射變換將面部大小調整爲固定大小和尺寸。
如果我們將面對齊應用於數據集中的每個面,則在輸出座標空間中,所有面應該:

以圖像爲中心。
旋轉使得眼睛位於水平線上(即,面部旋轉使得眼睛沿着相同的y座標)。
縮放使得面的大小大致相同。
將面部對齊應用於我們的OpenCV面部識別管道超出了今天教程的範圍,但如果您想使用OpenCV和OpenFace進一步提高面部識別的準確性,我建議您應用面部對齊。

查看我的博客文章, 使用OpenCV和Python進行Face Alignment。

調整你的超參數
我的第二個建議是,您嘗試在您正在使用的任何機器學習模型上調整您的超參數(即,在提取的面部嵌入之上訓練的模型)。

在本教程中,我們使用了線性SVM; 但是,我們沒有調整 C 值,這通常是調整SVM的最重要的值。

該 Ç 值是一個“閾值”參數和控制你多麼想避免在錯誤分類的訓練集中的每個數據點。

較大的C值 將更嚴格,並且更加努力地對每個輸入數據點進行正確分類,即使存在過度擬合的風險。

較小的C值 將更“軟”,允許在訓練數據中進行一些錯誤分類,但理想情況下更好地推廣測試數據。

有趣的是,根據OpenFace GitHub中的一個分類示例,他們實際上建議不調整超參數,因爲根據他們的經驗,他們發現設置 C = 1 在大多數設置中獲得令人滿意的面部識別結果。

儘管如此,如果您的面部識別精度不夠,通過網格搜索或隨機搜索調整超參數可能需要額外的工作量和計算成本。

使用dlib的嵌入模型(但不是它的k-NN用於人臉識別)
根據我使用OpenCV的人臉識別模型和dlib的人臉識別模型的經驗,我發現dlib的面部嵌入更具有辨別力,特別是對於較小的數據集。

此外,我發現dlib的模型較少依賴於:

面部對齊等預處理
在提取的面嵌入之上使用更強大的機器學習模型
如果你看一下我的原始人臉識別教程,你會注意到我們使用了一個簡單的k-NN算法進行人臉識別(通過一個小的修改來拋出距離超過閾值的最近鄰居投票)。

k-NN模型運行得非常好,但正如我們所知,存在更強大的機器學習模型。

爲了進一步提高準確性,你可能想要使用dlib的嵌入模型,然後不是應用k-NN,而是從今天的帖子開始遵循步驟#2,並在面部嵌入上訓練更強大的分類器。

您是否遇到過運行今天Python面部識別腳本的“USAGE”錯
我的錯誤看起來像這樣

或這個:

本教程中有三個單獨的Python腳本,而且,每個腳本都要求您(正確)提供相應的命令行參數。

如果您是命令行參數的新手,那很好,但是 在嘗試運行這些腳本之前, 您需要了解Python,argparse和命令行參數的工作原理!

我會誠實地對你說 – 面部識別是一種先進的技術。命令行參數是一個 非常初學者/新手的 概念。確保你在跑步前走路,否則你會絆倒。現在花些時間來教育自己如何使用命令行參數。

其次,我總是包含您可以複製並粘貼到終端或命令行的確切命令並運行腳本。您可能希望修改命令行參數以適應您自己的圖像或視頻數據,但基本上我已經完成了您的工作。通過了解命令行參數,您可以更新參數以 指向您自己的數據, 而無需修改單行代碼。

對於想要使用像Spyder的或PyCharm一個IDE讀者我的建議是,您將學習如何在命令行中/終端使用命令行參數 第一。在IDE中編程,但使用命令行執行腳本。

我還建議您不要嘗試爲命令行參數配置IDE,直到您首先通過鍵入它們來了解它們的工作方式。實際上,您可能會學會喜歡命令行,因爲它比每次想要更改它們時單擊GUI菜單輸入參數更快。一旦掌握了命令行參數的工作原理,就可以在IDE中單獨配置它

摘要
在今天的博客文章中,我們使用 opencv 人臉識別 .

我們的OpenCV人臉識別管道是使用四階段流程創建的:

創建面部圖像的數據集
爲圖像中的每個面提取面嵌入(同樣,使用OpenCV)
在面部嵌入的頂部訓練模型
利用OpenCV識別圖像和視頻流中的人
當然,如果您遵循上面詳述的項目的目錄結構,您可以交換自己的面部數據集。

如果您需要幫助收集自己的面部數據集,請務必參考有關構建面部識別數據集的這篇文章。

安裝OpenCV。可以參考我的教程 pip 安裝 opencv

代碼下載
請看 這篇文章 https://hotdog29.com/?p=620

我希望你喜歡今天關於OpenCV人臉識別的教程!

文章轉自 Adrian Rosebrock ,OpenCV Face Recognition,PyImageSearch,https://www.pyimagesearch.com/2018/09/24/opencv-face-recognition/,2009年7月6日訪問

相關文章
代碼下載
dlib 使用OpenCV,Python和深度學習進行人臉識別 源代碼
文本檢測 OpenCV EAST文本檢測器 源代碼
YOLO 對象檢測 OpenCV 源代碼
OpenCV教程 ,資源和指南
張貼在技術博客、opencv標籤:opencv、人臉識別、svm、深度學習編輯

請直接查看原文 OpenCV 人臉識別 源代碼 https://hotdog29.com/?p=553

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章