Время прочтения: 5 мин.
Сегодня мир столкнулся с угрозой, аналогов которой современное поколение не встречало. Да, это 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.
Минимальным требованием является использование модели для классификации изображений по двум классам — «человек в маске», «человек без маски». Для этого воспользуемся https://www.tensorflow.org/lite/tutorials/model_maker_image_classification – предварительно сформированный dataset с необходимыми классами изображений (лица людей с масками и без) загружаем в notebook, в котором выполняем дотренеровку и экспорт модели в TensorFlow Lite (.tflite).
Дополнительно, для определения наличия маски на лице у нескольких людей и/или с разных экспозиций добавим модель по определению объектов в кадре. Аналогично, дотренировываем модель https://www.tensorflow.org/lite/models/object_detection/overview.
Для применения полученных моделей воспользуемся официальными примерами их использования и объединим в один скрипт, который выполняет поиск объектов с видео-потока CSI-камеры – лица людей (с масками и без), получает эти фрагменты изображений и проводит по ним классификацию – лицо с маской или без:
- Классификация: https://github.com/tensorflow/examples/tree/master/lite/examples/image_classification/raspberry_pi
- Поиск объектов: https://github.com/tensorflow/examples/tree/master/lite/examples/object_detection/raspberry_pi
Рассмотрим фрагмент кода, который объединяет код из примеров по классификации и определению объектов на фотографии – из видео-потока 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 Вт/ч, делают возможным применение комплекса не только в офисах с развитой энергосетью, но даже и в общественном транспорте.
Тысячи людей работают на жизнеобеспечивающих предприятиях. Карантинные меры слабеют, а значит все больше людей выходит в офисы, торговые центры и другие общественные места. Как никогда важно следить за соблюдением масочного режима. По прогнозам экспертов, это будет актуально многие месяцы. Компании, использующие, подобные программно-аппаратные комплексы экономят свои ресурсы и остаются конкурентоспособными в столь кризисные времена.