首頁  >  文章  >  後端開發  >  如何在 Python 中使用 FaceNet 建構人臉辨識系統

如何在 Python 中使用 FaceNet 建構人臉辨識系統

王林
王林原創
2024-09-04 18:32:11643瀏覽

How to Build a Face Recognition System Using FaceNet in Python

人臉辨識技術在從安全系統到社群媒體的各種應用中變得越來越普遍。對於此任務最有效的模型之一是 FaceNet,這是一種專為人臉驗證、識別和聚類而設計的深度學習模型。

在本教學中,我將向您展示如何使用 FaceNet 在 Python 中建立人臉辨識系統。我們將涵蓋從加載模型到比較面部的所有內容。閱讀本指南後,您將為在自己的專案中實現人臉辨識奠定堅實的基礎。

什麼是FaceNet?

FaceNet 是 Google 開發的深度學習模型,可將人臉映射到 128 維歐幾里德空間。這些嵌入代表了臉部的基本特徵,可以輕鬆地以高精度比較和識別臉部。與傳統的人臉辨識方法不同,FaceNet 專注於嵌入學習,這使得它非常有效且可擴展。

先決條件

在深入研究程式碼之前,請確保您已安裝以下軟體:

  • Python 3.x
  • TensorFlow 或 Keras(用於深度學習模型)
  • NumPy(用於數值運算)
  • OpenCV(用於影像處理)
  • Scikit-learn(用於應用最近鄰搜尋)

您可以使用 pip 安裝這些依賴項:

pip install tensorflow numpy opencv-python scikit-learn

第 1 步:載入預先訓練的 FaceNet 模型

首先,我們將載入預先訓練的 FaceNet 模型。您可以從可信任來源下載模型,也可以使用 keras-facenet 函式庫提供的模型。

from keras.models import load_model

# Load the pre-trained FaceNet model
model = load_model('facenet_keras.h5')
print("Model Loaded Successfully")

載入模型是設定我們的人臉辨識系統的第一步。該模型將用於生成圖像的嵌入,這是面部的數位表示。

第 2 步:為 FaceNet 預處理影像

FaceNet 期望輸入影像為 RGB 格式的 160x160 像素。此外,像素值在輸入模型之前需要進行標準化。

import cv2
import numpy as np

def preprocess_image(image_path):
    # Load the image using OpenCV
    img = cv2.imread(image_path)

    # Convert the image to RGB (FaceNet expects RGB images)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    # Resize the image to 160x160 pixels
    img = cv2.resize(img, (160, 160))

    # Normalize the pixel values
    img = img.astype('float32') / 255.0

    # Expand dimensions to match the input shape of FaceNet (1, 160, 160, 3)
    img = np.expand_dims(img, axis=0)

    return img

此函數處理 FaceNet 所需的影像預處理。它將影像轉換為適當的格式和大小,確保模型接收到可以有效使用的輸入。

第 3 步:產生人臉嵌入

接下來,我們將使用 FaceNet 模型從預處理影像產生嵌入。這些嵌入將作為臉部的獨特數字表示。

def get_face_embedding(model, image_path):
    # Preprocess the image
    img = preprocess_image(image_path)

    # Generate the embedding
    embedding = model.predict(img)

    return embedding

get_face_embedding 函數接收模型和影像路徑,處理影像並傳回嵌入。我們將使用此嵌入來進行面部比較。

第 4 步:使用嵌入比較人臉

為了確定兩個面孔是否匹配,我們透過計算它們之間的歐幾里德距離來比較它們的嵌入。如果距離低於某個閾值,則認為臉孔匹配。

from numpy import linalg as LA

def compare_faces(embedding1, embedding2, threshold=0.5):
    # Compute the Euclidean distance between the embeddings
    distance = LA.norm(embedding1 - embedding2)

    # Compare the distance to the threshold
    if distance < threshold:
        print("Face Matched.")
    else:
        print("Faces are different.")

    return distance

compare_faces 函數計算兩個嵌入之間的距離。如果該距離小於指定閾值(預設為 0.5),則函數將列印「Face Matched」。否則,它會列印“面孔不同。”

第5步:測試人臉辨識系統

最後,讓我們用兩張圖像來測試我們的人臉辨識系統,看看它是否正確地將它們識別為同一個人。

# Load the FaceNet model
model = load_model('facenet_keras.h5')

# Get embeddings for two images
embedding1 = get_face_embedding(model, 'face1.jpg')
embedding2 = get_face_embedding(model, 'face2.jpg')

# Compare the two faces
distance = compare_faces(embedding1, embedding2)

print(f"Euclidean Distance: {distance}")

輸出

  • 如果面孔匹配,您將看到:面孔匹配。
  • 如果它們不匹配,您會看到:面孔不同。

此外,還將印製兩個嵌入之間的歐幾里德距離。

結論

您剛剛使用 Python 中的 FaceNet 建立了一個簡單但功能強大的人臉辨識系統。該系統可以輕鬆擴展以包含更多面孔、處理即時識別或整合到更大的專案中。 FaceNet 的高精度和高效率使其成為人臉辨識任務的絕佳選擇。

隨意嘗試閾值,或嘗試在即時應用程式中使用該系統,例如基於網路攝影機的人臉辨識工具。

如果您有任何疑問或需要進一步協助,請在下面發表評論。快樂編碼!


以上是如何在 Python 中使用 FaceNet 建構人臉辨識系統的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn