Поиск актёра по фото в 2021 году
Приложение из 2021 года, которое искало актёра, который больше всего похож на фото.
Сейчас это кажется тривиальной задачей, уверен, любое API нейросетей сможет найти актёра, похожего на фото. Скорее всего, даже есть какой-то промпт для этого. Но тогда такой роскоши не было, и я хотел сделать полный цикл без использования сторонних API. В 2017 я уже делал похожего бота, но он работал долго и тратил кучу оперативки на предсказание. Было решено освежить алгоритм и сделать всё элегантней.
Сбор датасета
Оказалось, я бережливый, и у меня остался датасет, в котором 40к фото актёров с известного всем сайта. Но на тот момент я решил собрать этот датасет заново. Для того чтобы найти похожих людей, нужно на фотке в датасете получить координаты лица (где это лицо находится вообще), а потом получить из этого лица 128 float-чисел (это вектор). У разных фоток одного и того же человека вектора направлены в пространстве примерно в одно и то же место. Получился простой алгоритм сбора датасета: скачивается фото актёра, сохраняется его имя, внутренний id, фото; на фото находится лицо; из лица извлекается вектор и сохраняется в датасет. Я брал только популярных актёров, получилось набрать 100к фоток, весом около 5 гигабайт.
Как ищется совпадение
Со стороны пользователя всё просто: человек загружает своё фото, бекенд находит на нём лицо, получает те же 128 чисел вектора и с помощью обученного классификатора по методу k-ближайших соседей находит векторы, которые направлены в ту же сторону, что и у фото пользователя. На выходе получается id самого близкого фото в базе актёров. Два фото склеиваются вместе, чтобы визуально оценить сходство, и пользователь видит уже готовое фото с небольшой информацией об этом актёре.
Кстати, интересный момент: в датасете были актёры и актрисы фильмов для взрослых. Я решил их не вычищать — так что кто-то неизбежно получал неожиданный результат. Это добавляло приложению элемент сюрприза.
Сборка приложения
Для фронтенда я использовал свой boilerplate на React, который сделал ещё на старте платформы VK Mini Apps. В нём уже решены типовые задачи: автоматическая смена темы, сложная навигация с возможностью создавать панели на лету, работа с API ВКонтакте, свайпбек и ещё куча мелочей. Когда начинаю новый проект, просто разворачиваю boilerplate с GitHub парой команд — и через 10 минут тонкой настройки приложение уже доступно в режиме разработки на Android, iOS и в веб-версии. При этом его можно тестировать сразу на любом устройстве, без всяких туннелей.
Бекенд я развернул на облачном хостинге Jelastic (уже недоступен в РФ). Вся система — это четыре связанных между собой ноды: балансировщик на NGINX, API на PHP 8.0, отдельная нода для ML-функций на Python и база данных. Ноды могут горизонтально масштабироваться, а платишь только за фактическое использование ресурсов. Всю эту систему я поднял за два часа, включая копирование пяти гигабайт изображений в окружение.
Цифры
Тогда интеграция VK Mini Apps в Одноклассники только появилась, и я решил попробовать, насколько это вообще полезно, и не прогадал.
С 17 ноября 2021 по 17 января 2022:
• 80 000 участников ВКонтакте
• 436 226 участников в Одноклассниках
• Победа в Fresh Code от VK Mini Apps
В ОК приложение попало в фичеринг и дало 70% всего трафика. В ВК такой бесплатной рекламы не случилось. К сожалению, монетизировать приложение так и не получилось, поэтому оно поработало какое-то время и я его выключил. Из технических уроков я вынес многое: как работают эмбеддинги лиц, как парсить сайты через headless-браузеры, как проектировать архитектуру с автомасштабированием под непредсказуемую нагрузку и как подружить одно приложение с API сразу двух соцсетей.