- Python | Обнаружение улыбки с помощью OpenCV
- Распознавание эмоций с помощью сверточной нейронной сети
- Главные препятствия
- Описание проекта
- Описание данных
- Извлечение признаков
- Архитектура модели по умолчанию
- Мой эксперимент
- Разведочный анализ данных
- Наблюдение
- Повторение эксперимента
- Тест производительности
- Производительность новой модели
- Увеличение (аугментация)
- Мужчины, 5 классов
- Объединяем несколько методов
- Тестируем аугментацию на мужчинах
- Мужчины, 2 класса
- Заключение
- Создание модели распознавания лиц с использованием глубокого обучения на языке Python
- Введение
- Распознавание лиц: потенциальные сферы применения
- Настройка системы: требования к аппаратному и программному обеспечению
- Шаг 1: Настройка аппаратного обеспечения
- Шаг 2: Настройка программного обеспечения
- Внедрение
- Пошаговое руководство
- Пример применения технологии распознавания лиц
Python | Обнаружение улыбки с помощью OpenCV
Детекторы эмоций используются во многих отраслях, одной из которых является медиаиндустрия, где компаниям важно определить реакцию общественности на свои продукты. В этой статье мы собираемся создать детектор улыбки, используя OpenCV, который получает прямую трансляцию с веб-камеры. Детектор улыбки / счастья, который мы собираемся внедрить, был бы сырым, есть много лучших способов реализовать его.
Шаг № 1: Прежде всего, нам нужно импортировать библиотеку OpenCV.
Шаг № 2: Включите желаемые каскады Хаара.
Каскады Хаара — это классификаторы, которые используются для обнаружения признаков (в данном случае лица) путем наложения предопределенных шаблонов на сегменты лица и используются в качестве файлов XML. В нашей модели мы будем использовать haar-каскады лица, глаз и улыбки, которые после загрузки необходимо поместить в рабочий каталог.
Все необходимые каскады Хаара можно найти здесь .
face_cascade = cv2.CascadeClassifier( ‘haarcascade_frontalface_default.xml’ )
eye_cascade = cv2.CascadeClassifier( ‘haarcascade_eye.xml’ )
smile_cascade = cv2.CascadeClassifier( ‘haarcascade_smile.xml’ )
Шаг 3:
На этом шаге мы собираемся построить основную функцию, которая будет выполнять обнаружение улыбки.
- Прямая трансляция с веб-камеры / видеоустройства обрабатывается кадр за кадром. Мы обрабатываем изображение в оттенках серого, так как на них лучше работают каскады.
- Чтобы определить лицо, мы используем:
faces = face_cascade.detectMultiScale(gray, 1.3 , 5 )
где 1.3 — коэффициент масштабирования, а 5 — количество ближайших соседей. Мы можем отрегулировать эти факторы согласно нашему удобству / результатам, чтобы улучшить наш детектор.
Теперь для каждого последующего обнаруженного лица нам нужно проверить наличие улыбок.
def detect(gray, frame):
faces = face_cascade.detectMultiScale(gray, 1.3 , 5 )
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), ((x + w), (y + h)), ( 255 , 0 , 0 ), 2 )
roi_gray = gray[y:y + h, x:x + w]
roi_color = frame[y:y + h, x:x + w]
smiles = smile_cascade.detectMultiScale(roi_gray, 1.8 , 20 )
for (sx, sy, sw, sh) in smiles:
cv2.rectangle(roi_color, (sx, sy), ((sx + sw), (sy + sh)), ( 0 , 0 , 255 ), 2 )
Пояснения —
- Данные лица хранятся в виде кортежей координат. Здесь x и y определяют координаты верхнего левого угла рамки лица, w и h определяют ширину и высоту рамки.
- Функция cv2.rectangle принимает кадр аргументов, верхние левые координаты лица, нижние правые координаты, код RGB для прямоугольника (который будет содержать в себе обнаруженную грань) и толщину прямоугольника.
- roi_gray определяет интересующую область лица, а roi_color делает то же самое для исходного кадра.
- В строке 7 мы применяем обнаружение улыбки с помощью каскада.
Шаг № 4:
Мы определяем main функцию на этом шаге. После выполнения функцию можно прекратить, нажав клавишу «q».
video_capture = cv2.VideoCapture( 0 )
# Захватывает video_capture кадр за кадром
_, frame = video_capture.read()
# Для захвата изображения в монохромном режиме
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# вызывает функцию detect ()
canvas = detect(gray, frame)
# Отображает результат в камере подачи
cv2.imshow( ‘Video’ , canvas)
# Сбой управления после нажатия клавиши q
if cv2.waitKey( 1 ) & 0xff = = ord ( ‘q’ ):
# Отпустите захват, как только закончится вся обработка.
video_capture.release()
cv2.destroyAllWindows()
Выход:
Источник
Распознавание эмоций с помощью сверточной нейронной сети
Распознавание эмоций всегда было захватывающей задачей для ученых. В последнее время я работаю над экспериментальным SER-проектом (Speech Emotion Recognition), чтобы понять потенциал этой технологии – для этого я отобрал наиболее популярные репозитории на Github и сделал их основой моего проекта.
Прежде чем мы начнем разбираться в проекте, неплохо будет вспомнить, какие узкие места есть у SER.
Главные препятствия
Описание проекта
Использование сверточной нейронной сети для распознавания эмоций в аудиозаписях. И да, владелец репозитория не ссылался ни на какие источники.
Описание данных
Есть два датасета, которые использовались в репозиториях RAVDESS и SAVEE, я только лишь адаптировал RAVDESS в своей модели. В контекста RAVDESS есть два типа данных: речь (speech) и песня (song).
- 12 актеров и 12 актрис записали свою речь и песни в своем исполнении;
- у актера #18 нет записанных песен;
- эмоции Disgust (отвращение), Neutral (нейтральная) и Surprises (удивленние) отсутствуют в «песенных» данных.
Разбивка по эмоциям:
Диаграмма распределения эмоций:
Извлечение признаков
Когда мы работаем с задачами распознавания речи, мел-кепстральные коэффициенты (MFCCs) – это передовая технология, несмотря на то, что она появилась в 80-х.
Эта форма определяет, каков звук на выходе. Если мы можем точно обозначить форму, она даст нам точное представление прозвучавшей фонемы. Форма речевого тракта проявляет себя в огибающей короткого спектра, и работы MFCC – точно отобразить эту огибающую.
Мы используем MFCC как входной признак. Если вам интересно разобраться подробнее, что такое MFCC, то этот туториал – для вас. Загрузку данных и их конвертацию в формат MFCC можно легко сделать с помощью Python-пакета librosa.
Архитектура модели по умолчанию
Автор разработал CNN-модель с помощь пакет Keras, создав 7 слоев – шесть Con1D слоев и один слой плотности (Dense).
Автор закомментировал слои 4 и 5 в последнем релизе (18 сентября 2018 года) и итоговый размер файла этой модели не подходит под предоставленную сеть, поэтому я не смогу добиться такого же результат по точности – 72%.
Модель просто натренирована с параметрами batch_size=16 и epochs=700 , без какого-либо графика обучения и пр.
Здесь categorical_crossentropy это функция потерь, а мера оценки – точность.
Мой эксперимент
Разведочный анализ данных
В датасете RAVDESS каждый актер проявляет 8 эмоций, проговаривая и пропевая 2 предложения по 2 раза каждое. В итоге с каждого актера получается 4 примера каждой эмоции за исключением вышеупомянутых нейтральной эмоции, отвращения и удивления. Каждое аудио длится примерно 4 секунды, в первой и последней секундах чаще всего тишина.
Наблюдение
После того как я выбрал датасет из 1 актера и 1 актрисы, а затем прослушал все их записи, я понял, что мужчины и женщины выражают свои эмоции по-разному. Например:
- мужская злость (Angry) просто громче;
- мужские радость (Happy) и расстройство (Sad) – особенность в смеющемся и плачущем тонах во время «тишины»;
- женские радость (Happy), злость (Angry) и расстройство (Sad) громче;
- женское отвращение (Disgust) содержит в себе звук рвоты.
Повторение эксперимента
Автор убрал классы neutral, disgust и surprised, чтобы сделать 10-классовое распознавание датасета RAVDESS. Пытаясь повторить опыт автора, я получил такой результат:
Однако я выяснил, что имеет место утечка данных, когда датасет для валидации идентичен тестовому датасету. Поэтому я повторил разделение данных, изолировав датасеты двух актеров и двух актрис, чтобы они не были видны во время теста:
- актеры с 1 по 20 используются для сетов Train / Valid в соотношении 8:2;
- актеры с 21 по 24 изолированы от тестов;
- параметры Train Set: (1248, 216, 1);
- параметры Valid Set: (312, 216, 1);
- параметры Test Set: (320, 216, 1) — (изолировано).
Я заново обучил модель и вот результат:
Тест производительности
Из графика Train Valid Gross видно, что не происходит схождение для выбранных 10 классов. Поэтому я решил понизить сложность модели и оставить только мужские эмоции. Я изолировал двух актеров в рамках test set, а остальных поместил в train/valid set, соотношение 8:2. Это гарантирует, что в датасете не будет дисбаланса. Затем я тренировал мужские и женские данные отдельно, чтобы провести тест.
- Train Set – 640 семплов от актеров 1-10;
- Valid Set – 160 семплов от актеров 1-10;
- Test Set – 160 семплов от актеров 11-12.
Опорная линия: мужчины
- Train Set – 608 семплов от актрис 1-10;
- Valid Set – 152 семпла от актрис 1-10;
- Test Set – 160 семплов от актрис 11-12.
Опорная линия: женщины
Как можно заметить, матрицы ошибок отличаются.
Мужчины: злость (Angry) и радость (Happy) – основные предугаданные классы в модели, но они не похожи.
Женщины: расстройство (Sad) и радость (Happy) – основыне предугаданные классы в модели; злость (Angry) и радость (Happy) легко спутать.
Вспоминая наблюдения из Разведочного анализа данных, я подозреваю, что женские злость (Angry) и радость (Happy) похожи до степени смешения, потому что их способ выражения заключается просто в повышении голоса.
Вдобавок ко всему, мне интересно, что если я еще больше упрощу модель, остави только классы Positive, Neutral и Negative. Или только Positive и Negative. Короче, я сгруппировал эмоции в 2 и 3 класса соответственно.
- Позитивные: радость (Happy), спокойствие (Calm);
- Негативные: злость (Angry), страх (fearful), расстройство (sad).
3 класса:
- Позитивные: радость (Happy);
- Нейтральные: спокойствие (Calm), нейтральная (Neutral);
- Негативные: злость (Angry), страх (fearful), расстройство (sad).
До начала эксперимента я настроил архитектуру модели с помощью мужских данных, сделав 5-классовое распознавание.
Я добавил 2 слоя Conv1D, один слой MaxPooling1D и 2 слоя BarchNormalization; также я изменил значение отсева на 0.25. Наконец, я изменил оптимизатор на SGD со скоростью обучения 0.0001.
Для тренировки модели я применил уменьшение «плато обучения» и сохранил только лучшую модель с минимальным значением val_loss . И вот каковы результаты для разных целевых классов.
Производительность новой модели
Мужчины, 5 классов
Мужчины, 2 класса
Мужчины, 3 класса
Увеличение (аугментация)
Когда я усилил архитектуру модели, оптимизатор и скорость обучения, выяснилось, что модель по-прежнему не сходится в режиме тренировки. Я предположил, что это проблема количества данных, так как у нас имеется только 800 семплов. Это привело меня к методам увеличения аудио, в итоге я увеличил датасеты ровно вдвое. Давайте взглянем на эти методы.
Мужчины, 5 классов
Динамическое увеличение значений
Настройка высоты звука
Добавление белого шума
Заметно, что аугментация сильно повышает точность, до 70+% в общем случае. Особенно в случае с добавлением белого, которое повышает точность до 87,19% – однако тестовая точность и F1-мера падают более чем на 5%. И тут мне ко пришла идея комбинировать несколько методов аугментации для лучшего результата.
Объединяем несколько методов
Белый шум + смещение
Тестируем аугментацию на мужчинах
Мужчины, 2 класса
Белый шум + смещение
Для всех семплов
Белый шум + смещение
Только для позитивных семплов, так как 2-классовый сет дисбалансированный (в сторону негативных семплов).
Настройка высоты звука + белый шум
Для всех семплов
Настройка высоты звука + белый шум
Только для позитивных семплов
Заключение
В конце концов, я смог поэкспериментировать только с мужским датасетом. Я заново разделил данные так, чтобы избежать дисбаланса и, как следствие, утечки данных. Я настроил модель на эксперименты с мужскими голосами, так как я хотел максимально упростить модель для начала. Также я провел тесты, используя разные методы аугментации; добавление белого шума и смещение хорошо зарекомендовали себя на дисбалансированных данных.
Источник
Создание модели распознавания лиц с использованием глубокого обучения на языке Python
Переводчик Елена Борноволокова специально для Нетологии адаптировала статью Файзана Шайха о том, как создать модель распознавания лиц и в каких сферах ее можно применять.
Введение
За последние годы компьютерное зрение набрало популярность и выделилось в отдельное направление. Разработчики создают новые приложения, которыми пользуются по всему миру.
В этом направлении меня привлекает концепция открытого исходного кода. Даже технологические гиганты готовы делиться новыми открытиями и инновациями со всеми, чтобы технологии не оставались привилегией богатых.
Одна из таких технологий — распознавание лиц. При правильном и этичном использовании эта технология может применяться во многих сферах жизни.
В этой статье я покажу вам, как создать эффективный алгоритм распознавания лиц, используя инструменты с открытым исходным кодом. Прежде чем перейти к этой информации, хочу, чтобы вы подготовились и испытали вдохновение, посмотрев это видео:
Распознавание лиц: потенциальные сферы применения
Приведу несколько потенциальных сфер применения технологии распознавания лиц.
Распознавание лиц в соцсетях. Facebook заменил присвоение тегов изображениям вручную на автоматически генерируемые предложения тегов для каждого изображения, загружаемого на платформу. Facebook использует простой алгоритм распознавания лиц для анализа пикселей на изображении и сравнения его с соответствующими пользователями.
Распознавание лиц в сфере безопасности. Простой пример использования технологии распознавания лиц для защиты личных данных — разблокировка смартфона «по лицу». Такую технологию можно внедрить и в пропускную систему: человек смотрит в камеру, а она определяет разрешить ему войти или нет.
Распознавание лиц для подсчета количества людей. Технологию распознавания лиц можно использовать при подсчете количества людей, посещающих какое-либо мероприятие (например, конференцию или концерт). Вместо того чтобы вручную подсчитывать участников, мы устанавливаем камеру, которая может захватывать изображения лиц участников и выдавать общее количество посетителей. Это поможет автоматизировать процесс и сэкономить время.
Настройка системы: требования к аппаратному и программному обеспечению
Рассмотрим, как мы можем использовать технологию распознавания лиц, обратившись к доступным нам инструментам с открытым исходным кодом.
Я использовал следующие инструменты, которые рекомендую вам:
- Веб-камера (Logitech C920) для построения модели распознавания лиц в реальном времени на ноутбуке Lenovo E470 ThinkPad (Core i5 7th Gen). Вы также можете использовать встроенную камеру своего ноутбука или видеокамеру с любой подходящей системой для анализа видео в режиме реального времени вместо тех, которые использовал я.
- Предпочтительно использовать графический процессор для более быстрой обработки видео.
- Мы использовали операционную систему Ubuntu 18.04 со всем необходимым ПО.
Прежде чем приступить к построению нашей модели распознавания лиц, разберем эти пункты более подробно.
Шаг 1: Настройка аппаратного обеспечения
Проверьте, правильно ли настроена камера. С Ubuntu это сделать просто: посмотрите, опознано ли устройство операционной системой. Для этого выполните следующие шаги:
- Прежде чем подключить веб-камеру к ноутбуку, проверьте все подключенные видео устройства, напечатав в командной строке ls /dev/video* . В результате выйдет список всех видео устройств, подключенных к системе.
- Подключите веб-камеру и задайте команду снова. Если веб-камера подключена правильно, новое устройство будет отражено в результате выполнения команды.
- Также вы можете использовать ПО веб-камеры для проверки ее корректной работы. В Ubuntu для этого можно использовать программу «Сheese».
Шаг 2: Настройка программного обеспечения
Шаг 2.1: Установка Python
Код, указанный в данной статье, написан с использованием Python (версия 3.5). Для установки Python рекомендую использовать Anaconda – популярный дистрибутив Python для обработки и анализа данных.
Шаг 2.2: Установка OpenCV
OpenCV – библиотека с открытым кодом, которая предназначена для создания приложений компьютерного зрения. Установка OpenCV производится с помощью pip :
Шаг 2.3: Установите face_recognition API
Мы будем использовать face_recognition API , который считается самым простым API для распознавания лиц на Python во всем мире. Для установки используйте:
Внедрение
После настройки системы переходим к внедрению. Для начала, мы создадим программу, а затем объясним, что сделали.
Пошаговое руководство
Создайте файл face_detector.py и затем скопируйте приведенный ниже код:
Затем запустите этот файл Python, напечатав:
Если все работает правильно, откроется новое окно с запущенным режимом распознавания лиц в реальном времени.
Подведем итоги и объясним, что сделал наш код:
- Сначала мы указали аппаратное обеспечение, на котором будет производиться анализ видео.
- Далее сделали захват видео в реальном времени кадр за кадром.
- Затем обработали каждый кадр и извлекли местонахождение всех лиц на изображении.
- В итоге, воспроизвели эти кадры в форме видео вместе с указанием на то, где расположены лица.
Пример применения технологии распознавания лиц
На этом все самое интересное не заканчивается. Мы сделаем еще одну классную вещь: создадим полноценный пример применения на основе кода, приведенного выше. Внесем небольшие изменения в код, и все будет готово.
Предположим, что вы хотите создать автоматизированную систему с использованием видеокамеры для отслеживания, где спикер находится в данный момент времени. В зависимости от его положения, система поворачивает камеру так, что спикер всегда остается в центре кадра.
Первый шаг — создайте систему, которая идентифицирует человека или людей на видео и фокусируется на местонахождении спикера.
Разберем, как это сделать. В качестве примера я выбрал видео на YouTube с выступлением спикеров конференции «DataHack Summit 2017».
Сначала импортируем необходимые библиотеки:
Затем считываем видео и устанавливаем длину:
После этого создаем файл вывода с необходимым разрешением и скоростью передачи кадров, аналогичной той, что была в файле ввода.
Загружаем изображение спикера в качестве образца для распознания его на видео:
Закончив, запускаем цикл, который будет:
- Извлекать кадр из видео.
- Находить все лица и идентифицировать их.
- Создавать новое видео, которое будет сочетать в себе оригинал кадра с указанием местонахождения лица спикера с подписью.
Посмотрим на код, который будет это выполнять:
Источник