Как добавить в дрон функцию распознавания лиц


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

Дрон с функцией распознавания лиц

Необходимые компоненты

  1. Комплект контроллера Pixhawk.
  2. Электронные регуляторы скорости (ESC).
  3. Бесщеточные двигатели.
  4. Литий-ионный аккумулятор емкостью 5200 мАч.
  5. Комплект SIPEED MAIXDUINO (для распознавания лиц).
  6. Сервомотор.
  7. Передатчик и приемник FlySky (6 каналов).
  8. Рама квадрокоптера S500.
  9. Электрическая зажигалка.
  10. Нитрат калия / ракетное топливо.

Внешний вид собранной конструкции проекта показан на следующем рисунке.

Внешний вид собранной конструкции дрона с функцией распознавания лиц

Схема проекта

Схема дрона с функцией распознавания лиц показана на следующем рисунке.

Схема дрона с функцией распознавания лиц

Реализация на программном уровне и обучение модели с помощью MaixHub

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

Более подробно про работу с платой Maixduino вы можете прочитать в следующих статьях на нашем сайте:

Главная страница сервиса MaixHub

Шаг 1: Сбор и подготовка данных

Перед обучением модели нам сначала нужно было собрать данные для классов "shivansh" и "Ashish". Этот процесс включал в себя получение изображений лиц с разных ракурсов, при разных условиях освещения и с разной мимикой. Цель состояла в том, чтобы создать надежный набор данных, способный обрабатывать вариативность в реальных условиях.

  • Размер набора данных: примерно 50-150 изображений на класс.

  • Качество изображений: все изображения были уменьшены до размера 224x224 пикселей (требуемый размер входных данных MaixHub) и сохранены в формате JPEG.

  • Расширение данных: хотя MaixHub имеет автоматический процесс расширения данных, дополнительное ручное расширение (например, вращение, отражение и регулировка контраста) помогло повысить вариативность набора данных. Это важно для улучшения производительности модели на ранее не встречавшихся данных.

Шаг 2: Загрузка набора данных в MaixHub

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

1. Создание нового проекта: после входа в MaixHub был создан новый проект в категории «Обнаружение объектов» .

2. Загрузка классов: на платформе были определены два класса (Shivansh, Ashish), и загружены соответствующие им изображения. Это позволило MaixHub связать каждое изображение с правильной меткой во время обучения.

3. Расширение данных: MaixHub применяет методы автоматического расширения данных, в том числе:

  • вращение: небольшие углы вращения (±15°);
  • горизонтальное отражение: случайным образом переворачивает изображения;
  • регулировка яркости и контрастности: случайные изменения для имитации различных условий освещения.

Загрузка изображения на MaixHub

Шаг 3: Настройка параметров обучения

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

  • Размер входных данных: размер входных данных модели был установлен на 224x224 пикселей. Это разрешение идеально подходит для работы на маломощных периферийных устройствах, таких как Maixduino, обеспечивая баланс между скоростью и точностью.
  • Якоря: для облегчения обнаружения объектов использовались заранее определенные якорные рамки. Эти якоря служат ориентирами для ограничивающих рамок, обеспечивая точную локализацию лица

anchors = [4.62, 3.28, 4.75, 5.0, 4.31, 4.38, 4.88, 3.77, 5.53, 4.08]

  • Скорость обучения: устанавливается на оптимальное значение для распознавания лиц, обеспечивающее сходимость модели с хорошей скоростью без переобучения.
  • Эпохи: модель обучалась в течение 50 эпох. Каждая эпоха представляет собой полный цикл обработки обучающего набора данных, что позволяет модели корректировать веса для повышения точности.
  • Размер пакета: установлен на 8, что хорошо подошло для размера набора данных и вычислительных ресурсов.

Задание параметров обучения модели в MaixHub

Шаг 4: Обучение модели

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

  • Функция потерь: функция потерь вычисляет разницу между прогнозируемыми и фактическими результатами. Цель состоит в минимизации этой потери с течением времени.
  • Точность: этот параметр показывает, насколько хорошо модель классифицирует изображения. MaixHub отслеживает точность и уведомляет пользователя о каждой эпохе обучения

В процессе обучения MaixHub визуализировал кривые точности и потерь. Если потери не уменьшались должным образом, вносились корректировки (например, изменялась скорость обучения или набор данных). Примерно через 30 минут обучение завершилось с потерями ниже 0,2 и точностью выше 95%, что достаточно для приложений обнаружения лиц в реальном времени.

Результаты обучения модели в MaixHub

Шаг 5: Тестирование модели на MaixHub

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

Результаты проверки: модель успешно обнаружила лица обоих классов с высокими значениями достоверности, что показывает, что она может различать классы «shivansh» и «Ashish».

Шаг 6: Экспорт модели

Убедившись в удовлетворительных результатах обучения, модель была экспортирована в формат .kmodel, который представляет собой облегченный, оптимизированный формат файлов, поддерживаемый процессором KPU (Kendryte Processing Unit) на Maixduino.

Адрес модели: файл .kmodel был сохранен на SD-карте для удобного доступа платы Maixduino.

model_addr = "/sd/model-153144.kmodel"

Шаг 7: Развертывание модели в Maixduino

После переноса файла .kmodel на SD-карту программа Maixduino загружает и использует модель для распознавания лиц в реальном времени.

1. Загрузка модели: модель загружается с помощью библиотеки KPU в MaixPy, а обнаружение лиц инициируется методом обнаружения объектов YOLOv2.

task = kpu.load(model_addr)
kpu.init_yolo2(task, 0.7, 0.5, 5, anchors)

Инструменты, используемые для реализации кода

Среда программирования: MaixPy IDE (IDE на основе Python для Maixduino).

Логотип MaixPy IDE

MaixPy IDE — это интегрированная среда разработки, предназначенная для упрощения процесса программирования и отладки плат Maix, таких как Maixduino, использующих процессоры Kendryte K210 AI. Она специально создана для работы с MicroPython, облегченной версией Python, оптимизированной для микроконтроллеров, что упрощает разработку приложений ИИ и IoT на встроенных системах.

Использованные библиотеки:

  • sensor: используется для инициализации камеры и захвата изображений.
  • image: для обработки изображений и рисования на ЖК-дисплее.
  • lcd: для управления отображением.
  • kpu: Для вывода модели с использованием нейронного сетевого процессора KPU.
  • ШИМ и таймер: для управления сервомотором.
  • UART: для связи по последовательному интерфейсу.

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

  • Плата Maixduino: основной процессор.
  • Камера GC0328: делает снимки для распознавания лиц.
  • Сервомотор: управление осуществляется на основе результатов распознавания лиц.
  • ЖК-дисплей: отображает видеопоток с камеры в режиме реального времени и результаты обнаружения.
  • Источник питания: USB или батарея для портативного использования.

Структура и пояснения кода

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

Внешний вид начального фрагмента кода проекта

1. Инициализация компонентов

ШИМ-таймер для управления сервомотором:

  • Для управления сервоприводом, подключенным к выводу IO21 на плате Maixduino, инициализируются таймер (Timer.TIMER0) и ШИМ-контроллер.

  • Частота ШИМ установлена ​​на 50 Гц, что типично для управления сервомоторами. Изначально сервомотор установлен на 0 градусов.

Настройка UART:

Интерфейс UART инициализируется для отправки результатов (данных об обнаруженном объекте) на другое устройство (например, ПК или другую плату).

2. Захват и обработка изображений

Инициализация камеры:

Библиотека датчиков инициализирует камеру в формате RGB565 с разрешением QVGA. Камера захватывает изображения для распознавания лиц.

Инициализация ЖК-дисплея:

Библиотека lcd используется для инициализации и управления дисплеем. Здесь же настраиваются поворот ЖК-экрана и очистка фона.

3. Вывод модели

Загрузка модели KPU:

  • Предварительно обученная модель распознавания лиц, экспортированная из формата .kmodel MaixHubin, загружается в KPU (процессор нейронной сети) Maixduino.

  • Сеть YOLOv2 процессора KPU обнаруживает объекты с порогом достоверности 0,7 и порогом подавления немаксимальных значений 0,5.

task = kpu.load(model_addr)

kpu.init_yolo2(task, 0.7, 0.5, 5, anchors)

Распознавание лиц:

Захваченное изображение обрабатывается моделью KPU для обнаружения лиц. Если лица обнаружены, вокруг них на ЖК-дисплее рисуются ограничивающие рамки.

Зажигание.

При обнаружении поверхности сервомотор поворачивается на 180° и остается в этом положении в течение 3 секунд. После этого он возвращается в исходное положение 0° для запуска воспламенителя.

Передача данных обнаружения через UART

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

Обработка и отображение ошибок

Эта lcd_show_except() функция отображает все ошибки, обнаруженные во время выполнения, непосредственно на ЖК-экране.

4. Выводы 

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

Полный код проекта

Весь код доступен по ссылке на GitHub ниже:

Код дрона с функцией распознавания лиц

Код HTML интерфейса

Видео, демонстрирующее работу проекта

(Проголосуй первым!)
Загрузка...
4 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *