Написано от Джордж Солупис ML GDE.

Това е публикация в блог, която обобщава усилията за създаване на прототип на просто решение за откриване на качеството на храните за хора с нарушено обоняние или загуба на обоняние с помощта на едноплатков компютър (Raspberry Pi 4B), куп прости сензори за въздух и Машинно обучение.

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

Първата ни цел беше да намерим солидни, но евтини материали. Някои от тях бяха сензори със запоена печатна платка, тъй като не е необходимо допълнително окабеляване и е необходимо използването на резистори и кондензатори за създаване на такова устройство. Вижте как са направени и как работят сензорите MQ-X в тази статия.

Имахме нужда и от ADC (което означава аналогово-цифров преобразувател). Решихме да използваме 8-канален модул MCP3008, който беше свързан към активираната SPI серийна връзка на Raspberry.

Връзката между сензорите и ADC може да се осъществи или чрез TTL, който е преобразувател на логически нива, или с просто използване на резистори и разделяне на напрежението за преобразуване на 0 до 5 V на изхода на сензорите в 0 до 3,3 V ADC очаква. И двете опции трябва да работят добре.

След като имате окабеляване, ще е необходима библиотека. Той трябва да бъде инсталиран, за да се възползвате от използването на MCP3008. Най-новата версия на софтуера се нарича CircuitPython и е качена тук.

Когато всичко е настроено правилно, ще получите макет, който трябва да изглежда така:

Можете да намерите подробно ръководство с всички подробности и код в тази Средна публикация в блога.

В допълнение към работата за един сензор трябваше да намерим информацията за останалите, които използвахме в нашия експеримент. Цялата настройка се състои от следните сензори:

  • MQ-2 (метан, бутан, LPG, дим)
  • MQ-3 (Алкохол, Етанол, дим)
  • MQ-4 (метан, CNG газ)
  • MQ-135 (бензен, алкохол, дим)
  • MQ-6 (LPG, газ бутан)
  • MQ-7 (Въглероден окис)
  • MQ-8 (водород)
  • MQ-9 (Въглероден окис, запалими газове)

След поставянето им макетът имаше следната настройка:

Чрез SPI интерфейса на Raspberry започнахме да събираме данни на всяка минута след поставяне на сензорите над сиренето.

Дори създадохме различни прототипи със сензор върху печатни платки:

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

Или сензори на прости гнезда:

Проверете схемата, която Akis Vlissidisе предоставил:

Можете да намерите повече информация за различните сензори, тяхното използване и код за използването им в тази Средна публикация в блог.

Данните трябваше да бъдат обработени с TensorFlow (рамка за машинно обучение), за да ни помогнат да определим качеството на храната. За всеки експеримент събирахме данни за един ден.

Изводът в Raspberry се прави с помощта на tflite-runtime за пестене на ресурси. Като изследваме инсталираната версия на тази библиотека, трябва да използваме същата версия на TensorFlow за обработка на данните. MCP3008 предоставя стойности от 0 до 65472 за всеки сензор поради използваната библиотека CircuitPython. Маркираме първите часове с цифрата “0” и финала на времето с цифрата “1”:

Типична диаграма на всеки сензор беше следната:

Данните за влака, валидирането и теста бяха създадени и ние категоризирахме храната като годна за консумация и негодна за консумация. Машинното обучение отново доказа силата си, като предостави модел, който беше над 90% точен!

В крайна сметка имахме файл .tflite, който можехме да поставим в Raspberry и да правим изводи със сурови данни от сензори по всяко време. За подробна информация относно обработката на данните следвайте тази Средна публикация в блог.

Изводът вътре в 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< br /> Среден

Акис Влисидис
Мениджър на ИТ приложения/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