用Python實現簡單的人臉識別,10分鐘搞定!(附原始碼)

專注的阿熊發表於2021-03-22

#----- 建立模型、建立資料集 -----#----- 建立模型、建立資料集 -----

import os

import cv2

import numpy as np

from PIL import Image

# 匯入 pillow 庫,用於處理影像

# 設定之前收集好的資料檔案路徑

path = 'data'

# 初始化識別的方法

recog = cv2.face.LBPHFaceRecognizer_create()

# 呼叫熟悉的人臉分類器

detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# 建立一個函式,用於從資料集資料夾中獲取訓練圖片 , 並獲取 id

# 注意圖片的命名格式為 User.id.sampleNum

def get_images_and_labels(path):

    image_paths = [os.path.join(path,f) for f in os.listdir(path)]

    # 新建連個 list 用於存放

    face_samples = []

    ids = []

    # 遍歷圖片路徑,匯入圖片和 id 新增到 list

    for image_path in image_paths:

        # 透過圖片路徑將其轉換為灰度圖片

        img = Image.open(image_path).convert('L')

        # 將圖片轉化為陣列

        img_np = np.array(img,'uint8')

        if os.path.split(image_path)[-1].split(".")[-1] != 'jpg':

            continue

        # 為了獲取 id ,外匯跟單gendan5.com將圖片和路徑分裂並獲取

        id = int(os.path.split(image_path)[-1].split(".")[1])

        faces = detector.detectMultiScale(img_np)

        # 將獲取的圖片和 id 新增到 list

        for(x,y,w,h) in faces:

            face_samples.append(img_np[y:y+h,x:x+w])

            ids.append(id)

    return face_samples,ids

# 呼叫函式並將資料餵給識別器訓練

print('Training...')

faces,ids = get_images_and_labels(path)

# 訓練模型

recog.train(faces,np.array(ids))

# 儲存模型

recog.save('trainner/trainner.yml')

這就讓電腦認識到你是與眾不同的那顆星~

3. 識別

檢測,校驗,輸出其實都是識別的這一過程,與前兩個過程不同,這是涉及實際使用的過程,所以我們把他整合放在一個統一的一個檔案內。

#----- 檢測、校驗並輸出結果 -----

import cv2

# 準備好識別方法

recognizer = cv2.face.LBPHFaceRecognizer_create()

# 使用之前訓練好的模型

recognizer.read('trainner/trainner.yml')

# 再次呼叫人臉分類器

cascade_path = "haarcascade_frontalface_default.xml"

face_cascade = cv2.CascadeClassifier(cascade_path)

# 載入一個字型,用於識別後,在圖片上標註出物件的名字

font = cv2.FONT_HERSHEY_SIMPLEX

idnum = 0

# 設定好與 ID 號碼對應的使用者名稱,如下,如 0 對應的就是初始

names = [' 初始 ','admin','user1','user2','user3']

# 呼叫攝像頭

cam = cv2.VideoCapture(0)

minW = 0.1*cam.get(3)

minH = 0.1*cam.get(4)

while True:

    ret,img = cam.read()

    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

    # 識別人臉

    faces = face_cascade.detectMultiScale(

            gray,

            scaleFactor = 1.2,

            minNeighbors = 5,

            minSize = (int(minW),int(minH))

            )

    # 進行校驗

    for(x,y,w,h) in faces:

        cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)

        idnum,confidence = recognizer.predict(gray[y:y+h,x:x+w])

        # 計算出一個檢驗結果

        if confidence < 100:

            idum = names[idnum]

            confidence = "{0}%",format(round(100-confidence))

        else:

            idum = "unknown"

            confidence = "{0}%",format(round(100-confidence))

        # 輸出檢驗結果以及使用者名稱

        cv2.putText(img,str(idum),(x+5,y-5),font,1,(0,0,255),1)

        cv2.putText(img,str(confidence),(x+5,y+h-5),font,1,(0,0,0),1)

        # 展示結果

        cv2.imshow('camera',img)

        k = cv2.waitKey(20)

        if k == 27:

            break

# 釋放資源

cam.release()

cv2.destroyAllWindows()


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2764275/,如需轉載,請註明出處,否則將追究法律責任。

相關文章