日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

opencv 训练人脸对比_【项目案例python与人脸识别】基于OpenCV开源计算机视觉库的人脸识别之python实现...

發(fā)布時(shí)間:2025/3/15 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv 训练人脸对比_【项目案例python与人脸识别】基于OpenCV开源计算机视觉库的人脸识别之python实现... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

“?本項(xiàng)目是一個(gè)基于OpenCV開源庫使用python語言程序?qū)崿F(xiàn)人臉檢測的項(xiàng)目,該項(xiàng)目將從【項(xiàng)目基礎(chǔ)知識(shí)】(即人臉識(shí)別的基本原理)、【項(xiàng)目實(shí)踐】(人臉識(shí)別所需要的具體步驟及其python程序的代碼實(shí)現(xiàn),包括人臉的檢測,數(shù)據(jù)的采集、存儲(chǔ)、訓(xùn)練、識(shí)別)兩個(gè)部分進(jìn)行講解,在講解過程中同時(shí)還提供了很多擴(kuò)展知識(shí)。

作者丨徐恩偉

01

【項(xiàng)目簡介】

????????本項(xiàng)目是一個(gè)基于OpenCV開源庫使用python語言程序?qū)崿F(xiàn)人臉檢測的項(xiàng)目,該項(xiàng)目將從【項(xiàng)目基礎(chǔ)知識(shí)】(即人臉識(shí)別的基本原理)、【項(xiàng)目實(shí)踐擦歐總】(人臉識(shí)別所需要的具體步驟及其python程序的代碼實(shí)現(xiàn),包括人臉的檢測,數(shù)據(jù)的采集、存儲(chǔ)、訓(xùn)練、識(shí)別)兩個(gè)部分進(jìn)行講解,在講解過程中同時(shí)還提供了很多擴(kuò)展知識(shí)。

本項(xiàng)目使用python+ OpenCV 完成,OpenCV是一個(gè)神奇的「開源計(jì)算機(jī)視覺庫」,具備很強(qiáng)的計(jì)算效率,且專門用于實(shí)時(shí)應(yīng)用,因此,它非常適合使用攝像頭的實(shí)時(shí)人臉識(shí)別。

02

【項(xiàng)目基礎(chǔ)知識(shí)】

(一)項(xiàng)目所需環(huán)境

(1)python 3 ?(python主程序)

(2)OpenCV庫(開源的計(jì)算機(jī)視覺庫)

(二)基本原理:OpenCV中的Haar-cascade檢測

(1)何為Haar

Haar是哈爾特征(Haar-like features)的簡稱,是一種用于物體識(shí)別的一種數(shù)字圖像特征。它們因?yàn)榕c哈爾小波轉(zhuǎn)換極為相似而得名,是第一種即時(shí)的人臉檢測運(yùn)算。歷史上,直接使用圖像的強(qiáng)度(就是圖像每一個(gè)像素點(diǎn)的RGB值)使得特征的計(jì)算強(qiáng)度很大。帕帕喬治奧等人提出可以使用基于哈爾小波的特征而不是圖像強(qiáng)度,維奧拉和瓊斯進(jìn)而提出了哈爾特征。哈爾特征使用檢測窗口中指定位置的相鄰矩形,計(jì)算每一個(gè)矩形的像素和并取其差值,然后用這些差值來對圖像的子區(qū)域進(jìn)行分類。

Haar特征包含三種:邊緣特征、線性特征、中心特征和對角線特征。每種分類器都從圖片中提取出對應(yīng)的特征。

比如上圖中,橫的黑道將人臉中較暗的雙眼提取了出來,而豎的白道將人臉中較亮的鼻梁提取了出來。

(2)何為Cascade

如果能找到一個(gè)簡單的方法能夠檢測某個(gè)窗口是不是人臉區(qū)域,如果該窗口不是人臉區(qū)域,那么就只看一眼便直接跳過,也就不用進(jìn)行后續(xù)處理了,這樣就能集中精力判別那些可能是人臉的區(qū)域。為此,有人引入了Cascade 分類器。它不是將6000個(gè)特征都用在一個(gè)窗口,而是將特征分為不同的階段,然后一個(gè)階段一個(gè)階段的應(yīng)用這些特征(通常情況下,前幾個(gè)階段只有很少量的特征)。如果窗口在第一個(gè)階段就檢測失敗了,那么就直接舍棄它,無需考慮剩下的特征。如果檢測通過,則考慮第二階段的特征并繼續(xù)處理。如果所有階段的都通過了,那么這個(gè)窗口就是人臉區(qū)域。作者的檢測器將6000+的特征分為了38個(gè)階段,前五個(gè)階段分別有1,10,25,25,50個(gè)特征(前文圖中提到的識(shí)別眼睛和鼻梁的兩個(gè)特征實(shí)際上是Adaboost中得到的最好的兩個(gè)特征)。根據(jù)作者所述,平均每個(gè)子窗口只需要使用6000+個(gè)特征中的10個(gè)左右。

基于Haar特征的cascade級(jí)聯(lián)分類器是Paul Viola和 Michael Jone在2001年的論文”Rapid Object Detection using a Boosted Cascade of Simple Features”中提出的一種有效的物體檢測方法。這種機(jī)器學(xué)習(xí)方法基于大量正面、負(fù)面圖像訓(xùn)練級(jí)聯(lián)函數(shù),然后用于檢測其他圖像中的對象。這里,我們將用它進(jìn)行人臉識(shí)別。

詳情參見:Cascade Classifier Training

在OpenCV 中包含很多預(yù)訓(xùn)練分類器,即提供了可以直接用于檢測人臉、眼睛、笑容等的相關(guān)算法,以供開發(fā)者調(diào)用,相關(guān)的 XML 文件可從該目錄下載:haarcascades

(3)Cascade級(jí)聯(lián)分類器的訓(xùn)練方法:Adaboost

級(jí)聯(lián)分類器的函數(shù)是通過大量帶人臉和不帶人臉的圖片通過機(jī)器學(xué)習(xí)得到的。對于人臉識(shí)別來說,需要幾萬個(gè)特征,通過機(jī)器學(xué)習(xí)找出人臉分類效果最好、錯(cuò)誤率最小的特征。訓(xùn)練開始時(shí),所有訓(xùn)練集中的圖片具有相同的權(quán)重,對于被分類錯(cuò)誤的圖片,提升權(quán)重,重新計(jì)算出新的錯(cuò)誤率和新的權(quán)重。直到錯(cuò)誤率或迭代次數(shù)達(dá)到要求。這種方法叫做Adaboost。

在Opencv中可以直接調(diào)用級(jí)聯(lián)分類器函數(shù)。

(4)Haar-cascade級(jí)聯(lián)檢測的基本原理:CascadeClassifier

在opencv中通過CascadeClassifier檢測模塊(算法模塊)能夠?qū)崿F(xiàn)基于Haar特征的人臉或人眼等其他部位Cascade級(jí)聯(lián)分類器,這些算法被封裝成xml文件進(jìn)行存放,其中包含相應(yīng)的檢測特征值,特征size大小根據(jù)訓(xùn)練時(shí)的參數(shù)而定,檢測的時(shí)候可以簡單理解為就是將每個(gè)固定size特征(檢測窗口)與輸入圖像的同樣大小區(qū)域比較,如果匹配那么就記錄這個(gè)矩形區(qū)域的位置,然后滑動(dòng)窗口,檢測圖像的另一個(gè)區(qū)域,重復(fù)操作。由于輸入的圖像中特征大小不定,比如在輸入圖像中眼睛是50x50的區(qū)域,而訓(xùn)練時(shí)的是25x25,那么只有當(dāng)輸入圖像縮小到一半的時(shí)候,才能匹配上,所以這里還有一個(gè)逐步縮小圖像,也就是制作圖像金字塔的流程.

由于人臉可能出現(xiàn)在圖像的任何位置,在檢測時(shí)用固定大小的窗口對圖像從上到下、從左到右掃描,判斷窗口里的子圖像是否為人臉,這稱為滑動(dòng)窗口技術(shù)(sliding window)。為了檢測不同大小的人臉,還需要對圖像進(jìn)行放大或者縮小構(gòu)造圖像金字塔,對每張縮放后的圖像都用上面的方法進(jìn)行掃描。

????????以512x512大小的圖像為例,假設(shè)分類器窗口為24x24,滑動(dòng)窗口的步長為1,則總共需要掃描的窗口數(shù)為:

即要檢測一張圖片需要掃描大于120萬個(gè)窗口,這里我們不得不借助計(jì)算機(jī)編程的程序來實(shí)現(xiàn)。

CascadeClassifier.detectMultiScale的調(diào)用方法為如下,只需要我們掌握一些調(diào)用的參數(shù)意義即可。

class CascadeClassifier: ? ?detectMultiScale( const Mat& image, vector<Rect>& objects,double scaleFactor, int minNeighbors,int flags, Size minObjectSize, Size maxObjectSize) ? { ? ? ? ?vector<int> fakeLevels; ? ? ? ?vector<double> fakeWeights; ? ? ? ?detectMultiScale( image, objects, fakeLevels, fakeWeights, scaleFactor, ? ? ? ? ? ?minNeighbors, flags, minObjectSize, maxObjectSize, false ); ? }

參數(shù)意思:\1. const Mat& image:輸入圖像\2. vector& objects:輸出的矩形向量組\3. double scaleFactor=1.1:這個(gè)是每次縮小圖像的比例,默認(rèn)是1.1\4. minNeighbors=3:匹配成功所需要的周圍矩形框的數(shù)目,每一個(gè)特征匹配到的區(qū)域都是一個(gè)矩形框,只有多個(gè)矩形框同時(shí)存在的時(shí)候,才認(rèn)為是匹配成功,比如人臉,這個(gè)默認(rèn)值是3。\5. flags=0:可以取如下這些值: CASCADE_DO_CANNY_PRUNING=1, 利用canny邊緣檢測來排除一些邊緣很少或者很多的圖像區(qū)域 CASCADE_SCALE_IMAGE=2, 正常比例檢測 CASCADE_FIND_BIGGEST_OBJECT=4, 只檢測最大的物體 CASCADE_DO_ROUGH_SEARCH=8 初略的檢測\6. minObjectSize maxObjectSize:匹配物體的大小范圍

(5)人臉如何識(shí)別

如果我們已經(jīng)檢測出了圖片中的人臉,那么如何鑒別人臉呢?

為了實(shí)現(xiàn)對人臉的識(shí)別我們將使用一種面部特征點(diǎn)估計(jì)(face landmark estimation)的算法。其實(shí)還有很多算法都可以做到,但我們這次使用的是由瓦希德·卡奇米(Vahid Kazemi)和約瑟菲娜·沙利文(Josephine Sullivan)在 2014 年發(fā)明的方法。這一算法的基本思路是找到68個(gè)人臉上普遍存在的點(diǎn)(稱為特征點(diǎn), landmark)。

  • 下巴輪廓17個(gè)點(diǎn) [0-16]

  • 左眉毛5個(gè)點(diǎn) [17-21]

  • 右眉毛5個(gè)點(diǎn) [22-26]

  • 鼻梁4個(gè)點(diǎn) [27-30]

  • 鼻尖5個(gè)點(diǎn) [31-35]

  • 左眼6個(gè)點(diǎn) [36-41]

  • 右眼6個(gè)點(diǎn) [42-47]

  • 外嘴唇12個(gè)點(diǎn) [48-59]

  • 內(nèi)嘴唇8個(gè)點(diǎn) [60-67]

    有了這68個(gè)點(diǎn),我們就可以輕松的將人臉進(jìn)行準(zhǔn)確的識(shí)別,但是如何確定不同人的臉之間有什么不同呢?

????????最簡單的方法就是把我們第二步中檢測的未知人臉與我們已知的人臉作對比,當(dāng)我們發(fā)現(xiàn)未知的面孔與一個(gè)以前標(biāo)注過的面孔看起來相似的時(shí)候,就可以認(rèn)定他們是同一個(gè)人。

????????我們?nèi)祟惸芡ㄟ^眼睛大小,頭發(fā)顏色等等信息輕松的分辨不同的兩張人臉,可是電腦怎么分辨呢?我們得量化它們,讓計(jì)算機(jī)通過不同的人臉特征數(shù)值進(jìn)行自動(dòng)識(shí)別。實(shí)際上最準(zhǔn)確的方法是讓計(jì)算機(jī)自己找出他要收集的測量值,深度學(xué)習(xí)比人類更懂得哪些面部測量值比較重要。所以,解決方案是訓(xùn)練一個(gè)深度卷積神經(jīng)網(wǎng)絡(luò),訓(xùn)練讓它為臉部生成128個(gè)測量值。

每次訓(xùn)練要觀察三個(gè)不同的臉部圖像:

  • 加載一張已知的人的面部訓(xùn)練圖像

  • 加載同一個(gè)人的另一張照片

  • 加載另外一個(gè)人的照片

  • ????????然后,算法查看它自己為這三個(gè)圖片生成的測量值。再然后,稍微調(diào)整神經(jīng)網(wǎng)絡(luò),以確保第一張和第二張生成的測量值接近,而第二張和第三張生成的測量值略有不同。我們要不斷的調(diào)整樣本,重復(fù)以上步驟百萬次,這確實(shí)是個(gè)巨大的挑戰(zhàn),但是一旦訓(xùn)練完成,它能攻輕松的找出人臉。

    ????????慶幸的是 OpenFace 上面的大神已經(jīng)做完了這些,并且他們發(fā)布了幾個(gè)訓(xùn)練過可以直接使用的網(wǎng)絡(luò),我們可以不用部署復(fù)雜的機(jī)器學(xué)習(xí),開箱即用,直接在python中調(diào)用即可,感謝開源精神。

    這128個(gè)測量值是什么鬼?其實(shí)我們不用關(guān)心,這對我們也不重要。我們關(guān)心的是,當(dāng)看到同一個(gè)人的兩張不同照片時(shí),我們的網(wǎng)絡(luò)需要能得到幾乎相同的數(shù)值。

    如果對上述的原理看不懂也沒有關(guān)系,因?yàn)榛谏鲜鲈韺?shí)現(xiàn)的操作代碼別人已經(jīng)寫好了,我們在python中直接調(diào)用即可而不必過于關(guān)注其實(shí)現(xiàn)過程,所以可以直接進(jìn)行下述的編程操作,在編寫代碼的過程中進(jìn)行理解人臉識(shí)別的邏輯關(guān)系。

    03

    【項(xiàng)目實(shí)踐】

    以下所有步驟我均在Windows 電腦上進(jìn)行了測試、運(yùn)行很好。要?jiǎng)?chuàng)建完整的人臉識(shí)別項(xiàng)目,在安裝好必要的環(huán)境與擴(kuò)展庫后,人臉的識(shí)別主要包括人臉的檢測、人臉數(shù)據(jù)的收集并存儲(chǔ)、對人臉數(shù)據(jù)的訓(xùn)練模型、人臉識(shí)別對比四個(gè)階段。

    一、安裝擴(kuò)展庫

    本文采用pip進(jìn)行安裝,因此需要成功配置好python的安裝環(huán)境。

    (1)opencv-python 的安裝,輸入:pip install opencv-python。

    注:安裝openCV,不是pip install OpenCv,而是 pip install OpenCv-python

    numpy與OpenCV綁定安裝,無需自己輸入命令。

    (2) pillow的安裝,輸入:pip install pillow

    注:pillow為圖像處理包。

    (3) contrib的安裝,輸入:pip instal opencv-contrib-python

    ? ? ? ?注:contrib是用于訓(xùn)練自己的人臉模型的一個(gè)OpenCV擴(kuò)展包

    ????????下圖為三個(gè)包的安裝過程截圖,由于我之前已經(jīng)安裝過,會(huì)顯示包已存在。首次安裝會(huì)有進(jìn)度條,成功后會(huì)有Successfully字樣。

    二、人臉檢測

    ????????人臉識(shí)別的最基礎(chǔ)任務(wù)是人臉檢測,你必須首先判斷是否有人臉才能在未來與捕捉到的新人臉對比時(shí)進(jìn)而識(shí)別它。

    ????????下面,我們就開始用 OpenCV 創(chuàng)建人臉檢測器吧!

    """功能:主要用于檢測是否是人臉,注意是檢測人臉而不是識(shí)別人臉版本:1.0"""import cv2def main(): ? ?# 導(dǎo)入人臉級(jí)聯(lián)分類器引擎,'.xml'文件里包含訓(xùn)練出來的人臉特征 ? ?faceCascade = cv2.CascadeClassifier("enginer\haarcascade_frontalface_default.xml") ? ?# 開啟攝像頭,獲取圖像 ? ?cap = cv2.VideoCapture(0) ? ?#增加循環(huán),使得攝像頭獲取的畫面為實(shí)時(shí)畫面而非靜態(tài)的圖像 ? ?while True: ? ? ? ?# 讀取攝像頭中的圖像,ok為是否讀取成功的判斷參數(shù),True為成功讀取,否則為False ? ? ? ?sucess, img = cap.read() ? ? ? ?if sucess is True: ? ? ? ? ? ?# 如果攝像頭成功讀取圖像,則將圖像轉(zhuǎn)換成灰度圖像 ? ? ? ? ? ?gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ? ? ? ?else: ? ? ? ? ? ?print("攝像頭沒有讀取到任何圖像") ? ? ? ? ? ?break ? ? ? ?# 用人臉級(jí)聯(lián)分類器引擎進(jìn)行人臉識(shí)別,返回的faces為人臉坐標(biāo)列表(x,y,w,h) ? ? ? ?faces = faceCascade.detectMultiScale( ? ? ? ?gray, ? ? ? ?scaleFactor=1.2, ? ? ? ?minNeighbors=5, ? ? ? ?minSize=(32, 32) ? ? ? ) ? ? ? ?# 對每一張人臉都做畫矩形標(biāo)出 ? ? ? ?for (x, y, w, h) in faces: ? ? ? ? ? ?# 畫出人臉框,藍(lán)色(BGR色彩體系),畫筆寬度為2 ? ? ? ? ? ?cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) ? ? ? ?cv2.imshow("Video", img) ? ? ? ?k = cv2.waitKey(30) ?# cv2.waitKey(delay) delay 毫秒是屏幕刷新的時(shí)間 ? ? ? ?if k == 27: ? ?# press 'ESC' to quit 在ASCII碼中esc按鍵為27,因此27對應(yīng)的就是ESC退出鍵 ? ? ? ? ? ?break ? ?cap.release() ? ?cv2.destroyAllWindows()if __name__ == '__main__': ? ?main()

    這行代碼可以加載「分類器」(在C盤的python安裝目錄下,也可以將其拷貝到項(xiàng)目中直接調(diào)用)。然后,我們在在循環(huán)內(nèi)部調(diào)用攝像頭,并以 grayscale 模式加載我們的輸入視頻。現(xiàn)在,我們必須調(diào)用分類器函數(shù),向其輸入一些非常重要的參數(shù),如比例因子、鄰近數(shù)和人臉檢測的最小尺寸。

    faces = faceCascade.detectMultiScale( ? ?gray, ? ?scaleFactor=1.2, ? ?minNeighbors=5, ? ?minSize=(32, 32) ? )

    其中:

    gray 表示輸入 grayscale 圖像。

    scaleFactor 表示每個(gè)圖像縮減的比例大小。

    minNeighbors 表示每個(gè)備選矩形框具備的鄰近數(shù)量。數(shù)字越大,假正類越少。

    minSize 表示人臉識(shí)別的最小矩形大小。

    該函數(shù)將檢測圖像中的人臉。接下來,我們必須「標(biāo)記」圖像中的人臉,比如,用藍(lán)色矩形。使用下列代碼完成這一步:

    for (x, y, w, h) in faces: ? ? ? ?cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)

    如果已經(jīng)標(biāo)記好人臉,則函數(shù)將檢測到的人臉的位置返回為一個(gè)矩形,左上角 (x,y),w 表示寬度,h 表示高度 ==> (x,y,w,h)。詳見下圖。

    得到這些位置信息后,我們可以為人臉創(chuàng)建一個(gè)「感興趣區(qū)域」(繪制矩形),用 imshow() 函數(shù)呈現(xiàn)結(jié)果。

    三、人臉數(shù)據(jù)的收集

    現(xiàn)在,我們需要?jiǎng)?chuàng)建一個(gè)簡單的數(shù)據(jù)集,該數(shù)據(jù)集將儲(chǔ)存每張人臉的 ID 和一組用于人臉檢測的灰度圖。

    開始之前,需要做以下準(zhǔn)備:

    1.在運(yùn)行該程序前,請先創(chuàng)建一個(gè)Facedata文件夾并和你的程序放在同一個(gè)根目錄下。

    2.程序運(yùn)行時(shí)間可能會(huì)比較長,可能會(huì)有幾分鐘,如果嫌長,可以將 ?#得到100個(gè)樣本后退出攝像 ? 這個(gè)注釋前的100,改為10。

    3.如果覺得收集的實(shí)踐比較長,實(shí)在等不及,可按esc退出,但可能會(huì)導(dǎo)致數(shù)據(jù)不夠模型精度下降。

    4.可以嘗試變換不同的人臉姿勢,如側(cè)臉、笑臉等等,增強(qiáng)輸入人臉信息的準(zhǔn)確性

    """功能:收集人臉的數(shù)據(jù)信息,存儲(chǔ)知道文件夾中版本1.0"""import cv2import json#定義函數(shù),存儲(chǔ)用戶的信息,并將其以json的格式寫入user_info.txtdef store_user_info(user_info): ? ?js = json.dumps(user_info) ? ?with open("user_info.txt", 'w',) as f: ? ? ? ?f.write(js)def main(): ? ?# 導(dǎo)入人臉級(jí)聯(lián)分類器引擎,'.xml'文件里包含訓(xùn)練出來的人臉特征 ? ?face_detector = cv2.CascadeClassifier("enginer\haarcascade_frontalface_default.xml") ? ?# 調(diào)用筆記本內(nèi)置攝像頭,所以參數(shù)為0,如果有其他的攝像頭可以調(diào)整參數(shù)為1,2 ? ?cap = cv2.VideoCapture(0) ? ?# 獲取當(dāng)前人臉的學(xué)號(hào)、姓名信息,并將其保存在user_info的字典中 ? ?user_info =dict() ? ?face_id = input("請輸入你的學(xué)號(hào)(ID):") ? ?face_name= input("請輸入你的姓名:") ? ?user_info[face_id]=face_name ? ?store_user_info(user_info) ? ?print("初始化攝像機(jī),請注意看攝像頭,開始獲取頭像信息,請耐心等待... ...") ? ?count = 0 ? ?while True: ? ? ? ?# 從攝像頭讀取圖片 ? ? ? ?sucess, img = cap.read() ? ? ? ?if sucess is True: ? ? ? ? ? ?# 如果攝像頭成功讀取圖像,則將圖像轉(zhuǎn)換成灰度圖像 ? ? ? ? ? ?gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ? ? ? ?else: ? ? ? ? ? ?break ? ? ? ?# 用人臉級(jí)聯(lián)分類器引擎進(jìn)行人臉識(shí)別,返回的faces為人臉坐標(biāo)列表(x,y,w,h) ? ? ? ?faces = face_detector.detectMultiScale(gray, 1.3, 5) ? ? ? ?# 如果檢測出人臉,則對每一張人臉都做畫矩形,并將其保存到同目錄的Facedata文件夾中 ? ? ? ?for (x, y, w, h) in faces: ? ? ? ? ? ?cv2.rectangle(img, (x, y), (x+w, y+w), (255, 0, 0)) ? ? ? ? ? ?count += 1 ? ? ? ? ? ?# 保存圖像 ? ? ? ? ? ?cv2.imwrite("Facedata/User." + str(face_id) + '.'+ str(face_name) + '.'+ str(count) +'.jpg', gray[y: y + h, x: x + w]) ? ? ? ?cv2.imshow('image', img) ? ? ? ?# 保持畫面的持續(xù) ? ? ? ?k = cv2.waitKey(30) ? ? ? ?if k == 27: ? # 通過esc鍵退出攝像 ? ? ? ? ? ?break ? ? ? ?elif count >= 100: ?# 得到100個(gè)樣本后退出攝像 ? ? ? ? ? ?break ? ?# 關(guān)閉攝像頭 ? ?cap.release() ? ?cv2.destroyAllWindows()if __name__ == '__main__': ? ?main()
    四、收集人臉信息的訓(xùn)練模型

    在訓(xùn)練模型階段,我們需要從存儲(chǔ)的數(shù)據(jù)集中抽取所有的用戶數(shù)據(jù),并訓(xùn)練 OpenCV 識(shí)別器對其繼續(xù)識(shí)別,這一過程可由特定的 OpenCV 函數(shù)直接完成,將識(shí)別結(jié)果保存在程序根目錄下的face_trainer目錄中,格式為.yml 文件。

    import numpy as npfrom PIL import Imageimport osimport cv2# 根據(jù)圖像存儲(chǔ)的文件路徑,獲取當(dāng)前圖像,然后對其進(jìn)行一一的訓(xùn)練def getImagesAndLabels(path): ? ?detector = cv2.CascadeClassifier("enginer\haarcascade_frontalface_default.xml") ? ?imagePaths = [os.path.join(path, f) for f in os.listdir(path)] ? ?faceSamples = [] ? ?ids = [] ? ?for imagePath in imagePaths: ? ? ? ?PIL_img = Image.open(imagePath).convert('L') ? ? ? ?img_numpy = np.array(PIL_img, 'uint8') ? ? ? ?id = int(os.path.split(imagePath)[-1].split(".")[1]) ? #獲取學(xué)號(hào) ? ? ? ?id_num = int(os.path.split(imagePath)[-1].split(".")[3]) ?#獲取當(dāng)前學(xué)號(hào)的第幾張圖像 ? ? ? ?print("正在訓(xùn)練ID為{}號(hào)的第{}張人臉信息....".format(id,id_num)) ? ? ? ?faces = detector.detectMultiScale(img_numpy) ? ? ? ?for (x, y, w, h) in faces: ? ? ? ? ? ?faceSamples.append(img_numpy[y:y + h, x: x + w]) ? ? ? ? ? ?ids.append(id) ? ?return faceSamples,idsdef main(): ? ?# 獲取人臉數(shù)據(jù)路徑 ? ?path = 'Facedata' ? ?recognizer = cv2.face.LBPHFaceRecognizer_create() ? ?print("開始訓(xùn)練數(shù)據(jù)模型,這可能需要一些時(shí)間,請耐心等待......") ? ?faces, ids = getImagesAndLabels(path) ? ?recognizer.train(faces, np.array(ids)) ? ?recognizer.write(r'face_trainer\trainer.yml') ? ?print("總共存在{0}個(gè)人. 已完成識(shí)別".format(len(np.unique(ids))))if __name__ == '__main__': ? ?main()
    五、人臉識(shí)別

    我們將通過攝像頭捕捉一個(gè)新人臉,如果這個(gè)人的面孔之前被捕捉和訓(xùn)練過,我們的識(shí)別器將會(huì)返回其預(yù)測的 id 和索引,并展示識(shí)別器對于該判斷有多大的信心。

    import cv2import json#定義函數(shù)獲取用戶的信息def get_user_info(): ? ?user_info = dict() ? ?with open("user_info.txt", 'r', ) as f: ? ? ? ?n = len(f.readlines()) ? ?with open("user_info.txt", 'r', ) as f: ? ? ? ?for i in range(n): ? ? ? ? ? ?line = f.readline() ? ? ? ? ? ?dic = json.loads(line) ? ? ? ? ? ?user_info.update(dic) ? ?return user_infodef main(): ? ?recognizer = cv2.face.LBPHFaceRecognizer_create() ? ?recognizer.read('face_trainer/trainer.yml') ? ?faceCascade = cv2.CascadeClassifier("enginer\haarcascade_frontalface_default.xml") ? ?font = cv2.FONT_HERSHEY_SIMPLEX ? ?# 名字是一個(gè)列表,與訓(xùn)練集中人的ID相對應(yīng),如"xuenwei":id=1,等等 ? ?#names = ['None','1xuenwei', '2Bob','3'] ? ?user_info=get_user_info() ? ?#初始化并開始使用攝像頭獲取圖像 ? ?cam = cv2.VideoCapture(0) ? ?while True: ? ? ? ?ret, img = cam.read() ? ? ? ?gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ? ? ? ?faces = faceCascade.detectMultiScale( ? ? ? ?gray, ? ? ? ?scaleFactor=1.2, ? ? ? ?minNeighbors=5, ? ? ? ?minSize=(32, 32) ? ? ? ) ? ? ? ?for (x, y, w, h) in faces: ? ? ? ? ? ?cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) ? ? ? ? ? ?idnum, confidence = recognizer.predict(gray[y:y+h, x:x+w]) ? ? ? ? ? ?user_id=str(idnum) ? ? ? ? ? ?if user_id in list(user_info.keys()): ? ? ? ? ? ? ? ?if confidence < 100: ? ? ? ? ? ? ? ? ? ?idname = user_info[user_id] ? ? ? ? ? ? ? ? ? ?confidence = "{0}%".format(round(100 - confidence)) ? ? ? ? ? ? ? ?else: ? ? ? ? ? ? ? ? ? ?idname = "unknown" ? ? ? ? ? ? ? ? ? ?confidence = "{0}%".format(round(100 - confidence)) ? ? ? ? ? ?else: ? ? ? ? ? ? ? ?idname = "Not exist this people!" ? ? ? ? ? ? ? ?confidence=0 ? ? ? ? ? ?cv2.putText(img, str(idname), (x+5, y-5), font, 1, (0, 0, 255), 1) ? ? ? ? ? ?cv2.putText(img, str(confidence), (x+5, y+h-5), font, 1, (0, 0, 0), 1) ? ? ? ?cv2.imshow('camera', img) ? ? ? ?k = cv2.waitKey(10) ? ? ? ?if k == 27: ? ? ? ? ? ?break ? ?cam.release() ? ?cv2.destroyAllWindows()if __name__ == '__main__': ? ?main()
    六、結(jié)語

    人臉識(shí)別是人工智能應(yīng)用的一個(gè)方面,現(xiàn)今已經(jīng)被應(yīng)用在很多方面,比如:手機(jī)面部解鎖、火車站進(jìn)站檢票、超市掃臉付款等。本項(xiàng)目希望有助于各位讀者實(shí)現(xiàn)自己的人臉識(shí)別應(yīng)用。

    (本教程參考‘’用樹莓派實(shí)現(xiàn)實(shí)時(shí)的人臉檢測‘’以及網(wǎng)頁資料。)

    文章來源:筆記整理

    微信編輯:徐恩偉

    【實(shí)用軟件推薦---混合式學(xué)習(xí)環(huán)境下實(shí)用教育技術(shù)與工具】

    【教學(xué)】作為教師,我們最應(yīng)該教給學(xué)生什么?

    【13】項(xiàng)目案例—Python爬取鏈家網(wǎng)租房信息

    【00】Python編程語言機(jī)房教學(xué)環(huán)境 ?安裝指南

    【12】Python與MySQL數(shù)據(jù)庫的交互 筆記

    【人工智能教學(xué)】人工智能將使中國教育僅存的優(yōu)勢蕩然無存

    ???需要您的轉(zhuǎn)發(fā)和閱讀哦

    總結(jié)

    以上是生活随笔為你收集整理的opencv 训练人脸对比_【项目案例python与人脸识别】基于OpenCV开源计算机视觉库的人脸识别之python实现...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。