🥬TensorFlow Lite深度学习Arduino微控制器
TensorFlow Lite | Arduino | 深度学习 | TinyML
介绍
Arduino
实现Arduino的输出处理的代码在hello_world / arduino / output_handler.cc中,用于代替原始文件hello_world / output_handler.cc。
让我们浏览一下源代码:
#include "tensorflow/lite/micro/examples/hello_world/output_handler.h"
#include "Arduino.h"
#include "tensorflow/lite/micro/examples/hello_world/constants.h"
首先,我们包含一些头文件。 我们的output_handler.h指定了此文件的接口。 Arduino.h提供了Arduino平台的接口; 我们用它来控制董事会。 因为我们需要访问kInferencesPerCycle,所以我们还包含了constants.h。
接下来,我们定义函数并指示它在首次运行时要执行的操作:
// Adjusts brightness of an LED to represent the current y value
void HandleOutput(tflite::ErrorReporter* error_reporter, float x_value,
float y_value) {
// Track whether the function has run at least once
static bool is_initialized = false;
// Do this only once
if (!is_initialized) {
// Set the LED pin to output
pinMode(LED_BUILTIN, OUTPUT);
is_initialized = true;
}
在C语言中,在函数内声明为静态的变量将在函数的多次运行中保持其值。 在这里,我们使用is_initialized变量来跟踪是否曾经运行过以下if(!is_initialized)块中的代码。
初始化块调用Arduino的pinMode()函数,该函数向微控制器指示给定的引脚应处于输入还是输出模式。 在使用图钉之前,这是必需的。 该函数由Arduino平台定义的两个常量调用:LED_BUILTIN和OUTPUT。 LED_BUILTIN表示连接到板载内置LED的引脚,而OUTPUT表示输出模式。
将内置LED的引脚配置为输出模式后,将is_initialized设置为true,以使该块代码不会再次运行。
接下来,我们计算所需的LED亮度:
// Calculate the brightness of the LED such that y=-1 is fully off
// and y=1 is fully on. The LED's brightness can range from 0-255.
int brightness = (int)(127.5f * (y_value + 1));
Arduino允许我们将PWM输出的电平设置为0到255之间的数字,其中0表示完全关闭,而255表示完全打开。 我们的y_value是介于–1和1之间的数字。前面的代码将y_value映射到0到255的范围内,以便当y = -1时LED完全熄灭,当y = 0时LED点亮一半,而当y = 1时 LED完全点亮。
下一步是实际设置LED的亮度:
// Set the brightness of the LED. If the specified pin does not support PWM,
// this will result in the LED being on when y > 127, off otherwise.
analogWrite(LED_BUILTIN, brightness);
Arduino平台的AnalogWrite()函数具有一个引脚号(我们提供LED_BUILTIN)和一个介于0到255之间的值。我们提供在上一行中计算出的亮度。 调用此功能时,LED将在该级别点亮。
最后,我们使用ErrorReporter实例记录亮度值:
// Log the current brightness value for display in the Arduino plotter
error_reporter->Report("%d\\n", brightness);
在Arduino平台上,ErrorReporter设置为通过串行端口记录数据。 串行是微控制器与主机计算机通信的一种非常常见的方式,通常用于调试。 这是一种通信协议,其中通过打开和关闭输出引脚来一次一次传输数据。 我们可以使用它来发送和接收任何内容,从原始二进制数据到文本和数字。
Arduino IDE包含用于捕获和显示通过串行端口接收的数据的工具。 其中一种工具(串行绘图仪)可以显示其通过串行接收的值的图形。 通过从代码中输出亮度值流,我们可以看到它们的图形。 图3展示了该方法的作用。
加速机器学习
TinyML构建和训练模型
TinyML构建应用
发布到微控制器
构建唤醒词检测应用
构建唤醒词检测模型
人物检测应用构建
人物检测模型构建
魔杖应用构建
魔杖模型训练
应用于微控制器的TensorFlow lite
部署TinyML应用
优化延时
优化能耗
Last updated