Использование Insightface для быстрого поиска и сравнения лиц на изображениях
Привет, VC! С вами DS Вадим Дарморезов. Рассмотрю кейс поиска «близнецов» в паспортных данных, которые были размещены в pdf-файлах, насчитывающих десятки, а порой и сотни страниц.
Для поиска схожих изображений последовательность шагов обычно следующая:
· Считывание и обработка изображений (приведение изображений к одному размеру, перевод в градации серого и т.д).
· Преобразование изображений в вектора
· Поиск разницы между векторами изображений и нахождение «близнецов».
В проектах, связанных с распознаванием лиц своеобразными «флагманами» являются библиотеки dlib/face-recognition и свёрточные нейронные сети. При этом на просторах русскоязычного интернета довольно мало статей о библиотеке insightface. Именно о ее использовании хотелось бы поговорить более подробно. Всем, кому это интересно, добро пожаловать по кат.
Insightface – open-source набор инструментов для анализа 2D и 3D изображений, реализованный с помощью фреймворков машинного обучения PyTorch и MXNet. Данная библиотека эффективно реализует широкий спектр современных алгоритмов распознавания/детектирования/выравнивания лиц, которые оптимизированы как для обучения, так и для развертывания.
Приступим к установке библиотеки. Выполню команду:
Начиная с версии библиотеки 0.2.0, в качестве бэкенда для вычислений используется не MXNet, а onnxruntime. Данная библиотека (нейронная сеть) позволяет в качестве инференса использовать CPU или GPU.
В случае использования CPU, инференс выполняется на логических ядрах процессора, число которых равно числу физических ядер или, при использовании технологии Hyperthreading, увеличено вдвое. Использование CPU на глубоких нейросетях неэффективно из-за ограниченного обмена данными с ОЗУ, что существенно влияет на скорость работы. Также ограничения на производительность накладываются самой архитектурой – в процессе инференса решаются простые задачи сравнения, которые легко переносятся на параллельные вычисления, но количество параллельных потоков обработки всегда будет ограничено количеством логических ядер CPU.
Инференс с использованием GPU за счет иной архитектуры процессора, наличия высокоскоростной памяти и гибкой системы управления кэш-памятью гораздо эффективнее, чем инференс на CPU. Плюсом является кардинальное (до 100 раз) ускорение работы и крайне высокая эффективность обучения по сравнению с CPU.
Для установки необходимо выполнить следующие команды:
После установки необходимых пакетов необходимо выбрать модель, которая будет использоваться для работы. Список моделей, которые могут быть использованы при работе, представлен в таблице ниже:
Далее, возможны два варианта запуска модели
1 вариант – Запуск модели, с работающим подключением к сети интернет.
Просто запускаю следующую строку:
app = FaceAnalysis(name="buffalo_l", providers=['CUDAExecutionProvider'])
Все необходимые для работы модели onnx-файлы будут скачаны и размещены в директории ~/.insightface/models/. В дальнейшем при инициализации модели дополнительные загрузки производиться не будут.
2 вариант – Запуск модели в оффлайн режиме.
При отсутствии возможности подключения компьютера к сети интернет для скачивания файлов, необходимо вручную создать следующую структуру директорий ~/.insightface/models/ и разместить туда предварительно скачанные onnx-файлы модели.
В моем случае была необходима инициализация модели в оффлайн-режиме, для чего был разработан класс для настройки рабочего окружения (создание необходимых для работы директорий, перемещение onnx-файлов модели)
После формирования рабочего окружения можно приступать к обработке pdf-файлов и обработке изображений.
Импорт библиотек:
После импорта библиотек посмотрю, как можно извлечь изображение из pdf-файлов. Для этой задачи была выбрана библиотека fitz. Для корректной работы данной библиотеки необходимо установить пакет pymupdf.
Далее, рассмотрю, как работает поиск лиц на изображениях. Инициализирую модель:
В качестве примера я хотел бы использовать знаменитое селфи Эллен Дедженерес с церемонии Оскар-2014:
Данное фото выбрано не только потому, что на нем представлен каст выдающихся актеров Голливуда, но и по следующим причинам:
· На фото представлены как мужчины, так и женщины;
· Представлены люди различных возрастов;
· Лица некоторых звезд видны не полностью (закрыты волосами соседей, руками и т.д).
Код для распознавания достаточно прост:
Посмотрю, что получилось:
С детекцией лиц на изображении модель справилась отлично, были распознаны даже частично прикрытые лица, а вот с определением пола и возраста ситуация не так однозначна. Модели не удается точно определять пол, в случае затрудненной видимости анализируемого объекта, как получилось в случае Анджелины Джоли (порядка 50 процентов лица скрыто), так же при определении возраста возникают значительные погрешности (например, возраст Брэдли Купера на момент снимка – 39 лет, Дженнифер Лоуренс – 24 года).
Посмотрю, какие значения хранятся в переменной faces на примере одного лица:
Необходимые для дальнейшего анализа переменные:
· bbox – хранит в себе координаты точек, ограничивающих область лица
· gender – пол человека, которому принадлежит обнаруженное лицо
· age – - возраст человека, которому принадлежит лицо
· embedding – векторное представление обнаруженного лица
Объединю полученные знания и коды:
Применю полученный код для поиска лиц в pdf-файлах и их преобразования в векторное представление:
Для поиска похожих изображений, представленных в векторном виде, буду использовать метод ближайших соседей из библиотеки sklearn, где в качестве метрики близости векторов будет выступать косинусное расстояние (данный подход не является единственно верным, существует множество методов расчета близости векторов).
Применим реализованный метод:
В первом тестовом примере модель не справилась с полным распознаванием Анджелины Джоли, будет логичным протестировать готовый код на датасете известных актеров с целью найти её «близнецов». Результат сравнения представлен ниже:
Таким образом, мне удалось реализовать систему для детектирования лиц в pdf-документах и поиска похожих людей с помощью библиотеки Insightface.Также хотелось бы отметить, что возможна гибкая настройка множества участков данной системы (от извлечения изображений из pdf-документов до методов расчета сходства изображений), что может позволить ускорить не только скорость обработки данных, но и качество распознавания и поиска дублирующихся и похожих лиц. Библиотека insightface богата на различные методы обработки лиц и может быть использована не только для их выявления и сравнения.