現在我們已經拍好了需要訓練的圖片,接下來就是進行訓練
流程圖:
我們在這里用到了numpy庫,NumPy是一個功能強大的Python庫,主要用於對多維數組執行計算。
使用numpy的目的是減少python代碼中的循環,以及提高數組運算的效率。
對於numpy性能的提升程度,我們可以從這段代碼中直觀感受到:
import datetime as dt import numpy as np n = 100000 start = dt.datetime.now() A, B = [], [] for i in range(n): A.append(i ** 2) B.append(i ** 3) C = [] for a,b in zip(A,B): C.append(a+b) t = (dt.datetime.now() -start).microseconds print(t) start = dt.datetime.now() A, B = np.arange(n)**2, np.arange(n)**3 C = A+B t = (dt.datetime.now() - start).microseconds print(t)
我們對列表進行了同樣的操作,然后輸出兩種操作所需要的時間(微秒),可以看到numpy在效率上提高了兩個數量級
訓練模塊的源代碼:
import numpy as np from PIL import Image import os import cv2 def train(): path = 'D:/FaceData' # 創建opencv中的LBPH算法的人臉識別器 recognizer = cv2.face.LBPHFaceRecognizer_create() # 依然是運用人臉識別分類器 detector = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml') def getImagesAndLabels(path): # os.path.join()函數: # 連接兩個或更多的路徑名組件 # os.listdir() 方法 # 用於返回指定的文件夾包含的文件或文件夾的名字的列表。這個列表以字母順序排列 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') # 將原圖片的多維數組轉為numpy的數組 img_numpy = np.array(PIL_img, 'uint8') # id對應的值是當前用戶的第幾張照片 id = int(os.path.split(imagePath)[-1].split('.')[1]) # 檢測人臉 faces = detector.detectMultiScale(img_numpy) for(x, y, w, h) in faces: # 將人臉范圍的numpy數組數據保存到列表中 faceSamples.append(img_numpy[y : y + h, x : x + w]) # 將id值保存到列表中 ids.append(id) return faceSamples, ids faces, ids = getImagesAndLabels(path) # 對圖片進行訓練,將訓練文件保存在指定路徑 recognizer.train(faces, np.array(ids)) recognizer.write(r'face_trainer\trainer.yml') print('{0} faces trained.'.format(len(np.unique(ids)))) if __name__ == '__main__': train()