提交 9ab89afe 编写于 作者: 一生痴绝处's avatar 一生痴绝处

Update tflite_micro doc

上级 da6da2c8
......@@ -2,11 +2,11 @@
**作者:**
Github: [Derekduke](https://github.com/Derekduke) E-mail: dkeji627@gmail.com
Github ID: [Derekduke](https://github.com/Derekduke) E-mail: dkeji627@gmail.com
Github: [QingChuanWS](https://github.com/QingChuanWS) E-mail: bingshan45@163.com
Github ID: [QingChuanWS](https://github.com/QingChuanWS) E-mail: bingshan45@163.com
Github: [yangqings](https://github.com/yangqings) E-mail: yangqingsheng12@outlook.com
Github ID: [yangqings](https://github.com/yangqings) E-mail: yangqingsheng12@outlook.com
## 概述
......@@ -50,7 +50,7 @@ Github: [yangqings](https://github.com/yangqings) E-mail: yangqingsheng12@outlo
有三种方式获取tflite_micro:
1. 从TencentOS tiny 代码仓库 `components\ai\tflite_micro`目录获取;
2. 以lib文件的形式使用tflite_micro组件,lib文件`TencentOS-tiny\components\ai\tflite_micro`的ARM_CortexM4_lib、ARM_CortexM7_lib和ARM_CortexM55_lib文件夹
2. 以lib文件的形式使用tflite_micro组件,lib文件`TencentOS-tiny\components\ai\tflite_micro`的ARM_CortexM4_lib、ARM_CortexM7_lib和ARM_CortexM55_lib文件夹
3. 从Tensorflow代码仓库获取,TFlite_Micro的源码已经开源,github仓库地址为:https://github.com/tensorflow/tensorflow ,可根据google TFLite Micro官方教程获得Tensorflow Lite Micro的全部源码。
如果没有tflite_micro开发经验,建议以**第一种**或者**第二种**方式获取tflite_micro,希望自行获取最新源码,或者编译lib文件,请参考`TencentOS-tiny\components\tflite_micro`目录的TFlite_Micro_Component_User_Guide.md文档,本指南将直接使用TencentOS tiny 代码仓库内的tflite_micro组件。
......@@ -61,17 +61,16 @@ Github: [yangqings](https://github.com/yangqings) E-mail: yangqingsheng12@outlo
以下是整个例程的目录规划:
| 一级目录 | 二级目录 | 三级目录 | 说明 |
| :-------: | :--------------------------: | :-------------------: | :----------------------------------------------------------: |
| arch | arm | | TencentOS tiny适配的IP核架构(含M核中断、调度、tick相关代码) |
| board | NUCLEO_STM32L496ZG | | 移植目标芯片的工程文件 |
| | | BSP | 板级支持包,外设驱动代码在Hardware目录 |
| component | ai | tflite_micro | tflite_micro源码及有关库文件 |
| examples | tflitemicro_person_detection | | 行人检测demo示例 |
| | | tflu_person_detection | 行人检测实例代码 |
| kernel | core | | TencentOS tiny内核源码 |
| | pm | | TencentOS tiny低功耗模块源码 |
| osal | cmsis_os | | TencentOS tiny提供的cmsis os 适配 |
| 一级目录 | 二级目录 | 三级目录 | 说明 |
| :-------: | :--------------------------: | :----------: | :----------------------------------------------------------: |
| arch | arm | | TencentOS tiny适配的IP核架构(含M核中断、调度、tick相关代码) |
| board | NUCLEO_STM32L496ZG | | 移植目标芯片的工程文件 |
| | | BSP | 板级支持包,外设驱动代码在Hardware目录 |
| component | ai | tflite_micro | tflite_micro源码 |
| examples | tflitemicro_person_detection | | 行人检测demo示例 |
| kernel | core | | TencentOS tiny内核源码 |
| | pm | | TencentOS tiny低功耗模块源码 |
| osal | cmsis_os | | TencentOS tiny提供的cmsis os 适配 |
完成TencentOS tiny基础keil工程准备工作后,在这个keil工程的基础上继续添加外设驱动代码。
......@@ -210,9 +209,9 @@ void task1(void *arg)
其中,retarget.c的路径为:`TencentOS-tiny\components\ai\tflite_micro\KEIL\retarget.c`
tensorflow_lite_micro.lib的路径为:`TencentOS-stiny\components\ai\tflite_micro\ARM_CortexM4_lib\tensorflow_lite_micro.lib`
tensorflow_lite_micro.lib的路径为:`TencentOS-tiny\components\ai\tflite_micro\ARM_CortexM4_lib\tensorflow_lite_micro.lib`
其余.cc文件和.h均在`examples\tflu_person_detection\tflu_person_detection`文件夹中。
其余.cc文件均在当前目录下的`tflu_person_detection`文件夹中。
#### 1.3 关闭Keil的MicroLib库
......@@ -244,7 +243,7 @@ TencentOS-tiny\components\ai\tflite_micro\ARM_CortexM4_lib\tensorflow\lite\micro
本例程的任务函数在
`TencentOS-tiny\examples\tflitemicro_person_detection\tflitemicro_person_detection.c`
`TencentOS-tiny\examples\tflitemicro_person_detection\tflitemicro_person_detection.c`目录下
#### 2.1 图像预处理
......@@ -312,13 +311,13 @@ void task2(void *arg)
#### 2.3 运行效果
通过串行输出实时打印信息,移动摄像头,没有对准行人时,输出如下:
通过串行输出实时打印信息,移动摄像头,镜头没有对准行人时,输出如下:
<div align=center>
<img src="./image/reasult_no_person.png" width=70% />
</div>
摄像头对准行人时,输出如下:
头对准行人时,输出如下:
<div align=center>
<img src="./image/reasult_person.png" width=70% />
......
# Tensorflow Lite Micro组件使用说明
Github ID: [Derekduke](https://github.com/Derekduke) E-mail: [dkeji627@gmail.com](mailto:dkeji627@gmail.com)
Github ID: [QingChuanWS](https://github.com/QingChuanWS) E-mail: [bingshan45@163.com](mailto:bingshan45@163.com)
Github ID: [yangqings](https://github.com/yangqings) E-mail: [yangqingsheng12@outlook.com](mailto:yangqingsheng12@outlook.com)
# 概述
`Tensorflow Lite Micro``TensorFlow Lite` 针对 AIOT 的轻量级 AI 引擎,专门用于在微控制器和其他资源受限的设备上运行机器学习模型。
# 1. 建立与转换模型
由于嵌入式设备存储空间有限,因此限制了深度学习的应用。同时考虑到平台算力以及算子支持等因素,因此在模型设计以及部署阶段需充分考虑硬件平台资源以及预期性能。
由于嵌入式设备存储空间有限,因此限制了深度学习的应用,同时考虑到平台算力以及算子支持等因素,因此在模型设计以及部署阶段需充分了解硬件平台资源以及预期性能。
本部分将介绍将 TensorFlow 模型转换为可在嵌入式设备上运行的模型的过程。
## 1.1 模型转换
将一个已训练好的 TensorFlow 模型转换为可以在嵌入式设备中运行的 Tensorflow Lite 模型可以使用 [TensorFlow Lite 转换器 Python API](https://tensorflow.google.cn/lite/microcontrollers/build_convert) 。它能够将模型转换成 [`FlatBuffer`](https://google.github.io/flatbuffers/) 格式,减小模型规模,并修改模型及算子以支持TensorFlow Lite运算。
将一个已训练好的 TensorFlow 模型转换为可以在嵌入式设备中运行的 Tensorflow Lite 模型可以使用 [TensorFlow Lite 转换器 Python API](https://tensorflow.google.cn/lite/microcontrollers/build_convert) 。它能够将模型转换成 [`FlatBuffer`](https://google.github.io/flatbuffers/) 格式,减小模型规模,并修改模型及算子以支持 TensorFlow Lite 运算。
### 1.1.1 量化
为了获得尽可能小的模型,某些情况下可以考虑使用 [训练后量化](https://tensorflow.google.cn/lite/performance/post_training_quantization) 。它会降低模型中数字的精度,从而减小模型规模,比如将 FP32 转化为 Int8。不过,这种操作可能会导致模型推理准确性的下降,对于小规模模型来说尤为如此,所以我们需要在量化前后分析模型的准确性,以确保这种损失在可接受范围内。
为了获得尽可能小的模型,某些情况下可以考虑使用 [训练后量化](https://tensorflow.google.cn/lite/performance/post_training_quantization) 。它会降低模型中数字的精度,从而减小模型规模,比如将 FP32 转化为 Int8。不过,这种操作可能会导致模型推理准确性的下降,对于小规模模型尤为如此,所以我们需要在量化前后分析模型的准确性,以确保这种损失在可接受范围内。
以下这段 Python 代码片段展示了如何使用预训练量化进行模型转换:
......@@ -36,7 +28,7 @@ open("converted_model.tflite", "wb").write(tflite_quant_model)
### 1.1.2 将模型文件转换为一个 C 数组
许多微控制器平台没有本地文件系统的支持。从程序中使用一个模型最简单的方式是将其转换为 C 数组并将其编译进你的程序。
许多微控制器平台没有本地文件系统,从程序中使用一个模型最简单的方式是将其转换为 C 数组并将其编译进应用程序。
以下的 unix 命令会生成一个包含 TensorFlow Lite 模型的 C 源文件,其中模型数据以 `char` 数组形式表现:
......@@ -54,33 +46,33 @@ unsigned char converted_model_tflite[] = {
unsigned int converted_model_tflite_len = 18200;
```
在生成了此文件之后,你可以将它包含到你的程序中。在嵌入式平台上,我们需要将该数组声明为 `const` 类型以获得更好的内存效率。
生成此文件后,你可以将其包含到程序中。在嵌入式平台上,我们需要将该数组声明为 `const` 类型以获得更好的内存效率。
## 1.2 模型结构与训练
在设计一个面向微控制器的模型时,考虑模型的规模、工作负载以及模型所使用到的算子是非常重要的。
在设计一个面向微控制器的模型时,考虑模型的规模、工作负载以及模型所使用到的算子是非常重要的。
### 1.2.1 模型规模
一个模型必须在二进制和运行时方面都足够小,以使其可以和你程序的其他部分满足目标设备的内存限制。
一个模型必须在二进制和运行时方面都足够小,以使其编译进应用程序后满足目标设备的内存限制。
为了创建一个更小的模型,你可以在模型设计中采用少而小的层。然而,小规模的模型更易导致欠拟合问题。这意味着对于许多应用,尝试并使用符合内存限制的尽可能大的模型是有意义的。但是,使用更大规模的模型也会导致处理器工作负载的增加
为了创建一个更小的模型,你可以在模型设计中采用少而小的层。然而,小规模的模型更易导致欠拟合问题。这意味着对于许多应用,尝试并使用符合内存限制的尽可能大的模型是有意义的。但是,使用更大规模的模型也会增加处理器工作负载
注:在一个 Cortex M3 上,TensorFlow Lite Micro的 core runtime 仅占约16 KB。
注:在一个 Cortex M3 上,TensorFlow Lite Micro 的 core runtime 仅占约16 KB。
### 1.2.2 工作负载
工作负载受到模型规模与复杂度的影响,大规模、复杂的模型可能会导致更高的功耗。在实际的应用场景中,功耗与热量的增加可能会带来其他问题。
工作负载受到模型规模,结构与复杂度的影响,大规模、复杂的模型可能会导致更高的功耗。在实际的应用场景中,功耗与热量的增加可能会带来其他问题。
### 1.2.3 运算支持
### 1.2.3 算子支持
TensorFlow Lite Micro 目前仅支持有限的 TensorFlow 算子,因此可运行的模型也有所限制。我们正致力于在参考实现和针对特定结构的优化方面扩展运算支持。Arm 的 CMSIS-NN 开源加速库也为算子的支持和优化提供了另一种可能。
TensorFlow Lite Micro 目前仅支持有限的 TensorFlow 算子,因此可运行的模型也有所限制。谷歌正致力于在参考实现和针对特定结构的优化方面扩展算子支持。Arm 的 CMSIS-NN 开源加速库也为算子的支持和优化提供了另一种可能。
已支持的运算可以在文件 [`all_ops_resolver.cc`](https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/micro/all_ops_resolver.cc) 中看到
已支持的算子在文件 [`all_ops_resolver.cc`](https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/micro/all_ops_resolver.cc) 中列出
## 1.3 运行推断
以下部分将介绍软件包自带语音历程中的 [main_functions.cc](https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/micro/examples/person_detection_experimental/main_functions.cc) 文件并阐述了如何使用 Tensorflow Lite Micro 来进行 AI 推理。
以下部分将介绍软件包自带语音例程中的 [main_functions.cc](https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/micro/examples/person_detection_experimental/main_functions.cc) 文件,并阐述了如何使用 Tensorflow Lite Micro 来进行 AI 推理。
### 1.3.1 包含项
......@@ -94,7 +86,7 @@ TensorFlow Lite Micro 目前仅支持有限的 TensorFlow 算子,因此可运
- [`micro_ops.h`](https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/micro/kernels/micro_ops.h) 提供给解释器(interpreter)用于运行模型的操作。
- [`micro_error_reporter.h`](https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/micro/micro_error_reporter.h) 输出调试信息。
- [`micro_interpreter.h`](https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/micro/micro_interpreter.h) Tensorflow Lite Micro 解释器,用来运行我们的模型。
- [`micro_interpreter.h`](https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/micro/micro_interpreter.h) Tensorflow Lite Micro 解释器,用来运行模型。
- [`schema_generated.h`](https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/schema/schema_generated.h) 定义 TensorFlow Lite [`FlatBuffer`](https://google.github.io/flatbuffers/) 数据结构。
- [`version.h`](https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/version.h) 提供 Tensorflow Lite 架构的版本信息。
......@@ -117,11 +109,11 @@ tflite::MicroErrorReporter micro_error_reporter;
tflite::ErrorReporter* error_reporter = &micro_error_reporter;
```
该对象被传递到解释器(interpreter)中用于记录日志。由于微控制器通常具有多种日志记录机制,因此 `tflite::MicroErrorReporter` 在实现上考虑了不同设备的差异性。
该对象被传递到解释器(interpreter)中用于记录日志。由于微控制器通常具有多种日志记录机制,因此 `tflite::MicroErrorReporter` 在实现上考虑了设备的差异性。
### 1.3.3 加载模型
在以下代码中,实例化的 `char` 数组中包含了模型信息,`g_tiny_conv_micro_features_model_data` (要了解其是如何构建的,请参见 [“构建与转换模型”](https://tensorflow.google.cn/lite/microcontrollers/build_convert) 。随后我们检查模型来确保其架构版本与我们使用的版本所兼容:
在以下代码中,实例化的 `char` 数组中包含了模型信息,`g_tiny_conv_micro_features_model_data` (要了解其是如何构建的,请参见 [“构建与转换模型”](https://tensorflow.google.cn/lite/microcontrollers/build_convert) 。随后我们检查模型来确保其架构版本与使用版本兼容:
```C++
const tflite::Model* model =
......@@ -135,7 +127,7 @@ if (model->version() != TFLITE_SCHEMA_VERSION) {
}
```
### 1.3.4实例化 OP 解析器
### 1.3.4 实例化 OP 解析器
解释器(interpreter)需要一个 [`micro_ops`](https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/micro/kernels/micro_ops.h) 实例来访问 Tensorflow 操作。可以扩展此类来添加自定义操作:
......@@ -154,7 +146,7 @@ tflite::SimpleTensorAllocator tensor_allocator(tensor_arena,
tensor_arena_size);
```
注意:所需内存大小取决于使用的模型,可能需要通过实验来确定。
注意:所需内存大小取决于使用的模型,可能需要通过实验来确定。
### 1.3.6 实例化解释器(Interpreter)
......@@ -167,7 +159,7 @@ tflite::MicroInterpreter interpreter(model, resolver, &tensor_allocator,
### 1.3.7 验证输入维度
`MicroInterpreter` 实例可以通过调用 `.input(0)` 返回模型输入张量的指针其中 `0` 代表第一个(也是唯一的)输入张量。我们通过检查这个张量来确认它的维度与类型是否与应用匹配:
`MicroInterpreter` 实例可以通过调用 `.input(0)` 返回模型输入张量的指针其中 `0` 代表第一个(也是唯一的)输入张量。我们通过检查这个张量来确认它的维度与类型是否与应用匹配:
```C++
TfLiteTensor* model_input = interpreter.input(0);
......@@ -180,7 +172,7 @@ if ((model_input->dims->size != 4) || (model_input->dims->data[0] != 1) ||
}
```
这个代码段中,变量 `kFeatureSliceCount``kFeatureSliceSize` 与输入属性相关,其定义在 [`micro_model_settings.h`](https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.h) 中。枚举值 `kTfLiteUInt8` 是对 Tensorflow Lite 某一数据类型的引用,其定义在 [`common.h`](https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/c/common.h) 中。
上述代码中,变量 `kFeatureSliceCount``kFeatureSliceSize` 与输入相关,其定义在 [`micro_model_settings.h`](https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.h) 中。枚举值 `kTfLiteUInt8` 是对 Tensorflow Lite 某一数据类型的引用,其定义在 [`common.h`](https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/c/common.h) 中。
### 1.3.8 生成特征
......@@ -199,11 +191,11 @@ TfLiteStatus feature_status = feature_provider.PopulateFeatureData(
在此例中,特征生成和推理发生在同一循环,因此设备能不断捕捉和处理最新的音频数据。
当您在编写程序时,可能会通过其它的方式生成特征数据,但需要注意的是,特征数据填充完成后才能进行推理。
在编写程序时,可以通过其它方式生成特征数据,但需要注意,特征数据填充完成后才能进行推理。
### 1.3.9 运行模型
通过在 `tflite::MicroInterpreter` 实例上调用 `Invoke()` 可快速触发推理过程
通过在 `tflite::MicroInterpreter` 实例上调用 `Invoke()` 可快速触发推理:
```C++
TfLiteStatus invoke_status = interpreter.Invoke();
......@@ -213,7 +205,7 @@ if (invoke_status != kTfLiteOk) {
}
```
通过检查返回值 `TfLiteStatus` 来确定运行是否成功。在 [`common.h`](https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/c/common.h) 中定义的 `TfLiteStatus` 的值有 `kTfLiteOk``kTfLiteError`
通过检查返回值 `TfLiteStatus` 来确定运行是否成功。在 [`common.h`](https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/c/common.h) 中定义的 `TfLiteStatus` `kTfLiteOk``kTfLiteError`两种状态
### 1.3.10 获取输出
......@@ -246,7 +238,7 @@ for (int category_index = 0; category_index < kCategoryCount;
将 TensorFlow project 下载到本地,在终端中输入以下命令:
```bash
git clone --depth 1 https://github.com/QingChuanWS/tensorflow.git
git clone https://github.com/tensorflow/tensorflow.git
git checkout 5e0ed38eb746f3a86463f19bcf7138a959ddb2d4
```
......@@ -274,47 +266,47 @@ make -f tensorflow/lite/micro/tools/make/Makefile generate_projects
运行本目录下的 `lib_extra.py` 生成 tflite micro 源文件包:
| 参数 | 含义 |
| ------------------ | ------------------------------------------- |
| --tensorflow_path | 下载的tensorflow仓库的根目录(绝对路径) |
| 参数 | 含义 |
| ------------------ | ----------------------------------------------- |
| --tensorflow_path | 下载的tensorflow仓库的根目录(绝对路径) |
| --tflitemicro_path | 生成的tensorflow lite micro路径(绝对路径) |
脚本成功运行后打印 `--tensorflow lite micro source file extract successful--` 信息,并在对应的 `tflitemicro_path` 路径下生成 `Source` 文件夹存放 Tensorflow Lite Micro 源文件。
## 2. 将源文件加入 KEIL 工程并生成 .lib 库
## 2.2 将源文件加入 KEIL 工程并生成 .lib 库
### 2.1 添加文件 ###
新建目标芯片的 KEIL 工程(本次示例以 ARM Cortex M4 为例),将 `Source` 目录下的 `tensorflow``third_party` 文件夹导入到 KEIL 工程根目录下,并添加 `tensorflow` 目录中除 `lite/micro/kernels` 以及 `lite/micro/tools` 文件以外的所有源文件(包含 .c 和 .cc),例如下图所示:
### 2.2.1 添加文件 ###
新建目标芯片的 KEIL 工程(本次示例以 ARM Cortex M4 为例),将 `Source` 目录下的 `tensorflow``third_party` 文件夹导入到 KEIL 工程根目录下,并添加 `tensorflow` 目录中除 `lite/micro/kernels` 以及 `lite/micro/tools` 文件以外的所有源文件(包含 .c 和 .cc)如下图所示:
<div align=center>
<img src="image/lib文件目录.png" width=80% />
</div>
**注意**
在添加 `tensorflow/lite/micro/kernel` 目录下的源文件时需要区分 `reference` 算子和 Arm `CMSIS-NN`优化加速算子`tensorflow/lite/micro/kernel` 文件夹内容如下图中所示:
在添加 `tensorflow/lite/micro/kernel` 目录下的源文件时需要区分 `reference` 算子和 Arm `CMSIS-NN`优化加速算子。s`tensorflow/lite/micro/kernel` 文件夹内容如下图中所示:
<div align=center>
<img src="image/cmsis和reference.png" width=80% />
</div>
**注:CMSIS-NN 是 Arm 在 AI 领域针对 IOT 设备开发神经网络加速库,其目的是为了让 AI 在算力和资源有限的设备上落地,更好的发挥 Arm 的生态优势。相关代码和文档已经开源 (https://www.keil.com/pack/doc/CMSIS/NN/html/index.html) 。在 Tensorflow Lite Micro 框架下基于 CMSIS-NN 加速库设计的 CMSIS-NN 算子与 reference 算子的性能对比可参考[附录](./TFlite_Micro_Component_User_Guide.md#%E9%99%84%E5%BD%95cmsis-nn-%E5%AF%B9-tensorflow-lite-micro-%E7%9A%84%E8%BF%90%E7%AE%97%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96) 。**
**注:CMSIS-NN 是 Arm 在 AI 领域针对 IOT 设备开发的神经网络加速库,其目的是为了让 AI 在算力和资源有限的设备上落地,更好的发挥 Arm 的生态优势。相关代码和文档已经开源 (https://www.keil.com/pack/doc/CMSIS/NN/html/index.html) 。在 Tensorflow Lite Micro 框架下的 CMSIS-NN 算子与 reference 算子性能对比可参考[附录](./TFlite_Micro_Component_User_Guide.md#%E9%99%84%E5%BD%95cmsis-nn-%E5%AF%B9-tensorflow-lite-micro-%E7%9A%84%E8%BF%90%E7%AE%97%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96) 。**
#### 2.1.1 采用 CMSIS-NN 生成 .lib 文件 ####
#### 2.2.1.1 采用 CMSIS-NN 生成 .lib 文件 ####
需要:
1. 添加 `tensorflow/lite/micro/kernel/cmsis-nn` 源文件;
2. 添加 `tensorflow/lite/micro/kernel/` 中的算子时,请不要添加 `add.cc``conv.cc``depthwise_conv.cc``softmax.cc``fully_connected.cc``pooling.cc``mul.cc` 源文件;
3. 添加 `tensorflow/lite/micro/tools` 文件夹下的全部源文件。
3. 添加 `tensorflow/lite/micro/tools` 文件夹下的源文件。
#### 2.1.2 采用 reference 算子生成 .lib 文件 ####
#### 2.2.1.2 采用 reference 算子生成 .lib 文件 ####
需要:
1. 添加 `tensorflow/lite/micro/kernel/` 中的全部算子;
2. 无需添加 `tensorflow/lite/micro/tools` 文件夹下的源文件。
### 2.2 配制编译选项 ###
### 2.2.2 配制编译选项 ###
采用 compiler version 6 编译器并关闭 Microlib :
......@@ -342,9 +334,21 @@ make -f tensorflow/lite/micro/tools/make/Makefile generate_projects
- 测试输入图片:`tensorflow\lite\micro\tools\make\downloads\person_model_int8` 目录中 `person_image_data.cc``no_person_image_data.cc` 保存的 96 * 96 pixels ( uint_8 ) 灰度图。
- 单次执行和 10 次累计执行的测试结果如下:
| Case | Disable ARM-CMSIS-NN | Enable ARM-CMSIS-NN | Improvement |
| Case | Disable ARM-CMSIS-NN | Enable ARM-CMSIS-NN | Improvement |
| :--------------------------------------------: | :----------------------: | :------------------: | :---------: |
| Initialize_Benchmark_Runner | 65 ticks (65 ms) | 66 ticks (66 ms) | * |
| Run_Single_Iteration | 12476 ticks (12476 ms) | 633 ticks (633 ms) | 19.71X |
| Person_Detection_Ten_Ierations_With_Person | 124769 ticks (124769 ms) | 6324 ticks (6324 ms) | 19.73X |
| Person_Detection_Ten_Ierations_With_out_Person | 124770 ticks (124770 ms) | 6325 ticks (6325 ms) | 19.72X |
\ No newline at end of file
| Person_Detection_Ten_Ierations_With_out_Person | 124770 ticks (124770 ms) | 6325 ticks (6325 ms) | 19.72X |
## TencentOS-tiny AI 开发组件
TencentOS-tiny 已将 Tensorflow Lite Micro 以及 CMSIS-NN 集成到 AI 组件中,并通过其他组件与腾讯云无缝相连,打通从云到端整条链路,助力 AI 的发展与落地。随着越来越多的厂商采用 Arm Cortex M55 和 Ethos U NPU IP,相信未来端侧AI的应用会更加广阔。
TencentOS-tiny AI组件:https://github.com/rceet/tencentos-tiny-with-tflitemicro-and-iot/tree/master/components/ai/tflite_micro
Arm Cortex M55:https://www.arm.com/products/silicon-ip-cpu/cortex-m/cortex-m55
Arm Ethos U55:https://www.arm.com/products/silicon-ip-cpu/ethos/ethos-u55
Arm Ethos U65:https://www.arm.com/products/silicon-ip-cpu/ethos/ethos-u65
# Tensorflow Lite Micro 使用指南
## 1.组件介绍
## 1. 组件介绍
TensorFlow Lite Micro 组件是 Google TensorFlow 团队针对微处理器平台设计的端侧推理框架,该推理框架主要解决在资源, 功耗, 性能受限的嵌入式系统中, 如何简单快速高效部署 Tensorflow Lite 深度学习模型。CMSIS 全称 Software Interface Standard for Arm Cortex-based Microcontrollers,其中 CMSIS-NN 组件为 AI 加速库,包含高效的神经网络算子来减小内存占用和最大化硬件性能。相关代码和文档已经开源并在多个平台上得到验证( https://www.keil.com/pack/doc/CMSIS/NN/html/index.html )。
## 2.目录结构
## 2. 目录结构
组件目录结构如下图所示:
......@@ -20,13 +20,13 @@ tflite_micro
```
其中,KEIL 文件夹包含针对 KEIL 编程环境需要额外添加的源文件(将其中的源文件一同加入工程)。
其中,KEIL 文件夹包含针对 KEIL 编程环境需要额外添加的源文件(将其中的源文件一同加入工程)。
ARM_CortexM4_lib 和 ARM_CortexM7_lib 两个文件夹中存放了针对 Cortex M4、Cortex M7 平台预编译的 tensorflow_lite_micro.lib 库,优化后的性能数据可以参考附录部分;如果在开发过程中采用 ARM Cortex M4 或 Cortex M7 系列芯片可以直接使用对应的 tensorflow_lite_micro.lib 库,并包含相关的头文件,极大的缩短了开发时间。
[TFlite_Micro_Component_User_Guide.md](./TFlite_Micro_Component_User_Guide.md) 中提供了本组件的使用说明以及上述 .lib 库的制作方法。
## 3.组件使用案例
## 3. 组件使用案例
基于本组件我们以 STM32L496RG 为例设计了行人检测案例,具体使用流程可参考[Neclue STM32L496RG案例](../../../board/NUCLEO_STM32L496ZG/KEIL/tflitemicro_person_detection/TFlite_Micro_Demo移植参考指南(Keil版).md)
......@@ -37,9 +37,21 @@ ARM_CortexM4_lib 和 ARM_CortexM7_lib 两个文件夹中存放了针对 Cortex M
- 测试输入图片:`tensorflow\lite\micro\tools\make\downloads\person_model_int8` 目录中 `person_image_data.cc``no_person_image_data.cc` 保存的 96 * 96 pixels ( uint_8 ) 灰度图。
- 单次执行和 10 次累计执行的测试结果如下:
| Case | Disable ARM-CMSIS-NN | Enable ARM-CMSISNN | Improvement |
| Case | Disable ARM-CMSIS-NN | Enable ARM-CMSISNN | Improvement |
| :--------------------------------------------: | :----------------------: | :------------------: | :---------: |
| Initialize_Benchmark_Runner | 65 ticks (65 ms) | 66 ticks (66 ms) | * |
| Run_Single_Iteration | 12476 ticks (12476 ms) | 633 ticks (633 ms) | 19.71X |
| Person_Detection_Ten_Ierations_With_Person | 124769 ticks (124769 ms) | 6324 ticks (6324 ms) | 19.73X |
| Person_Detection_Ten_Ierations_With_out_Person | 124770 ticks (124770 ms) | 6325 ticks (6325 ms) | 19.72X |
\ No newline at end of file
| Person_Detection_Ten_Ierations_With_out_Person | 124770 ticks (124770 ms) | 6325 ticks (6325 ms) | 19.72X |
## 5. TencentOS-tiny AI 开发组件
TencentOS-tiny 已将 Tensorflow Lite Micro 以及 CMSIS-NN 集成到 AI 组件中,并通过其他组件与腾讯云无缝相连,打通从云到端整条链路,助力 AI 的发展与落地。随着越来越多的厂商采用 Arm Cortex M55 和 Ethos U NPU IP,相信未来端侧AI的应用会更加广阔。
TencentOS-tiny AI组件:https://github.com/rceet/tencentos-tiny-with-tflitemicro-and-iot/tree/master/components/ai/tflite_micro
Arm Cortex M55:https://www.arm.com/products/silicon-ip-cpu/cortex-m/cortex-m55
Arm Ethos U55:https://www.arm.com/products/silicon-ip-cpu/ethos/ethos-u55
Arm Ethos U65:https://www.arm.com/products/silicon-ip-cpu/ethos/ethos-u65
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册