摘要:我們把要做的事分成三部分創建數據集訓練識別在本文中,我們會嘗試寫一個程序來生成數據集。生成數據集我們來寫一個數據集生成腳本。為了不會將不同的人臉照片弄混,我們需要定一個命名規則,用于給照片命名。
在上一篇文章中,我們學習了如何安裝配置OpenCV和Python,然后寫了些代碼玩玩人臉檢測?,F在我們要進行下一步了,即搞一個人臉識別程序,就是不只是檢測還需要識別到人是誰。
來,搞人臉識別要搞一個人臉識別程序,首先我們需要先用提前裁剪好的標注好的人臉照片訓練一個識別器。比如說,我們的識別器需要識別兩個人,一個人的id是1,而另一個的id是2,于是在數據集里面,1號人的所有照片會有id 1號,2號人同理。然后我們就會使用這些數據集照片去訓練識別器,再從一個視頻中識別出1號人。
我們把要做的事分成三部分:
創建數據集
訓練
識別
在本文中,我們會嘗試寫一個程序來生成數據集。
生成數據集我們來寫一個數據集生成腳本。
首先打開我們的Python環境,不管是Pycharm等IDE,還是簡單的記事本都行。需要提前準備的是在目錄中放好haarcascade_frontalface_default.xml,上一篇也有用到過這個XML文件,就是OpenCV自帶的。
接下來使用cv2獲取攝像頭數據以及XML文件:
import cv2 cam = cv2.VideoCapture(0) detector=cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
我們的數據集需要先從攝像頭采集一些人臉例子照片,當然,只能是同一個人的。然后程序會給這些例子照片添加id,并將照片保存在一個文件夾中,這個文件夾我們就將它命名為dataSet吧。
來,我們在py腳本的同目錄下創建一個dataSet的文件夾。為了不會將不同的人臉照片弄混,我們需要定一個命名規則,用于給照片命名。
例如,命名規則為User.[ID].[SampleNumber].jpg。如果是2號人的第十張照片,我們可以將它命名為User.2.10.jpg。
為什么要定義這樣的格式呢?因為這樣,在加載照片訓練的時候,我們就可以只通過照片的文件名,就能簡單地判斷是幾號用戶的人臉照片。
接下來,我們嘗試用比較簡單的方法,通過shell輸入,來獲取人的id,并且初始化計算器變量來存儲人們的例子數。
Id = raw_input("enter your id: ") sampleNum = 0
然后我們加入一個主循環,我們會從視頻流中輸入20個例子,然后把例子都保存在已經創建好的dataSet文件夾。
這是之前寫過的代碼版本,用于人臉檢測:
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
現在我們將它改造成數據集生成程序:
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) # 增加例子數 sampleNum = sampleNum + 1 # 把照片保存到數據集文件夾 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
我們添加了兩行代碼,用以計算例子數,以及將人臉照片按照我們的命名規則保存為jpg格式。
其中有一個值得注意的地方,就是gray[y : y + h, x : x + w]。此處我們是把一張灰度圖片看成一個二維數組(或二維矢量),然后使用python中[]截取OpenCV檢測出來的人臉區域。
不過這樣的代碼會在一秒內快速地生成許多照片,比如說20張。我們不想要那么快,我們需要的是更好的素材,比如說從不同角度拍攝出來的照片,這樣的話,要求慢一點。
為了慢一點,我們需要提高一下兩次拍攝之間的延遲。同時,我們素材不需要太多,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) # 增加例子數 sampleNum = sampleNum + 1 # 把照片保存到數據集文件夾 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 # 超過20張就可以停了 elif sampleNum > 20: break
好,繼續,現在的代碼就會在兩個拍攝間延遲100毫秒,100毫秒足夠讓我們去移動我們人臉的角度了(時間不夠長就再加)。而且,在拍攝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()生成結果
如圖,已經生成了一堆訓練素材了。
先這樣吧
原文,若有錯誤之處請指出,更多地關注煎魚。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/41760.html
摘要:想要能人臉識別,我們需要訓練一個識別器處理?,F在,是時候用這個訓練集來訓練一個人臉識別器了。同目錄下,創建一個文件夾,名為,用于存放我們訓練后的識別器。訓練差不多完成了,現在我們調用一下這個函數,然后將我們的數據喂給識別器去訓練吧。 想要能人臉識別,我們需要訓練一個識別器處理。訓練的話就需要之前已經標注好的訓練集,在前一篇文章中,我們創建了一個已經標注好的訓練集。現在,是時候用這個訓練...
摘要:在之前的文章中,我們學習了使用數據集訓練出一個識別器?,F在,我們將使用這個訓練好的文件去識別人臉了。我們把程序改成釋放資源記得釋放資源測試然后在測試階段,這個人工智障完美地識別不出我。 在之前的文章中,我們學習了使用數據集訓練出一個識別器。本文中,我們將載入這個識別器,然后來看見怎么識別人臉。 如果看過之前的文章,你就已經準備好了一個識別器,它就在trainner文件夾和trainne...
摘要:時間永遠都過得那么快,一晃從年注冊,到現在已經過去了年那些被我藏在收藏夾吃灰的文章,已經太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...
摘要:劍橋大學印度國家技術學院近日聯合發布了一篇論文,名為利用空間融合卷積神經網絡通過面部關鍵點進行偽裝人臉識別,該論文利用空間融合卷積神經網絡為刑偵過程的人臉識別提供了有力的支持,我們來一窺究竟。 劍橋大學、印度國家技術學院近日聯合發布了一篇論文,名為《利用空間融合卷積神經網絡通過面部關鍵點進行偽裝人臉識別Disguised Face Identification (DFI) with Faci...
閱讀 3417·2021-11-24 09:39
閱讀 1806·2021-11-17 09:33
閱讀 3530·2021-10-12 10:12
閱讀 5037·2021-09-22 15:51
閱讀 1121·2019-08-30 13:11
閱讀 3580·2019-08-30 10:59
閱讀 574·2019-08-30 10:48
閱讀 1322·2019-08-26 13:48