Учим Raspberry Pi распознавать маску на лице

Учим Raspberry Pi распознавать маску на лице

Одна из худших профессий в мире – стоять на входе в торговом центре и предлагать людям надеть маски. Вместо этого можно спроектировать использующую распознавание изображений систему обнаружения на базе Raspberry Pi.

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

Источник: Tom’s Hardware

Принцип работы системы распознавания масок на Raspberry Pi

Когда человек приближается к веб-камере, код на Python определяет, надел он маску или нет, используя пакеты TensorFlow , OpenCV и imutils . Люди без масок будут обведены в красную рамку с надписью «Маска не обнаружена» (No Face Mask Detected), а лица в масках окажутся в зеленой рамке с текстом «Спасибо. Маска надета» (Thank You. Mask On.).

Сколько времени займет реализация системы обнаружения масок на Raspberry Pi?

Прохождение всех этапов проекта, начиная с момента установки ОС Raspberry Pi, займет минимум 5 часов. Если вы читали статью «Учим Raspberry Pi распознаванию лиц», можете вычесть полтора часа на установку OpenCV и использовать предварительно обученную модель, а значит перейти сразу к работающей системе распознавания масок на Raspberry Pi.

Что вам понадобится

  • Raspberry Pi 3 или 4 (использовать Raspberry Pi Zero W в этом проекте не рекомендуется);
  • Карта microSD на 16GB или выше с загруженной ОС Raspberry Pi;
  • Блок питания/клавиатура/мышь/монитор/HDMI кабель (для Raspberry Pi);
  • USB веб-камера;
  • По желанию: тачскрин 7” Raspberry Pi;
  • По желанию: чехол для тачскрина Pi.

Большая часть гайда основана на выполнении команд в терминале.

Часть 1: Установка зависимостей для детектора масок на Raspberry Pi

    – это библиотека алгоритмов с открытым исходным кодом для обработки изображений и видео в реальном времени с возможностью машинного обучения; – это серия удобных функций для ускорения вычислений OpenCV на Raspberry Pi; – платформа машинного обучения с открытым исходным кодом.

1. Установка операционной системы Raspberry Pi с карты microSD.

2. Подключение веб-камеры через один из USB-портов на вашей плате. Если вы задействали камеру Raspberry Pi вместо вебки, используйте для подключения ленточный кабель. Запускайте Raspberry Pi .

Источник: Tom's HardwareИсточник: Tom’s Hardware

В конце статьи будет описано подключение светодиодов и зуммера. Делать это необязательно.

3. Если вместо веб-камеры вы используете камеру Pi, подключите ее в конфигурации Raspberry Pi (Camera: Enable). Нажмите OK и перезагрузите устройство.

Источник: Tom's HardwareИсточник: Tom’s Hardware

4. Откройте терминал сочетанием клавиш Ctrl+T.

5. Установите OpenCV. Это займет около 2-х часов. Процесс установки подробно описан в предыдущей статье «Учим Raspberry Pi распознаванию лиц» . После установки пакета ваша командная строка будет выглядеть примерно так:

Источник: Tom's HardwareИсточник: Tom’s Hardware

6. Установите TensorFlow. Это заняло у меня 5-10 минут.

7. Установите imutils. Займет около минуты.

Часть 2: Распознавание маски (ускоренный метод)

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

1. Откройте новую командную строку на устройстве сочетанием клавиш Ctrl+T.

2. Скачайте код с GitHub.

3. Запустите предварительно обученную модель, через которую прошло больше 1000 фотографий. В терминале замените директорию (cd) на скопированную из GitHub.

4. Выполните код Python 3, чтобы открыть веб-камеру и запустить алгоритм распознавания масок.

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

Источник: Tom's HardwareИсточник: Tom’s Hardware

Или с красной рамкой, если маска не надета.

Источник: Tom's HardwareИсточник: Tom’s Hardware

Можете поэкспериментировать с разными масками, надевая их, как вам угодно (например, маска, свисающая с вашего уха или не закрывающая нос).

Нажмите Esc, чтобы остановить скрипт.

Часть 3: Обучение модели распознавания маски (Долгий метод)

Теперь, когда детектор маски на лице запущен, вы думаете: “А как он работает?”

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

Чем больше фото, тем выше точность машинного обучения и наоборот.

Снимки были разбросаны по 2-м папкам внутри dataset, with_mask (в маске) и without_mask (без маски), а алгоритм обучения создал модель mask vs. no mask (есть маска / нет маски) на основе набора данных. Примеры фотографий в папке dataset, которую вы загрузили с GitHub, это мои фотографии.

А что, если вместо тысячи фото мы бы обучали нашу систему распознавания с использованием всего 20 снимков? У нас есть предварительно обученная модель для проверки.

Запустите код Python 3 из папки face_mask_detection в терминале, чтобы открыть веб-камеру с моделью из 20 фото.

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

Как обучить модель распознавания маски на Raspberry Pi самостоятельно

Ниже описан способ, как вы можете обучить модель на основе собственных фото.

На вашем устройстве в папке dataset внутри face_mask_detection найдите две подпапки: with_mask и without_mask.

Источник: Tom's HardwareИсточник: Tom’s Hardware

Чтобы натренировать модель на ваших снимках (селфи), просто сохраните фотографии соответственно папкам. Можете добавить туда свои фото и фото членов семьи.

Сделайте фото на Raspberry Pi

1. Откройте командную строку сочетанием клавиш Ctrl+T.

2. Измените каталог на папку face_mask_detection.

3. Выполните код Python, чтобы сфотографироваться в маски и без.

4. Нажмите Пробел, чтобы сделать снимок.

5. Как закончите, нажмите q.

Источник: Tom’s Hardware

Выполнение этих скриптов автоматически сохраняет фото в нужные папки: with_mask и without_mask. Чем больше снимков вы сделаете, тем более точной будет модель. Не забывайте, что мощность вашего микрокомпьютера не такая, как у стационарного. Raspberry Pi сможет проанализировать ограниченное количество фото из-за вычислительной мощности и объема ОЗУ. На Raspberry Pi 4 8GB получилось обработать около 1000 фотографий, но создание модели заняло больше 2-х часов.

Обучение модели для системы распознавания маски на Raspberry Pi

Приступаем к тренировке модели на основе фотографий из папки dataset, но перед этим надо установить несколько пакетов. Максимальное количество фото, которые сможет обработать скрипт train_mask_detector.py , зависит от модели платы и доступного объема памяти.

1. Откройте терминал через Ctrl+T.

2. Установите пакеты sklearn и matplotlib на устройство.

Источник: Tom's HardwareИсточник: Tom’s Hardware

3. Обучайте модель. Помните, чем больше фото в папке dataset, тем дольше будет идти процесс. Если выскочит ошибка “out of memory” (недостаточно памяти), уменьшайте количество фотографий в папке, пока не сможете запустить код на Python.

Источник: Tom's HardwareИсточник: Tom’s Hardware

В нашем случае обучение модели с использованием 1000 снимков отняло больше 2-х часов

Источник: Tom's HardwareИсточник: Tom’s Hardware

В этом примере мы использовали для обучения только 20 фото, и уровень точности составил 67%.

После выполнения скрипта вы увидите новый файл в директории face_mask_detector: my_mask_detector.model .

4. Давайте сначала проверим, насколько точной она будет по мнению Pi. Откройте изображение mymodelplot.png

Источник: Tom's HardwareИсточник: Tom’s Hardware

Мы тренировали модель на основе тысячи фотографий и получили очень высокую точность.

Тестирование модели распознавания маски на Raspberry Pi

Теперь, когда модель обучена, приступаем к тесту!

Запустите тот же скрипт распознавания, но вместо модели по умолчанию укажите вашу.

В той же командной строке:

Часть 4: Подключение светодиодов и зуммера

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

Сейчас мы добавим зуммер и 2 светодиода и проверим у кого-нибудь наличие маски.

Источник: Tom's HardwareИсточник: Tom’s Hardware

Для этого шага нам понадобится:

  • малая макетная плата;
  • 2 резистора 330 Ом;
  • 1 красный светодиод;
  • 2 зеленых светодиода;
  • 1 зуммер.

1. Проведите светодиоды и зуммер как показано на диаграмме ниже (всегда добавляйте резистор между положительным выводом светодиода и выводом GPIO на Pi).

a. Красный светодиод управляется GPIO14;

b. Зеленый светодиод управляется GPIO15;

c. Зуммер активируется GPIO 21;

d. Подсоедините GND к GND на вашей плате.

Источник: Tom's HardwareИсточник: Tom’s Hardware

2. Протестируйте настройку светодиодов и зуммера, запустив LED-buzzer.py. Откройте новый терминал и запустите код:

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

Источник: Tom’s Hardware

3. Если зуммер не замолчал после нажатия Ctrl+C, запустите LED-buzzer-OFF.py , чтобы отключить звук со светодиодами.

4. Протестируйте систему распознавания маски на Raspberry Pi в том же терминале:

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

Источник: Tom’s Hardware

Варианты усовершенствования технологии безграничны. Вы можете продолжать обучение модели, загружая новые фото, или передать команду сервоприводу/шлюзу, когда на лице обнаружена маска. Можно объединить эту идею с автоматизированной отправкой электронных писем из статьи «Учим Raspberry Pi распознаванию лиц» и отправлять сообщение с фото, когда кто-то приходит без маски.

Если вы только осваиваете популярный язык программирования, обратите внимание на факультет Python-разработки GeekBrains. Под руководством опытных наставников вы научитесь писать подобные (и более сложные) приложения, а успешно завершившим обучение студентам онлайн-академия помогает с трудоустройством.