Введение

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

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

Одно изображение может быть разбито на бесконечное количество категорий. Изучение и классификация фотографий вручную может занять много времени, особенно когда их большое количество (скажем, 10 000), поэтому автоматизация процесса с помощью компьютерного зрения была бы весьма полезной. Вот несколько примеров классификации изображений:

  • Является ли рентген раковым или нет (бинарная классификация).
  • Классификация цифры, написанной от руки (мультиклассовая классификация).
  • Нанесение имени на снимок лица человека (мультиклассовая классификация).

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

Глубокое обучение также является очень популярным методом распознавания выражений лица (FER) и классификации. Сети глубокого убеждения (DBN) и сверточные нейронные сети (CNN) — это две формы алгоритмов глубокого обучения, которые использовались для обнаружения выражения лица. Наш подход заключается в реализации нескольких из этих контролируемых и неконтролируемых алгоритмов и сравнении их результатов, чтобы найти наилучшую доступную модель классификации.

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

Обзор

Структура задачи классификации изображений — распознавания лиц для нашего проекта выглядит следующим образом:

  1. Загрузка данных
  2. Извлечение признаков
  3. Обработка изображений
  4. Обработка данных с помощью алгоритмов ML
  5. Просмотр результатов
  6. Реализовать Gradio (полностью функциональный интерфейс)

Важно:

  • Для этого проекта мы используем Google Drive и блокнот Google Collab.
  • Для этого проекта мы разделим наши данные на следующие:
  1. Данные поезда (внутренние)
  2. Валидация (внутренняя)
  3. Данные общедоступного тестирования
  4. Частные тестовые данные

Загрузка данных

Для этого проекта мы используем данные изображений из Kaggle, ссылки на которые приведены ниже: https://www.kaggle.com/competitions/challenges-in-representation-learning-facial-expression-recognition-challenge/data.

Введение в набор данных

Пьер-Люк Кэрриер и Аарон Курвиль разработали этот набор данных в рамках продолжающихся исследований. Они любезно предоставили предварительную версию своего набора данных организаторам семинара для включения в этот конкурс на Kaggle.

Данные содержат изображения лиц в градациях серого с разрешением 48x48 пикселей. Лица были автоматически зарегистрированы таким образом, что они более или менее центрированы на каждом изображении и занимают примерно одинаковую площадь. Цель состоит в том, чтобы поместить каждое лицо в одну из семи категорий в зависимости от эмоций, выраженных в выражении лица (0 = злость, 1 = отвращение, 2 = страх, 3 = счастье, 4 = печаль, 5 = удивление, 6 = нейтрально). .

«Эмоции» и «пиксели» — это две колонки в train.csv. Столбец «чувство» включает числовой код, обозначающий эмоцию, присутствующую на картинке, в диапазоне от 0 до 6 включительно. Для каждого изображения столбец «пиксели» содержит строку, заключенную в кавычки. Эта строка содержит значения пикселей в порядке строк, разделенные пробелами. Единственный столбец в test.csv — это «пиксели», и ваша цель — спрогнозировать столбец эмоций.

В обучающем наборе 28 709 экземпляров. В общедоступном тестовом наборе, используемом для таблицы лидеров, 3589 случаев. Еще 3589 образцов составляют окончательный тестовый набор, который использовался для определения победителя этого мероприятия Kaggle.

Загрузка данных для проекта

Чтобы работать с этими данными, мы выполняем следующие шаги:

  1. Загрузите файл «fer2013.tar.gz» по ссылке ниже и используйте его для своего блокнота Jupyter или Google для совместной работы.
  2. Создайте и откройте новый блокнот Google для совместной работы и подключите диск к блокноту для совместной работы, используя приведенный ниже код.

3. Откройте расположение файла fer2013.tar.gz, например:
%ls
%cd /content/drive/MyDrive/Colab Notebooks/FinalProject-Dataset

4. Разархивируйте файл fer2013.tar.gz, используя приведенную ниже функцию.

5. Загрузка данных в поезд, общедоступный тест и частный тест DataFrame, как показано ниже.

Попытка просмотра данных:

Пример результатов из кода выше:

Извлечение признаков

Извлечение признаков относится к процессу преобразования необработанных данных в числовые признаки, которые можно обрабатывать, сохраняя при этом информацию в исходном наборе данных. Это дает лучшие результаты, чем применение машинного обучения непосредственно к необработанным данным. Чтобы выполнить успешное извлечение признаков, мы выполним следующие шаги:
— Подготовка обучающих, проверочных и тестовых наборов данных
— Кодирование функций и меток для всех наборов данных.

Для этого проекта мы также будем:
— сохранять и загружать данные в локальные файлы и из них.

Подготовьте данные для обучения и проверки

Для этого проекта мы разделим наши обучающие данные на внутреннее обучение и внутренние наборы данных проверки, как показано в коде ниже,

Мы используем функции выборки, удаления и сброса данных индекса из библиотеки pandas DataFrame, чтобы разделить наши обучающие данные на внутренний набор данных для обучения и проверки.

Функции кодирования и метка для всех наборов данных

Модели машинного обучения могут работать только с числовыми значениями. По этой причине необходимо преобразовать категориальные значения соответствующих признаков в числовые. Этот процесс называется кодированием признаков. Чтобы выполнить кодирование, мы используем LabelEncoder из библиотеки предварительной обработки sklearn.

Мы кодируем наши данные, используя код, как показано ниже,

Получение количества меток для всех наборов данных

Вот результаты после реализации функции выше,

Сохранение данных и их загрузка из локального файла

Сохранение данных путем создания локальных файлов,

Чтобы проверить, присутствуют ли файлы в каталоге или нет, мы можем использовать команду %ls. После подтверждения доступности файлов мы можем импортировать данные из этих файлов, используя приведенный ниже код:

Предварительная обработка изображений

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

Для этого проекта мы выполняем стандартизацию. Стандартизация — это метод масштабирования, при котором результаты центрируются вокруг среднего значения с единичным стандартным отклонением. В результате среднее значение атрибута становится равным нулю, а результирующее распределение имеет единичное стандартное отклонение. Его также называют масштабированием MinMax.

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

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

Обучение модели

Это важный этап в процессе, когда методы контролируемого или глубокого машинного обучения используются для поиска наиболее интригующих закономерностей на картинке, признаков, которые могут быть уникальными для определенного класса и впоследствии помогут модели различать их. Этот процесс, когда модель изучает функции из набора данных, называется обучением модели. Для этого проекта на этом этапе сравниваются шаблоны изображений с целевыми шаблонами и классифицируются наблюдаемые элементы по указанным классам с использованием соответствующего метода/модели классификации.

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

Основное отличие состоит в том, что при поиске по сетке мы определяем комбинации и обучаем модель, а в RandomizedSearchCV модель выбирает комбинации случайным образом. Оба являются довольно успешными методами повышения обобщаемости модели за счет настройки параметров.

Когда размерностей меньше, случайный поиск является лучшей стратегией поиска параметров. Бергстра и Бенжио эмпирически и теоретически доказывают, что случайный поиск более эффективен для оптимизации параметров, чем поиск по сетке, в своей работе «Случайный поиск для оптимизации гиперпараметров».

k-NN

Классификатор k-Nearest Neighbor на сегодняшний день является самым простым алгоритмом машинного обучения/классификации изображений. На самом деле, это настолько просто, что на самом деле ничему не «обучается».

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

Проще говоря, алгоритм k-NN классифицирует неизвестные точки данных, находя наиболее распространенный класс среди k-наиболее близких примеров. Каждая точка данных в k ближайших примерах дает право голоса, и категория с наибольшим количеством голосов побеждает!

Или, говоря простым языком: «Скажи мне, кто твои соседи, и я скажу, кто ты».

Чтобы применить классификацию k-ближайших соседей, мы обычно определяем метрику расстояния или функцию сходства. Общие варианты включают евклидово расстояние и расстояние Манхэттен/городской квартал.

Другие метрики расстояния/функции подобия могут использоваться в зависимости от вашего типа данных (расстояние хи-квадрат часто используется для распределений [т.е. гистограмм]).

Для набора данных изображений этого проекта KNN реализован с настройкой гиперпараметров, как показано ниже:

Время выполнения для приведенной выше модели: 8 мин.

Набор гиперпараметров: {'n_neighbors': [1, 3, 5, 7, 9]}

Реализован рандомизированный поиск

SVM

«Машина опорных векторов» (SVM) — это контролируемый метод машинного обучения, который может решать задачи классификации и регрессии. Однако он в основном используется для решения задач категоризации. Каждый элемент данных отображается в виде точки в n-мерном пространстве (где n — количество признаков), при этом значение каждого признака является значением определенной координаты в этом методе SVM. Затем мы завершаем классификацию, находя гиперплоскость, которая четко различает два класса.

Вот некоторые из ключевых параметров SVM:

  • C: Контролирует стоимость просчетов

Маленькая буква C — снижает стоимость неправильной классификации.

Большой C — делает стоимость неправильной классификации ВЫСОКОЙ

  • Ядро: алгоритмы SVM используют набор математических функций, которые определены как ядро.
    Типы ядер: линейное, RBF (радиальная базисная функция), полиномиальное ядро.
  • Гамма: определяет, насколько влияние отдельных обучающих примеров достигает значений и приводит к необъективным результатам.

Для набора данных изображений этого проекта SVM реализован на ядре RBF с настройкой гиперпараметров, как показано ниже:

Время выполнения: 28 мин.

Набор гиперпараметров: {'C': [0,001, 0,01, 0,1, 1, 10], 'kernel': ['rbf'], 'gamma': [0,001, 0,01, 0,1, 1] }

Реализован поиск по сетке

Древо решений

Деревья принятия решений (DT) по существу представляют собой серию правил принятия решений для преобразования непрерывных данных, таких как спектральная информация из изображения, в дискретные тематические данные, такие как класс земного покрова. Если спектральная информация пикселя (или спектральные изменения, такие как индексы растительности) соответствует определенным требованиям, она будет отнесена к классу земного покрова. Его структура, которая организована иерархически в виде простых бинарных решений (да/нет), дает ему название «Дерево решений».

Для этого проекта мы будем использовать функцию классификатора дерева решений из библиотеки sklearn с настройкой гиперпараметров, как показано ниже:

Время выполнения: 30 мин.

Набор гиперпараметров: {'C': [0,001, 0,01, 0,1, 1, 10], 'kernel': ['rbf'], 'gamma': [0,001, 0,01, 0,1, 1] }

Реализован рандомизированный поиск

Глубокое обучение — сверточные нейронные сети

Сверточные нейронные сети (CNN) — это парадигма, определяющая текущие достижения и улучшения в области глубокого обучения.

CNN бросили вызов ожиданиям и взобрались на трон как самый передовой подход к компьютерному зрению. CNN на сегодняшний день являются наиболее распространенными из нескольких типов нейронных сетей (другие включают рекуррентные нейронные сети (RNN), долговременную кратковременную память (LSTM), искусственные нейронные сети (ANN) и так далее).

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

Для этого проекта мы будем выполнять CNN на обучающих данных с использованием увеличения данных. Создавая свежие и разнообразные экземпляры для обучения наборов данных, дополнение данных может помочь повысить производительность и результаты моделей машинного обучения. Модель машинного обучения работает лучше и правильнее, когда набор данных богатый и достаточный. Мы применяем увеличение данных с помощью класса ImageDataGenerator, который позволяет нам случайным образом поворачивать изображения на любой градус от 0 до 360, предоставляя целочисленное значение в аргументе rotate_range, как в коде ниже:

из tensorflow.keras.preprocessing.image импортировать ImageDataGenerator

Для этого проекта мы строим последовательную модель Conv-2D со сводкой, как показано ниже:

Компиляция модели,

Оптимизатор модели,

Время выполнения: 14 мин.

Сохранение модели обучения

cnn_best.save('CNN_model_Gradio')

Анализ результатов модели

На этом этапе мы выполняем сравнение точности и результатов реализованных моделей, чтобы найти наиболее подходящую модель обучения для нашей цели.

Отчет о классификации

Предварительно построенная функция Classification report from sklearn metrics очень удобна для поиска и определения показателей производительности для каждой модели отдельно.
(https://scikit-learn.org/stable/modules/generated/sklearn.metrics .classification_report.html)

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

Отчет о классификации может быть создан с использованием кода, как показано ниже,

Отчет о классификации для KNN

Отчет о классификации для дерева решений

Точность моделей

Анализ и сравнение точности различных моделей классификации на частных и общедоступных тестовых данных,

k-NN

Дерево решений

Матрица путаницы

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

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

Матрица путаницы для k-NN

Матрица путаницы для дерева решений

Анализ сверточной сети

Точность

Анализ точности Модель сверточной сети может быть сгенерирована с использованием кода, как показано ниже:

Примеры результатов,

График потерь при обучении в зависимости от эпохи

Это можно сгенерировать с помощью кода ниже,

Пример результатов: для нашего проекта результаты из приведенного выше кода приводят к выводу, что наша модель имеет точность 56%.

Реализация проекта сквозного машинного обучения с использованием Gradio

Gradio — это набор инструментов Python, который позволяет легко создавать настраиваемые компоненты пользовательского интерфейса для любой модели машинного обучения, API или любой произвольной функции всего за несколько строк кода. Вы можете либо встроить графический интерфейс в свою записную книжку Python, либо предоставить URL-адрес кому угодно.

Шаг 1. Установите и импортируйте Gradio

Шаг 2. Загрузите предварительно обученную модель

Шаг 3.Загрузите скаляр нормализации

Шаг 4.Переоцените нашу загруженную модель

Шаг 5. Создание тестовых примеров для отладки

Шаг 6.Написание функции прогнозирования для градиента

Шаг 7.Настройка внешнего интерфейса

Шаг 8.Запуск внешнего интерфейса

Блок-схема, изображающая нашу вышеуказанную модель:

Пример интерфейса:

Обсуждение: будущие области распознавания лиц

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

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

В 2022 году и далее несколько секторов будут способствовать прогрессу в области распознавания лиц. Хотя распознавание лиц, несомненно, меняет среду, в которой мы живем, оно также меняет способ использования распознавания лиц во всем мире. Распознавание лиц никуда не денется, и вместо того, чтобы рассматривать его как угрозу для нашей личной жизни, мы должны использовать многочисленные преимущества, которые оно предлагает.

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