背景
隨著時(shí)間的流逝,食物浪費(fèi)問(wèn)題對(duì)環(huán)境的影響越來(lái)越嚴(yán)重。聯(lián)合國(guó)環(huán)境規(guī)劃署 (UNEP) 最近的食物浪費(fèi)指數(shù)報(bào)告顯示,平均而言,消費(fèi)者每年浪費(fèi)近 10 億噸食物(或購(gòu)買的所有食物的 17%)。
人們生產(chǎn)的食物多于消耗的食物這一事實(shí)會(huì)產(chǎn)生重大的負(fù)面影響。例如,估計(jì)全球溫室氣體排放的 8-10% 來(lái)自未使用的食物。相反,減少食物浪費(fèi)將有助于減少溫室氣體排放和全球污染,并增加遭受饑餓的國(guó)家的糧食供應(yīng)。
這種情況表明,在不久的將來(lái),我們需要關(guān)注的不是擴(kuò)大食品生產(chǎn),而是及時(shí)控制質(zhì)量,以便新鮮產(chǎn)品可以銷售和消費(fèi)。為了解決當(dāng)前的情況,人類將需要更智能的用戶友好型技術(shù),以幫助他們實(shí)時(shí)監(jiān)控產(chǎn)品質(zhì)量。
在這篇文章中,我將解釋一種檢查食品質(zhì)量的簡(jiǎn)單方法,該方法可以在普通商店甚至您自己的冰箱中實(shí)施。
介紹
最近,我做了一個(gè)簡(jiǎn)單的實(shí)驗(yàn),我想和大家分享一下,因?yàn)槲覉?jiān)信這樣的實(shí)際解決方案可以對(duì)解決全球性問(wèn)題產(chǎn)生很大的影響。
我的想法是使用 Tiny Machine Learning 方法根據(jù)氣體傳感器的數(shù)據(jù)預(yù)測(cè)食物是新鮮的還是變質(zhì)的。我使用 7 個(gè)氣體傳感器進(jìn)行了實(shí)驗(yàn)。
在我的教程中,您將會(huì)學(xué)習(xí)如何自動(dòng)創(chuàng)建一個(gè)超小型機(jī)器學(xué)習(xí)模型,將其嵌入傳感器的微控制器中,并使用它檢查食品質(zhì)量。
所以讓我們開始吧!
程序:
第 1 步:使用 Neuton 創(chuàng)建 TinyML 模型
在 Neuton 平臺(tái)上創(chuàng)建一個(gè)新的解決方案“食品質(zhì)量”,并上傳包含食品質(zhì)量信號(hào)的訓(xùn)練數(shù)據(jù)集,標(biāo)記為兩個(gè)類別(新鮮和變質(zhì))。我的數(shù)據(jù)集包含 784 行。
然后,選擇目標(biāo)(標(biāo)簽)和目標(biāo)指標(biāo)(準(zhǔn)確度),同時(shí)啟用微型機(jī)器學(xué)習(xí)模式。此外,為沒(méi)有浮點(diǎn)數(shù)據(jù)類型的計(jì)算選擇 8 位深度,然后單擊“開始部署”。
模型將在幾分鐘內(nèi)準(zhǔn)備就緒,接下來(lái)需要下載模型。
第 2 步:創(chuàng)建微控制器的固件
下載示例:https ://github.com/Neuton-tinyML/arduino-example
項(xiàng)目介紹
該項(xiàng)目包含:
- 通過(guò) USB-UART 串??口接收數(shù)據(jù)集的代碼,
- 預(yù)測(cè)實(shí)現(xiàn),
- 結(jié)果指示,
- 用于測(cè)量預(yù)測(cè)時(shí)間的代碼。
主草圖文件“ arduino-tiny-ml-neuton.ino ”具有處理數(shù)據(jù)包的功能。
主要過(guò)程在 user_app.c 文件中進(jìn)行:
static NeuralNet neuralNet = { 0 };
extern const unsigned char model_bin[];
extern const unsigned int model_bin_len;
uint8_t app_init()
{
return (ERR_NO_ERROR != CalculatorInit(&neuralNet, NULL));
}
inline Err CalculatorOnInit(NeuralNet* neuralNet)
{
memUsage += sizeof(*neuralNet);
app_reset();
timer_init();
return CalculatorLoadFromMemory(neuralNet, model_bin, model_bin_len, 0);
}
在這里,創(chuàng)建一個(gè)對(duì)象 NeuralNet 并調(diào)用一個(gè)函數(shù)來(lái)加載位于文件model.c中的模型
CalculatorLoadFromMemory(neuralNet, model_bin, model_bin_len, 0);
該模型現(xiàn)在已準(zhǔn)備好進(jìn)行預(yù)測(cè)。為此,您需要通過(guò)將大小為 neuralNet.inputsDim 的浮點(diǎn)數(shù)組傳輸給 CalculatorRunInference 函數(shù)來(lái)調(diào)用它。
最后一個(gè)值是 BIAS,應(yīng)該是 1。
inline float* app_run_inference(float* sample, uint32_t size_in, uint32_t *size_out)
{
if (!sample || !size_out)
return NULL;
if (size_in / sizeof(float) != app_inputs_size())
return NULL;
*size_out = sizeof(float) * neuralNet.outputsDim;
if (app.reverseByteOrder)
Reverse4BytesValuesBuffer(sample, app_inputs_size());
return CalculatorRunInference(&neuralNet, sample);
}
執(zhí)行預(yù)測(cè)時(shí),會(huì)調(diào)用三個(gè)回調(diào)函數(shù):預(yù)測(cè)之前的 CalculatorOnInferenceStart 和預(yù)測(cè)之后的 CalculatorOnInferenceEnd,以及帶有預(yù)測(cè)結(jié)果的 CalculatorOnInferenceResult。
在示例中,我使用這些函數(shù)來(lái)測(cè)量預(yù)測(cè)時(shí)間。
具有類概率的數(shù)組與預(yù)測(cè)結(jié)果一起傳遞給函數(shù),大小為neuralNet.outputsDim。在這里,找到概率最高的類,如果概率 > 0.5,則打開 LED(綠色為 0 類,紅色為 1 類)。
inline void CalculatorOnInferenceResult(NeuralNet* neuralNet, float* result)
{
if (neuralNet->taskType == TASK_BINARY_CLASSIFICATION && neuralNet->outputsDim >= 2)
{
float* value = result[0] >= result[1] ? &result[0] : &result[1];
if (*value > 0.5)
{
if (value == &result[0])
{
led_green(1);
led_red(0);
}
else
{
led_green(0);
led_red(1);
}
}
else
{
led_green(0);
led_red(0);
}
}
}
第 3 步:將下載的模型復(fù)制到草圖中
將模型文件model.c從模型存檔復(fù)制到 MCU 固件。
第 4 步:編譯草圖并將其上傳到開發(fā)板
現(xiàn)在一切都準(zhǔn)備好,可以進(jìn)行草圖編譯了。我用程序?qū)?shù)據(jù)從計(jì)算機(jī)發(fā)送到 MCU 并顯示預(yù)測(cè)結(jié)果(它模擬傳感器數(shù)據(jù)并將數(shù)據(jù)發(fā)送到 MCU)。
根據(jù)您的操作系統(tǒng),使用bin文件夾中的相應(yīng)文件。
您需要為實(shí)用程序指定兩個(gè)參數(shù):USB 端口和數(shù)據(jù)集文件。
該實(shí)用程序讀取 CSV 文件并將樣本逐行發(fā)送到微控制器。然后,它將結(jié)果作為 CSV 文件輸出到標(biāo)準(zhǔn)輸出流。發(fā)送所有樣本后,實(shí)用程序會(huì)請(qǐng)求一份包含預(yù)測(cè)時(shí)間和消耗的內(nèi)存量的報(bào)告。
第 5 步:檢查嵌入式模型的功能
創(chuàng)建兩個(gè) CSV 文件,每個(gè)文件包含一行,其中的數(shù)據(jù)對(duì)應(yīng)于兩個(gè)類別:新鮮和變質(zhì)。
然后,將它們中的每一個(gè)發(fā)送到微控制器并查看預(yù)測(cè)結(jié)果
在第一種情況下,食物保持新鮮,因?yàn)轭A(yù)測(cè)類別為零,這意味著結(jié)果是“新鮮食物”。該預(yù)測(cè)是在 3844 微秒內(nèi)完成的,閃存使用量為 199kB,RAM 使用量為 136B。此外,您可以看到綠色 LED 亮起,這表示結(jié)果良好。
在另一種情況下,我們會(huì)看到模型預(yù)測(cè)食物變質(zhì)了,因?yàn)轭A(yù)測(cè)的類別是一類,表示“食物變質(zhì)”。預(yù)測(cè)也非常快,在 3848 微秒內(nèi),使用相同的 199 kB 閃存和 136 kB RAM。在這種情況下,您可以看到紅色 LED,表示食物已變質(zhì)。
結(jié)論:
這個(gè)實(shí)驗(yàn)證明,只需 5 個(gè)簡(jiǎn)單的步驟,您就可以創(chuàng)建一個(gè)工作智能設(shè)備,盡管它的體積很小,但對(duì)監(jiān)控食品質(zhì)量有很大幫助。我絕對(duì)確信這些技術(shù)可以幫助我們使我們居住的世界變得更清潔、更健康。
-
微控制器
+關(guān)注
關(guān)注
48文章
7487瀏覽量
151045 -
氣體傳感器
+關(guān)注
關(guān)注
14文章
539瀏覽量
37648 -
智能設(shè)備
+關(guān)注
關(guān)注
5文章
1045瀏覽量
50443
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論