
Пока весь мир гонится за распознаванием лиц и отпечатков пальцев, мы в решили взглянуть на человека чуть сбоку — буквально.
Пришел клиент, принес проект. Система поиска родственных связей по фото. Все работает, все ищется, но хочется, чтобы было еще точнее, еще глубже. «А что если сравнивать… уши», — подумали мы.
Почему уши? Потому что они, как и лица, обладают уникальной формой, но в отличие от лица — не меняются с возрастом, не маскируются бородой и не хмурятся на паспортном контроле.
Идеальный кандидат для дополнительного биометрического сигнала. Но не все так просто.
Нам предстоял полный цикл разработки модуля распознавания и сравнения ушей:
Детектировать ухо на изображении;
Построить модель landmark-детекции (чтобы точно знать, где именно ухо);
Удалить фон и изолировать объект анализа;
Построить embedding-модель, которая будет превращать изображение уха в вектор;
Разработать алгоритм сравнения эмбеддингов для поиска по базе.
Остановимся на четвертом пункте — самом интересном: embedding-модель.

Почему Vision Transformers
Сначала мы, как и все приличные люди, пробовали CNN. Быстро поняли, что CNN-архитектуры недостаточно хорошо справляются с вариативностью ушей: угол съемки, освещение, пряди волос, наушники и прочий реальный мир. Классические backbone вроде ResNet50 и EfficientNet давали эмбеддинги, которые были... скажем так, неубедительны.
Тогда мы начали смотреть в сторону Vision Transformers (ViT). Их глобальный взгляд на картинку оказался особенно полезен для выделения сложных контуров уха. К тому же, архитектура на трансформерах позволяла лучше улавливать мелкие и уникальные детали — изгибы, доли, завитки — все, что делает ухо ухом.
Для прототипа мы взяли vit_base_patch16_224, предобученный на ImageNet. Слои адаптировали под задачу биометрии:
выкинули классификационную голову,
добавили head на 128-д размерность эмбеддинга,
применили L2-нормализацию,
потеряли пару вечеров на тюнинг learning rate и заморозку первых слоев.
Получилась легкая, но выразительная модель, которую мы начали обучать на нашей (очень неоднородной) базе ушей.

Однако финальную точность 88% мы получили уже на другой архитектуре — Swin Transformer V2. Это обновленный трансформер с иерархическим патчингом и оконным вниманием, который оказался гораздо устойчивее к шуму и частично закрытым ушам (волосы, капюшоны, аксессуары). Он лучше справлялся с локальными деталями, а при этом не терял контекст всей структуры уха.
Переход на Swin V2 дал нам прирост около 6–8% к точности без увеличения объема данных — просто за счет архитектурных преимуществ. В условиях слабого и шумного датасета — это было решающим.
Данных нет — держи совочек, копай сам
Если вы думали, что датасет с ушами легко скачать с Kaggle — у нас плохие новости.
В отличие от лицевых датасетов, приличного датасета ушей в природе почти не существует. OpenEar? Мало и шумно. EarVN1.0? Почти непригоден без чистки.
Собирать вручную? Можно — но долго и дорого. Мы пошли другим путём.
В качестве базы мы взяли хорошо известный датасет VGGFace2, который изначально предназначен для распознавания лиц. У него богатое разнообразие по ракурсам, возрасту, освещению — и, главное, во многих случаях видны уши.
Дальше — техническая магия:
прогнали датасет через нашу модель детекции уха;
отфильтровали кадры, где ухо перекрыто (волосами, головными уборами и прочим);
собрали чистый поднабор с более-менее открытыми и читаемыми ушами;
аугментировали и нормализовали изображения.
Так у нас появился основной обучающий набор.
А вот для тестирования мы уже собрали отдельный датасет: вручную нашли фото в открытых источниках, спарсили, почистили, разметили. Он получился более разнообразным и «грязным» — и именно на нём финальная модель показала себя особенно стабильно.

Метрики, метрики, метрики
Валидация шла по top-1 accuracy в задаче поиска по эмбеддингам. Прогресс выглядел примерно так:
CNN: 62–70%, сильно плавает от фона и освещения;
Первые версии ViT: 75–80%;
Финальная модель с дообучением и регуляризацией: 88.1%.
Больше всего буста дала комбинированная loss-функция:
loss = 0.8 triplet_loss(anchor, pos, neg) + 0.2 center_loss(embedding, label)
Так мы обеспечили сходимость кластеров эмбеддингов вокруг классов (людей) и при этом сохранили обучаемость по градиентам.
Обработка шума и фона
На удивление, одна из главных проблем была в фоне. Волосы, сережки, капюшоны — все это создавало ложную информацию в эмбеддинге. Поэтому до подачи в ViT мы изолировали ухо:
Детектировали bounding box;
Выделяли landmarks (20 ключевых точек);
Строили маску и вырезали фон;
Только потом масштабировали в input для трансформера.
Это снизило overfitting и улучшило стабильность при inference на реальных фото.
Вывод
Мы построили надежную и достаточно легкую embedding-модель для распознавания ушей. На ViT. С точностью 88%. Без большого датасета. С полной изоляцией объекта. И главное — она действительно помогает в мультибиометрической системе, повышая итоговую точность поиска родственных связей.
Мы не утверждаем, что уши заменят лица. Но как дополнительный биометрический сигнал — они чертовски хороши. Особенно, если с ними правильно обращаться.
Если вы внедряете биометрию, ищете нестандартные сигналы или просто хотите сделать что-то, чего никто не делал — приходите, расскажем, как уши могут быть полезны бизнесу.