Предпосылки

Был такой функционал в Битрикс24 — Face‑трекер. В 2022 году его отключили, о чем вышло официальное уведомление.

Причина для отключения — «Провайдер, с которым мы сотрудничаем, сейчас не может предоставить сервис распознавания лиц».

По фану возникла идея проверить, можно ли реализовать распознавание лиц самостоятельно, без привлечения сторонних сервисов и провайдеров? Ведь в открытом доступе достаточно много предобученных нейронных сетей распознавания лиц и инструментов для их использования. Взять хоты бы решения:

Цель была сформулирована.

Постановка задачи и инструменты

Поскольку нужно исключить зависимость от различных сторонних сервисов, решение должно работать исключительно внутри портала Битрикс24. Отсюда естественным вариантом реализации является локальное приложение, которое будет:

  • распознавать лица из видеопотока или загруженного изображения,

  • работать на любом облачном платном тарифе Битрикс24,

  • использовать только открытые модели и инструменты.

Выбор инструмента для решения поставленных задач остановился на библиотеке face-api.js. Из плюсов:

  • реализована на открытой библиотеке от Google tensorfow.js,

  • имеет предобученные и адаптированные для работы модели нейронных сетей распознавания лиц.

Архитектура и функционал приложения

  1. В качестве входных данных приложение принимает видеопоток с web-камеры или загружаемое изображение-фотографию.

  2. Если на входных данных распознано лицо - приложение позволяет создать контакт в Битрикс24 и сохраняет в нем загруженное изображение и его дескриптор (цифровой отпечаток).

  3. В режиме идентификации приложение принимает загруженное изображение, выполняет поиск в базе контактов и возвращает контакт с наиболее похожим изображением-фотографией.

Немного теории

В качестве дескриптора (цифрового отпечатка лица) будем использовать вектор из 128 числовых значений. Это является распространенной практикой в решении задачи распознавания лиц, которую в частности применяют как предобученные модели face-api.js, так и известная библиотека dlib, она нам также пригодится для наполнения базы контактов и тестирования нашего приложения. Поиск "похожего" лица из входных данных в базе идентифицированных изображений, хранящихся в контактах, выполняется путем попарного сравнения дескрипторов. В качестве меры "похожести" используется евклидово расстояние между сравниваемыми векторами.

Подумаем о скорости поиска. Инструментом поиска похожего лица будет Битрикс24 REST API, а значит поиск можно выполнять только по операции равно / не равно. Данная операция не подходит для решения нашей задачи, т.к. нужно оценивать не полное сходство дескрипторов а меру их близости, поэтому для организации поиска будем держать в памяти два варианта реализации:

1) основной: дескрипторы хранятся в строковом поле контакта «как есть». При запуске приложения дескрипторы всех контактов считываются в память приложения, откуда уже выполняется поиск контакта с наиболее похожим лицом. Здесь, конечно, главный вопрос — какое количество контактов может быть загружено в память для устойчивой бесперебойной работы приложения? На него мы ответим в ходе тестирования.

2) запасной: дескрипторы хранятся в поле контакта в виде локально‑чувствительных хэшей (LSH), предварительно рассчитанных для каждого контакта. Тогда поиск похожего контакта можно выполнять через REST API, применяя операцию сравнения. Основным минусом данного варианта является снижение достоверности получаемых результатов, поскольку преобразование дескриптора в LSH неизбежно ведет к частичной потере информации.

В итоге, попробуем сначала реализовать основной вариант, если результаты будут неудовлетворительными, воспользуемся запасным.

И еще озаботимся получением набора фотографий лиц для создания базы "известных" контактов в Битрикс24. Конечно можно воспользоваться опубликованными датасетами, например этим. Но мы же разрабатываем приложение, работающее в реальных "боевых" условиях, поэтому аватарки профилей ВКонтакте - наше все! Здесь тебе и фото, снятые под различным углом и в разном освещении, и фото в очках, шляпах и бог еще знает в чем, и несколько лиц на одной фотографии, в общем полный комплект.

Одна, задача - как вычислить дескрипторы лиц для этиз фото и залить их в контакты Битрикс24? face-api.js больше заточен для работы с фронтендом, поэтому воспользуемся библиотекой dlib, которая на выходе генерирует все тот же дескриптор-вектор из 128 чисел.

Предварительно я сравнил дескрипторы, рассчитанные face-api.js и dlib для одинаковых фотографий. Ни в одном случае они не совпали, среднее расхождение колебалось в пределах 0.07 - 0.15. Наверное это расхождение можно уменьшить подстройкой используемых моделей, но закапываться в такие дебри не хотелось да и расхождение не превышало пороговых значений, поэтому использовал настройки моделей по умолчанию. Кому интересно, скрипт для извлечения фото аватарок из ВКонтакте писался на python с использованием библиотек:

  • vk_api - для извлечения фото аватарок из профилей VK,

  • face_recognition - обертка dlib на python для расчета дескрипторов,

  • fast_bitrix24 - библиотека реализующая REST API для сохранения фото и дескрипторов в контактах Битрикс24

В итоге, на портале была создана база из 85000 контактов. Вполне себе репрезентативная выборка.

Реализация

Здесь мало есть что сказать. Код приложения выложен на Github. Чтобы протестировать, достаточно:

1. добавить на портале Битрикс24 в контакты текстовое поле в котором будет храниться дескриптор лица контакта. И прописать ID этого поля в файле **script.js**, вот в этой строке кода

BX24.appOption.set('DESCRIPTOR_FIELD_ID', "UF_CRM_ID__");

2. скачать репозиторий, упаковать его в zip-архив и установить на Битрикс24-портале как локальное приложение.

Большинство внешних зависимостей на используемые js библиотеки и преобученные модели нейронных сетей - через cdn-ссылки. В приложение затащил только библиотеку face-api.js. Связано это с конфликтом версий с tensorflow.js, на которой основана face-api.js, подбирать версии не хотелось, поэтому остановился на этом рабочем варианте.

Базу контактов с фото и расчитанными дескрипторами в репозиторий конечно не положил. Но проверить работу приложения можно и без нее. В интерфейсе предусмотрено создание на портале Б24 новых контактов по загруженному с локального диска изображению или видеопотоку с web-видеокамеры.

Как работает приложение

При запуске приложения на портале Битрикс24 браузер запросит доступ к вебкамере (если есть). Разрешаем, тогда в приложении можно делать фото из видеопотока. Если камеры нет - загружаем изображение с компьютера.

С загруженным изображением можно:

1. создать на его основе новый контакт в Битрикс24. В контаке помимо фото изображения, ФИО и телефона созранится дескриптор распознанного на изобрадении лица

2. Найти контакт с максимально похожее лицом. Если вы добавили новый контакт и сразу хотите проверить как работает поиск нужно через F5 перезагрузить приложение.

В информационном блоке отображается вспомогательная информация:

  • найдено ли лицо на изображении. Проверка выполняется каждый раз, когда делается новый снимок с видеопотока или загружается изображение с локального диска,

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

В блоке приложения "Наиболее похожий контакт" отображается контакт из базы Битрикс24 с наиболее похожим лицом

Тестирование

Тестировалось не само приложение а работоспособность первоначальной идеи - в Битрикс24 возможно создать автономный рабочий инструмент распознавания лиц без привязки к сторонним сервисам. Поэтому в качестве критериев для проверки идеи были выделены:

  1. Скорость нахождения на входном изображении лица и его идентификация (расчет дескриптора) - в пределах 0.3 - 0.5 сек.

  2. скорость поиска наиболее похожего лица в базе контактов - менее 1 секунды

  3. количество контактов, которое может быть размещено в памяти приложения при основном варианте реализации - 85000 (вся тестовая выборка)

  4. время загрузки контактов в приложение - количество контактов 85000, время загрузки - 37 мин. Много конечно, но если держать приложение все время открытым, для решения конкретной задачи распознавания лиц - это время не критично.

  5. объем памяти, занимаемый контактами в приложении - 151 Мб.

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

При больших объемах данных нужно будет организовывать поиск через LSH-хеши ну или другое решение.  

Выводы

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

2. Использованный в публикации подход к реализации может быть применен для разработки приложений, решающих самые различные задачи автоматизации на порталах Битрикс24 любых облачных и коробочных версий, например:

  • учет времени прихода/ухода сотрудников компании,

  • ведение статистики посещений клиентов,

  • регистрация новых клиентов на портале Битрикс24,

  • поиск информации по фотографии клиента в социальных сетях

    ... и многое другое. Как говорится у кого на что фантазии хватит.

Комментарии (0)