摘要:我們把要做的事分成三部分創(chuàng)建數(shù)據(jù)集訓(xùn)練識(shí)別在本文中,我們會(huì)嘗試寫(xiě)一個(gè)程序來(lái)生成數(shù)據(jù)集。生成數(shù)據(jù)集我們來(lái)寫(xiě)一個(gè)數(shù)據(jù)集生成腳本。為了不會(huì)將不同的人臉照片弄混,我們需要定一個(gè)命名規(guī)則,用于給照片命名。
在上一篇文章中,我們學(xué)習(xí)了如何安裝配置OpenCV和Python,然后寫(xiě)了些代碼玩玩人臉檢測(cè)。現(xiàn)在我們要進(jìn)行下一步了,即搞一個(gè)人臉識(shí)別程序,就是不只是檢測(cè)還需要識(shí)別到人是誰(shuí)。
來(lái),搞人臉識(shí)別要搞一個(gè)人臉識(shí)別程序,首先我們需要先用提前裁剪好的標(biāo)注好的人臉照片訓(xùn)練一個(gè)識(shí)別器。比如說(shuō),我們的識(shí)別器需要識(shí)別兩個(gè)人,一個(gè)人的id是1,而另一個(gè)的id是2,于是在數(shù)據(jù)集里面,1號(hào)人的所有照片會(huì)有id 1號(hào),2號(hào)人同理。然后我們就會(huì)使用這些數(shù)據(jù)集照片去訓(xùn)練識(shí)別器,再?gòu)囊粋€(gè)視頻中識(shí)別出1號(hào)人。
我們把要做的事分成三部分:
創(chuàng)建數(shù)據(jù)集
訓(xùn)練
識(shí)別
在本文中,我們會(huì)嘗試寫(xiě)一個(gè)程序來(lái)生成數(shù)據(jù)集。
生成數(shù)據(jù)集我們來(lái)寫(xiě)一個(gè)數(shù)據(jù)集生成腳本。
首先打開(kāi)我們的Python環(huán)境,不管是Pycharm等IDE,還是簡(jiǎn)單的記事本都行。需要提前準(zhǔn)備的是在目錄中放好haarcascade_frontalface_default.xml,上一篇也有用到過(guò)這個(gè)XML文件,就是OpenCV自帶的。
接下來(lái)使用cv2獲取攝像頭數(shù)據(jù)以及XML文件:
import cv2 cam = cv2.VideoCapture(0) detector=cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
我們的數(shù)據(jù)集需要先從攝像頭采集一些人臉例子照片,當(dāng)然,只能是同一個(gè)人的。然后程序會(huì)給這些例子照片添加id,并將照片保存在一個(gè)文件夾中,這個(gè)文件夾我們就將它命名為dataSet吧。
來(lái),我們?cè)趐y腳本的同目錄下創(chuàng)建一個(gè)dataSet的文件夾。為了不會(huì)將不同的人臉照片弄混,我們需要定一個(gè)命名規(guī)則,用于給照片命名。
例如,命名規(guī)則為User.[ID].[SampleNumber].jpg。如果是2號(hào)人的第十張照片,我們可以將它命名為User.2.10.jpg。
為什么要定義這樣的格式呢?因?yàn)檫@樣,在加載照片訓(xùn)練的時(shí)候,我們就可以只通過(guò)照片的文件名,就能簡(jiǎn)單地判斷是幾號(hào)用戶的人臉照片。
接下來(lái),我們嘗試用比較簡(jiǎn)單的方法,通過(guò)shell輸入,來(lái)獲取人的id,并且初始化計(jì)算器變量來(lái)存儲(chǔ)人們的例子數(shù)。
Id = raw_input("enter your id: ") sampleNum = 0
然后我們加入一個(gè)主循環(huán),我們會(huì)從視頻流中輸入20個(gè)例子,然后把例子都保存在已經(jīng)創(chuàng)建好的dataSet文件夾。
這是之前寫(xiě)過(guò)的代碼版本,用于人臉檢測(cè):
while True: ret, img = cap.read() gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = detector.detectMultiScale(gray, 1.3, 5) for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2) cv2.imshow("frame", img) if cv2.waitKey(1) & 0xFF == ord("q"): break
現(xiàn)在我們將它改造成數(shù)據(jù)集生成程序:
while True: ret, img = cap.read() gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = detector.detectMultiScale(gray, 1.3, 5) for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2) # 增加例子數(shù) sampleNum = sampleNum + 1 # 把照片保存到數(shù)據(jù)集文件夾 cv2.imwrite("dataSet/user." + str(Id) + "." + str(sampleNum) + ".jpg", gray[y:y + h, x:x + w]) cv2.imshow("frame", img) if cv2.waitKey(1) & 0xFF == ord("q"): break
我們添加了兩行代碼,用以計(jì)算例子數(shù),以及將人臉照片按照我們的命名規(guī)則保存為jpg格式。
其中有一個(gè)值得注意的地方,就是gray[y : y + h, x : x + w]。此處我們是把一張灰度圖片看成一個(gè)二維數(shù)組(或二維矢量),然后使用python中[]截取OpenCV檢測(cè)出來(lái)的人臉區(qū)域。
不過(guò)這樣的代碼會(huì)在一秒內(nèi)快速地生成許多照片,比如說(shuō)20張。我們不想要那么快,我們需要的是更好的素材,比如說(shuō)從不同角度拍攝出來(lái)的照片,這樣的話,要求慢一點(diǎn)。
為了慢一點(diǎn),我們需要提高一下兩次拍攝之間的延遲。同時(shí),我們素材不需要太多,20張就好。
while True: ret, img = cap.read() gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = detector.detectMultiScale(gray, 1.3, 5) for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2) # 增加例子數(shù) sampleNum = sampleNum + 1 # 把照片保存到數(shù)據(jù)集文件夾 cv2.imwrite("dataSet/User." + str(Id) + "." + str(sampleNum) + ".jpg", gray[y:y + h, x:x + w]) # cv2.imshow("frame", img) # 延遲100毫秒 if cv2.waitKey(100) & 0xFF == ord("q"): break # 超過(guò)20張就可以停了 elif sampleNum > 20: break
好,繼續(xù),現(xiàn)在的代碼就會(huì)在兩個(gè)拍攝間延遲100毫秒,100毫秒足夠讓我們?nèi)ヒ苿?dòng)我們?nèi)四樀慕嵌攘耍〞r(shí)間不夠長(zhǎng)就再加)。而且,在拍攝20張后就停止了。
最后記得釋放資源:
cap.release() cv2.destroyAllWindows()
放出完整代碼:
import cv2 detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml") cap = cv2.VideoCapture(0) sampleNum = 0 Id = raw_input("enter your id: ") while True: ret, img = cap.read() gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = detector.detectMultiScale(gray, 1.3, 5) for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2) # incrementing sample number sampleNum = sampleNum + 1 # saving the captured face in the dataset folder cv2.imwrite("dataSet/User." + str(Id) + "." + str(sampleNum) + ".jpg", gray[y:y + h, x:x + w]) # cv2.imshow("frame", img) # wait for 100 miliseconds if cv2.waitKey(100) & 0xFF == ord("q"): break # break if the sample number is morethan 20 elif sampleNum > 20: break cap.release() cv2.destroyAllWindows()生成結(jié)果
如圖,已經(jīng)生成了一堆訓(xùn)練素材了。
先這樣吧
原文,若有錯(cuò)誤之處請(qǐng)指出,更多地關(guān)注煎魚(yú)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/41760.html
摘要:想要能人臉識(shí)別,我們需要訓(xùn)練一個(gè)識(shí)別器處理。現(xiàn)在,是時(shí)候用這個(gè)訓(xùn)練集來(lái)訓(xùn)練一個(gè)人臉識(shí)別器了。同目錄下,創(chuàng)建一個(gè)文件夾,名為,用于存放我們訓(xùn)練后的識(shí)別器。訓(xùn)練差不多完成了,現(xiàn)在我們調(diào)用一下這個(gè)函數(shù),然后將我們的數(shù)據(jù)喂給識(shí)別器去訓(xùn)練吧。 想要能人臉識(shí)別,我們需要訓(xùn)練一個(gè)識(shí)別器處理。訓(xùn)練的話就需要之前已經(jīng)標(biāo)注好的訓(xùn)練集,在前一篇文章中,我們創(chuàng)建了一個(gè)已經(jīng)標(biāo)注好的訓(xùn)練集。現(xiàn)在,是時(shí)候用這個(gè)訓(xùn)練...
摘要:在之前的文章中,我們學(xué)習(xí)了使用數(shù)據(jù)集訓(xùn)練出一個(gè)識(shí)別器。現(xiàn)在,我們將使用這個(gè)訓(xùn)練好的文件去識(shí)別人臉了。我們把程序改成釋放資源記得釋放資源測(cè)試然后在測(cè)試階段,這個(gè)人工智障完美地識(shí)別不出我。 在之前的文章中,我們學(xué)習(xí)了使用數(shù)據(jù)集訓(xùn)練出一個(gè)識(shí)別器。本文中,我們將載入這個(gè)識(shí)別器,然后來(lái)看見(jiàn)怎么識(shí)別人臉。 如果看過(guò)之前的文章,你就已經(jīng)準(zhǔn)備好了一個(gè)識(shí)別器,它就在trainner文件夾和trainne...
摘要:時(shí)間永遠(yuǎn)都過(guò)得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過(guò)去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
摘要:劍橋大學(xué)印度國(guó)家技術(shù)學(xué)院近日聯(lián)合發(fā)布了一篇論文,名為利用空間融合卷積神經(jīng)網(wǎng)絡(luò)通過(guò)面部關(guān)鍵點(diǎn)進(jìn)行偽裝人臉識(shí)別,該論文利用空間融合卷積神經(jīng)網(wǎng)絡(luò)為刑偵過(guò)程的人臉識(shí)別提供了有力的支持,我們來(lái)一窺究竟。 劍橋大學(xué)、印度國(guó)家技術(shù)學(xué)院近日聯(lián)合發(fā)布了一篇論文,名為《利用空間融合卷積神經(jīng)網(wǎng)絡(luò)通過(guò)面部關(guān)鍵點(diǎn)進(jìn)行偽裝人臉識(shí)別Disguised Face Identification (DFI) with Faci...
閱讀 3406·2021-11-24 09:39
閱讀 1797·2021-11-17 09:33
閱讀 3503·2021-10-12 10:12
閱讀 5019·2021-09-22 15:51
閱讀 1112·2019-08-30 13:11
閱讀 3572·2019-08-30 10:59
閱讀 564·2019-08-30 10:48
閱讀 1311·2019-08-26 13:48