Автор Джордж Солоупис ML GDE.

В этом сообщении в блоге обобщаются усилия по созданию прототипа простого решения для определения качества продуктов питания для людей с нарушением или потерей обоняния с помощью одноплатного компьютера (Raspberry Pi 4B), несколько простых датчиков воздуха и машинное обучение.

Идея пришла ко мне случайно, когда мой друг сказал мне, что в результате аварии на велосипеде он потерял обоняние и иногда ему приходилось просить других людей понюхать его еду, чтобы понять, стоит ли ему ее есть. Посетив несколько ИТ-мероприятий по машинному обучению, я никогда не слышал о решении этой проблемы, и это заставило меня задуматься, настолько ли велика мощь машинного обучения, что оно может справиться с этой ситуацией. Имея хорошие связи с Афинской GDG, я связался с некоторыми другими блестящими разработчиками, и мы объединились, чтобы найти решение. Мы получили большую поддержку от разработчиков Google в рамках Фонда социального воздействия, и после нескольких онлайн-встреч мы пришли к выводу, что нам нужно создать устройство, которое было бы доступным, точным и могло бы использоваться любым, кто не знаком с компьютерами и программированием.

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

Нам также понадобился АЦП (аналогово-цифровой преобразователь). Мы решили использовать 8-канальный модуль MCP3008, который был подключен к последовательному соединению SPI Raspberry.

Соединение между датчиками и АЦП может быть выполнено либо через TTL, который представляет собой преобразователь логического уровня, либо с помощью простого использования резисторов и деления напряжения для преобразования 0–5 В выходного сигнала датчиков в 0–3,3 В. АЦП ожидает. Оба варианта должны работать нормально.

Если у вас есть проводка, потребуется библиотека. Его необходимо установить, чтобы воспользоваться преимуществами использования MCP3008. Последняя версия программного обеспечения называется CircuitPython и была загружена здесь.

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

Вы можете найти подробное руководство со всеми подробностями и кодом в этом сообщении в блоге Medium.

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

  • MQ-2 (Метан, Бутан, СУГ, дым)
  • MQ-3 (Алкоголь, Этанол, дым)
  • MQ-4 (Метан, СПГ)
  • MQ-135 (Бензол, Алкоголь, дым)
  • MQ-6 (СУГ, бутан)
  • MQ-7 (угарный газ)
  • MQ-8 (водородный газ)
  • MQ-9 (Угарный газ, горючие газы)

После их установки макетная плата имела следующую настройку:

Через SPI-интерфейс Raspberry мы начали собирать данные каждую минуту после размещения датчиков над сыром.

Мы даже создали разные прототипы с датчиком на печатных платах:

и использовал его для эксперимента:

Или датчики на простых розетках:

Проверьте схему, которую Акис Влиссидис предоставил:

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

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

Инференс внутри Raspberry делается с помощью tflite-runtime для экономии ресурсов. Изучив установленную версию этой библиотеки, мы должны использовать ту же версию TensorFlow для обработки данных. MCP3008 предоставляет значения от 0 до 65472 для каждого датчика благодаря используемой библиотеке CircuitPython. Мы помечаем первые часы цифрой «0», а финал времени цифрой «1»:

Типичная схема каждого датчика была такой:

Были созданы данные поезда, проверки и испытаний, и мы разделили продукты на съедобные и несъедобные. Машинное обучение еще раз доказало свою силу, предоставив модель с точностью более 90%!

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

Вывод внутри Raspberry делается с помощью tflite-runtime. Ограниченные ресурсы Raspberry Pi вынудили нас использовать более легкие решения, чем установка всего пакета TensorFlow. В первую очередь пришлось обратить внимание на версию упаковки внутри одноплатного компьютера. Эту версию нужно было использовать для обучения модели машинного обучения, которая затем была преобразована в формат tflite.

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

input_array = []            
for item in lst:                
    input_array.append(float(item))   
          
test_features = np.array(input_array).astype(np.float32)            test_features = np.expand_dims(test_features, axis=0)  
          
# Load the TFLite model and allocate tensors.            
interpreter = tflite_runtime.Interpreter(model_path="food_model_250.tflite")            interpreter.allocate_tensors()  
           
# Get input and output tensors details.            
input_details = interpreter.get_input_details()            output_details = interpreter.get_output_details()            print(input_details)            
print(output_details)interpreter.set_tensor(input_details[0]['index'], test_features)             
interpreter.invoke()
            
# The function `get_tensor()` returns a copy of the tensor data.            # Use `tensor()` in order to get a pointer to the tensor.            output_data = interpreter.get_tensor(output_details[0]['index'])            print(output_data)

Выходные данные представлены в виде массива, из которого мы получаем максимальное значение. Затем мы передаем значение на устройство Android, чтобы у нас был визуальный результат вывода:

Ознакомьтесь с хорошо написанным сообщением в блоге от Konstantinos Michelis, в котором анализируется, как вы можете подключить Raspberry к устройству Android.

Заключение
Используя ограниченные ресурсы, мы ясно показываем, что мощь машинного обучения настолько велика, что оно может обрабатывать данные простых датчиков воздуха и выводить оценку, съедобна ли пища или нет. помощью небольшого, но удобного Raspberry Pi. Полную информацию и фрагменты кода можно найти в этом репозитории Github.

Будущие улучшения
1. Используйте разные резисторы RL для изменения чувствительности каждого датчика.
2. Экспериментируйте также с датчиками MQ-131, MQ-136, MQ-137, MQ138. .
3. Уменьшить размер прототипа.
4. Поэкспериментировать с более чем 8 датчиками, включив 2-й SPI Raspberry.

Эксперимент:
Георгиос Солоупис
Фармацевт, старший разработчик Android, ML GDE.
LinkedIn
Github Средний

Акис Влиссидис
Менеджер по ИТ-приложениям/Folli Follie Group.
LinkedIn
Twitter
Github

Твиттер

Приложение для Android:
Константинос Микелис
Внештатный разработчик Android — штатный инженер в Hellenic Air Force, но работающий неполный рабочий день над личными проектами в Android с 2016 года.
Github
LinkedIn

Ресурсы:
Димитрис Панагопулос
Исследователь (чистый) математик, специалист по науке о данных
LinkedIn

Джордж Кандилогианнакис
Компьютерная инженерия — учитель информатики
LinkedIn

Ресурсы:
https://magpi.raspberrypi.com/articles/electronic-nose
https://www.ncbi.nlm.nih.gov/pmc /articles/PMC6282642/
https://drive.google.com/file/d/1TyxhH3GltOoE_km5Hlgq1dud50uq8HeC/view?usp=sharing
https://drive.google.com/file/ d/1LMbi95dqlGEhmTrEqHAuIOcW3pOH2f20/view?usp=sharing
https://drive.google.com/file/d/1OKgimAKZ_ObWmFxl8vuAZNNyowg3xhki/view?usp=sharing