Контроль соблюдения масочного режима на базе Raspberry Pi и Google Coral

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

Сегодня мир столкнулся с угрозой, аналогов которой современное поколение не встречало. Да, это COVID-19. И хотя человечество не раз встречалось с эпидемиями, уничтожавшими целые страны: чума, оспа, испанка и т.д., сейчас мы имеем значительные преимущества: развитая гигиена, высокий уровень медицины, а главное — мощные технологии.

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

Расскажем подробнее о том, как определить наличие медицинских масок на людях на базе Raspberry Pi и Google Coral.

Raspberry Pi — это одноплатный компьютер, то есть различные части компьютера, которые обычно располагаются на отдельных платах, здесь представлены на одной. Плата имеет относительно небольшой размер. Иногда ее называют миникомпьютером.

Сегодня Raspberry Pi – наиболее популярная платформа своей области. Она используется как мозг робота, сервер или просто компьютер.

Нашей задачей является сконфигурировать программно-аппаратный комплекс для распознавания медицинских масок на маломощных устройствах обработки данных. Нам потребуется Raspberry Pi 3 model B ссылка на ресурс.

Перед началом работы необходимо:

  • установить на миникомпьютер Raspberry Pi OS на базе OC Debian 20.04 для ARM процессоров ссылка;
  • настроить автоматическое подключение к источнику Wi-Fi или LAN-подключение. Для этого воспользуйтесь универсальной инструкцией по настройке для Debian/Ubuntu-подобных систем младше версии 18.04 — ссылка;
  • настроить SSH-server для удаленного терминального доступа и настройке. Для этого устанавливаем OpenSSH из терминала командой:
1. sudo apt-get install ssh

В метапакете SSH содержится как клиент, так и сервер. При установке SSH-сервер автоматически прописывается в автозагрузку. Управлять его запуском, остановкой или перезапуском можно с помощью команд:

1. sudo service ssh stop|start|restart

Для более детального описания воспользуйтесь этой информацией.

Затем мы использовали камеру IR-CUT B с интерфейсом CSI по ссылке, но работа возможна и с обычной USB-камерой. В нашем случае достаточно в самой ОС запустить raspi-config для консольного управления конфигурацией Raspberry Pi и выбрать пункт «Включить камеру». Проверить работу CSI-камеры можно с помощью следующих команд:

1. raspistill -o image.jpg -w 1920 -h 1080 2. raspivid -t 10000 -p video.h264

Подробная инструкция: здесь.

Далее необходимо установить зависимости для работы Google Coral по инструкции размещена по ссылке. Мы использовали связку Coral USB Accelerator с Raspberry Pi. Coral предназначен для использования упрощенных моделей TensorFlow – TensorFlow Lite. На этом процесс конфигурации завершен.

Так как Google Coral предназначен для работы с моделями TensorFlow Lite, воспользуемся официальными noteboo`ами для дотренеровки подготовленных моделей, используя colab.research.google.com.

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

Для этого воспользуемся Image classification with TensorFlow Lite Model Make — предварительно сформированный dataset с необходимыми классами изображений (лица людей с масками и без) загружаем в notebook, в котором выполняем дотренеровку и экспорт модели в TensorFlow Lite (.tflite).

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

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

Рассмотрим фрагмент кода, который объединяет код из примеров по классификации и определению объектов на фотографии — из видеопотока CSI-камеры анализируем покадрово изображения на наличие лиц людей. Если такие объекты были найдены, обрезаем данные фрагменты изображения и проводим классификацию для выявления на лице медицинской маски.

1. def main(): 2. interpreter_classify, labels_classity = init_models("classify") 3. interpreter_obj_detect, labels_obj_detect = init_models("obj_detection") 4. 5. with picamera.PiCamera(resolution=(CAMERA_WIDTH, CAMERA_HEIGHT), framerate=30) as camera: 6. camera.start_preview() 7. try: 8. stream = io.BytesIO() 9. annotator = Annotator(camera) 10. 11. # Получение потока видео в виде jpeg снимков 12. for _ in camera.capture_continuous(stream, format='jpeg', use_video_port=True): 13. stream.seek(0) 14. # Конвертируем кадр в цветовое пространство RGB без альфа канала 15. image = Image.open(stream).convert('RGB').resize( 16. (input_width, input_height), 17. Image.ANTIALIAS 18. ) 19. start_time = time.monotonic() 20. 21. # Поиск объектов на фотографии - лица людей 22. objects = detect_objects(interpreter_obj_detect, image, args.threshold) 23. results = list() 24. for obj in objects: 25. ymin, xmin, ymax, xmax = obj['bounding_box'] 26. XY = ( 27. int(xmin * CAMERA_WIDTH), 28. int(xmax * CAMERA_WIDTH), 29. int(ymin * CAMERA_HEIGHT), 30. int(ymax * CAMERA_HEIGHT), 31. ) 32. 33. # По каждому найденному объекту определяем наличие маски 34. results.append({ 35. "XY": XY, 36. "class_img": classify_image(interpreter_classify, image.crop(XY)) 37. }) 38. 39. elapsed_ms = (time.monotonic() - start_time) * 1000 40. annotator.clear() 41. annotate_objects(annotator, results, ["with_mask", "without_mask"]) 42. annotator.text([5, 0], '%.1fms' % (elapsed_ms)) 43. annotator.update() 44. 45. stream.seek(0) 46. stream.truncate() 47. 48. finally: 49. camera.stop_preview()

Полученный программно-аппаратный комплекс позволяет в режиме реального времени определять людей, пренебрегающими профилактическими мерами, то есть без маски. Сравним быстродействие данного комплекса с Coral и без него:

Контроль соблюдения масочного режима на базе Raspberry Pi и Google Coral

Таким образом, Coral ускоряет работу в 10 раз. Кроме того, скорость более 10-13 кадров в секунду является достаточной для использования комплекса в режиме реального времени. Отметим также, что минимальные энергозатраты, около 2.5 Вт/ч, делают возможным применение комплекса не только в офисах с развитой энергосетью, но даже и в общественном транспорте.

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

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

1010
2 комментария

Отличная подача материала. Спасибо . Какого уровня ошибки смогли достичь? Освещение / расположение камеры тестировали?

2
Ответить
Автор

Andrey, добрый день, спасибо! Освещение, положение камер не тестировали. На нашей маленькой обучающей модели мы смогли достичь точности чуть лучше, чем случайное угадывание (около 60%). Для лучших результатов модель нужно дообучать.

Ответить