Machine Learning

Сам себе поисковик. Ищем нужных людей на картинке

Время прочтения: 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, может использоваться в различных обработках видео, при этом не сильно загружая ПК и выдавая стабильно высокие результаты.

Советуем почитать