Андрей Смирнов
Время чтения: ~6 мин.
Просмотров: 0

Помните findface, который искал аккаунты в соцсетях по фото? его купили власти москвы

Система распознавания пользователей в соц сети

Распознавание лиц на загруженном фото

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

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

Рисунок 1. Распознавание пользователей на фото

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

Построение пользовательских профилей

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

Рисунок 2. Трудный профиль

Рассмотрим профиль пользователя, состоящий только из групповых фотографий.
Определить владельца аккаунта (рис. 2) можно если учитывать его пол и возраст, а также друзей, профили которых были построены ранее.

Рисунок 3. Построение пользовательских профилей

Мы строили профиль пользователя следующим образом (Рис. 3):

1) Выбирали наиболее качественные фотографии пользователя

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

  • наличия отметок пользователей на фото (фотопинов) ручным способом;
  • метаинформации фотографии (фото загружено с мобильного телефона, снято на фронтальную камеру, в отпуске, …);
  • фото было на аватарке

2) Искали на этих фотографиях лица

3) Вычисляли характеристический вектор лица

4) Производили кластеризацию векторов

Задача этой кластеризации – определить, какой именно набор векторов принадлежит владельцу аккаунта. Основная проблема – это наличие друзей и родственников на фотографиях. Для кластеризации мы используем алгоритм DBScan.

5) Определяли лидирующий кластер

Для каждого кластера мы считали вес на основании:

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

Коэффициенты параметров, участвующих в вычислении веса кластера обучим линейной регрессией. Честный пол и возраст профиля – отдельная сложная задача, об этом расскажем далее.

Чтобы кластер считался лидером, нужно чтобы его вес был больше ближайшего конкурента на константу, рассчитанную на обучающей выборке. Если лидер не найден, мы еще раз переходим к пункту 2, но используем большее число фотографий. Для некоторых пользователей мы сохраняли два кластера. Такое бывает для совместных профилей — некоторые семьи имеют общий профиль.

6) Получали эмбеддинги пользователя по его кластерам

Эмбеддинг пользователя – это центроид отобранного для него (лидирующего) кластера.
Строить центроиды можно множеством разных способов. После многочисленных экспериментов мы вернулись к самому простому из них: усреднение входящих в кластер векторов.

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

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

Процесс построения всех профилей на портале мы производили несколько раз, так как наличие информации о друзьях повышает качество выбора кластера.
Объем данных необходимый для хранения векторов ~300 GB.

Установка приложения

Программу установить очень просто, достаточно зайти в Play Market и скачать ее. Загрузка осуществляется бесплатно. Если вы хотите расширить возможности утилиты, то вам необходимо заплатить 150-450 р. в месяц и ограничение на бесплатные 30 запросов будут сняты. Также у вас появятся более точные настройки.

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

Описание приложения FindFace

FindFace – это приложение, которое без труда обнаруживает профиль в соцсети «ВК» по фото. Существует браузерная версия утилиты, а также для мобильных устройств под управлением Андроид, IOS. В мобильном приложении значительно меньший функционал. Сервис не является полностью бесплатным. Вы можете воспользоваться им только первые 30 раз, а дальше нужно платить.

Любой человек может сфотографировать кого угодно на улице со своего смартфона, и программа найдет его изображение в соцсети «ВК». Сервис распознает человека по лицу и даже если фото не качественное, он все равно найдет его. Здесь используются новейшие технологии.

Советы

Конечно, мало кому хочется, чтобы его профиль в «ВК» мог обнаружить кто угодно. И это естественно. Что же делать в подобной ситуации? Если вы будете выставлять в профиле «ВК» фото, к примеру, в капюшоне либо сделанные под нестандартным углом, в очках, но в реальной жизни вы выглядите немного иначе. Человек, сфотографировавший вас и попытавшийся найти через программу, не сможет этого сделать.

Если у ваших фото в аккаунте «ВК» доступ является открытым для всех, то сделав ваш снимок на улице, а после, использовав утилиту, любой вас найдет. Поройтесь в настройках приватности. Проанализируйте, что за разрешения у вас стоят на просмотр. Измените их.

Аналоги FindFace

Аналогами FindFace с похожими функциями в сети являются поисковики Яндекс и Google. Также есть хороший сайт – pictriev.com. Используя эти сервисы, вы тоже сможете находить нужных людей по фото. В поисковых системах нужно выбирать на главной странице пиктограмму, похожую на фотоаппарат и вставлять нужный файл либо ссылку на него, а после кликать поиск. На сайте pictriev.com алгоритм действий практически такой же. Любым из перечисленных сервисов пользоваться очень просто, это может сделать каждый желающий, и он получит положительный результат.

Детектор лиц

Первую версию детектора лиц ОК запустили в 2013 году на базе стороннего решения, схожего по характеристикам с детектором на базе метода Виолы — Джонса. За 5 лет это решение устарело, современные решения, основанные на MTCNN, показывают точность в два раза выше. Поэтому мы решили следовать трендам и построили свой каскад из сверточных нейронных сетей (MTCNN).

Для работы старого детектора мы использовали более 100 “стареньких” серверов с CPU. Практически все современные алгоритмы нахождения лиц на фото основаны на свёрточных нейронных сетях, которые наиболее эффективно работают на GPU. Закупить большое число видеокарт мы не имели возможности по объективным причинам: дорого все скупили майнеры. Решено было запускаться c детектором на CPU (ну не выкидывать же сервера).

Для детектирования лиц на заливаемых фотографиях мы используем кластер из 30 машин (остальные пропили сдали в утиль). Детектирование при построении пользовательских векторов (итерации по аккаунтам) мы делаем на 1000 виртуальных ядрах с низким приоритетом в нашем облаке. Облачное решение детально описано в докладе Олега Анастасьева: One-cloud — ОС уровня дата-центра в Одноклассниках.

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

Рисунок 4. Примеры большого количества кандидатов после первой сети в каскаде

Оптимизируя этот случай, мы высказали предположение, что на фотографии обычно немного лиц. Поэтому, после первого этапа каскада мы оставляем не больше 200 кандидатов, опираясь на уверенность соответствующей нейросети в том, что это лицо.
Такая оптимизация уменьшила время худшего случая до 350 мс, то есть в 4 раза.

Применив пару оптимизаций (например, заменив Non-Maximum Suppression после первой ступени каскада на фильтрацию на основе Blob detection), разогнали детектор ещё в 1.4 раза без потери качества.
Впрочем прогресс на месте тоже не стоял, и сейчас искать лица на фото принято более элегантными методами — см. FaceBoxes. Не исключаем, что в ближайшее время и мы переедем на нечто подобное.

Рейтинг автора
5
Материал подготовил
Максим Иванов
Наш эксперт
Написано статей
129
Ссылка на основную публикацию
Похожие публикации