📜  Python|使用 dlib 进行人脸识别

📅  最后修改于: 2022-05-13 01:54:43.613000             🧑  作者: Mango

Python|使用 dlib 进行人脸识别

本文旨在快速构建一个Python人脸识别程序,轻松训练一个人多张图像,并开始识别图像中的已知人脸。

在本文中,代码使用了 ageitgey 的 face_recognition API for Python。该 API 是使用dlib 的人脸识别算法构建的,它允许用户在您的项目中或从命令行轻松实现人脸检测、人脸识别甚至实时人脸跟踪。

库安装:
首先,确保您的计算机上安装了所需的库。

pip install face_recognition Scikit-learn dlib docopt

如果您希望 dlib 在 GPU 上使用CUDA ,请确保正确安装了CUDAcuDNN ,然后使用 pip 安装 dlib。有关在不同平台上安装的详细说明,请查看 face_recognition 的安装指南。

现在,使用以下格式为每个人创建一个包含训练图像的目录。确保你有足够的训练图像(每个人至少 5 个),否则支持向量分类器 (SVC)(在这个程序中使用 - 在非常小的数据集上产生毫无意义的结果。

文件结构:

face_recognize.py
test_image.jpg
train_dir/
    person_1/
        person_1_face-1.jpg
        person_1_face-2.jpg
        .
        .
        person_1_face-n.jpg
    person_2/
        person_2_face-1.jpg
        person_2_face-2.jpg
        .
        .
        person_2_face-n.jpg
    .
    .
    person_n/
        person_n_face-1.jpg
        person_n_face-2.jpg
        .
        .
        person_n_face-n.jpg

人脸编码:
face_recognition API 为图像中的人脸生成人脸编码。面部编码基本上是一种使用一组128个计算机生成的测量值来表示面部的方法。同一个人的两张不同图片将具有相似的编码,而两个不同的人将具有完全不同的编码。

生成所有人脸编码后,使用 scikit-learn 对人脸编码及其标签进行训练,支持向量分类器 (SVC) 来自训练目录中的所有已知人脸。最后,API 会检测您提供的测试图像中的所有人脸,并且经过训练的 SVC 会预测测试图像中的所有已知人脸。

代码:识别多张面孔。

"""
Usage:
  face_recognize.py -d  -i 
  
Options:
  -h, --help                     Show this help
  -d, --train_dir =   Directory with 
                                 images for training
  -i, --test_image = Test image
"""
  
# importing libraries
import face_recognition
import docopt
from sklearn import svm
import os
  
def face_recognize(dir, test):
    # Training the SVC classifier
    # The training data would be all the 
    # face encodings from all the known 
    # images and the labels are their names
    encodings = []
    names = []
  
    # Training directory
    if dir[-1]!='/':
        dir += '/'
    train_dir = os.listdir(dir)
  
    # Loop through each person in the training directory
    for person in train_dir:
        pix = os.listdir(dir + person)
  
        # Loop through each training image for the current person
        for person_img in pix:
            # Get the face encodings for the face in each image file
            face = face_recognition.load_image_file(
                dir + person + "/" + person_img)
            face_bounding_boxes = face_recognition.face_locations(face)
  
            # If training image contains exactly one face
            if len(face_bounding_boxes) == 1:
                face_enc = face_recognition.face_encodings(face)[0]
                # Add face encoding for current image 
                # with corresponding label (name) to the training data
                encodings.append(face_enc)
                names.append(person)
            else:
                print(person + "/" + person_img + " can't be used for training")
  
    # Create and train the SVC classifier
    clf = svm.SVC(gamma ='scale')
    clf.fit(encodings, names)
  
    # Load the test image with unknown faces into a numpy array
    test_image = face_recognition.load_image_file(test)
  
    # Find all the faces in the test image using the default HOG-based model
    face_locations = face_recognition.face_locations(test_image)
    no = len(face_locations)
    print("Number of faces detected: ", no)
  
    # Predict all the faces in the test image using the trained classifier
    print("Found:")
    for i in range(no):
        test_image_enc = face_recognition.face_encodings(test_image)[i]
        name = clf.predict([test_image_enc])
        print(*name)
  
def main():
    args = docopt.docopt(__doc__)
    train_dir = args["--train_dir"]
    test_image = args["--test_image"]
    face_recognize(train_dir, test_image)
  
if __name__=="__main__":
    main()

如何在终端上运行它:

python face_recognize.py -d train_dir -i test_image.jpg

输出:
测试图像和输出