nikita.kopot 24 ноября 2020

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

Расскажем, как на базе Raspberry Pi настроить систему распознавания маски на лице с активацией зуммера. Во время пандемии коронавируса это бюджетное решение может пригодиться небольшим магазинам.
😷 Учим Raspberry Pi распознавать маску на лице

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

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

Источник: Tom's Hardware
Источник: 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, imutils и TensorFlow.

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

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 минут.

        sudo pip3 install

https://github.com/lhelontra/tensorflow-on-arm/releases/download/v2.1.0/tensorflow-2.1.0-cp37-none-linux_armv7l.whl
    

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

        sudo pip3 install imutils
    

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

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

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

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

        git clone https://github.com/carolinedunn/face_mask_detection
    

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

        cd face_mask_detection
    

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

        python3 detect_mask_webcam.py 
Если вы используете камеру Pi: python3 detect_mask_picam.py
    

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

Источник: 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 фото.

        python3 detect_mask_webcam.py --model mask_detector-20.model 
Если вы используете камеру Pi: python3 detect_mask_picam.py --model mask_detector-20.model
    

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

Как обучить модель распознавания маски на 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.

        cd face_mask_detection
    

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

        Если используете веб-камеру: python withMaskDataset.py или python withoutMaskDataset.py 
Если используете камеру Pi: python withMaskDataset-picam.py или python withoutMaskDataset-picam.py
    

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

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

Источник: Tom's Hardware
Источник: 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 на устройство.

        sudo pip3 install sklearn 

sudo pip3 install matplotlib
    
Источник: Tom's Hardware
Источник: Tom's Hardware

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

        cd face_mask_detection 

python3 train_mask_detector.py --dataset dataset --plot mymodelplot.png --model my_mask_detector.model
    
Источник: 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

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

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

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

        python3 detect_mask_webcam.py --model my_mask_detector.model 
Если вы используете камеру Pi: python3 detect_mask_picam.py --model my_mask_detector.model
    

Часть 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. Откройте новый терминал и запустите код:

        cd face_mask_detection 

python LED-buzzer.py
    

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

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

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

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

        python3 detect_mask_webcam_buzzer.py

Если вы используете камеру Pi: python3 detect_mask_picam_buzzer.py 

Если вы используете свою модель, добавьте --model my_mask_detector.model как вы делали в предыдущем шаге.
    

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

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

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

***

Как научиться программировать на Python максимально быстро и качественно?

В условиях повышенной конкуренции среди джунов, пойти учиться на курсы с преподавателями — самый прагматичный вариант, который позволит быстро и качественно освоить базовые навыки программирования и положить 5 проектов в портфолио. Преподаватель прокомментирует домашние задания, поделится полезными советами, когда надо подбодрит или даст «волшебного» пинка.

На курсе «Основы программирования на Python» с преподавателем вы научитесь:

  • работать в двух интегрированных средах разработки — PyCharm и Jupyter Notebook;
  • парсить веб-страницы;
  • создавать ботов для Telegram и Instagram;
  • работать с данными для различных материалов и дальнейшего анализа;
  • тестировать код.

Плюс положите 5 проектов в портфолио.

Источники

МЕРОПРИЯТИЯ

Комментарии

ВАКАНСИИ

Добавить вакансию
Java Team Lead
Москва, по итогам собеседования
Go-разработчик
по итогам собеседования

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ