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

Мотивация. Большая поклонница BTS бросила мне вызов определить семерых участников группы, просто посмотрев несколько музыкальных клипов (и прослушав ее аудиоаннотации в реальном времени). Это был хороший вызов для меня, и мне потребовалось некоторое время, чтобы правильно ответить на все семь участников. Поскольку мне потребовалось несколько дней, чтобы на самом деле научиться распознавать участников, я решил передать эту задачу машине (алгоритму обучения) и посмотреть, как быстро и насколько точно она сможет научиться распознавать их лица.

Далее последовала краткая последовательность шагов:

  1. Сбор данных — изображения участников были загружены с помощью веб-скрейпинга на селене.
  2. Аннотации и контроль качества. Качество маркировки набора данных было проверено путем ручной проверки.
  3. Распознавание лиц с помощью MTCNN [2]
  4. Преобразование изображений лиц в векторные вложения с использованием предварительно обученной модели Facenet [1]
  5. Обучите классификатор SVM, используя вложения в качестве функций и имена членов в качестве классов.
  6. Оценить результаты классификации
  7. Классифицируйте лица участников в музыкальном видео с помощью классификатора

Сбор данных

Данные, которые нам нужны для распознавания лиц, — это данные изображения. Так как нам нужно обучить модель различать семь членов группы «плохих», нам нужно очистить набор изображений для каждого из участников группы.

Источником данных, который мы используем для этого, являются изображения Google, и мы будем собирать URL-адреса изображений с веб-сайта, используя selenium[3] для python после поиска изображений каждого из семи участников группы.

Кроме того, для получения точных результатов поиска в Pinterest мы будем использовать настоящие имена участников группы вместо названий их групп. Например. — Нам Джун из BTS вместо RM BTS

Начнем с создания структуры папок для того же

Теперь, когда у нас есть структура папок, созданная для тестирования, обучения и всего остального, давайте соберем изображения с изображений Google и сохраним их в соответствующих папках.

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

Очистка данных

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

Кроме того, поскольку каждое изображение аннотировано, мы собираемся продолжить работу только с изображениями, на которых есть соответствующий участник группы в соответствии с метками. В наборе данных есть несколько изображений, на которых присутствовало более одного участника группы, мы используем mtcnn [2] для обнаружения лиц, а изображения с несколькими обнаруженными лицами были удалены из набора данных. При проверке это действительно приводит к небольшому дисбалансу в количестве образцов на класс, но это не является большой разницей. Ниже показано, как мы подсчитываем количество лиц на каждом изображении и удаляем изображения с несколькими изображениями.

Общее количество изображений, которые мы просмотрели по всем участникам = 1226.

Разделение между поездами и тестами

Следующий шаг требует, чтобы мы разделили весь репозиторий изображений на обучающие и тестовые наборы данных. Этот шаг просто требует от нас скопировать изображения из папки «Все» в папки поезда и теста. Для этого варианта использования мы будем использовать разделение поезд-тест 80–20.

Разделение поезд-тест привело к 978 в тренировочном наборе и 248 в тестовом наборе.

Извлечение лиц и создание набора данных для обучения/тестирования

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

  1. Для извлечения лиц мы снова будем использовать mtcnn [2]. Но на этот раз, вместо того, чтобы просто подсчитывать лица, мы будем использовать значения ограничительной рамки для обрезки только лица из изображения. После того, как у нас есть функция для загрузки лиц, нам нужно сохранить значения 2-мерных пикселей в изображениях в виде массивов, которые мы можем позже использовать для получения вложений лиц.

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

Встраивание лиц с помощью Keras-Facenet [1]

Во-первых, давайте загрузим предварительно обученную модель весами. Предварительно обученная модель, которую я получил, была моделью тензорного потока, и я преобразовал ее в модель Keras со ссылкой на keras-inception-resnet-v2.

Как только мы загрузили модель, мы можем использовать значения пикселей лица в качестве входных данных для модели FaceNet [1] и получить встраивания лиц в качестве выходных данных модели.

Вложения будут служить входными данными для обучения модели классификации (обнаружения) лиц. Эта модель дает нам 512 функций встраивания лиц для использования в каждом образце.

Обучающая модель классификации SVM для распознавания лиц

Что такое SVM?

Машины опорных векторов (SVM) — это алгоритм, который помогает создать границу между точками данных в плоскости очень большой размерности. Поскольку у нас есть около 512 измерений из наших вложений лиц с примерно 978 образцами, использование SVM является действительно эффективным выбором. Кроме того, поскольку количество наших функций меньше, чем выборок, нам не нужно слишком беспокоиться о переоснащении модели (или мы можем позже рассмотреть регуляризацию, если это необходимо).

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

Теперь мы будем обучать классификатор SVM из библиотеки sklearn на созданном нами обучающем наборе.

Момент истины: давайте сделаем несколько прогнозов и проверим точность нашей модели распознавания лиц.

Accuracy: train=82.515 test=84.677

Неплохой результат для простой модели без настройки гиперпараметров! Кроме того, мы видим, что наша модель хорошо обобщает и не переоснащает, поскольку точность набора тестов выше, чем точность набора поездов. Хотя позже я сделаю резюме K-Fold, чтобы обеспечить баланс предвзятости и дисперсии.

Давайте также рассмотрим классификацию отдельных изображений:

Для большинства примеров мы видим хорошие результаты. Пришло время использовать это в музыкальном видео и увидеть это в действии! Я скачал музыкальное видео BTS — Life Goes On. Это немного медленно по сравнению с некоторыми другими, и я хотел, чтобы лица участников были немного стабильными, чтобы увидеть это в действии.

Для этого мы будем выполнять покадровую обработку и рендеринг с помощью пакета moviepy [6].

Требуется немного времени на обработку, и вуаля! Ниже ссылка на вывод. Это не 100% точность, но это хороший POC для распознавания лиц и подобных приложений.

Заключение

Мы смогли построить модель распознавания лиц, используя трансферное обучение с хорошей точностью. Этот проект был сделан, чтобы понять, сможет ли алгоритм машинного обучения превзойти меня в задаче различения семи участников, и я могу сделать вывод, что всего с несколькими сотнями изображений Google для каждого участника он смог добиться большего, чем я. Хотя в процессе построения модели и написания этой статьи я сам довел почти до 100% точности 😝.

Эта статья написана, чтобы дать обзор процесса построения модели распознавания лиц для реального приложения.

Спасибо, что прочитали эту статью! Оставьте комментарий ниже, если у вас есть какие-либо вопросы.

Ссылки

[1] Х. Таниай, keras-facenet. 30 августа 2022 г. По состоянию на 30 августа 2022 г. [Онлайн]. Доступно: https://github.com/nyoki-mtl/keras-facenet

[2] И. де П. Сентено, ipazc/mtcnn. 31 августа 2022 г. По состоянию на 30 августа 2022 г. [Онлайн]. Доступно: https://github.com/ipazc/mtcnn

[3] selenium/py в магистрали · SeleniumHQ/selenium, GitHub. https://github.com/SeleniumHQ/selenium (по состоянию на 30 августа 2022 г.).

[4] Дж. Браунли, Как разработать систему распознавания лиц с помощью FaceNet в Keras, Мастерство машинного обучения, 6 июня 2019 г. https://machinelearningmastery.com/how-to -develop-a-face-recognition-system-using-facenet-in-keras-and-svm-classifier/ (по состоянию на 31 августа 2022 г.).

[5] scikit-learn, 31 августа 2022 г. По состоянию на 31 августа 2022 г. [Онлайн]. Доступно: https://github.com/scikit-learn/scikit-learn

[6] Зулко, MoviePy. 31 августа 2022 г. По состоянию на 31 августа 2022 г. [Онлайн]. Доступно: https://github.com/Zulko/moviepy