Как создать детектор маски для лица с помощью Jetson Nano 2GB и AlwaysAI

Как создать детектор маски для лица с помощью Jetson Nano 2GB и AlwaysAI

Было очень интересно, когда Nvidia объявила о новой низкой цене на свои комплекты для разработчиков - Jetson Nano 2GB за 59 долларов. Я большой поклонник линейки продуктов Jetson, и просто удивительно, сколько программного обеспечения Nvidia использует на них. Однако, просмотрев версию на 4 ГБ, версию AGX и самодельный Jetbot, я не хотел просто запускать стандартные демонстрации и что-то писать. Я решил заняться созданием детектора маски для лица своими руками и подключиться к набору красных, зеленых и синих светофоров.

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

Необходимое оборудование, особенно впечатляющие светофоры

Для начала вам понадобится Jetson Nano (или что-то подобное, что вы можете использовать таким же образом). Я использовал самую новую и дешевую модель, но подойдет и любой другой Jetson. Тогда, конечно, вам понадобится камера. USB-камера, как и веб-камера, идеальна. Или камера с ленточным подключением, такая как камера Raspberry Pi. Я почти уверен, что вы также можете использовать поток с IP-камеры, но я не пробовал.

Для вывода в большинстве интернет-проектов DIY для Nano используются крошечные светодиоды. Это не казалось достойным wfoojjaec, поэтому я решил пойти дальше. Оказывается, подержанные светофоры - да, те, которые вы видите на перекрестках - довольно легко найти на eBay. Я купил набор 12-дюймовых фонарей красного, зеленого и желтого цветов, которые были изъяты из системы Аризонского шоссе - доставка была самой дорогой частью.

Светофоры, к сожалению для наших целей, рассчитаны на 120 вольт. Это потому, что, хотя они и являются светодиодными, они предназначены для замены более традиционных ламп с возможностью подключения вилок. Это означало либо операцию на них, чтобы обойти трансформатор, либо выключение и включение 120 В. Поскольку светофоры тщательно проклеены и защищены от атмосферных воздействий, я остановился на последнем. У меня уже было два умных разъема TP-Link / Kasa, поэтому мне хватило еще одного. Что касается аппаратного обеспечения, на данном этапе у вас все в порядке, кроме разработки системы крепления для фонарей (я все еще работаю над этим) и, возможно, удлинителя.

Построение маски для лица, определяющей нейронную сеть

Как это часто бывает, проще всего было оборудование. Моя идея для нейронной сети, обнаруживающей маски, заключалась в том, чтобы начать с модели обнаружения объектов с обнаружением лиц, которая была обучена распознавать лица и их ограничивающие рамки в различных сценах. Затем я провел дополнительное обучение (также известное как трансферное обучение), чтобы научить его определять, были ли на этих лицах маски. В принципе, это не должно быть сверхсложным, особенно с учетом того, что у Nvidia есть специальный инструментарий Transfer Learning Toolkit (TLT) именно для этой цели. Однако это оказалось самой трудоемкой частью проекта.

Шаг 1. Создание пригодных для использования наборов данных

Печальная правда о гламурно звучащих проектах ИИ заключается в том, что основная часть усилий часто кажется рутинным сбором и форматированием данных. В случае масок существует ряд наборов данных, все в разных форматах. Я выбрал набор данных медицинских масок и набор данных лиц без масок (MAFA и FDDB), чтобы использовать их для обучения. К счастью, в Интернете был хороший код Python, который помог мне перевести их в два нужных мне формата (KITTI для инструментария трансферного обучения Nvidia и Pascal VOC для AlwaysAI). Одна неприятная вещь, с которой я столкнулся, заключается в том, что некоторые из ограничивающих прямоугольников в наборах данных выходили за пределы границы изображения, где код повторного обучения Tensorflow от Nvidia был готов с ними справиться. Таким образом, это означало, что больше кода Python для повторной обработки данных и обрезки ограничивающих рамок, указывающих на расположение лиц. В итоге у меня было около 1000 лиц в масках и без масок. Для более серьезного проекта мне определенно потребовалось бы добавить немного больше обучающих данных.

Шаг 2: Использование передачи обучения для создания модели с маской / без маски

В начале проекта я думал, что использование TLT от Nvidia будет беспроблемным. К сожалению, разобравшись в деталях, я понял, что это не так. Он работает только в Linux и требует для обучения графический процессор Nvidia. WSL 2 начал некоторую ограниченную поддержку графических процессоров, но в этом случае это не сработало. А мой облачный сервер Paperspace, который я часто использую для обучения, не поддерживает более новую версию драйверов Nvidia, которая нужна TLT. Итак, я дважды загрузил Ubuntu на своем старом ноутбуке, думая, что наконец нашел решение. Но графический процессор 750M не поддерживается TLT. Наконец, я решил провести повторное обучение, а затем загрузить его в TLT для удаления и развертывания, но это не поддерживается. Он работает только с некоторыми базовыми моделями, предоставленными Nvidia.

Как создать детектор маски для лица с помощью Jetson Nano 2GB и AlwaysAI
Как создать детектор маски для лица с помощью Jetson Nano 2GB и AlwaysAI
Как создать детектор маски для лица с помощью Jetson Nano 2GB и AlwaysAI

К счастью, недавно я познакомился с AlwaysAI, которая предлагает среду разработки и выполнения для проектов машинного зрения с улучшенным ИИ. Они были в процессе выпуска версии своего продукта, которая поддерживала дополнительное обучение и развертывание моделей на устройствах, включая Nano. Поэтому я преобразовал свои данные из KITTI в требуемый формат Pascal VOC и попробовал. Я столкнулся с парой небольших сбоев, но их поддержка была отличной и помогала мне правильно настроить необходимую среду Docker плюс Python и использовать их интерфейс командной строки. Теперь у меня была рабочая модель, которую я мог видеть работающей.

Шаг 3: управление светофором

Было легко решить, что хорошим способом управления светом будут мои умные розетки Kasa, тем более что для них была небольшая изящная оболочка Python. Здесь тоже была загвоздка, поскольку для библиотеки Kasa требовался Python 3.7, а для образа AlwaysAI Docker - 3.6. Любой, кто использует Docker, знает, что запускать команды вне контейнера - нетривиальная задача. Я попытался обойти это, используя ssh обратно на тот же компьютер, но ни один из обходных путей, позволяющих избежать запроса пароля для каждой команды, не помог мне. Итак, я установил небольшой веб-сервер (простой в Python), который будет анализировать полученные команды и пересылать их в систему. Затем я использовал curl из своего приложения для отправки команд. Это отлично сработало, хотя и с небольшой задержкой по времени. К счастью, сотрудники AlwaysAI тем временем нашли для меня обходной путь, так что теперь у меня было два решения!

Вот как работает детектор маски для лица:

Запуск детектора маски

Я начал с базовой модели, которая была обучена распознавать лица на расстоянии, поэтому я надеялся, что мой детектор масок также будет работать на расстоянии - например, люди, подходящие к нашему дому. Однако, возможно, из-за того, что многие из моих дополнительных тренировочных изображений были сделаны крупным планом или, может быть, из-за того, что я использую старую веб-камеру, она не обнаруживала ничего, пока человек не оказался в пределах нескольких футов. Радиуса действия, может быть, хватит для камеры дверного звонка, но не для большой комнаты. До сих пор я не удосужился добавить в свой код причудливые таймеры и несколько состояний, поэтому он просто отображается желтым, пока не обнаружит немаскированное лицо - когда оно отображается красным - или лицо в маске - когда оно отображается зеленым. AlwaysAI сделал основной код довольно простым. Ниже представлен весь цикл обработки кадра. Я написал функцию doit (), которая отправляет команды curl на мини-веб-сервер:

Даже на Nano за 59 долларов модель могла анализировать кадр менее чем за 1/10 секунды, давая общую частоту кадров около 12 кадров в секунду. Достаточно для этого приложения. В целом, помимо незапланированного «опыта обучения», когда приходится опробовать несколько подходов на каждом этапе, он показывает, что возможно с минимальным оборудованием и готовым бесплатным программным обеспечением (AlwaysAI в настоящее время бесплатен, хотя в будущем взимать плату за коммерческие проекты, а весь другой код, который я использовал, бесплатен для личного использования).