Python | Распознавание нескольких лиц с использованием dlib

Опубликовано: 22 Июля, 2021

Эта статья направлена на быстрое создание программы распознавания лиц на Python, чтобы легко обучить несколько изображений для каждого человека и начать распознавать известные лица на изображении.

В этой статье код использует API ageitgey face_recognition для Python. Этот API построен с использованием алгоритмов распознавания лиц dlib и позволяет пользователю легко реализовать обнаружение лиц, распознавание лиц и даже отслеживание лиц в реальном времени в ваших проектах или из командной строки.

Установка библиотеки:
Сначала убедитесь, что на вашем компьютере установлены необходимые библиотеки.

 pip install face_recognition Scikit-learn dlib docopt

Если вы хотите, чтобы dlib использовал CUDA на графическом процессоре, убедитесь, что CUDA и cuDNN установлены правильно, а затем установите dlib с помощью pip. Подробные инструкции по установке на различных платформах см. В Руководстве по установке 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 компьютерных измерений. Два разных изображения одного и того же человека будут иметь одинаковую кодировку, а два разных человека будут иметь совершенно разную кодировку.

После того, как все кодировки лиц сгенерированы, классификатор опорных векторов (SVC) с помощью scikit-learn обучается кодировкам лиц вместе с их метками из всех известных лиц в каталоге обучения. Наконец, API обнаруживает все лица в предоставленном вами тестовом изображении, а обученный SVC предсказывает все известные лица в тестовом изображении.

Код: для распознавания нескольких лиц.




"""
Usage:
face_recognize.py -d <train_dir> -i <test_image>
Options:
-h, --help Show this help
-d, --train_dir =<train_dir> Directory with
images for training
-i, --test_image =<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 каталог_поезда -i test_image.jpg

Выход: