您好,登錄后才能下訂單哦!
這篇文章主要講解了“如何用python創建人臉識別程序”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何用python創建人臉識別程序”吧!
在這個項目中,我們將使用一個名為Facenet的系統來為我們做人臉識別程序。
Facenet是由Florian Schroff、Dmitry Kalenichenko和James Philbin構建的系統。他們也為此寫了一篇論文。
它直接從人臉圖像中學習圖像到歐式空間上點的映射,其中距離直接對應于人臉相似度的度量。一旦創建了這些嵌入,就可以使用這些嵌入作為特征來完成人臉識別和驗證等過程。
Facenet使用卷積層直接從人臉的像素學習。該網絡在一個大數據集上進行訓練,以實現對光照、姿態和其他可變條件的不變性。該系統是在 Labelled Faces in the wild(http://vis-www.cs.umass.edu/lfw/) 數據集上訓練的。這個數據集包含13000多張從網絡上收集的不同人臉的圖片,每個人臉都有一個名字(標簽)。
Facenet從圖像中創建128維嵌入,并將其插入特征空間,這樣,無論成像條件如何,相同身份之間的特征距離要盡可能的小,而不同身份之間的特征距離要盡可能的大。下圖描述了模型體系結構:
模型結構:模型包含一個批處理輸入層、一個深入學習架構和一個L2層。這就產生了人臉嵌入。
該系統采用一種特殊的損失函數,稱為三重損失。三重損失使同一身份的圖像之間的L2距離最小,使不同特征的人臉圖像之間的L2距離最大。
該系統采用三重損失,更適合于人臉驗證。使用三重損失的動機是它鼓勵將一個身份的所有圖像投影到嵌入空間中的一個點上。
三重損失:學習前后
創作者們設計了一種高效的三重選擇機制,可以一次巧妙地選擇三幅圖像。這些圖像有以下三種類型:
錨:一個隨機的人的圖。
正圖:同一個人的另一張圖。
負圖:另一個人的圖。
測量了兩個歐幾里德距離:一個是錨和正圖之間的距離,我們稱之為A;另一個是錨和負圖之間的距離,我們稱之為B。訓練過程旨在減少A并使B最大化,這樣相似的圖像彼此靠近,不同的圖像在嵌入空間中會隔得很遠。
最精彩的部分開始了!我們可以使用Facenet為我們自己選擇的人臉創建嵌入,然后訓練支持向量機(Support Vector Machine)使用這些嵌入并進行分類。讓我們開始建立一個自定義的人臉識別程序吧!
你可以看看這個項目的Github存儲庫,因為它包含了一個自定義數據集和用于在視頻中檢測人臉的腳本。
在開始之前,請確保你的系統上安裝了以下庫:
tensorflow==1.7
scipy
scikit-learn
opencv-python
h6py
matplotlib
Pillow
requests
psutil
在這個項目中,我們將創建一個人臉識別程序,將能夠識別90年代情景喜劇《老友記》的核心人物。如果你想識別一組不同的人臉,那么就用你的圖像來代替。只需確保遵循類似的目錄結構——為要識別的每個身份創建一個文件夾,并將這些文件夾存儲在名為“raw”的文件夾中。
數據集目錄:注意每個角色如何擁有自己對應的文件夾
在每個文件夾里放上人物的照片。請注意,每張圖片只有一張清晰可見的臉。盡管只需要很少的圖像,我還是為每個角色添加了20個圖像。每個文件夾都有相同數量的圖片。你可以從這里下載我創建的《老友記》的數據集。順便說一下,這是“Chandler”文件夾的樣子:
現在已經結束收集數據了。請繼續下載Facenet repo。下載并提取它,并將“Dataset”文件夾放入其中。
該模型的一個問題是它可能會漏掉一些人臉標志,為了解決這個問題,我們必須將數據集中的所有圖像對齊,使眼睛和嘴唇在所有圖片中顯示在同一位置。我們將使用M.T.C.N.N.(多任務C.N.N.)來執行相同的操作,并將所有對齊的圖像存儲在名為processed的文件夾中。
打開終端/命令提示符并導航到Facenet目錄。然后運行align_dataset_mtcn.py以及以下參數。
python src/align_dataset_mtcnn.py \ ./Dataset/Friends/raw \ ./Dataset/Friends/processed \ --image_size 160 \ --margin 32 \ --random_order \ --gpu_memory_fraction 0.25
運行此命令將對齊所有圖像并將其存儲在各自的文件夾中,然后將所有內容存儲在“processed”文件夾中。下圖將向你介紹對齊的工作原理:
所有圖像都被裁剪并與標準的160x160像素圖像對齊。
現在,為了在你自己的圖像上訓練模型,你需要下載預先訓練的模型。
在Facenet根目錄中創建一個名為“Models”的文件夾。下載完成后,將zip文件的內容解壓縮到名為“facenet”的目錄中,并將此文件夾放在“Models”文件夾中。
這個模型是在LFW數據集上訓練的,因此所有的人臉嵌入都存儲在這些文件中。這使我們有機會凍結圖像,并在我們自己的圖像上訓練它。這樣做會將我們提供的所有人臉嵌入到維度空間中。
我們都準備好了!我們有一個預先訓練好的模型,我們的自定義數據集已經對齊并準備好了。現在,是時候訓練模型了!
python src/classifier.py TRAIN \ ./Dataset/Friends/processed \ ./Models/facenet/20180402-114759.pb \ ./Models/Friends/Friends.pkl \ --batch_size 1000
執行上述命令將加載預先訓練的模型并啟動訓練過程。訓練結束后,新圖像的嵌入將導出到/Models/Friends/中。
由于我們使用的是預先訓練的模型和相對較少的圖像數量,因此訓練過程很快就結束了。
為了測試我們的模型,我使用的是來自《老友記》的視頻。你可以用自己的視頻來代替,甚至可以用攝像頭。在本節中,我們將編寫腳本,以便于在視頻源中進行人臉識別。
導航到“src”文件夾并創建一個新的python腳本。我給它起名 faceRec.py。
接下來,我們導入所有必需的庫。
此腳本只接受一個參數,即視頻文件的路徑。如果沒有提到路徑,那么我們將通過網絡攝像頭傳輸視頻。因此,參數的默認值為0。
我們將初始化一些變量。請確保根據文件夾結構更改路徑。
加載自定義分類器。
設置Tensorflow圖,然后加載Facenet模型。使用GPU將加快檢測和識別過程。
設置輸入和輸出張量。
pnet、rnet和onet是M.T.C.N.N.的組成部分,將用于檢測和對齊人臉。
接下來,我們將創建一個集合和一個來跟蹤檢測到的每個角色的集合。
設置視頻捕獲對象。
因此,如果在運行程序時未將VIDEO_PATH作為參數傳遞,則它將假定默認值為0。如果發生這種情況,視頻捕獲對象將從網絡攝像機流式傳輸視頻。
然后逐幀捕獲視頻,并且由檢測人臉模塊在這些幀中檢測人臉。找到的人臉數存儲在faces\u found變量中。
如果找到人臉,那么我們將迭代每個人臉并將邊界框的坐標保存在變量bb中。
然后提取、裁剪、縮放、重塑這些人臉并輸入字典。
我們將使用該模型來預測人臉的身份。我們提取最佳類概率或置信度。這是衡量我們的模型是如何確定預測的身份屬于給定的臉。
最后,我們將在人臉周圍畫一個邊界框,并在邊界框旁邊寫下預測的身份和置信度。如果置信度低于某個閾值,我們將把名字填為未知。
一定要放一個except語句。這將確保成功忽略拋出的任何錯誤。確保放置except語句。這樣做有助于我們忽略錯誤。
except: pass
顯示視頻并在過程結束后關閉視頻顯示窗口。因為每一幀都要經過大量的處理,所以視頻回放可能會很慢。
恭喜你,你的耐心得到了回報!我們已經完成了腳本,準備好了!快速啟動并執行以下命令以啟動人臉識別程序。請確保將要測試的視頻的路徑作為參數傳遞,或將其留空以從網絡攝像機流式傳輸視頻。
python src/faceRec.py --path ./Dataset/Friends/friends.mp
好吧,這個系統還不完善,還有一些缺點。
系統總是試圖將每個人臉都匹配到一個給定的身份中。如果屏幕上出現新人臉,系統將為其分配一個或另一個身份。這個問題可以通過仔細選擇一個閾值來解決。
身份的混淆。在上面的gif中,你可以觀察到Joey和Chandler之間的預測有時是如何波動的。而且,置信度得分也很低。使用更多圖像訓練模型將解決此問題。
無法在一定距離識別人臉(如果距離很遠使得人臉看起來很小)。
感謝各位的閱讀,以上就是“如何用python創建人臉識別程序”的內容了,經過本文的學習后,相信大家對如何用python創建人臉識別程序這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。