背景
随着时间的流逝,食物浪费问题对环境的影响越来越严重。联合国环境规划署 (UNEP) 最近的食物浪费指数报告显示,平均而言,消费者每年浪费近 10 亿吨食物(或购买的所有食物的 17%)。
人们生产的食物多于消耗的食物这一事实会产生重大的负面影响。例如,估计全球温室气体排放的 8-10% 来自未使用的食物。相反,减少食物浪费将有助于减少温室气体排放和全球污染,并增加遭受饥饿的国家的粮食供应。
这种情况表明,在不久的将来,我们需要关注的不是扩大食品生产,而是及时控制质量,以便新鲜产品可以销售和消费。为了解决当前的情况,人类将需要更智能的用户友好型技术,以帮助他们实时监控产品质量。
在这篇文章中,我将解释一种检查食品质量的简单方法,该方法可以在普通商店甚至您自己的冰箱中实施。
介绍
最近,我做了一个简单的实验,我想和大家分享一下,因为我坚信这样的实际解决方案可以对解决全球性问题产生很大的影响。
我的想法是使用 Tiny Machine Learning 方法根据气体传感器的数据预测食物是新鲜的还是变质的。我使用 7 个气体传感器进行了实验。
在我的教程中,您将会学习如何自动创建一个超小型机器学习模型,将其嵌入传感器的微控制器中,并使用它检查食品质量。
所以让我们开始吧!
程序:
第 1 步:使用 Neuton 创建 TinyML 模型
在 Neuton 平台上创建一个新的解决方案“食品质量”,并上传包含食品质量信号的训练数据集,标记为两个类别(新鲜和变质)。我的数据集包含 784 行。
然后,选择目标(标签)和目标指标(准确度),同时启用微型机器学习模式。此外,为没有浮点数据类型的计算选择 8 位深度,然后单击“开始部署”。
模型将在几分钟内准备就绪,接下来需要下载模型。
第 2 步:创建微控制器的固件
下载示例:https ://github.com/Neuton-tinyML/arduino-example
项目介绍
该项目包含:
主草图文件“ arduino-tiny-ml-neuton.ino ”具有处理数据包的功能。
主要过程在 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);
}
在这里,创建一个对象 NeuralNet 并调用一个函数来加载位于文件model.c中的模型
CalculatorLoadFromMemory(neuralNet, model_bin, model_bin_len, 0);
该模型现在已准备好进行预测。为此,您需要通过将大小为 neuralNet.inputsDim 的浮点数组传输给 CalculatorRunInference 函数来调用它。
最后一个值是 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);
}
执行预测时,会调用三个回调函数:预测之前的 CalculatorOnInferenceStart 和预测之后的 CalculatorOnInferenceEnd,以及带有预测结果的 CalculatorOnInferenceResult。
在示例中,我使用这些函数来测量预测时间。
具有类概率的数组与预测结果一起传递给函数,大小为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 步:编译草图并将其上传到开发板
现在一切都准备好,可以进行草图编译了。我用程序将数据从计算机发送到 MCU 并显示预测结果(它模拟传感器数据并将数据发送到 MCU)。
根据您的操作系统,使用bin文件夹中的相应文件。
您需要为实用程序指定两个参数:USB 端口和数据集文件。
该实用程序读取 CSV 文件并将样本逐行发送到微控制器。然后,它将结果作为 CSV 文件输出到标准输出流。发送所有样本后,实用程序会请求一份包含预测时间和消耗的内存量的报告。
第 5 步:检查嵌入式模型的功能
创建两个 CSV 文件,每个文件包含一行,其中的数据对应于两个类别:新鲜和变质。
然后,将它们中的每一个发送到微控制器并查看预测结果
在第一种情况下,食物保持新鲜,因为预测类别为零,这意味着结果是“新鲜食物”。该预测是在 3844 微秒内完成的,闪存使用量为 199kB,RAM 使用量为 136B。此外,您可以看到绿色 LED 亮起,这表示结果良好。
在另一种情况下,我们会看到模型预测食物变质了,因为预测的类别是一类,表示“食物变质”。预测也非常快,在 3848 微秒内,使用相同的 199 kB 闪存和 136 kB RAM。在这种情况下,您可以看到红色 LED,表示食物已变质。
结论:
这个实验证明,只需 5 个简单的步骤,您就可以创建一个工作智能设备,尽管它的体积很小,但对监控食品质量有很大帮助。我绝对确信这些技术可以帮助我们使我们居住的世界变得更清洁、更健康。
全部0条评论
快来发表一下你的评论吧 !