Привет, Хабр!  С вами Вадим Дарморезов, участник профессионального сообщества NTA.   Сегодня рассмотрю кейс поиска «близнецов» в паспортных данных, которые были размещены в pdf‑файлах, насчитывающих десятки, а порой и сотни страниц. Введение Запуск модели Обработка 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. Для установки необходимо выполнить следующие команды: Команда Что используется в качестве инференса pip install onnxruntime CPU pip install   onnruntime-gpu GPU После установки необходимых пакетов необходимо выбрать модель, которая будет использоваться для работы. Список моделей, которые могут быть использованы при работе, представлен в таблице ниже:  Название Модель детекции  Модель распознавания Атрибуты Размер модели antelopev2 SCRFD-10GF ResNet100@Glint360k Пол и возраст 407Mb buffalo_l SCRFD-10GF ResNet50@WebFace600k Пол и возраст 326Mb buffalo_m SCRFD-2.5GF ResNet50@WebFace600k Пол и возраст 313Mb buffalo_s SCRFD-500MF MBF@WebFace600k Пол и возраст 159Mb buffalo_sc SCRFD-500MF MBF@WebFace600k - 16Mb Далее, возможны два варианта запуска модели. Для этого просто запускаю следующую строку:   Все необходимые для работы модели onnx‑файлы будут скачаны и размещены в директории ~/.insightface/models/. В дальнейшем при инициализации модели дополнительные загрузки производиться не будут.   При отсутствии возможности подключения компьютера к сети интернет для скачивания файлов, необходимо вручную создать следующую структуру директорий ~/.insightface/models/ и разместить туда предварительно скачанные onnx‑файлы модели. В моем случае была необходима инициализация модели в оффлайн‑режиме, для чего был разработан класс для настройки рабочего окружения (создание необходимых для работы директорий, перемещение onnx‑файлов модели).  После формирования рабочего окружения можно приступать к обработке pdf‑файлов и обработке изображений.  Начну с импорта необходимых библиотек:   После импорта библиотек посмотрю, как можно извлечь изображение из pdf‑файлов. Для этой задачи была выбрана библиотека fitz. Для корректной работы данной библиотеки необходимо установить пакет pymupdf. Далее, рассмотрю, как работает поиск лиц на изображениях. Инициализирую модель:  В качестве примера я хотел бы использовать знаменитое селфи Эллен Дедженерес с церемонии Оскар-2014: Данное фото выбрано не только потому, что на нем представлен каст выдающихся актеров Голливуда, но и по следующим причинам:  на фото представлены как мужчины, так и женщины; представлены люди различных возрастов; лица некоторых звезд видны не полностью — закрыты волосами соседей, руками и т. д. Код для распознавания достаточно прост: Посмотрю, что получилось: С детекцией лиц на изображении модель справилась отлично, были распознаны даже частично прикрытые лица, а вот с определением пола и возраста ситуация не так однозначна. Модели не удается точно определять пол, в случае затрудненной видимости анализируемого объекта, как получилось в случае Анджелины Джоли (порядка 50 процентов лица скрыто), так же при определении возраста возникают значительные погрешности (например, возраст Брэдли Купера на момент снимка — 39 лет, Дженнифер Лоуренс — 24 года). Посмотрю, какие значения хранятся в переменной faces на примере одного лица: Необходимые для дальнейшего анализа переменные:   bbox — хранит в себе координаты точек, ограничивающих область лица; gender — пол человека, которому принадлежит обнаруженное лицо; age — возраст человека, которому принадлежит лицо; embedding — векторное представление обнаруженного лица. Объединю полученные знания и коды:   Применю полученный код для поиска лиц в pdf‑файлах и их преобразования в векторное представление: Для поиска похожих изображений, представленных в векторном виде, буду использовать метод ближайших соседей из библиотеки sklearn, где в качестве метрики близости векторов будет выступать косинусное расстояние (данный подход не является единственно верным, существует множество методов расчета близости векторов).  Применю реализованный метод: В первом тестовом примере модель не справилась с полным распознаванием Анджелины Джоли, будет логичным протестировать готовый код на датасете известных актеров с целью найти её «близнецов». Результат сравнения представлен ниже:  Мне удалось реализовать систему для детектирования лиц в pdf-документах и поиска похожих людей с помощью библиотеки Insightface.Также хотелось бы отметить, что возможна гибкая настройка множества участков данной системы (от извлечения изображений из pdf-документов до методов расчета сходства изображений), что может позволить ускорить не только скорость обработки данных, но и качество распознавания и поиска дублирующихся и похожих лиц. Библиотека insightface богата на различные методы обработки лиц и может быть использована не только для их выявления и сравнения.    Профессиональное сообщество