Время прочтения: 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-камеры – лица людей (с масками и без), получает эти фрагменты изображений и проводит по ним классификацию – лицо с маской или без:

Рассмотрим фрагмент кода, который объединяет код из примеров по классификации и определению объектов на фотографии – из видео-потока 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 Вт/ч, делают возможным применение комплекса не только в офисах с развитой энергосетью, но даже и в общественном транспорте.

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