Данный репозиторий включает в себя решение задачи разработки системы распознавания эмоций.
Процесс был разбит на 2 этапа:
- Разработка модели классификации эмоций
- Реализация real-time системы c использованием веб-камеры по выводу на экран текущей эмоции
Изначально была спроектирована собственная свёрточная сеть (Custom.ipynd), которая вышла на плато по качеству валидации при значении ~0,45.
Однако во избежание "изобретения велосипеда", было решенио использовать архитекутры из ModelZoo. Опираясь на сравнительную таблицу,
взятую с интернет-ресурса PyTorch for Beginners: Image Classification using Pre-trained models, я решил остановить выбор на 3-ёх архитектурах: VGG19, ResNet50 и ModileNet V2. Выбор обоснован как тем, что данные архитектуры обладают относительно малым инференсом и находятся в свободном доступе в пакете TensorFlow.
Из-за специфики задачи использовался подход fine-tuning. Дело в том, что модели из "зоопарка" обучены на датасете ImageNet, где различия между классами гораздо более значительные нежели рахличия между эмоциями людей. Поэтому я решил разморозить все слои модели и обучить каждый, опираясь на таблицу (в случае данного кейса актуален 1-ый квадрант),
взятую из публикации Transfer learning from pre-trained models.
Максимальные значения метрики accuracy на валидационных данных получились следующие:
- VGG19 - 0,51 (VGG_19_(AUG).ipynb);
- ResNet50 - 0,49 (ResNet50.ipynb);
- MobileNet V2 - 0,46 (MobileNet_V2_(simple_+_AUG).ipynb).
Данные значения соответствуют обучению с аугментацией данных. Без неё метрика accuracy в среднем была ниже на 5-6%. Соответственно, основой для продолжения разработки стала модель с архитекутрой VGG19.
Изначально после обучения модель НЕ соответствовала требованиям по времени инференса (58-66мс на 1 кадр против максимально допустимых 33мс). Для алгоритмического ускорения был использован пакет TensorRT с собственным "ифнвренс-движком", который относительно недавно был встроен непосредственно в библиотеку TensorFlow. После подобной модификации модели скорость инференса приблизиласт к значениям 5-10мс на 1 кадр.
Отдельный блокнот (Kaggle_format.ipynb) служил для формирования файла на платформу Kaggle. Итоговый результат посылки получился следующий:
На платформе присутствует 2 попытки отправки файла submission.csv из-за того, что в первый раз словарь с названиями классов был сформирован неправильно: нужно было пометить их в алфавитном порядке, а не в том, как они расположены на Google Drive
Cкрипт для классификации эмоций с использованием веб-камеры main.py написан в Visual Studio Code. Для использования веб-камеры применяется функционал библиотеки OpenCV.
Есть 2 способа запуска системы на вашем устройстве:
- Скачать архив по ссылке, распаковать на своё устройство и запустить файл main.exe. После небольшого ожидания должна запуститься камера
- Руководствоваться следующими указаниями (в этом случае для воспроизведения решения на Вашем устройстве должен быть установлен Python. Для установки см. ссылку).
Шаги для использования системы распознавания эмоций:
- Скачать haarcascade_frontalface_default.xml из данного репозитория.
- Скачать модель по классификации эмоций одним из 2-ух следующих способов:
- Скачать и распаковать архив с моделью по классификации эмоций по ссылке
- Скачать модель, обученную самостоятельно и ускоренную с помощью TensorRT (в таком случае модель должна обучаться на изображениях (128, 128, 3) для воспроизводимости скрипта)
- Скачать файл main.py
- Скрипт main.py, модель haarcascade_frontalface_default.xml и папка с моделью по классификации эмоций (saved_model_trt либо Ваша модель) должны лежать в 1 директории
- В папке с файлом main.py открыть командную строчку и прописать py main.py
- Если у Вас не установлен Keras или cv2 (OpenCV), то понадобится прописать pip install keras или pip install opencv-python соответственно, а после повторить шаг 5.
- test_kaggle.zip;
- train.zip;
- VGG19 model (21 эпоха);
- saved_model_trt (VGG19 model (21 эпоха) + TensorRT).