Привет, Хабр! Меня зовут Вадим Селютин, я старший исследователь в компании VisionLabs. Наши решения по распознаванию лиц можно встретить в офисных центрах, московском метро и кассах самообслуживания супермаркетов. Во всех этих кейсах мы используем нейросети, которые адаптируем специально для мобильных устройств.
В этой статье я расскажу про постановку задачи распознавания лиц, подходящие мобильные архитектуры, обучение распознаванию лиц на больших объемах данных и способы повысить точность маленькой архитектуры.
Системы распознавания лиц обычно осуществляют верификацию и идентификацию пользователей:
В первом случае определяется, один ли человек представлен в паре изображений, а во втором идет поиск человека с исходного фото в базе.
Эти задачи можно разбить на два класса: closed-set и open-set. В первом случае есть фиксированная база людей, которая не может изменяться. Здесь достаточно по входной фотографии человека определить его класс из обучающей выборки.
В реальных сценариях, как правило, необходимо подготовить модель, которая бы решала open-set-задачи и распознавала любых людей, не включенных в базу в процессе обучения. Для их решения мы используем расстояние между эмбеддингами, которые извлечены из входных изображений.
Можно сказать, что closed-set — это задачи классификации, а open-set — Metric Learning:
Во втором случае необходимо, чтобы представления похожих объектов были близки друг к другу в пространстве эмбеддинга, а разных — далеки.
Чтобы распознать лицо, нужно сначала найти его на фотографии, затем выровнять и обрезать лишние детали:
Из обработанного изображения с помощью модели глубокого обучения получаем эмбеддинг или, как он еще называется, дескриптор лица.
Последним шагом идет матчинг лиц, когда мы вычисляем расстояния между полученными дескрипторами и сравниваем с каким-то порогом:
В распознавании лиц обычно используются две метрики: True Positive Rate (TPR) и False Positive Rate (FPR). TPR показывает, как хорошо модель определяет человека по фото. Это отношение числа пар фото, на которых модель правильно ответила, что представлен один человек, к числу всех пар фото с одним и тем же человеком.
FPR, наоборот, является метрикой неправильных ответов. Это отношение числа пар фото, где модель неверно ответила, что это один человек, к числу всех пар фото с разными людьми.
В качестве метрики модели обычно смотрят на значение TPR в низких значениях FPR, что соответствует крайней левой области ROC-кривой.
Чтобы построить сильную модель по распознаванию лиц, нужен баланс трех вещей: функции потерь, архитектуры и данных.
Для классификации изображений подойдет любая модель, поверх которой добавляется дополнительный линейный слой. Он приведет выходной эмбеддинг в нужную размерность дескриптора лица.
В ходе обучения модели для распознавания лиц решается задача классификации, а во время продуктового использования уже идет сравнение эмбеддингов лиц между собой:
Возникает сложность: модель должна не только научиться относить эмбеддинг к нужному классу, но еще и учитывать расстояние между эмбеддингами. В этом помогает лосс-функция:
На скрине выше представлена формула типичного лосса для задачи классификации — кросс-энтропии. Здесь:
хi — эмбеддинг лица i-изображения;
W — матрица весов последнего классификационного линейного слоя архитектуры;
b — bias слоя;
yi — номер класса этого изображения в соответствии с разметкой.
Теперь спроецируем эмбеддинги X на гиперсферу фиксированного радиуса S. Тогда мы сможем сравнивать расстояния между векторами в терминах углов между ними. Для этого распишем формулу над экспонентой как скалярное произведение векторов. Далее нормализуем матрицу W и эмбеддинг хi, а bias занулим. Тогда от формулы останется только косинус:
Можно усложнить задачу во время обучения и ввести в лосс дополнительные гиперпараметры m1, m2 и m3, которые называются марджинами:
За счет них расстояние между дескриптором и центром его родного по разметке класса станет в m раз больше, чем его расстояние до любого другого центра класса, который является чужим. Например, в случае двух классов обычный лосс кросс-энтропии позволяет линейно разделить классы между собой:
Если нормализовать векторы и перейти в пространство гиперсферы, внутриклассовые расстояния между точками уменьшатся:
Если еще дополнительно ввести марджины для усложнения задачи, то межклассовые расстояния заметно увеличатся. Этого мы и добивались:
Первыми статьями, где были описаны такие способы добавления марджинов, были SphereFace, ArcFace и CosFace:
В целом можно делать лосс с их комбинациями. Современные лоссы для распознавания лиц вводят различные адаптивные стратегии обучения, которые основаны на качестве изображения или его сложности для распознавания:
Основной компонент мобильных архитектур — depthwise-свертка. В отличие от обычной свертки, в ней каждый канал обрабатывается отдельно, а результаты конкатенируются и затем агрегируются сверткой с ядром размера 1x1:
Такая идея была успешно использована в MobileNet. Эта архитектура была предложена в 2017 году и на тот момент получила 70% точности на тесте ImageNet:
Стоит отметить, что depthwise-свертка является частным случаем групповой свертки, в которой каналы входной feature map разбиваются на группы, обрабатываются отдельно независимыми свертками, а результаты конкатенируются:
Далее вышла статья про MobileNet V2, где авторы заменили обычный residual-блок на inverted residual:
В нем число каналов входной Feature Map сначала увеличивается, затем применяется depthwise-свертка, после чего число каналов уменьшается к исходному значению.
В третьей версии MobileNet авторы добавили Squeeze-and-Excite-модуль к блоку V2, который адаптивно перевзвешивает каналы Feature Map, исходя из их важности:
Другим нововведением была нелинейность h-swish, которая хорошо зарекомендовала себя в мобильных архитектурах:
Третья версия MobileNet смогла превзойти вторую, оставаясь в рамках той же вычислительной сложности.
Эта архитектура была предложена в 2020 году. Ее авторы взяли за основу семейство архитектур, похожее на ResNet, и модифицировали ее, получив более точные множества архитектур:
Результат их работы — блоки RegNet-X и RegNet-Y. RegNet-Y отличается от RegNet-X добавлением Squeeze-and-Excite-модуля:
В этой статье были представлены разные размеры архитектур. Дальше я буду рассматривать мобильные.
В этой архитектуре применяется трюк, очень похожий на идею из статьи ShuffleNet. На Feature Map применяется depthwise-свертка, а результат конкатенируется с самой исходной Feature Map:
В статье GhostNet V2 авторы добавили в блок GhostNet еще дополнительный модуль, имитирующий механизм внимания на изображении:
Такие модификации позволили архитектуре превзойти MobileNet V3 на тесте ImageNet.
В 2022 году вышла статья про архитектуру ConvNeXt. Авторы добавили в модель ResNet различные трюки из архитектуры трансформера Swin. Например, LayerNorm-нормализации или большие ядра размера 7х7:
В этой статье были представлены довольно крупные модели, Поэтому мы обратили внимание на библиотеку Pytorch Image Models с моделями ConvNeXt мобильного размера.
На скриншоте ниже представлены результаты нашей команды при работе с этими архитектурами:
Важно заметить, что это исторические максимумы, которые мы получали для этих архитектур. Каждая модель обучалась со своими гиперпараметрами. Лучшие результаты показывает GhostNet, но у нее больше параметров, чем у остальных моделей. Самые слабые показатели у MobileNet-архитектур. Хороший баланс параметров и результатов тестов показала RegNet-X.
Мы провели замеры скорости выполнения этих моделей:
Заметно, что GhostNet и ConvNeXt медленнее, чем MobileNet и RegNet на CPU, а на GPU они сопоставимы по скорости между собой.
Существуют разные методы ускорения архитектур глубокого обучения. Например, специализированные чипы, а также различные способы квантизации архитектур с переходом в вычисления на меньшей точности. Их я рассматривать в этой статье не буду.
При обучении модели по распознаванию лиц сама природа данных является трудностью:
Отдельным классом в обучающей выборке являются фотографии одного и того же человека. А в типичных датасетах содержатся изображения тысяч или даже миллионов разных людей. Это приводит к тому, что в пайплайне обучения модели матрица весов классификационного слоя будет иметь очень большие размеры:
Соответственно, растет нагрузка на видеокарту:
Типичные методы распараллеливания типа DataParallel не решают эту проблему, поэтому нужен кастомный подход.
Чтобы уменьшить нагрузку при обучении на нескольких картах, разделим колонки этой матрицы, назовем ее W, на группы равного размера и положим каждую группу на свою видеокарту:
Рассмотрим, как будет происходить forward-шаг с таким разбиением. В самом начале у нас есть несколько видеокарт. На каждой карте находится своя группа колонок матрицы W.
Первым шагом собираем эмбеддинги всех минибатчей с каждого процесса и получаем эмбеддинги X для всего батча. Затем на каждом процессе считаем произведение X со своей частью матрицы W. Далее собираем логиты с каждого процесса, после чего можно посчитать итоговый лосс для всего батча.
Во время backward-шага сначала считаем градиенты по локальным логитам каждого процесса. С их помощью обновляем на каждом процессе свою часть весов матрицы W и собираем вместе все локальные градиенты. Последним шагом обновляются веса backbone, копия которых лежит на каждом процессе:
За счет использования такого метода можно заметно сократить нагрузку на каждую видеокарту, даже на датасетах с миллионами классов:
У нас этот метод не дал хороших результатов, но поделюсь нашим опытом из-за его популярности.
Рассмотрим каждую колонку весов матрицы W — классификационного слоя модели — в качестве центра своего класса. Для какого-то эмбеддинга X позитивным классом назовем его родной класс по разметке или по лейблу, а негативным — любой другой:
В 2020 году был представлен метод под названием Partial-FC, который берет из матрицы W центр положительного класса как есть, а центры всех других классов сэмплирует с какой-то низкой вероятностью R:
Его авторы показали, что можно существенно сократить число негативных центров классов в матрице W и практически не потерять в точности модели:
Мы попробовали применить этот метод у себя:
Получили заметное ухудшение в точности моделей разных скейлов. Из этого вывод, что первая стратегия распараллеливания колонок по процессам намного эффективнее для уменьшения нагрузки на каждый из них. Плюс она не дает просадок в точности.
Есть и другие методы для снижения нагрузки. В основном они фокусируются на введении дополнительных буферов, имитирующих хранение полной матрицы классификационного слоя.
Представим, что мы смогли в supervised-режиме обучить очень точную, но также большую и медленную модель по распознаванию лиц, при помощи типичного лосса классификации. Назовем эту сеть «учителем»:
Во время обучения заморозим веса «учителя» и будем работать с маленькой сетью — «студентом»:
В качестве ответов используем не метки классов, а логиты от «учителя». Таким образом можно передать знания от крупной модели к более маленькой и поднять ее точность.
У нас был кейс, когда заказчики попросили сделать две совместимые модели разных размеров, чтобы матчить их дескрипторы между собой. Например, один раз извлечь дескриптор по профильному фото сотрудника с помощью медленной модели. А быструю идентификацию на системе контроля доступа производить с помощью мобильной архитектуры:
Для получения совместимости можно во время дистилляции знаний инициализировать матрицу весов классификационного слоя «студента» матрицей весов от «учителя» и заморозить ее на время обучения. Тогда «студент» выучит то же пространство дескрипторов, что и его «учитель»:
Этот метод дает такие результаты:
На этом скриншоте строки 1 и 2 — результаты модели «учителя» и «студента». Для получения данных в строке 3 для каждой пары фото нужно взять по одному дескриптору от каждой модели и найти расстояние между ними. Результаты такого кросс-матчинга оказывались между результатами исходных моделей, что показывает их совместимость.
Здесь я кратко соберу основные идеи по распознаванию лиц на мобильных устройствах, к которым мы пришли в процессе работы:
лучшую скорость и качество показала мобильная модель RegNet-X;
разбиение матрицы весов классификационного слоя лежит в основе обучения всех современных моделей по распознаванию лиц;
негативные центры классов важны во время обучения, поэтому резкое сокращение их количества приводит к ухудшению точности модели;
с помощью дистилляции знаний можно сделать два совместимых варианта моделей: маленькую и быструю и масштабную и медленную. Каждую из них можно использовать для своих задач.
На этом у меня все, готов ответить на ваши вопросы.
Скрытый текстSphereFace: Deep Hypersphere Embedding for Face Recognition, Liu et al, 2017
https://arxiv.org/abs/1704.08063
CosFace: Large Margin Cosine Loss for Deep Face Recognition, Wang et al, 2018
https://arxiv.org/abs/1801.09414
ArcFace: Additive Angular Margin Loss for Deep Face Recognition, Deng et al, 2018
https://arxiv.org/abs/1801.07698
CurricularFace: Adaptive Curriculum Learning Loss for Deep Face Recognition, Huang et al, 2020
https://arxiv.org/abs/2004.00288
MagFace: A Universal Representation for Face Recognition and Quality Assessment, Meng et al, 2021
https://arxiv.org/abs/2103.06627
AdaFace: Quality Adaptive Margin for Face Recognition, Kim et al, 2022
https://arxiv.org/abs/2204.00964
Xception: Deep Learning with Depthwise Separable Convolutions, Chollet, 2017 https://arxiv.org/abs/1610.02357
Google’s MobileNets on the iPhone, Hollemans, 2017
https://machinethink.net/blog/googles-mobile-net-architecture-on-iphone/
MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications, Howard et al, 2017
https://arxiv.org/abs/1704.04861
CondenseNet: An Efficient DenseNet using Learned Group Convolutions, Huang et al, 2018
https://arxiv.org/abs/1711.09224
MobileNetV2: Inverted Residuals and Linear Bottlenecks, Sandler et al, 2018
https://arxiv.org/abs/1801.04381
Searching for MobileNetV3, Howard et al, 2019
https://arxiv.org/abs/1905.02244
Designing Network Design Spaces, Radosavovic et al, 2020
https://arxiv.org/abs/2003.13678
GhostNet: More Features from Cheap Operations, Han et al, 2020
https://arxiv.org/abs/1911.11907
GhostNetV2: Enhance Cheap Operation with Long-Range Attention, Tang et al, 2020
https://arxiv.org/abs/2211.12905
A ConvNet for the 2020s, Liu et al, 2022
https://arxiv.org/abs/2201.03545
pytorch-image-models
https://github.com/huggingface/pytorch-image-models
WebFace260M: A Benchmark Unveiling the Power of Million-Scale Deep Face Recognition, Zhu et al, 2021
https://arxiv.org/abs/2103.04098
An Efficient Training Approach for Very Large Scale Face Recognition
https://arxiv.org/abs/2105.10375
Partial FC: Training 10 Million Identities on a Single Machine, An et al, 2020
https://arxiv.org/abs/2010.05222
Killing Two Birds with One Stone: Efficient and Robust Training of Face Recognition CNNs by Partial FC
https://arxiv.org/abs/2203.15565
Distilling the Knowledge in a Neural Network, Hinton et al, 2015
https://arxiv.org/abs/1503.02531
Margin based knowledge distillation for mobile face recognition, Nekhaev et al, 2020
https://www.researchgate.net/publication/338959991_Margin_based_knowledge_distillation_for_mobile_face_recognition