Рубрики
Схемы на Arduino

Индикатор испорченных продуктов на Arduino

В данной статье мы рассмотрим создание индикатора испорченных продуктов (предсказателя качества еды) на основе платы Arduino Mega и технологии машинного обучения (Tiny Machine Learning).

Ранее на нашем сайте мы также рассматривали проект индикатора качества воды на основе Arduino.

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

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

  1. Плата Arduino Mega 2560 (купить на AliExpress).
  2. Arm Cortex M0.

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

Neuton Tiny ML Neuton.

Общее описание проекта

С каждым годом проблема пищевых отходов становится все более острой для окружающей среды. Недавний отчет Программы Организации Объединенных Наций по окружающей среде (United Nations Environment Program, UNEP) об индексе пищевых отходов показал, что в среднем потребители выбрасывают почти миллиард тонн продуктов питания в год (или 17 процентов всех покупаемых продуктов питания): https://www.unep.org/resources/report/unep-food-waste-index-report-2021.

Тот факт, что люди производят больше продуктов питания, чем потребляют, имеет значительные негативные последствия. Например, по оценкам, 8-10% глобальных выбросов парниковых газов приходится на неиспользованные продукты питания. Напротив, сокращение пищевых отходов поможет сократить выбросы парниковых газов и глобальное загрязнение, а также повысить доступность продовольствия для стран, страдающих от голода.

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

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

Недавно автор проекта (ссылка на оригинал приведена в конце статьи) провел простой эксперимент, и его результатами он хотел бы поделиться в с вами. Он твердо верит, что такие практические решения могут иметь большое значение в решении глобальных проблем человечества. Так сказать, “детские шаги” на пути к глобальному благу.

Его идея состоит в том, чтобы использовать технологию машинного обучения (Tiny Machine Learning) для прогнозирования того, является ли пища свежей или испорченной, на основе данных газовых датчиков. Он провел свой эксперимент с использованием 7 газовых датчиков.

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

Далее последовательно рассмотрим все необходимые шаги для реализации данного проекта.

Создание модели TinyML на платформе Neuton

Зарегистрируйтесь на платформе Neuton, после чего создайте в ней новый проект “Food Quality” (качество еды). Затем загрузите обучающий набор данных, содержащий сигналы о качестве продуктов питания, помеченные для двух классов (свежие и испорченные). Набор данных автора проекта содержал 784 строки.

Затем выберите цель (Label, Метка) и целевую метрику (Accuracy, Точность), и включите режим Tiny Machine Learning. Также выберите 8-битную глубину для вычислений без типов данных с плавающей запятой (without float data types) и нажмите “Start Training” (начать обучение).

Модель будет готова через несколько минут. После этого скачайте модель.

Написание программы для микроконтроллера

Скачайте пример программы и необходимые файлы для проекта по ссылке: https://github.com/Neuton-tinyML/arduino-example.

Программа для проекта содержит:

  • код для получения набора данных через последовательный порт USB-UART;
  • блок предсказания;
  • блок индикации результатов;
  • код для измерения времени предсказания.

Основной скетч проекта “arduino-tiny-ml-neuton.ino” содержит функции для обработки пакетов данных.

Основные процессы проекта происходят в файле user_app.c:

В этом фрагменте кода мы создаем объект NeuralNet и вызываем функцию для загрузки модели, располагающуюся в файле model.c.

Теперь наша модель готова для выработки предсказаний. Для этого необходимо вызвать функцию CalculatorRunInference и передать в нее в качестве параметра массив вещественных чисел размерностью neuralNet.inputsDim.

Последнее значение в данном массиве – это BIAS и оно должно быть равно 1.

При расчете предсказания происходит вызов 3-х функций: CalculatorOnInferenceStart перед началом процесса предсказания, CalculatorOnInferenceEnd после процесса предсказания и CalculatorOnInferenceResult с результатом предсказания.

В приведенном примере автор проекта использовал эти функции для измерения времени предсказания.

Массив с вероятностями классов передается в функцию с результатом предсказания, с размерностью neuralNet.outputsDim. Затем мы находим класс с самой высокой вероятностью, и если его вероятность больше 0.5, то включаем светодиод (зеленый светодиод для класса 0 и красный для класса 1).

Копирование скачанной модели в скетч

Скопируйте файл модели model.c из архива моделей в программное обеспечение микроконтроллера (MCU firmware). Этот процесс показан на следующем видео.

Компиляция скетча и загрузка его в плату Arduino

Автор проекта использовал Arduino IDE для компиляции скетча, его загрузки в плату Arduino и отображения результатов предсказания (он эмулирует данные датчика и передает их в плату).

Чтобы выполнить предсказание, скачайте необходимые файлы по адресу: https://github.com/Neuton-tinyML/dataset-uploader.

В скачанном каталоге используйте необходимый файл из подкаталога bin в зависимости от вашей операционной системы.

Вам необходимо переопределить два параметра в скачанных файлах: USB порт и файл с набором данных.

Пример:

uploader -d./food_quality_binary_test_spoiled.csv -s /dev/cu.usbmodem14411101

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

Тестирование работы проекта

Создадим два CSV файла, содержащих каждый по одной строке, с данными относящимися к двум классам: свежие продукты (fresh) и испорченные продукты (spoiled).

Затем передадим каждый из этих файлов в микроконтроллер и увидим результат предсказания.

В рассмотренном примере пища считается свежей, поскольку предсказанный класс равен 0, что означает свежую еду. Вероятность нулевого класса очень высокая – 100%. Предсказание было выполнено за 3844 мкс и при этом было затрачено 199 Кбайт флэш памяти и 136 Кбайт оперативной памяти (RAM). В результате проведенных операций загорелся светодиод зеленого цвета, что свидетельствует о свежих продуктах (не испорченных).

В следующем видео показан результат для другой строки данных. В этом случае мы видим, что модель определила еду испорченной (“spoiled food”). Предсказание также было выполнено очень быстро – за 3848 мкс. Было также использовано 199 Кбайт флэш памяти и 136 Кбайт оперативной памяти (RAM). Поскольку еда определилась как испорченная, то в результате загорелся светодиод красного цвета.

Исходный код программы (скетча)

Инициализация

Создание модели

Модель предсказания

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

Источник статьи

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

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