Пока весь мир гонится за распознаванием лиц и отпечатков пальцев, мы в решили взглянуть на человека чуть сбоку — буквально. 

Пришел клиент, принес проект. Система поиска родственных связей по фото. Все работает, все ищется, но хочется, чтобы было еще точнее, еще глубже. «А что если сравнивать… уши», — подумали мы. 

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

Идеальный кандидат для дополнительного биометрического сигнала. Но не все так просто.

Нам предстоял полный цикл разработки модуля распознавания и сравнения ушей:

  • Детектировать ухо на изображении;

  • Построить модель 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%. Без большого датасета. С полной изоляцией объекта. И главное — она действительно помогает в мультибиометрической системе, повышая итоговую точность поиска родственных связей.

Мы не утверждаем, что уши заменят лица. Но как дополнительный биометрический сигнал — они чертовски хороши. Особенно, если с ними правильно обращаться.

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

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


  1. GlazOtca
    26.07.2025 06:02

    На первом рисунке "тот кого нельзя называть"? Да еще и в макияже...