Python | Распознавание нескольких лиц с использованием dlib
Эта статья направлена на быстрое создание программы распознавания лиц на 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
Выход: