Время прочтения: 4 мин.
Достаточно часто при работе с видео ставится задача узнать – сколько людей было в кадре и получить их лица.
На первый взгляд задача достаточно простая, но порой ее реализация упирается в огромное количество проблем. Наиболее частая – какую библиотеку использовать, чтобы максимально быстро получить хороший результат?
Решением является — Face recognition (простая библиотека в использовании и установке). По факту является API инструментом, который устанавливается с этой библиотекой. Сам инструмент выделяет черты лица на изображениях, и в случае, если нам нужен такой функционал, пытается по ним идентифицировать найденного человека. Весь функционал написан на языке С++ и сформирован в библиотеку Dlib – наиболее продвинутого сборника, содержащего алгоритмы машинного обучения и имеющего открытый исходный код.
Если попробовать поискать статьи про эту библиотеку, то можно найти достаточно интересную информацию о том, что при тестировании на большой базе распознавания лиц Labeled Faces in the Wild модель показала точность более 99%. Так как библиотека для python является лишь «оберткой» основного инструмента, весь функционал можно использовать через командную строку, что в некоторых ситуациях очень удобно.
Для установки необходимо сначала установить библиотеку для python, которая самостоятельно установит dlib:
pip install face_recognition
После установки (процесс занимает около 10 минут) мы добавим библиотеку в проект. Кроме этого, для работы с изображениями добавим библиотеку PIL:
import face_recognition
from PIL import Image
В начале мы будем искать просто лица на изображении и выводить их по очереди. Для этого загрузим изображения.
image = face_recognition.load_image_file("test.jpg")
face_locations = face_recognition.face_locations(image)
Затем поочередно выведем изображения на экран следующим кодом:
for face_location in face_locations:
top, right, bottom, left = face_location
print("A face is located at pixel location Top: {}, Left: {}, Bottom: {}, Right: {}".format(top, left, bottom, right))
face_image = image[top:bottom, left:right]
pil_image = Image.fromarray(face_image)
pil_image.show()
Исходное изображение:
Результат обработки будет следующий:
Как вы видите, практически все лица солдат были определены. Не определилось лишь лицо, которое видно лишь наполовину.
Теперь попробуем найти конкретного человека на изображении.
Для этого нам нужно изображение-шаблон и изображение, на котором нужно осуществить поиск.
В начале загрузим изображение лица человека, которого будем искать:
picture_of_me = face_recognition.load_image_file("fil.jpg")
my_face_encoding = face_recognition.face_encodings(picture_of_me)[0]
Это изображение преобразуем в нужный формат (для программы).
Так же загружаем изображение для обработки:
unknown_picture = face_recognition.load_image_file("test.jpg")
unknown_face_encoding = face_recognition.face_encodings(unknown_picture)[0]
Далее начинаем искать:
results = face_recognition.compare_faces([my_face_encoding], unknown_face_encoding)
В переменнуюresult будут помещены результаты поиска в виде массива. Если первый элемент будет иметь значения True, то объект найден. Индекс элемента будет совпадать с индексом массива изображений, который мы подаем в метод compare_faces.
Далее сделаем простенький вывод результата:
if results[0] == True:
print("Найден!")
else:
print("Кто то другой!")
Сначала попробуем найти среди людей из первого изображения интересующего нас человека:
Исходное изображение:
Изображение для поиска
Результат
Теперь попробуем другое изображение, на котором человек для поиска будет виден, но в другой одежде и выражением лица.
Исходное изображение
Результат.
Вот таким простым образом можно искать лица людей. Библиотека face_recognition, которая реализует огромные возможности dlib, может использоваться в различных обработках видео, при этом не сильно загружая ПК и выдавая стабильно высокие результаты.