Одна из худших профессий в мире – стоять на входе в торговом центре и предлагать людям надеть маски. Вместо этого можно спроектировать использующую распознавание изображений систему обнаружения на базе Raspberry Pi.
Бюджетный одноплатный компьютер может распознать, надели вы маску или нет. Этот проект был вдохновлен видео из торгового центра в Азии, где входные двери активировались только при наличии у посетителя маски на лице.
Принцип работы системы распознавания масок на 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.
В конце статьи будет описано подключение светодиодов и зуммера. Делать это необязательно.
3. Если вместо веб-камеры вы используете камеру Pi, подключите ее в конфигурации Raspberry Pi (Camera: Enable). Нажмите OK и перезагрузите устройство.
4. Откройте терминал сочетанием клавиш Ctrl+T.
5. Установите OpenCV. Это займет около 2-х часов. Процесс установки подробно описан в предыдущей статье «Учим Raspberry Pi распознаванию лиц». После установки пакета ваша командная строка будет выглядеть примерно так:
6. Установите TensorFlow. Это заняло у меня 5-10 минут.
7. Установите imutils. Займет около минуты.
Часть 2: Распознавание маски (ускоренный метод)
В этой части мы пропустим этап обучения и запустим подготовленную модель для определения наличия маски на лице.
1. Откройте новую командную строку на устройстве сочетанием клавиш Ctrl+T.
2. Скачайте код с GitHub.
3. Запустите предварительно обученную модель, через которую прошло больше 1000 фотографий. В терминале замените директорию (cd) на скопированную из GitHub.
4. Выполните код Python 3, чтобы открыть веб-камеру и запустить алгоритм распознавания масок.
В течение нескольких секунд на экране появится окно веб-камеры с зеленой рамкой, означающей наличие маски.
Или с красной рамкой, если маска не надета.
Можете поэкспериментировать с разными масками, надевая их, как вам угодно (например, маска, свисающая с вашего уха или не закрывающая нос).
Нажмите 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.
Чтобы натренировать модель на ваших снимках (селфи), просто сохраните фотографии соответственно папкам. Можете добавить туда свои фото и фото членов семьи.
Сделайте фото на Raspberry Pi
1. Откройте командную строку сочетанием клавиш Ctrl+T.
2. Измените каталог на папку face_mask_detection.
3. Выполните код Python, чтобы сфотографироваться в маски и без.
4. Нажмите Пробел, чтобы сделать снимок.
5. Как закончите, нажмите q.
Выполнение этих скриптов автоматически сохраняет фото в нужные папки: 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 на устройство.
3. Обучайте модель. Помните, чем больше фото в папке dataset, тем дольше будет идти процесс. Если выскочит ошибка “out of memory” (недостаточно памяти), уменьшайте количество фотографий в папке, пока не сможете запустить код на Python.
В нашем случае обучение модели с использованием 1000 снимков отняло больше 2-х часов
В этом примере мы использовали для обучения только 20 фото, и уровень точности составил 67%.
После выполнения скрипта вы увидите новый файл в директории face_mask_detector: my_mask_detector.model
.
4. Давайте сначала проверим, насколько точной она будет по мнению Pi. Откройте изображение mymodelplot.png
Мы тренировали модель на основе тысячи фотографий и получили очень высокую точность.
Тестирование модели распознавания маски на Raspberry Pi
Теперь, когда модель обучена, приступаем к тесту!
Запустите тот же скрипт распознавания, но вместо модели по умолчанию укажите вашу.
В той же командной строке:
Часть 4: Подключение светодиодов и зуммера
Когда модель детектора маски на лице обучена, можно немного развлечься.
Сейчас мы добавим зуммер и 2 светодиода и проверим у кого-нибудь наличие маски.
Для этого шага нам понадобится:
- малая макетная плата;
- 2 резистора 330 Ом;
- 1 красный светодиод;
- 2 зеленых светодиода;
- 1 зуммер.
1. Проведите светодиоды и зуммер как показано на диаграмме ниже (всегда добавляйте резистор между положительным выводом светодиода и выводом GPIO на Pi).
a. Красный светодиод управляется GPIO14;
b. Зеленый светодиод управляется GPIO15;
c. Зуммер активируется GPIO 21;
d. Подсоедините GND к GND на вашей плате.
2. Протестируйте настройку светодиодов и зуммера, запустив LED-buzzer.py. Откройте новый терминал и запустите код:
Если светодиоды моргают и зуммер издает звук, значит у вас все получилось и можно двигаться дальше. Если что-то из этого не работает, проверьте проводку.
3. Если зуммер не замолчал после нажатия Ctrl+C, запустите LED-buzzer-OFF.py
, чтобы отключить звук со светодиодами.
4. Протестируйте систему распознавания маски на Raspberry Pi в том же терминале:
Если все работает как надо, то когда скрипт увидит надетую маску, загорится зеленый свет. Если маски на лице не будет, загорится красный светодиод в сопровождении звукового сигнала зуммера.
Варианты усовершенствования технологии безграничны. Вы можете продолжать обучение модели, загружая новые фото, или передать команду сервоприводу/шлюзу, когда на лице обнаружена маска. Можно объединить эту идею с автоматизированной отправкой электронных писем из статьи «Учим Raspberry Pi распознаванию лиц» и отправлять сообщение с фото, когда кто-то приходит без маски.
Как научиться программировать на Python максимально быстро и качественно?
В условиях повышенной конкуренции среди джунов, пойти учиться на курсы с преподавателями — самый прагматичный вариант, который позволит быстро и качественно освоить базовые навыки программирования и положить 5 проектов в портфолио. Преподаватель прокомментирует домашние задания, поделится полезными советами, когда надо подбодрит или даст «волшебного» пинка.
На курсе «Основы программирования на Python» с преподавателем вы научитесь:
- работать в двух интегрированных средах разработки — PyCharm и Jupyter Notebook;
- парсить веб-страницы;
- создавать ботов для Telegram и Instagram;
- работать с данными для различных материалов и дальнейшего анализа;
- тестировать код.
Плюс положите 5 проектов в портфолио.
Комментарии