Рубрики
Проекты на Raspberry Pi

Обнаружение масок на лицах людей с помощью Raspberry Pi и OpenCV

Текущая пандемия коронавируса COVID-19 значительно осложнила жизнь людей по всему миру. Одним из обязательных условий для борьбы с распространением коронавируса стало обязательное ношение масок во многих общественных местах. Но ставить в каждом таком месте человека для соблюдения масочного режима не всегда оправдано с точки зрения значительных экономических трат на людей, которые осуществляют проверку масочного режима. Поэтому в данной статье мы рассмотрим автоматическое обнаружение масок на лицах людей с помощью платы Raspberry Pi и библиотеки OpenCV.

Наш проект будет состоять из 3-х основных частей:

  • сбор данных;
  • обучение (тренировка) модели;
  • обнаружение масок на лицах людей.

На первом этапе мы соберем набор изображений, на которых изображены лица людей с масками и без них. Этот набор будет состоять из 500 изображений, относящихся к двум классам. На втором этапе мы будем тренировать (обучать) наш «распознаватель» (Recognizer) на обнаружение людей с масками и без них. А на заключительном этапе работы проекта мы будем использовать эти тренировочные данные чтобы определить находится ли на лице человека маска или нет.

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

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

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

Установка OpenCV и других библиотек для работы проекта

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

Далее установим пакеты, которые нам потребуются для дальнейшей установки OpenCV:

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

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

Затем установим Tensorflow с помощью команды:

И, наконец, установим пакет sklearn.

Объяснение программы для Raspberry Pi для обнаружения масок на лицах людей

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

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

  • набор данных (Dataset): в этом каталоге будут находиться изображения лиц людей с масками и без них;
  • gather_images.py – простой скрипт на python для сбора изображений с лицами;
  • training.py – считывает набор данных, производит точную настройку MobileNetV2 чтобы создать нашу модель обнаружения лиц (MaskDetector.h5);
  • detect_mask.py – код программы на python, который использует тренировочные (обучающие) данные чтобы классифицировать каждое лицо – с маской оно или без нее.

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

1. Сбор данных

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

В первых двух строках этого скрипта мы определим системные аргументы. В первой строке определяется label name (имя метки), а во второй – количество изображений, которые мы хотим собрать. К примеру, если вы хотите собрать 250 изображений с масками, то используйте команду: python3 gather_images.py with_mask 250. А для сбора изображений без масок используйте команду: python3 gather_images.py without_mask 250. В этих командах with_mask/without_mask – это метка изображения, а 250 – количество изображений.

Далее укажем пути к каталогу с изображениями и классами изображений: то есть лица с масками и без них.

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

Затем мы начнем считывать кадры (frames) с видеопотока и если номер кадра будет равен числу отсчетов, мы будем останавливать (завершать) цикл.

Далее мы будем сохранять все изображения по определенному пути. Все изображения будут нумероваться соответственно их порядковому номеру.

2. Обучение (тренировка) модели

Теперь, когда у нас есть образцы лиц, мы можем передать ив нейронную сеть и начать процесс ее обучения чтобы в дальнейшем можно было производить автоматическое распознавание того, есть ли маска на лице человека или нет. Для этого откройте файл training.py в каталоге с обнаружителем масок (mask detector directory) и вставьте в него приведенный ниже фрагмент кода. Затем начните процесс обучения нейронной сети с помощью команды:

Вначале в скрипте training.py мы импортируем все необходимые библиотеки. Далее инициализируем необходимые нам переменные: начальный уровень обучения (initial learning rate), число этапов/эпох (epochs) для обучения и размер партии/пачки (batch size).

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

После этого в цикле мы считываем все изображения из каталога по указанному пути, после этого мы можем начать обучение модели. Шаги предварительной обработки (Pre-processing steps) изменение размера изображений до разрешения 224×224 пикселов, конвертирования их в формат массива и использования функции preprocess_input для масштабирования интенсивностей пикселов на изображении в диапазон [-1, 1].

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

Затем мы будем разделять данные на тренировочный и тестовый наборы.  80% данных будут использоваться для тренировки (обучения), а оставшиеся 20% – для тестирования.

Далее мы загрузим модель MobileNet с заранее натренированными весами ImageNet, отбрасывая головную часть сети.

В следующих строках мы сконструируем головную часть модели, которая будет помещена на верх базовой модели. Функция AveragePooling2D будет рассчитывать среднее выходное значение характеристической карты (изображения) на предыдущем слое. Чтобы предотвратить переполнение мы используем 50% процент отсева.

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

Затем мы начнем тренировку (обучение) модели и после того как оно будет закончено, мы сохраним модель под именем “MaskDetector.h5”.

3. Обнаружение масок на лицах людей

Теперь, на финальном шаге нашего проекта, мы будем использовать тренировочные данные для классификации каждого лица – с маской оно или без. Лица мы будем считывать из видео потока в реальном времени. Для этого откройте файл detect_mask.py в каталоге с обнаружителем масок (mask detector directory) и вставьте в него приведенный ниже фрагмент кода.

Также, как и в скрипте training.py, эту программу мы начнем с импорта необходимых библиотек. В следующих строках мы определим размеры кадра и сконструируем из него blob (кляксу, шар).

Затем мы пропустим эту кляксу через нейронную сеть и произведем обнаружение лица с помощью модели faceNet.

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

После этого отфильтруем обнаружения, чей уровень доверия меньше 0.5. Далее вычислим координаты (x, y) прямоугольника, окружающего обнаруженные лица.

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

Далее организуем цикл по всем кадрам видео потока и произведем изменение их разрешения (resize). Затем обнаружим лица в каждом кадре и определим есть ли на них маски или нет.

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

Тестирование работы обнаружителя масок

Чтобы проверить наш проект обнаружителя масок на лицах людей подключите модуль камеры к плате Raspberry Pi.

Запустите скрипт detect_mask.py. Спустя несколько секунд вы увидите изображение с камеры во всплывающем окне. Если маска на лице будет обнаружена, то вокруг лица человека будет нарисован прямоугольник зеленого цвета и высветится надпись ‘Mask Detected’ (маска обнаружена). Если же маски на обнаруженном лице нет, то вокруг него будет нарисован прямоугольник красного цвета и высветится надпись ‘No Mask Detected’ (маски не обнаружено).

Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

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

Обнаружение масок

Сбор изображений

Tensor Flow

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

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

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

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