Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara Membina Sistem Pengecaman Wajah Menggunakan FaceNet dalam Python

Cara Membina Sistem Pengecaman Wajah Menggunakan FaceNet dalam Python

王林
王林asal
2024-09-04 18:32:11566semak imbas

How to Build a Face Recognition System Using FaceNet in Python

Teknologi pengecaman muka telah menjadi semakin meluas dalam pelbagai aplikasi, daripada sistem keselamatan hingga ke media sosial. Salah satu model paling berkesan untuk tugasan ini ialah FaceNet, model pembelajaran mendalam yang direka untuk pengesahan muka, pengecaman dan pengelompokan.

Dalam tutorial ini, saya akan menunjukkan kepada anda cara membina sistem pengecaman muka dalam Python menggunakan FaceNet. Kami akan merangkumi segala-galanya daripada memuatkan model kepada membandingkan wajah. Pada penghujung panduan ini, anda akan mempunyai asas yang kukuh untuk melaksanakan pengecaman muka dalam projek anda sendiri.

Apakah FaceNet?

FaceNet ialah model pembelajaran mendalam yang dibangunkan oleh Google yang memetakan muka ke dalam ruang Euclidean 128 dimensi. Pembenaman ini mewakili ciri penting wajah, menjadikannya mudah untuk membandingkan dan mengenali wajah dengan ketepatan yang tinggi. Berbeza dengan kaedah pengecaman muka tradisional, FaceNet memfokuskan pada membenamkan pembelajaran, yang menjadikannya sangat berkesan dan berskala.

Prasyarat

Sebelum menyelam ke dalam kod, pastikan anda telah memasang yang berikut:

  • Python 3.x
  • TensorFlow atau Keras (untuk model pembelajaran mendalam)
  • NumPy (untuk operasi berangka)
  • OpenCV (untuk pemprosesan imej)
  • Scikit-belajar (untuk memohon carian jiran terdekat)

Anda boleh memasang kebergantungan ini menggunakan pip:

pip install tensorflow numpy opencv-python scikit-learn

Langkah 1: Memuatkan Model FaceNet Pra-terlatih

Pertama, kami akan memuatkan model FaceNet yang telah terlatih. Anda boleh memuat turun model daripada sumber yang dipercayai atau menggunakan model yang tersedia melalui pustaka keras-facenet.

from keras.models import load_model

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

Memuatkan model ialah langkah pertama dalam menyediakan sistem pengecaman wajah kami. Model ini akan digunakan untuk menjana benam untuk imej, yang merupakan perwakilan berangka wajah.

Langkah 2: Pramemproses Imej untuk FaceNet

FaceNet menjangkakan imej input ialah 160x160 piksel dalam format RGB. Selain itu, nilai piksel perlu dinormalkan sebelum dimasukkan ke dalam model.

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

Fungsi ini mengendalikan prapemprosesan imej yang diperlukan oleh FaceNet. Ia menukar imej kepada format dan saiz yang sesuai, memastikan model menerima input yang boleh digunakan dengan berkesan.

Langkah 3: Menjana Benam Wajah

Seterusnya, kami akan menggunakan model FaceNet untuk menjana benam daripada imej praproses. Pembenaman ini akan berfungsi sebagai perwakilan berangka unik wajah.

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

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

    return embedding

Fungsi get_face_embedding mengambil model dan laluan imej, memproses imej dan mengembalikan pembenaman. Pembenaman inilah yang akan kami gunakan untuk perbandingan muka.

Langkah 4: Membandingkan Wajah Menggunakan Benam

Untuk menentukan sama ada dua muka sepadan, kami membandingkan benamnya dengan mengira jarak Euclidean antara mereka. Jika jarak di bawah ambang tertentu, muka dianggap padan.

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

Fungsi compare_faces mengira jarak antara dua benam. Jika jarak ini kurang daripada ambang yang ditentukan (0.5 secara lalai), fungsi mencetak "Padanan Muka." Jika tidak, ia mencetak "Wajah berbeza."

Langkah 5: Menguji Sistem Pengecaman Wajah

Akhir sekali, mari kita uji sistem pengecaman wajah kita dengan dua imej untuk melihat sama ada imej itu mengenal pasti mereka dengan betul sebagai orang yang sama atau tidak.

# 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}")

Keluaran

  • Jika wajah sepadan, anda akan melihat: Padanan Wajah.
  • Jika ia tidak sepadan, anda akan melihat: Wajah berbeza.

Selain itu, jarak Euclidean antara kedua-dua benam akan dicetak.

Kesimpulan

Anda baru sahaja membina sistem pengecaman muka yang ringkas tetapi berkuasa menggunakan FaceNet dalam Python. Sistem ini boleh dikembangkan dengan mudah untuk memasukkan lebih banyak muka, mengendalikan pengecaman masa nyata atau disepadukan ke dalam projek yang lebih besar. Ketepatan dan kecekapan tinggi FaceNet menjadikannya pilihan terbaik untuk tugas pengecaman muka.

Jangan ragu untuk bereksperimen dengan nilai ambang, atau cuba gunakan sistem ini dalam aplikasi masa nyata seperti alat pengecaman muka berasaskan kamera web.

Jika anda mempunyai sebarang soalan atau memerlukan bantuan lanjut, tinggalkan komen di bawah. Selamat mengekod!


Atas ialah kandungan terperinci Cara Membina Sistem Pengecaman Wajah Menggunakan FaceNet dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn