opencv實現人臉識別(三) 訓練圖片模塊


現在我們已經拍好了需要訓練的圖片,接下來就是進行訓練

流程圖:

我們在這里用到了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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM