В условиях пандемии COVID-19 проверка температуры перед входом в помещение является необходимым шагом для обеспечения вашего здоровья и помощи другим в безопасности. В Сингапуре это требование правительства.

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

Здесь есть две потенциальные проблемы.

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

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

Как мы собираемся это решить?

Общая идея такая:

  1. Обнаружить лицо
  2. Убедитесь, что человек есть в базе
  3. Если человек находится в системе, запишите его температуру и создайте запись с текущей меткой времени в системе.
  4. В противном случае сообщите администратору неизвестного лица по электронной почте с прикрепленной формой для регистрации человека.
  5. Как только человек будет зарегистрирован, он будет зарегистрирован.
  6. Данные будут храниться локально для дальнейшего использования.

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

В наши дни, когда вычислительные технологии зашли так далеко, есть много отличных вариантов: планшет, такой как iPad, Raspberry Pi, Nvidia Jetson или даже приличный ноутбук.

IPad - дорогое решение. Самая дешевая модель стоила 329 долларов США. Кроме того, мы можем использовать с iPad лишь ограниченный набор оборудования для измерения и записи температуры. Одним из таких аксессуаров является персональный тепловизор FLIR ONE для iOS. Этот аксессуар стоит 260 долларов США и не обязательно доступен для покупки в Сингапуре без каких-либо ограничений на импорт. Тем не менее, это то, что, вероятно, требует определенного количества шаблонной работы, поскольку Apple создала одни из лучших API для распознавания лиц и работы с машинным обучением.

Nvidia Jetson - еще один возможный вариант. Он стоит примерно так же, как Raspberry Pi, и поставляется с хорошей программной поддержкой. Аппаратное обеспечение поставляется с 128-ядерным графическим процессором, который может легко обрабатывать изображения и видео без каких-либо проблем. Также существует сильная поддержка сообщества, которая может облегчить нам поиск информации и устранение неполадок.

Raspberry Pi по цене и назначению примерно такой же, как Nvidia Jetson. Однако есть несколько аспектов, по которым Raspberry Pi, особенно версия 4, уступает Jetson. Во-первых, это более быстрый, новый и эффективный процессор. Второй - энергопотребление. Raspberry Pi 4 потребляет не более 3,4 Вт энергии по сравнению с 10 Вт на Nvidia Jetson. Можно отнести это к менее мощному, но эффективному VideoCore от Broadcom на Raspberry Pi. Наконец, размер. Nvidia Jetson довольно большая из-за необходимости поддерживать большой радиатор, и для его размещения потребуется более крупный корпус.

Аппаратное и программное обеспечение

В конце концов Raspberry Pi 4 победил, потому что нам не нужно выполнять тяжелые работы с искусственным интеллектом или роботами, для которых предназначена Nvidia Jetson. Кроме того, я всегда мог повторно использовать Raspberry Pi для будущих проектов более общего назначения. Наконец, он также дешевле, чем iPad с аксессуаром для камеры FLIR, даже с учетом того, что нам нужно покупать камеру, датчик и корпус.

Поскольку я получил Raspberry Pi 4 как любительский набор от Labists, он поставлялся с ОС Raspberry Pi. Все, что нужно было для начала, - это быстрая установка.

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

Теперь, когда мне понадобился способ более точного измерения температуры, несколько часов исследований указали мне на использование термодатчика AMG8833. Я нашел один из SparkFun, и он был легко доступен локально. Существуют и другие, более мощные и, вероятно, более точные тепловизионные датчики или камеры, такие как SparkFun IR Array breakout - MLX90640, но они стоят дороже, а некоторых нет в наличии.

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

Я выбрал OpenCV, так как это было то, с чем я знаком, и он имеет хорошую поддержку Raspberry Pi. Быстрый поиск в Google даст вам ряд результатов.

Использовалась последняя версия Python 3 (v3.9 на момент написания).

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

Реализация распознавания лиц, термочтения и регистрации

Вы можете увидеть диаграмму архитектуры для решения ниже.

Из архитектуры мы видим, что на Raspberry Pi работают два модуля, связанных с распознаванием лиц. Я реализовал их на основе решений, предоставленных Адрианом Роузброком на его сайте.

Для обнаружения лиц используется классификатор Хаара Каскад с алгоритмом классификации KNN.

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

Модуль «Распознавание лиц с отметкой на рейс» соответствует названию. Он берет изображение с камеры и проверяет каждый кадр на наличие лица. Как только он найдет его, он сверится с хранилищем лиц / имен. Только после этого он считывает температуру, измеренную термодатчиком, и приступает к записи человека в хранилище температуры, которое представляет собой не что иное, как файл .csv.

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

Как только система обнаружит известное лицо и зафиксирует его температуру, система сохранит его в температурном хранилище. Ниже вы можете найти блок-схему, описывающую выполнение.

А для тех, кто любит читать исходный код проекта, его тоже можно найти здесь.

Строительство жилья

У меня был примерный план размещения оборудования. Это выглядит так:

  1. Нужен отсек для Raspberry Pi
  2. Камера должна быть размещена достаточно высоко
  3. Термодатчик должен видеть
  4. Он должен содержать дисплей.

Всегда есть возможность использовать 3D-принтер, но я знал, что, вероятно, у меня уйдет слишком много времени, чтобы понять, как все собрать воедино. Так что я выбрал одну вещь, которую знаю: LEGO. Это дает мне возможность изменять свой дизайн всякий раз, когда того требует ситуация, а также дает мне возможность делать все, что я хочу. Все, что мне было нужно, - это кирпичи нужного типа и в нужном количестве.

Ниже представлен первый прототип. Его единственной целью было размещение камеры и Raspberry Pi.

Вышеупомянутый дизайн не может масштабироваться, но он дает мне основу для дальнейшего развития. Я изменил корпус Raspberry Pi и добавил больше отсеков для размещения 7-дюймового сенсорного дисплея и термодатчика.

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

Тестирование

Поскольку это задумано как прототип и цель обучения, я не стал проводить модульное тестирование и все такое. Я сосредоточился только на том, чтобы все заработало. Я провел лишь небольшое тестирование приложения, чтобы убедиться, что все, что я реализовал, работает.

Поскольку я разрабатывал в основном на своем Macbook Pro, я протестировал на нем реализацию идентификации лица с веб-камерой в качестве источника видеопотока, прежде чем развернуть его на Raspberry Pi.

После того, как термодатчик был установлен, я лично убедился в эффективности термодатчика. Ссылка репо содержит два примера модулей Python (IR_cam_interp.py и IR_cam_test.py), которые я мог бы использовать, чтобы проверить, работает ли термодатчик.

Используя модули, датчик мог определять температуру моей кожи около 34 градусов по Цельсию на расстоянии около 10 см. Отойдя немного дальше на 15 см, температура упала примерно до 33 градусов Цельсия. В дальнейшем становится труднее получить более точное считывание без какой-либо добавленной стоимости смещения. Пока что пробовал 2.5, 6.0 и 8.0. Последний дал лучшую точность. Но это также означало, что размещение теплового датчика в верхней части камеры - не лучший вариант.

Что дальше?

Поскольку термодатчик не дает очень точных показаний для удаленного объекта, такого как человеческое тело, требуется другой подход. Ниже вы можете увидеть рисунок улучшения, которое я мог бы сделать.

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

И последнее, но не менее важное: я мог бы также рассмотреть возможность добавления серверной поддержки через Microsoft Azure для сбора записанной температуры, уведомления пользователей о новых неизвестных пользователях и включения загрузки сохраненной записи.

Эта статья изначально была размещена здесь: