Python-OpenCV人臉識別之資料集生成
在上一篇文章中,我們學習瞭如何安裝配置OpenCV和Python,然後寫了些程式碼玩玩人臉檢測。現在我們要進行下一步了,即搞一個人臉識別程式,就是不只是檢測還需要識別到人是誰。
來,搞人臉識別
要搞一個人臉識別程式,首先我們需要先用提前裁剪好的標註好的人臉照片訓練一個識別器。比如說,我們的識別器需要識別兩個人,一個人的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()
生成結果
如圖,已經生成了一堆訓練素材了。
先這樣吧
相關文章
- 人臉識別資料集和特點
- 人臉識別資料集 - BioID Face Database - FaceDBDatabase
- 如何構建自定義人臉識別資料集
- 人臉識別資料集 - Labeled Faces in the Wild Home (LFW)
- 人臉識別資料集 - PubFig: Public Figures Face DatabaseDatabase
- 人臉識別資料集 - Multi-Task Facial Landmark (MTFL) dataset
- 人臉識別資料集 - Large-scale CelebFaces Attributes (CelebA) Dataset
- 景聯文科技人臉識別資料採集服務(二)——人臉欺詐相關資料
- 人臉識別之特徵臉方法(Eigenface)特徵
- 刪除十億人臉資料,Facebook關閉人臉識別系統
- 人臉識別之Python DLib庫進行人臉關鍵點識別Python
- 拆分PPOCRLabel標註的資料集並生成識別資料集
- opencv 人臉識別OpenCV
- 從零玩轉人臉識別之RGB人臉活體檢測
- 人臉聚類那些事兒:利用無標籤資料提升人臉識別效能聚類
- 人臉檢測識別,人臉檢測,人臉識別,離線檢測,C#原始碼C#原始碼
- 人臉識別——景聯文科技提供3D頭模資料採集業務!3D
- C#人臉識別入門篇-STEP BY STEP人臉識別--入門篇C#
- 智慧人臉識別門禁系統開發,人臉識別開鎖流程
- 前端人臉識別--兩張臉相似度前端
- python—呼叫API人臉識別PythonAPI
- 首次!用合成人臉資料集訓練的識別模型,效能高於真實資料集模型
- 美國要在邊境大搞人臉識別,求你千萬別丟資料庫資料庫
- python ubuntu dlib人臉識別3-人臉對齊PythonUbuntu
- 人臉活體檢測人臉識別:眨眼+張口
- 乾貨 | AI人臉識別之人臉搜尋AI
- 人臉識別智慧考勤系統開發_人臉識別考勤管理系統開發
- 前端如何玩轉人臉識別前端
- 人臉識別技術應用
- Python人臉識別微笑檢測Python
- 從零玩轉人臉識別
- 為人臉識別技術提供AI基礎資料服務支援AI
- 人臉識別之人臉檢測的重要性
- 保障人臉安全!頂象釋出《人臉識別安全白皮書》
- 刷臉支付人臉識別特徵點越多是別越精確特徵
- 人臉、指紋、虹膜、行為,你需要的人工智慧生物識別AI資料集全在這裡!人工智慧AI
- OpenCV-Python 人臉眼睛嘴識別OpenCVPython
- 人臉識別系列(三):DeepID2