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

Мотивация проекта

Все началось с конкурса в университете, к которому я принадлежу (Университет Трансильвании из Брашова, Румыния). Они объявляют о предложении 1 миллиона евро 10 командам, которые придут с новыми проектными предложениями, способными оцифровать университет (100 000 евро на команду на покупку оборудования + студенческая стипендия).

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

Но это было бы слишком просто для проекта стоимостью 100 тысяч евро, верно?

И это правильно! Поэтому мы решили немного усложнить систему, добавив несколько дополнительных функций:

  • определять температуру людей
  • определить социальную дистанцию ​​между людьми
  • агрегировать все собранные данные и отображать их на веб-платформе панели мониторинга
  • генерировать сигналы тревоги (аудио + визуальные), когда люди не соблюдают требуемые меры

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

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

Имея все это в виду, мы написали деловое предложение примерно на 30 страниц, и, к счастью, оно было принято! Отличие заключалось лишь в том, что руководство университета хотело сначала увидеть прототип (только одно устройство), а затем масштабировать его.

Как это работает

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

Как видно на рисунке выше, есть 3 основных компонента, о которых я расскажу отдельно:

а. Процессор видеопотока для устройства N

Это программное обеспечение, которое работает на устройстве (точнее, на микроконтроллере), а значит, здесь лежат все алгоритмы.

Для задачи обнаружения маски мы использовали предварительно обученный Yolo-v4-tiny из GitHub с идеей его дальнейшей тонкой настройки с использованием наших собственных данных. Удивительно, но сначала он работал довольно хорошо даже в условиях низкой освещенности, поэтому мы решили использовать его как есть и сэкономить время и энергию для создания других частей, связанных с программным обеспечением.

Задача заключалась в том, чтобы заставить его работать в режиме реального времени. Используя чистую реализацию Python, мы получили довольно низкий FPS (точное значение я не помню, но, поверьте мне, он был медленным). Итак, что мы сделали, так это запустили алгоритм обнаружения (Yolo-v4-tiny) напрямую через фреймворк Darknet (который написан на C&Cuda и явно быстрее, чем Python). И это сработало! Значительно увеличился FPS. Мы вызвали платформу Darknet в Python, используя библиотеку подпроцессов, и прочитали вывод консоли.

Задачу обнаружения высокой температуры реализовать было довольно просто. Мы взяли поток с тепловизионной камеры, извлекли температуру (на основе интенсивности пикселей) и сравнили ее с порогом. Однако мы по-прежнему сталкиваемся с некоторыми проблемами при выполнении этой задачи:

▹Мы не смогли найти хороший API для тепловизионной камеры, который мог бы дать нам видеопоток и реальную температуру. Есть несколько доступных API, но они не работают должным образом. Итак, нам пришлось вручную извлекать кадры и делать сопоставление между интенсивностью красного канала и фактическими температурами.

▹Нам пришлось запускать это как отдельный процесс и синхронизировать его с тем, который отвечает за обнаружение маски (который был скриптом python, который вызывает скрипт C)

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

Чтобы аппроксимировать реальное расстояние, мы должны вычислить евклидово расстояние в трехмерном пространстве. Проблема в том, что мы не используем камеру глубины, поэтому у нас есть информация только о координатах X и Y лиц, а не Z (только в 2d-плоскости).

Не возникает вопроса: как мы можем оценить глубину лиц только по 2D-изображениям?

Наша идея заключалась в том, чтобы использовать площадь ограничивающих рамок. Исходя из предположения, что все лица имеют примерно одинаковый размер, это означает, что если площадь 2 ограничивающих рамок (соответствующих 2 обнаруженным лицам) то же самое, тогда эти 2 человека находятся в одной плоскости Z (одинаковая глубина). Кроме того, если ограничивающая рамка меньше, это означает, что обнаруженный человек находится дальше от камеры. И наоборот: чем меньше размер ограничивающей рамки, тем ближе к камере находится человек. Имея это в виду, мы использовали небольшую нейронную сеть для аппроксимации реального расстояния между людьми, используя координаты X и Y из 2-мерного кадра и площадь ограничивающих прямоугольников в качестве координаты Z.

Все эти три алгоритма отправляют данные в модуль посредника в виде событий JSON через запросы POST.Из каждого кадра.

б. Средний человек

Этот модуль имеет следующие роли, описанные в порядке их следования:

  • Получать все события с устройства/устройств.
  • Обработатьих:
     — решить, принадлежит ли конкретное событие (например, обнаружение человека без маски) тому же человеку, что и в предыдущем кадре. Это можно очень хорошо сделать с помощью алгоритма отслеживания, но, поскольку это дорогостоящая задача с вычислительной точки зрения, мы сделали это более ручным способом, просматривая координаты и дату и время)
    - Преобразование событий JSON в наши конкретные типы данных (в основном статистические объекты Python, которые я опишу в разделе веб-платформы)
    — сохраняйте их в базе данных
  • Открыть все собранные данные для веб-платформы через службы REST.

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

в. Веб-платформа

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

  • На текущий день общее количество людей, вошедших в здание, делится на 4 категории:
    - те, кто носит маску
    - те, кто не носит маску (или носит ее, но неправильно )
    - тем, у кого повышена температура тела
    - тем, кто не соблюдает социальную дистанцию
  • На текущий день общее количество людей, которые соблюдают ограничения Covid-19, по сравнению с теми, кто не соблюдает (на этот раз в процентах)
  • Совокупный трафик людей, входящих в здание за текущие сутки (опять же, разделенный на две категории: соблюдающие ограничения и не соблюдающие)
  • Для каждого дня недели общее количество людей, которые соблюдают ограничения по сравнению с теми, кто не соблюдает

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

Этот модуль был полностью написан с использованием React с фреймворком Bootstrap, начиная с бесплатного шаблона, найденного на этом удивительном веб-сайте. Опять же, мы не пытались изобретать велосипед, а пытались создать MVP как можно быстрее.

Я считаю, что всю описанную выше программную архитектуру можно было бы сделать более элегантным/оптимизированным способом, но наш опыт здесь ограничен, поскольку мы оба занимаемся анализом данных 😄.

Аппаратные компоненты

Сердце и мозг устройства представлены микроконтроллером Jetson Xavier. Глаза представлены биспектральной камерой Hikvision (тепловая + RGB). Эти два компонента являются основными.

Среди второстепенных компонентов у нас есть беспроводной маршрутизатор для доступа к камере, 21-дюймовый монитор в качестве дисплея устройства, удлинитель с 4 входами и все соответствующие силовые кабели.

Все эти компоненты прикреплены к черной деревянной доске, которая прикреплена к металлическому штативу.

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

Еще одна большая проблема этого проекта заключалась в том, что оборудование было доставлено всего ~7 месяцев после того, как проект уже начался (учитывая 10-месячный срок от начала до поставки). Похоже, покупка вещей через аукционы — очень медленный процесс с бюрократической точки зрения.

Будущая работа

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

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

Заключение

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

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