История проекта «сделай сам», который сочетает в себе глубокое обучение и плату Arduino Pro.

Это наконец случилось. Я навсегда попал в мир машинного обучения на встраиваемых системах. Первые признаки моего нового увлечения стали проявляться робко. Вначале я был очарован использованием Raspberry Pi. Сочетание Linux и Python гарантировало быстрые результаты. Это был прямой перевод с более крупной машины для инженера по машинному обучению. Более того, ощущение того, что вы делаете что-то осязаемое и вооружаете его своим кодом, было приятным изменением по сравнению с созданием кода, строго предназначенного для бэкенда.

Затем пришло время для Nvidia Jetson. Это мощное устройство создано специально для глубокого обучения и компьютерного зрения с первой загрузки. Настраивать и работать с экологическим щитом было одно удовольствие. Несмотря на его небольшой размер, меня все равно преследовало ощущение, что устройство слишком велико, и я не мог применить его во всех сценариях. Если быть точным, он был слишком тяжелым для моего Mavic.

Так я наткнулся на Arduino Nano. Должна признаться, что я была впечатлена и разочарована одновременно. Платформа предлагает большие возможности. Мы обсуждаем большие возможности расширения, легкий доступ к компонентам и возможность запуска небольших моделей машинного обучения. Каждый аксессуар, применимый к широко используемому Arduino Uno, также доступен для Nano. С другой стороны, работа с моделями машинного обучения — занятие не из приятных. Это связано со строгими ограничениями памяти.

Однако я не сдался. Arduino пользуется моим безграничным доверием. При этом работать с on-edge машинным обучением становилось все интереснее, а количество идей для приложений росло. Мне нужно было более мощное устройство с аналогичными габаритами. Так я наткнулся на Arduino Portenta.

В этой записи блога будет описан мой первый самодельный проект с использованием глубокого обучения на плате Arduino Pro. Возьмите чашку кофе. Это будет долго 🙂

Проблема

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

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

План прост. Спроектируйте и запрограммируйте мусорные баки таким образом, чтобы они способствовали формированию правильных привычек утилизации.

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

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

Распаковка

Основные комплектующие пришли ровно через день после заказа, что приятно удивило. В этом проекте я решил работать с Arduino Portenta H7. Доска была дополнена визирным щитом. Датчика камеры 320x320 пикселей достаточно, чтобы классифицировать основные виды отходов. Щит совместим с LoRa, что пригодится в будущих проектах. Существует также его версия для Ethernet.

Подготовка платы

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

Теперь сложная часть. Для работы с платой нам потребовалась ее прошивка. Я собираюсь использовать Portenta в двух случаях.

Первый связан со сбором данных и подготовкой модели. Я планирую использовать для этого Edge Impulse. К счастью, у них есть отличный туториал по интеграции платы с платформой. Не забудьте использовать ваш браузер для подключения к устройству. Это делает процесс плавным.

Второй сценарий сочетает в себе вывод с использованием модели машинного обучения и управление некоторым дополнительным оборудованием. Я фанат MicroPython и CircuitPython. Вот почему я использовал OpenMV, который требует других шагов установки. После скачивания IDE и подключения платы вы получите уведомление о возможности прошивки устройства.

Обратите внимание, что сценарии несовместимы.

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

Собрать

Подготовка красочных корзин для мусора была первой задачей в моем списке. Установка состоит из трех бункеров. Каждый цвет представляет разные типы отходов: синий (бумага), желтый (пластик и металл) и зеленый (стекло). Корзина контроллера размещена посередине. Сверху я вырезал прямоугольное отверстие, куда поместил плату Arduino с камерой. Каждый бункер имеет пару светодиодных лент, закрепленных на внутренних стенках. Маленький повербанк питает все. Конечно, внутренняя разводка выглядит как спагетти 😅.

Подготовка данных

Существует несколько подходов к подготовке данных. Я мог бы работать с существующим набором данных или подготовить его самостоятельно. Хотя есть общедоступные помеченные наборы данных, которые я мог бы приспособить к проблеме, я решил создать свой собственный небольшой набор образцов. Это было связано со спецификой сенсора камеры Arduino и желанием проверить возможности платформы Edge Impulse. Это был хороший выбор. Функция сбора данных Edge Impulse интуитивно понятна, что позволяет мне эффективно справляться с задачей. Включение соединения между платформой и устройством было отличной идеей.‍

Подготовка модели

Я решил продолжить развитие Edge Impulse и обучил модель машинного обучения с использованием фреймворка TensorflowLite. Во-первых, я создал Импульс, который представляет собой план конвейера обучения. Следующий шаг был связан с предварительной обработкой данных. Наконец, я выбрал предопределенную архитектуру модели и инициализировал процесс. Модель быстро сошлась с доступной опцией трансферного обучения и дала хороший результат. Мне все еще любопытно, сколько настроек возможно с помощью Edge Impulse, но я скоро проверю это на более сложном примере использования.

‍Развертывание

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

Полученные результаты

После того, как все было собрано, пришло время пользовательских приемочных тестов. Детям понравились первые 15 минут работы, но оно того стоило.‍

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

Краткое содержание

Подводя итог, время было потрачено с пользой. Я многому научился и отлично провел время, собирая и кодируя решение. Я убежден, что машинное обучение на периферии станет важной темой в будущем. Есть несколько областей, где применим такой подход. В то же время я думаю, что многое еще предстоит сделать. К счастью, Edge Impulse и OpenMV значительно упрощают работу.

Чтобы узнать больше об автоматизированной классификации отходов, вы можете прочитать статью Камила Жеховски, нашего старшего инженера по машинному обучению.

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

— Адам Вавжиньски, старший инженер по машинному обучению в ReasonField Lab.

Первоначально опубликовано на https://www.reasonfieldlab.com.