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