首頁  >  文章  >  後端開發  >  如何使用Python實現人臉辨識功能?

如何使用Python實現人臉辨識功能?

WBOY
WBOY轉載
2023-04-20 22:16:143051瀏覽

一、人臉偵測

人臉偵測是指從影像或影片中偵測出人臉的位置。我們使用OpenCV函式庫來實現人臉偵測功能。 OpenCV是一種流行的電腦視覺庫,它支援各種影像和視訊處理功能,並且可以在多個平台上運行。

下面是Python實作人臉偵測的程式碼範例:

import cv2

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)

for (x,y,w,h) in faces:
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)

cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在這個程式碼範例中,我們使用了OpenCV的CascadeClassifier類別載入了一個名為「haarcascade_frontalface_default.xml」的分類器,這個分類器是OpenCV自備的,用於人臉偵測。然後,我們讀取一張名為「test.jpg」的圖片,並將其轉換為灰階影像。接下來,我們使用detectMultiScale函數來偵測影像中的人臉。 detectMultiScale函數將傳回一個包含人臉位置和大小的矩形清單。最後,我們在原始影像中繪製矩形,以標記偵測到的人臉。

二、人臉特徵提取

人臉特徵提取是指從人臉圖像中提取出一些特徵,如眼睛、鼻子、嘴巴等。我們使用Dlib函式庫來實現人臉特徵提取功能。 Dlib是一個流行的C 庫,用於機器學習、電腦視覺和影像處理。雖然Dlib是用C 寫的,但它也提供了Python接口,我們可以使用Python來呼叫Dlib函式庫的功能。

下面是Python實現人臉特徵提取的程式碼範例:

import dlib
import cv2

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')

img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = detector(gray)

for face in faces:
    landmarks = predictor(gray, face)
    for n in range(68):
        x = landmarks.part(n).x
        y = landmarks.part(n).y
        cv2.circle(img, (x, y), 2, (255, 0, 0), -1)

cv2.imshow("Output", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在這個程式碼範例中,我們使用了Dlib庫的get_frontal_face_detectorlandmarks. dat」的人臉特徵提取器。然後,我們讀取一張名為「test.jpg」的圖片,並將其轉換為灰階影像。接下來,我們使用detector函數來偵測影像中的人臉,並使用predictor函數來擷取人臉特徵。 predictor函數將會傳回一個包含人臉特徵點的68個座標的清單。最後,我們在原始圖像中繪製圓圈,以標記人臉特徵點。

三、 人臉辨識

人臉辨識是指將擷取的特徵與資料庫中的人臉資訊進行比較,從而辨識出人臉的身份。我們使用Dlib庫來實現人臉辨識功能。具體實現過程如下:

  1. 採集人臉資料:我們需要採集一些人臉資料作為我們的資料庫。我們可以使用攝影機來收集這些數據,並將它們保存在硬碟上。

  2. 人臉特徵提取:對於每個人臉圖像,我們需要提取它的特徵。我們可以使用第二個程式碼範例中的方法來提取人臉特徵。

  3. 建立人臉辨識模型:我們需要使用擷取的人臉特徵來建立一個人臉辨識模型。我們可以使用Dlib函式庫的face_recognition模組來實現這一點。 face_recognition模組提供了一個名為「face_encodings」的函數,它可以將人臉影像轉換為包含128個特徵的向量。我們可以將這些向量儲存到硬碟上,作為我們的人臉資料庫。

  4. 人臉辨識:對於要辨識的人臉圖像,我們可以使用第二個程式碼範例中的方法來提取它的特徵。然後,我們可以使用face_recognition模組的compare_faces函數來比較提取的特徵與我們的人臉資料庫中的特徵。如果匹配,則表示我們已經辨識出了人臉的身份。

 下面是Python實現人臉識別的程式碼範例:

import cv2
import dlib
import face_recognition

known_face_encodings = []
known_face_names = []

# Load the known faces and embeddings
for name in ["person_1", "person_2", "person_3"]:
    image = face_recognition.load_image_file(f"{name}.jpg")
    face_encoding = face_recognition.face_encodings(image)[0]
    known_face_encodings.append(face_encoding)
    known_face_names.append(name)

# Initialize some variables
face_locations = []
face_encodings = []
face_names = []
process_this_frame = True

video_capture = cv2.VideoCapture(0)

while True:
    # Grab a single frame of video
    ret, frame = video_capture.read()

    # Resize frame of video to 1/4 size for faster face recognition processing
    small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)

    # Convert the image from BGR color (which OpenCV uses) to RGB color (which face_recognition uses)
    rgb_small_frame = small_frame[:, :, ::-1]

    # Only process every other frame of video to save time
    if process_this_frame:
        # Find all the faces and face encodings in the current frame of video
        face_locations = face_recognition.face_locations(rgb_small_frame)
        face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)

        face_names = []
        for face_encoding in face_encodings:
            # See if the face is a match for the known face(s)
            matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
            name = "Unknown"

            # If a match was found in known_face_encodings, just use the first one.
            if True in matches:
                first_match_index = matches.index(True)
                name = known_face_names[first_match_index]

            face_names.append(name)

    process_this_frame = not process_this_frame

    # Display the results
    for (top, right, bottom, left), name in zip(face_locations, face_names):
        # Scale back up face locations since the frame we detected in was scaled to 1/4 size
        top *= 4
        right *= 4
        bottom *= 4
        left *= 4

        # Draw a box around the face
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)

        # Draw a label with a name below the face
        cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
        font = cv2.FONT_HERSHEY_DUPLEX
        cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)

    # Display the resulting image
    cv2.imshow('Video', frame)

    # Hit 'q' on the keyboard to quit!
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# Release handle to the webcam
video_capture.release()
cv2.destroyAllWindows()

在這個程式碼範例中,我們首先載入了一些人臉數據,並使用face_recognition模組將它們轉換為人臉特徵向量。然後,我們使用cv2.VideoCapture函數讀取攝影機的視訊串流,並使用face_recognition模組來識別視訊串流中的人臉。最後,我們使用OpenCV的函數將人臉辨識結果顯示在視訊串流中。

以上是如何使用Python實現人臉辨識功能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除