Контроль соблюдения масочного режима на базе 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 и без него:

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

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

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

0
2 комментария
Andrey Muratov

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

Ответить
Развернуть ветку
NTA
Автор

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

Ответить
Развернуть ветку
-1 комментариев
Раскрывать всегда