распознавание пола по лицу
FaceMatica определит пол, возраст и схожесть по фото
Компания «Вокорд» запустила на своем сайте облачный сервис распознавания лиц FaceMatica, который может определить степень похожести фотографий, а также определить с высокой долей точности пол и возраст человека, изображенного на фотографии
Сервис FaceMatica доступен во всех браузерах. Интерфейс сервиса прост и понятен. Пользователю доступна загрузка как отдельных изображений, так и массовая загрузка до 500 фотографий одновременно. После загрузки фотографий, сервис определяет пол и возраст лиц. Групповые фотографии выделяются в отдельную статистику.
С помощью нейро-сетевого алгоритма распознавания лиц инструмент сравнивает несколько фотографий с эталонным изображением. Сервис отранжирует загруженные фотографии в процентном соотношении степени схожести и составит статистику. Также статистика выдается и по полу и возрасту лиц на загруженных фотографиях.
Разработчики приложений могут в тестовом режиме on-line проверить возможности VOCORD FaceMatica, чтобы в дальнейшем интегрировать сервис распознавания лиц в собственные внешние приложения на основе интерфейса программирования API (Application Programming Interface). Платформа унифицирована для интеграции.
Как определить пол и возраст по фото?
Давайте на конкретном примере рассмотрим, как определить пол и возраст человека на фото с помощью трех строчек кода.
К примеру, имеется следующая информация: пол, возраст и ссылка на фото. Для проверки соответствия воспользуемся библиотекой py-agender языка Python.
Работа библиотеки осуществляется в два этапа. На первом, opencv определяет расположение лица на фото. На втором, нейронная сеть архитектуры EfficientNetB3, которая обучена на наборе данных UTKFace DataSet, определяет пол и возраст обладателя лица на фото.
Для начала импортируем необходимые библиотеки:
Создадим объект детектора пола и возраста:
С помощью opencv загрузим фото:
Далее определим характеристики лица с помощью метода detect_genders_ages объекта agender:
где переменная face_info содержит следующую информацию:
Здесь параметры (‘left’, ‘top’, ‘right’, ‘bottom’, ‘width’, ‘height’) характеризуют расположение лица на фото. Параметр gender характеризует принадлежность к определенному полу, где 0 – соответствует мужчине, 1 – женщине. Т.е. после обработки изображений, по порогу 0.5 разделяем обработанную выборку на мужчин и женщин.
Алгоритм определил, что на данном изображении представлен мужчина (значение пола очень близко к нулю: 0.0075379927), а также, что на этом фото ему 41 с половинкой годика (41.5858), не знаю сколько Константину Хабенскому лет на этом фото, но думаю алгоритм близок к истине.
Хороший пример, четкое изображение и довольно впечатляющий результат. Однако, когда начинаешь применять алгоритм к реальным данным, все не так радужно, как хотелось бы. И дело здесь не сколько в алгоритме, а в качестве исходных данных.
В моем случае это был набор из 1542 изображений с разрешением 300х300. Для 64 изображений алгоритм не смог определить характеристики лица. Основная причина – плохая освещенность в момент фотофиксации (лиц почти не видно). Для 1478 изображений медианное значение ошибки определения возраста составило 4,96 года. На рисунке ниже представлено распределение ошибки:
Для 8.5% изображений (125 из 1478) алгоритм совершил ошибку в определении пола человека. Из них в 122 случаях алгоритм ошибочно принял женщину за мужчину. Повторюсь, не стоит винить алгоритм во всех случаях. В большинстве ошибочных примеров встречалось много лиц в очках, которые могут скрывать некоторые особенности лица. На рисунке ниже представлено распределение возраста для набора данных UTKFace DataSet:
Можно заметить, что большая часть набора данных содержит изображения людей c возрастом 20-40 лет. Несмотря на это алгоритм чаще всего ошибался именно для указанного интервала, т.е скорее всего ошибки связаны с особенностью набора данных, для которого был применен алгоритм. На рисунке ниже представлено распределение возраста людей, на которых алгоритм ошибся:
Py-Agender – интересный инструмент, который может помочь автоматизировать ряд рутинных задач или по крайней мере уменьшить размер выборки для ручного анализа. В статье представлена оценка для специфичного набора данных, возможно в вашем случае алгоритм сработает более результативно.
Определяем возраст и пол человека используя нейронную сеть
У нас была задача отсортировать профили людей по возрасту и полу. Нам нужно было сегментировать базу потенциальных клиентов для запуска тестовых рекламных компаний, для каждой рекламной компании мы подбирали индивидуальные видео которые лучше всего подошли бы людям определенного возраста и пола.
Если вам интересны такие темы и вы хотите и дальше видеть новые публикации и развитие данного модуля, то просим вас поставить нам звездочку ⭐ на Github!
После анализа доступных библиотек, мы нашли интересный репозиторий на Github: https://github.com/davisking/dlib-models
Автор Davis E. King @davisking, он же создатель замечательной библиотеки dlib, предоставил уже натренированную модель на несколько тысяч лиц людей. Но, вот беда… код написан на C++ а рабочей альтернативы на Python мы не нашли.
Модель для определения формы лица (shape_predictor_5_face_landmarks.dat)
Это 5-точечная модель, которая определяет уголки глаз и дно носа. Она обучена на наборе данных из 5-точечных ориентиров от 7198 лиц людей. Автор @davisking создал этот набор данных, загружая изображения из Интернета и комментируя их с помощью инструмента imglab от dlib.
Модель для предсказывания возраста (dnn_age_predictor_v1.dat)
Первоначальный источник для создания модели пришел из документа Z. Qawaqneh: «Глубокая сверточная нейронная сеть для оценки возраста на основе модели VGG-Face». Тем не менее, наши исследования привели нас к значительным улучшениям в CNN модели, что позволило нам оценить возраст человека, превосходящего существующие результаты, с точки зрения точности результата.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Telegram Чат & Канал
Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Таким образом, эта модель является определителем возраста, использующим архитектуру ResNet-10, и обучается с использованием частного набора данных из примерно 110 тыс. различных изображений людей с комментарием в виде их возраста.
Эта модель прогнозирования возраста предоставляется компанией Cydral Technology бесплатно и распространяется по лицензии Creative Commons Zero v1.0 Universal.
Модель для определения пола человека по лицу (dnn_gender_classifier_v1.dat)
Эта модель является гендерным классификатором, обученным с использованием частного набора данных из примерно 200 000 различных изображений лиц, и она была сгенерирована в соответствии с определением сети и настройками, заданными в «Минималистической модели на основе CNN для прогнозирования пола по изображениям лиц«. Даже если набор данных, использованный для обучения, отличается от того, который использовался Г. Антиповым, результаты классификации по оценке LFW в целом схожи (± 97,3%).
Эта гендерная модель предоставляется бесплатно компанией Cydral Technology и распространяется по лицензии Creative Commons Zero v1.0 Universal.
Перенос C++ кода на Python
Изначально, @davisking предоставил два C++ файла которые показывали как работать с натренированными им моделями:
Они выводили результат сразу в консоль, но вот использовать код в рабочем проекте даже на C++ было крайне неудобно. Используя pybind11 мы имеем возможность применить код на C++ в нашем коде на Python. Мы не будем акцентироваться долго на pybind11, но если вы хотите ознакомиться с ним, то рекомендуем статью: Создаем С++ Python расширения с помощью pybind11
Распознавание пола в изображениях и видео
В данной статье представлен алгоритм распознавания пола, обладающий точностью 93.1% [1]. Статья не требует каких-либо предварительных знаний в области обработки изображений или машинного обучения. После прочтения статьи читатель будет в состоянии выполнить рассмотренный алгоритм самостоятельно.
Введение
Взглянув на человека, обычно мы безошибочно определяем пол. Иногда мы ошибаемся, но зачастую в таких случаях это действительно трудновыполнимо.
Часто мы используем некоторый контекст. Так, например, для автора статьи цвет одежды иногда является самым значимым признаком при попытке идентифицировать пол ребенка до 1-2 лет.
Перейдем к задаче определения пола по изображению лица. Каждое изображение лица мы хотим отнести либо к классу мужчин, либо к классу женщин. Нужен некий механизм, который будет решать, к какому классу отнести фотографию. В такой постановке проблема выглядит как типичная задача машинного обучения: есть набор маркированных примеров двух классов: М и Ж. «Маркированных» значит, что каждой фотографии поставлен в соответствие пол изображенного на ней человека. Таким образом, нам нужен некоторый классификатор.
Однако на основании чего классификатор пола будет принимать решение, к какому классу отнести изображение? Нужны некоторые характеристики. Каждое изображение представляет собой матрицу некоторого размера элементы которой кодируют яркость каждого пикселя. Очевидно, что можно использовать пиксели изображения напрямую. Такой подход часто дает неплохие результаты, однако он неустойчив к изменениям освещения и наличию шумов на изображении.
Другим подходом является использование некоторых отношений пикселей. Разработано огромное количество таких отношений или характеристик (features). Исследование применимости конкретного типа характеристик является ключевым этапом многих задач компьютерного зрения.
Характеристики
Для простоты пронумеруем все пиксели в изображении: – означает яркость пикселя с порядковым номером Рассмотрим следующий набор характеристик
Таким образом, для каждой пары пикселей имеем 10 характеристик, для изображения пикселей получаем
характеристик. Еще раз отметим, что характеристики в нашем контексте это всего лишь разности пикселей с примененными правилами, описанными выше.
Очевидно, что не все характеристики стоит использовать для распознавания пола. Более того, обработка такого большого количества чисел может быть неэффективной. Наверняка среди этого набора характеристик есть небольшая часть тех, которые кодируют отличия пола лучше, чем остальные. Так как же выбрать такие характеристики?
Данная задача эффективно решается с помощью алгоритма AdaBoost[2][3], целью которого является выбор небольшого набора ценных характеристик из очень большого начального массива.
Подготовка данных и обучение классификатора
Начнем с подготовки данных. Для обучения и тестирования мы будем использовать базу лиц FERET[4][5]. Она содержит различные фотографии 994 человек (591 мужчин, 403 женщины), причем, для каждого человека приводится несколько фотографий, сделанных в разных позах.
На каждой фотографии необходимо найти глаза, вырезать интересующую нас область и уменьшить ее до размера так чтобы результат был аналогичен следующему шаблону:
К счастью, создатели FERET отметили основные точки на лице вручную, и глаза в их числе. Однако в реальной системе распознавания глаза расставляются специальным алгоритмом, который обычно менее точен, чем ручная расстановка. Поэтому для вырезания интересующих областей на этапе обучения распознаванию пола рекомендуется использовать тот же алгоритм расстановки глаз, который будет в системе распознавания. В этом случае классификатор «обучится» учитывать ошибку расстановки глаз алгоритмом.
В результате предварительной обработки имеем два набора картинок:
Отметим, что для наглядности каждое лицо на рисунке выше имеет размеры пикселей, в действительности в рассмотренном подходе используются изображения размером
пикселей. Обучающая выборка будет использоваться для обучения классификатора, как это следует из названия. Проверочная выборка «неизвестна» классификатору, поэтому с ее помощью можно объективно измерить показатели точности.
Таким образом, необходимо
Теперь попытаемся разобраться с алгоритмом обучения «на словах». Немногим ниже приведена формальная схема алгоритма AdaBoost.
Напомним, что нашей задачей является выбор таких характеристик, которые наилучшим образом могут разделить классы М и Ж. Предположим, что мы уже проанализировали таких характеристик по порядку, и приступаем к анализу
Значения характеристики для первых трех обучающих примеров
значение вектора меток для этих примеров
. Если принять значения
характеристики как прогноз пола, то вектор ошибки в этом случае составит
. Если рассмотреть характеристику
, то
. Таким образом, выбирая между характеристикам
и
, следует предпочесть характеристику
, так как
. Перебрав все характеристики, мы найдем T лучших, которые и будем использовать для классификации.
А теперь формальная процедура обучения.
Обучающие примеры: , где
— изображение,
в случае женского пола,
в случае мужского.
Инициализируем вектор весов :
Для (где T – количество характеристик, которое мы хотим выбрать)
Если пример классифицирован неверно (т.е. ),
.
,
.
Результирующий классификатор представлен формулой:
Попытаемся оценить диапазон значений, которые может принимать . Мы уже отмечали, что
принимает значения на отрезке
. Теперь предположим, что
для некоторого классификатора
. Очевидно, что в этом случае
. Однако будет ли выбран такой классификатор алгоритмом, описанным выше? Очевидно, что не будет, потому что в обучающей выборке всегда найдется такой классификатор
, полученный с помощью операции отрицания
, для которого
и
. Легко видеть, что если пример был классифицирован правильно, то его вес уменьшается умножением на
, и таким образом, примеры, классифицированные неправильно (сложные примеры) получают больший вес.
Теперь вернемся к вопросу об избыточности, которым мы задавались ранее. Наличие в выборке классификаторов, полученных отрицанием , ограничивает
на отрезке
и позволяет весам сложных примеров расти.
Учитывая размеры входных матриц, выбор первых 1000 характеристик стандартным алгоритмом AdaBoost занимает около 10 часов (Intel Core i7). Стандартным, значит, пробегая по всем характеристикам. Существуют версии алгоритма, которые работают со случайными характеристиками из всего набора, однако их описание выходит за рамки данной статьи. Время обучения 10 часов является приемлемым результатом для данной задачи, так как это одноразовая операция.
Отметим, что результатом алгоритма являются пары индексов пикселей, которые необходимо сравнивать, одно из пяти правил сравнения и величина для каждой пары. Фактически для анализа фотографии необходимо только посчитать разности, применить выбранное правило и найти решение по формуле для
. Поэтому данный алгоритм совершенно не требователен к ресурсам и не замедляет систему распознавания, в которой используется.
Результаты
Теперь самое интересное! Какие же характеристики выбрал AdaBoost?! Ниже представлены первые 50 характеристик, которые выбрал AdaBoost. Красный и белый пиксели это и
. При анализе пикселей около краев изображения необходимо помнить, что лица многих людей не помещаются в рамку. Поэтому краевые пиксели могут, некоторым образом, кодировать размер лица.
Рассмотрим зависимость точности классификации от количества использованных характеристик.
Отметим, что график получен с помощью данных из базы лиц FERET, которые AdaBoost «не видел» на этапе обучения. Максимальная точность в 93.1% достигается при использовании 911 характеристик. Авторы данного подхода сообщают точность 94.3%, что очень близко к полученному показателю. Разница в 1.2% может возникнуть из-за разного разбиения на обучающую и проверочную выборки. Также в данной статье для поиска глаз использовался собственный алгоритм, точность которого отличается от точности расстановки глаз человеком в базе FERET.
Однако что если классификатор обучился распознавать только ту базу, на которой он был обучен?! Похожий эффект возникает, когда ученик, готовясь к экзамену просто заучивает формулы, задачи, примеры, без понимания сути. Такой ученик способен решить только те задачи, которые он уже видел, и не способен распространить свои знания на новые проблемы. Данный эффект в машинном обучении называется overfitting (переобучение) и является серьезной проблемой в распознавании. Противоположный ему эффект носит название generalization (обобщение).
Для проверки способности обобщать воспользуемся еще одной базой лиц — Bosphorus Database [6][7]. Она состоит из фотографий 105 человек. База содержит до 35 различных выражений лица на каждого человека.
График ниже аналогичен графику, представленному чуть выше, с той лишь разницей, что получен с помощью Bosphorus Database (т.е. исключается возможность знакомства с тестовой выборкой).
Тестовая выборка включает 1300 фотографий (727 М и 573 Ж). Максимальная точность в 91% достигается при 954 характеристиках. Отметим, что отметка в 90% достигается уже при 100 характеристиках.
Эти два графика, а также видео, которые присутствуют в статье, демонстрируют высокую точность работы данного подхода на данных, которые он «не видел» на этапе обучения. Именно поэтому он считается state-of-the-art алгоритмом для распознавания пола.
Следующее видео показывает работу алгоритма на фрагментах телепередач. Для достижения такой точности используется «сглаживание» результатов во времени: каждое лицо наблюдается в течение 19 кадров, на каждом из которых определяется пол. В качестве результата выбирается пол, встретившийся наибольшее число раз за последние 19 кадров.
VisionLabs создала Telegram-бот, который определяет пол и возраст по фотографии
Компания VisionLabs представила первую версию бота в Telegram, которая позволяет определить пол и возраст человека. Об этом Inc. рассказал представитель VisionLabs.
Чтобы воспользоваться ботом, необходимо добавить в список контактов в мессенджере @facevision_bot. Бот предложит пользователю отправить фотографию. Технологии VisionLabs позволяют определить пол человека с достоверностью в 99,7%. Точность определения возраста зависит от освещенности фотографии или макияжа, при этом бот определяет возраст на 75% точнее, чем человек.
В кадре должно быть лишь одно лицо. Если на фото несколько лиц, то бот сообщает пользователю об этом. Алгоритмы способны заметить, что человек носит очки или его нет на изображении.
генеральный директор VisionLabs
«Фактически, бот лишь демонстрирует некоторые из наших возможностей. Потенциал коммерческого продукта намного шире. Технология распознавания возраста и пола позволяет ретейлерам точнее составлять портрет своих клиентов и использовать полученные данные для мерчендайзинга и предоставления таргетированных предложений».
Нейросеть, лежащая в основе технологии, была обучена на сотнях тысяч размеченных фотографий лиц. Технологии позволяют распознать лицо человека в максимально неподготовленных условиях, однако самой высокой точности технология достигает при равномерном освещении (не менее 200 Lux) и нейтральном выражении лица.
В июле компании «Мой график» и VisionLabs представили сервис, который позволяет учитывать рабочее время с помощью технологии распознавания лиц. Так компании хотели сделать доступным для малого бизнеса автоматизированный учет рабочего времени.
Напомним, в июне VisionLabs планировала запустить систему распознавания лиц с помощью веб-браузеров. Платформа предназначалась для компаний финансового сектора.