了解 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 中手动安装该库。

添加库后,转到 File -> Examples。您应该会在列表底部附近看到一个名为 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 包含 constants.ccoutput_handler.cc 文件的 SparkFun Edge 实现,将在指定目标 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 库

如果需要生成新的库 build,您可以从 TensorFlow 代码库运行以下脚本:

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

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

移植到新设备

有关将适用于微控制器的 TensorFlow Lite 移植到新平台和设备的指南,请参阅 micro/docs/new_platform_support.md