了解 C++ 库

适用于微控制器的 TensorFlow Lite C++ 库是 TensorFlow 存储库 的一部分。它旨在易于阅读、易于修改、经过良好测试、易于集成,并与常规 TensorFlow Lite 兼容。

以下文档概述了 C++ 库的基本结构,并提供有关创建您自己的项目的相关信息。

文件结构

micro 根目录具有相对简单的结构。但是,由于它位于庞大的 TensorFlow 存储库中,因此我们创建了脚本和预生成的项目文件,这些文件在各种嵌入式开发环境中以隔离的方式提供相关源文件。

关键文件

用于使用适用于微控制器的 TensorFlow Lite 解释器最重要的文件位于项目的根目录中,并附带测试

[`micro_mutable_op_resolver.h`](https://github.com/tensorflow/tflite-micro/blob/main/tensorflow/lite/micro/micro_mutable_op_resolver.h)
can be used to provide the operations used by the interpreter to run the
model.

请参阅 微控制器入门,了解典型用法的演练。

构建系统提供特定于平台的某些文件的实现。这些文件位于带有平台名称的目录中,例如 cortex-m

还存在其他几个目录,包括

  • kernel,其中包含操作实现和相关代码。
  • tools,其中包含构建工具及其输出。
  • examples,其中包含示例代码。

启动新项目

我们建议使用Hello World 示例作为新项目的模板。您可以按照本节中的说明获取适用于您选择的平台的版本。

使用 Arduino 库

如果您使用的是 Arduino,则Hello World 示例包含在 Arduino_TensorFlowLite Arduino 库中,您可以手动将其安装在 Arduino IDE 和 Arduino Create 中。

添加库后,转到 文件 -> 示例。您应该在列表底部附近看到一个名为 TensorFlowLite:hello_world 的示例。选择它并单击 hello_world 加载示例。然后,您可以保存示例的副本,并将其用作您自己的项目的依据。

为其他平台生成项目

适用于微控制器的 TensorFlow Lite 能够使用 Makefile 生成包含所有必要源文件的独立项目。当前支持的环境是 Keil、Make 和 Mbed。

要使用 Make 生成这些项目,请克隆 TensorFlow/tflite-micro 存储库 并运行以下命令

make -f tensorflow/lite/micro/tools/make/Makefile generate_projects

这将需要几分钟,因为它需要下载一些大型工具链来满足依赖关系。完成后,您应该看到在类似 gen/linux_x86_64/prj/ 的路径中创建了一些文件夹(确切路径取决于您的主机操作系统)。这些文件夹包含生成的项目和源文件。

运行命令后,您可以在 gen/linux_x86_64/prj/hello_world 中找到“Hello World”项目。例如,hello_world/keil 将包含 Keil 项目。

运行测试

要构建库并运行所有单元测试,请使用以下命令

make -f tensorflow/lite/micro/tools/make/Makefile test

要运行单个测试,请使用以下命令,将 <test_name> 替换为测试的名称

make -f tensorflow/lite/micro/tools/make/Makefile test_<test_name>

您可以在项目的 Makefile 中找到测试名称。例如,examples/hello_world/Makefile.inc 指定了“Hello World”示例的测试名称。

构建二进制文件

要为给定项目(例如示例应用程序)构建可运行的二进制文件,请使用以下命令,将 <project_name> 替换为要构建的项目

make -f tensorflow/lite/micro/tools/make/Makefile <project_name>_bin

例如,以下命令将为“Hello World”应用程序构建二进制文件

make -f tensorflow/lite/micro/tools/make/Makefile hello_world_bin

默认情况下,项目将针对主机操作系统进行编译。要指定不同的目标架构,请使用 TARGET=TARGET_ARCH=。以下示例显示了如何为通用 cortex-m0 构建“Hello World”示例

make -f tensorflow/lite/micro/tools/make/Makefile TARGET=cortex_m_generic TARGET_ARCH=cortex-m0 hello_world_bin

当指定目标时,任何可用的目标特定源文件将用于替换原始代码。例如,子目录 examples/hello_world/cortex_m_generic 包含 SparkFun Edge 对文件 constants.ccoutput_handler.cc 的实现,这些文件将在指定目标 cortex_m_generic 时使用。

您可以在项目的 Makefile 中找到项目名称。例如,examples/hello_world/Makefile.inc 指定了“Hello World”示例的二进制名称。

优化内核

tensorflow/lite/micro/kernels 根目录中的参考内核是用纯 C/C++ 实现的,不包含特定于平台的硬件优化。

优化版本的内核在子目录中提供。例如,kernels/cmsis-nn 包含几个利用 Arm 的 CMSIS-NN 库的优化内核。

要使用优化内核生成项目,请使用以下命令,将 <subdirectory_name> 替换为包含优化的子目录的名称

make -f tensorflow/lite/micro/tools/make/Makefile TAGS=<subdirectory_name> generate_projects

您可以通过为它们创建一个新的子文件夹来添加自己的优化。我们鼓励您为新的优化实现提交拉取请求。

生成 Arduino 库

如果您需要生成库的新版本,您可以从 TensorFlow 存储库中运行以下脚本

./tensorflow/lite/micro/tools/ci_build/test_arduino.sh

生成的库可以在 gen/arduino_x86_64/prj/tensorflow_lite.zip 中找到。

移植到新设备

有关将 TensorFlow Lite for Microcontrollers 移植到新平台和设备的指南,请参阅 micro/docs/new_platform_support.md.