Распознавание эмоций с помощью Raspberry Pi, OpenCV, TensorFlow и Keras

В данной статье мы рассмотрим создание системы распознавания эмоций на лицах людей на основе платы Raspberry Pi 4 и пакетов OpenCV, TensorFlow и Keras. Мы будем использовать заранее (предварительно) обученную модель распознавания эмоций на лицах людей в видео потоке реального времени. Мы использовали набор данных “FER2013” для обучения модели с помощью свёрточной нейронной сети (Convolutional Neural Network, CNN), похожей на VGG.

Внешний вид проекта распознавания эмоций с помощью Raspberry Pi, OpenCV, TensorFlow и Keras

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

Общие принципы работы нашего проекта

Для распознавание эмоций (выражения лица) с помощью Raspberry Pi мы в нашем проекте будем выполнять следующую последовательность шагов:

  1. Обнаруживать лица во входном видеопотоке реального времени.
  2. Выделять значащую для нас область лица (ROI).
  3. Использовать модель распознавания выражения лица для определения эмоционального состояния человека.

В нашем проекте мы будем использовать 6 классов распознаваемых эмоций: 'Angry' (сердитый), 'Fear' (страх), 'Happy' (счастливый), 'Neutral' (безразличный), 'Sad' (грустный), 'Surprise' (удивление). То есть распознаваемые изображения эмоций должны относиться к одному из этих классов.

Также на нашем сайте вы можете посмотреть следующие проекты, в которых плата Raspberry Pi совместно с библиотекой OpenCV использовалась для обработки изображений:

Необходимые компоненты

  1. Плата Raspberry Pi 4 (купить на AliExpress).
  2. Камера для Raspberry Pi (купить на AliExpress).

Установка OpenCV на Raspberry Pi 4

Перед началом установки OpenCV обновите программное обеспечение платы Raspberry Pi до последней версии с помощью команды:

Затем установим необходимые дополнения, которые нам понадобятся для дальнейшей установки OpenCV.

Далее установим OpenCV на Raspberry Pi с помощью установщика pip.

Установка Tensorflow и Keras на Raspberry Pi 4

Перед установкой Tensorflow и Keras установим ряд необходимых библиотек:

Далее непосредственно установим библиотеки Tensorflow и Keras с помощью pip. Если в вашей системе используется python3 в качестве окружения по умолчанию для python, то в терминале, соответственно, необходимо использовать команду pip3.

Объяснение программы Raspberry Pi для распознавания эмоций

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

Скачанный вами каталог проекта будет содержать подкаталог (Haarcascades), файл на Python (emotion1.py) и модель (ferjj.h5).

Вначале кода программы мы подключим (импортируем) все используемые библиотеки.

Примечание: мы используем TensorFlow API чтобы импортировать библиотеку Keras.

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

После этого укажем путь к классификатору Haarcascade с помощью функции CascadeClassifier() из библиотеки OpenCV.

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

Тестирование работы распознавания эмоций на изображениях

Внутри функции face_detector_image(img) функция cvtColor() будет использоваться для преобразования входного изображения в черно-белое (с оттенками серого) как показано на следующем рисунке.

Преобразование входного изображения в черно-белое (с оттенками серого)

Затем с изображения мы будем извлекать зону, существенную нам для анализа лица (Region Of Interest, ROI). Используемая нами функция будет возвращать нам 3 важных параметра: ROI лица, координаты лица и исходное изображение. Также вокруг обнаруженного лица будет рисоваться прямоугольник.

Выделение на изображении зоны, существенной для анализа

Далее мы будем передавать данные входного изображения в модель распознавания эмоций с помощью функции face_detector_image(img).

После обработки данных моделью выходной результат будет отображаться на экране вместе с обнаруженным лицом. Выходной результат будет браться из списка class_labels, который мы создали ранее. Мы будем использовать функцию text_on_detected_boxes() чтобы задать внешний вид меткам, которые будут выводиться на экране рядом с обнаруженными лицами. Функция imshow() будет использоваться для отображения окна.

Отображение названия распознанной эмоции на изображении

Распознавание эмоций (выражения лица) в видеопотоке

Для обнаружения лица в видеопотоке будет использоваться функция face_detector_video(img). В данную функцию входной кадр видео передается в виде изображения. Эта функция возвращает координаты обнаруженного лица, его область существенную для анализа (ROI) и исходный кадр. Функция rectangle() используется для рисования прямоугольника вокруг обнаруженного лица.

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

В первых двух строках этой функции мы извлекаем кадр (frame) из входного видеопотока. Затем мы передаем этот кадр в функцию face_detector_video(frame). Далее функция predict() из классификатора используется для распознавания выражений (эмоций) обнаруженных лиц (на кадре). Затем для каждой распознанной эмоции мы назначаем метку исходя из значений записанных в списке class_labels. И, наконец, функция imshow() используется для отображения на экране распознанной эмоции рядом с каждым обнаруженным лицом.

Далее следует основная (главная) функция нашей программы. Внутри нее могут использоваться функции emotionVideo() и emotionImage() в зависимости от того где вы хотите распознавать эмоции на лицах людей – на изображении или в видеопотоке. Если вы хотите распознавать эмоции на изображении, то закомментируйте первые две строки главной функции и раскомментируйте две ее оставшиеся строки. Но перед этим убедитесь, что вы записали правильный путь к входному изображению в переменной IMAGE_PATH.

Тестирование работы проекта распознавания эмоций

Перед тем, как запускать программу проекта на выполнение, подключите к плате Raspberry Pi модуль камеры как показано на следующем рисунке.

Подключение модуля камеры к плате Raspberry Pi

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

Тестирование работы проекта

Исходный код программы на Python

Видео, демонстрирующее работу проекта

Источник статьи

(Проголосуй первым!)
Загрузка...
77 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *