Пошаговое руководство по распознаванию лиц в реальном времени с использованием библиотеки OpenCv

В этом посте я покажу вам, как создать собственный распознаватель лиц с помощью Python. Создание программы, которая обнаруживает и распознает лица, - очень интересный и увлекательный проект для начала работы с компьютерным зрением. В предыдущих постах я показал, как распознавать текст, а также обнаруживать лица на изображении, это отличные проекты для практики Python в компьютерном зрении. Сегодня мы сделаем кое-что более продвинутое, и это будет распознавание лиц.

Как можно понять из названия, мы напишем программу, которая будет распознавать лица на изображении. Когда я говорю «программа», вы можете понимать это как обучение машины тому, что делать и как это делать. Мне нравится использовать обучение вместо программирования, потому что именно этим мы и будем заниматься. Лучший способ обучения - это обучение, поэтому, обучая машину распознавать лица, мы тоже учимся. Прежде чем мы начнем работать над проектом, я хочу поделиться различием между распознаванием лиц и распознаванием лиц. Это полезно знать.

Оглавление:

  • Распознавание лиц против распознавания лиц
  • Начало работы
  • Библиотеки
  • Обучение изображений
  • Распознавание лиц
  • Тестирование распознавателя

Распознавание лиц против распознавания лиц

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

Распознавание лиц - это процесс обнаружения лиц по изображению или видео, который не имеет значения. Программа не делает ничего, кроме поиска лиц. Но с другой стороны, распознавание лиц, программа, которая находит лица, а также может определить, какое лицо кому принадлежит. Так что это более информативно, чем просто их обнаружение.

Чтобы написать код, распознающий лица, нужны некоторые обучающие данные, мы должны обучить нашу машину, чтобы она знала лица и кто они. В этом проекте мы преподаем нашу программу. В машинном обучении есть два типа обучения; под присмотром и без присмотра. Я не буду вдаваться в подробности, в этом проекте мы будем использовать контролируемое обучение. Вот хороший пост о методах машинного обучения.

Пример сравнения

Начиная

Мы будем использовать два основных модуля для этого проекта, и они называются Face Recognition и OpenCV. OpenCV - это высокооптимизированная библиотека, ориентированная на приложения реального времени.

OpenCV (Open Source Computer Vision Library) - это библиотека программного обеспечения для компьютерного зрения и машинного обучения с открытым исходным кодом. OpenCV был создан для обеспечения общей инфраструктуры для приложений компьютерного зрения и для ускорения использования машинного восприятия в коммерческих продуктах. OpenCV является продуктом с лицензией BSD и упрощает использование и изменение кода предприятиями.

Источник: https://opencv.org



Библиотеки

Нам нужно установить некоторые библиотеки, чтобы наша программа работала. Вот список библиотек, которые мы установим: cmake, face_recognition, numpy, opencv-python. Cmake - это обязательная библиотека, поэтому установка библиотеки распознавания лиц не выдает ошибок.

Мы можем установить их в одну строку с помощью диспетчера библиотек PIP:

pip install cmake face_recognition numpy opencv-python

После завершения установки давайте импортируем их в наш редактор кода. Некоторые из этих библиотек включены в Python, поэтому мы можем импортировать их, не устанавливая.

import face_recognition
import cv2
import numpy as np
import os
import glob

Большой! Теперь мы переходим к следующему шагу, где мы будем импортировать изображения и использовать их для обучения нашей программы.

Тренировка изображений

Перво-наперво, давайте найдем наши изображения.

Импортировать изображения

Я загрузил изображения некоторых известных людей и добавил их в новую папку под названием «лица». Также, чтобы получить текущий каталог, другими словами, расположение вашей программы, мы можем использовать метод операционной системы, называемый «getcwd ()».

faces_encodings = []
faces_names = []
cur_direc = os.getcwd()
path = os.path.join(cur_direc, 'data/faces/')
list_of_files = [f for f in glob.glob(path+'*.jpg')]
number_files = len(list_of_files)
names = list_of_files.copy()

Понимание приведенных выше строк:

  • Все изображения находятся в одной папке с названием «лица».
  • Имена файлов изображений должны соответствовать имени человека на изображении. (Например: bill-gates.jpg).
  • Имена файлов перечислены и присвоены переменной «names».
  • Типы файлов должны быть одинаковыми. В этом упражнении я использовал формат «jpg».

Переходим к следующему шагу.

Тренируйте лица

for i in range(number_files):
    globals()['image_{}'.format(i)] = face_recognition.load_image_file(list_of_files[i])
    globals()['image_encoding_{}'.format(i)] = face_recognition.face_encodings(globals()['image_{}'.format(i)])[0]
    faces_encodings.append(globals()['image_encoding_{}'.format(i)])
# Create array of known names
    names[i] = names[i].replace(cur_direc, "")  
    faces_names.append(names[i])

Чтобы дать вам некоторое представление, вот как выглядит мой список «имен».

Большой! Образы обучены. На следующем шаге мы будем использовать веб-камеру устройства, чтобы увидеть, как работает наш код.

Распознавание лица

На этом этапе у нас есть длинные строки кода. Если вы пройдете через это, вы легко поймете, что происходит в каждой строке. Определим переменные, которые потребуются.

face_locations = []
face_encodings = []
face_names = []
process_this_frame = True

А вот и код распознавания лиц. (Возможно, вам придется переформатировать интервал, если вы скопируете следующий код, я рекомендую написать его с нуля, посмотрев на код, а также попытаться понять)

video_capture = cv2.VideoCapture(0)
while True:
    ret, frame = video_capture.read()
    small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
    rgb_small_frame = small_frame[:, :, ::-1]
    if process_this_frame:
        face_locations = face_recognition.face_locations( rgb_small_frame)
        face_encodings = face_recognition.face_encodings( rgb_small_frame, face_locations)
        face_names = []
        for face_encoding in face_encodings:
            matches = face_recognition.compare_faces (faces_encodings, face_encoding)
            name = "Unknown"
            face_distances = face_recognition.face_distance( faces_encodings, face_encoding)
            best_match_index = np.argmin(face_distances)
            if matches[best_match_index]:
                name = faces_names[best_match_index]
            face_names.append(name)
process_this_frame = not process_this_frame
# Display the results
    for (top, right, bottom, left), name in zip(face_locations, face_names):
        top *= 4
        right *= 4
        bottom *= 4
        left *= 4
# Draw a rectangle around the face
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
# Input text label with a name below the face
        cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
        font = cv2.FONT_HERSHEY_DUPLEX
        cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)
# Display the resulting image
    cv2.imshow('Video', frame)
# Hit 'q' on the keyboard to quit!
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

Тестирование распознавателя

На первом изображении я использую то же самое изображение, которое использовалось в обучающих данных.

Теперь я попробую это сделать с другим изображением Тейлор Свифт. Работает отлично!

Поздравляю!! Вы создали программу, которая обнаруживает, а также распознает лица на изображении. Теперь у вас есть представление о том, как использовать компьютерное зрение в реальном проекте. Надеемся, что вам понравилось читать это пошаговое руководство. Буду рад, если вы сегодня узнали что-то новое. Работа над проектами практического программирования, подобными этому, - лучший способ отточить свои навыки программирования.

Не стесняйтесь связываться со мной, если у вас возникнут вопросы при внедрении кода.

Я Behic Guven, и мне нравится делиться историями о программировании, образовании и жизни. Подпишитесь на мой контент, чтобы оставаться воодушевленным, и В сторону науки о данных, чтобы оставаться воодушевленным. Спасибо,

Другие проекты машинного обучения