
本文來自社區投稿與征集,作者 鄭亞斌,Arm 中國生態技術市場經理,
概述:
TensorFlow Lite Micro 是 TensorFlow Lite 針對 AIOT 的輕量級 AI 引擎,用于在微控制器和其他資源受限的設備上運行機器學習模型,端云鏈接從 TencentOS Tiny 開始,
1. 建立與轉換模型
由于嵌入式設備存盤空間有限,因此限制了深度學習的應用,同時考慮到平臺算力以及算子支持等因素,因此在模型設計以及部署階段需充分了解硬體平臺資源以及預期性能,
本部分主要介紹如何將 TensorFlow 模型部署在資源受限的嵌入式設備的程序,
1.1模型轉換
將一個已訓練好的 TensorFlow 模型轉換為可以在嵌入式設備中運行的 TensorFlow Lite 模型可以使用 TensorFlow Lite 轉換器 Python API,它能夠將模型轉換成 FlatBuffer 格式,減小模型規模,并修改模型及算子以支持 TensorFlow Lite 運算,
-
TensorFlow Lite 轉換器 Python API
https://tensorflow.google.cn/lite/microcontrollers/build_convert
-
FlatBuffer
https://google.github.io/flatbuffers/
1.1.1 量化
為了獲得盡可能小的模型,某些情況下可以考慮使用訓練后量化,它會降低模型中數字的精度,從而減小模型規模,比如將 FP32 轉化為 Int8,不過,這種操作可能會導致模型推理準確性的下降,對于小規模模型尤為如此,所以我們需要在量化前后分析模型的準確性,以確保這種損失在可接受范圍內,
-
訓練后量化
https://tensorflow.google.cn/lite/performance/post_training_quantization
訓練后量化需要 representive dataset 作為參考,以下這段 Python 代碼片段展示了如何使用訓練后量化進行模型轉換:
import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
def representative_dataset_generator():
for value in reference_data:
yeild [np.array(value, dtype=np.float32, ndmin=2)]
converter.representative_dataset = representative_dataset_generator
tflite_quant_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_quant_model)
1.1.2 將模型檔案轉換為一個 C 陣列
許多微控制器平臺沒有本地檔案系統,從程式中使用一個模型最簡單的方式是將其轉換為 C 陣列并將其編譯進應用程式,
以下的 unix 命令會生成一個包含 TensorFlow Lite 模型的 C 源檔案,其中模型資料以 char 陣列形式表現:
xxd -i converted_model.tflite > model_data.cc
其輸出類似如下:
unsigned char converted_model_tflite[] = {
0x18, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x0e, 0x00,
};
unsigned int converted_model_tflite_len = 18200;
生成此檔案后,你可以將其包含到程式中,在嵌入式平臺上,我們需要將該陣列宣告為 const 型別以獲得更好的記憶體效率,
1.2 模型結構與訓練
在設計一個面向微控制器的模型時,考慮模型的規模、作業負載以及模型所使用到的算子是非常重要的,
1.2.1 模型規模
一個模型必須在二進制和運行時方面都足夠小,以使其編譯進應用程式后滿足目標設備的記憶體限制,
為了創建一個更小的模型,你可以在模型設計中采用少而小的層,然而,小規模的模型更易導致欠擬合問題,這意味著對于許多應用,嘗試并使用符合記憶體限制的盡可能大的模型是有意義的,但是,使用更大規模的模型也會增加處理器作業負載,
注:在一個 Cortex M3 上,TensorFlow Lite Micro 的 core runtime 僅占約16 KB,
1.2.2 作業負載
作業負載受到模型規模,結構與復雜度的影響,大規模、復雜的模型可能會導致更高的功耗,在實際的應用場景中,功耗與熱量的增加可能會帶來其他問題,
1.2.3 算子支持
TensorFlow Lite Micro 目前僅支持有限的 TensorFlow 算子,因此可運行的模型也有所限制,Google 正致力于在參考實作和針對特定結構的優化方面擴展算子支持,Arm 的 CMSIS-NN 開源加速庫也為算子的支持和優化提供了另一種可能,
已支持的算子在檔案 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 檔案,并闡述了如何使用 TensorFlow Lite Micro 來進行 AI 推理,
-
main_functions.cc
https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/micro/examples/person_detection_experimental/main_functions.cc
1.3.1 包含項
#include "tensorflow/lite/micro/kernels/micro_ops.h"
#include "tensorflow/lite/micro/micro_error_reporter.h"
#include "tensorflow/lite/micro/micro_interpreter.h"
#include "tensorflow/lite/schema/schema_generated.h"
#include "tensorflow/lite/version.h"
-
micro_ops.h 提供給解釋器(interpreter)用于運行模型的操作(鏈接見文末),
-
micro_error_reporter.h 輸出除錯資訊,
-
micro_interpreter.h TensorFlow Lite Micro 解釋器,用來運行模型,
-
schema_generated.h定義 TensorFlow Lite FlatBuffer 資料結構,
-
version.h 提供 TensorFlow Lite 架構的版本資訊,
示例中還包括其他一些檔案,比如:
#include "tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.h"
#include "tensorflow/lite/micro/examples/micro_speech/micro_features/model.h"
model.h 將模型存盤為 char 型別陣列,閱讀 "構建與轉換模型" 了解如何將 TensorFlow Lite 模型轉換為該格式,
-
構建與轉換模型
https://tensorflow.google.cn/lite/microcontrollers/build_convert
micro_model_settings.h 定義與模型相關的各種常量,
1.3.2 設定日志記錄
要記錄日志,需要實體化 tflite::MicroErrorReporter 類:
tflite::MicroErrorReporter micro_error_reporter;
tflite::ErrorReporter* error_reporter = µ_error_reporter;
該物件被傳遞到解釋器 (interpreter) 中用于記錄日志,由于微控制器通常具有多種日志記錄機制,因此 tflite::MicroErrorReporter 在實作上考慮了設備的差異性,
1.3.3 加載模型
在以下代碼中,實體化的 char 陣列中包含了模型資訊,g_tiny_conv_micro_features_model_data (要了解其是如何構建的,請參見 “構建與轉換模型”) ,隨后我們檢查模型來確保其架構版本與使用版本兼容:
const tflite::Model* model =
::tflite::GetModel(g_tiny_conv_micro_features_model_data);
if (model->version() != TFLITE_SCHEMA_VERSION) {
error_reporter->Report(
"Model provided is schema version %d not equal "
"to supported version %d.\n",
model->version(), TFLITE_SCHEMA_VERSION);
return 1;
}
- 構建與轉換模型
https://tensorflow.google.cn/lite/microcontrollers/build_convert
1.3.4 實體化算子
算子(OP)實體化有兩種方法:
tflite::op::micro::AllOpsResolver
tflite::MicroMutableOpResolver
前者包含所有 TensorFlow Lite Micro 可用算子,并將他們提供給解釋器 (Interpreter)
tflite::ops::micro::AllOpsResolver resolver;
前者是一種可靠但是比較浪費資源的方法,因為給定的模型不會使用全部算子,多余的算子會占用不必要的記憶體空間,因此后者只需要實體化真正使用的算子,模型中包含哪些算子可以通過開源工具 Netron (https://netron.app/) 查看,
//定義模型需要的算子
namespace tflite {
namespace ops {
namespace micro {
TfLiteRegistration* Register_SOFTMAX();
} //namespace micro
} //namespace ops
} //namespace tflite
tflite::MicroMutableOpResolver micro_mutable_op_resolver;
micro_mutable_op_resolver.AddBuiltin(
tflite::BuiltinOperator_SOFTMAX,
tflite::ops::micro::Register_SOFTMAX());
1.3.5 分配記憶體
我們需要預先為輸入、輸出以及中間變數分配一定的記憶體,該預分配的記憶體是一個大小為 tensor_arena_size 的 uint8_t 陣列,它將會作為 tflite::SimpleTensorAllocator 實體化的引數:
const int tensor_arena_size = 10 * 1024;
uint8_t tensor_arena[tensor_arena_size];
tflite::SimpleTensorAllocator tensor_allocator(tensor_arena,
tensor_arena_size);
注:所需記憶體大小取決于使用的模型,可能需要通過實驗來確定,
1.3.6 實體化解釋器 (Interpreter)
我們創建一個 tflite::MicroInterpreter 實體并傳遞相關變數:
tflite::MicroInterpreter interpreter(model, resolver, &tensor_allocator,
error_reporter);
1.3.7 驗證輸入維度
MicroInterpreter 實體可以通過呼叫 .input(0) 回傳模型輸入張量的指標,其中 0 代表第一個(也是唯一的)輸入張量,我們通過檢查這個張量來確認它的維度與型別是否與應用匹配:
TfLiteTensor* model_input = interpreter.input(0);
if ((model_input->dims->size != 4) || (model_input->dims->data[0] != 1) ||
(model_input->dims->data[1] != kFeatureSliceCount) ||
(model_input->dims->data[2] != kFeatureSliceSize) ||
(model_input->type != kTfLiteUInt8)) {
error_reporter->Report("Bad input tensor parameters in model");
return 1;
}
在上述代碼中,變數 kFeatureSliceCount 和 kFeatureSliceSize 與輸入相關,其定義在 micro_model_settings.h 中,列舉值 kTfLiteUInt8 是對 TensorFlow Lite 某一資料型別的參考,其定義在 common.h 中,
1.3.8 運行模型
通過在 tflite::MicroInterpreter 實體上呼叫 Invoke() 可快速觸發推理:
TfLiteStatus invoke_status = interpreter.Invoke();
if (invoke_status != kTfLiteOk) {
error_reporter->Report("Invoke failed");
return 1;
}
通過檢查回傳值 TfLiteStatus 來確定運行是否成功,在 common.h 中定義的 TfLiteStatus 有 kTfLiteOk 和 kTfLiteError兩種狀態,
1.3.9 獲取輸出
模型的輸出張量可以通過在 tflite::MicroIntepreter 上呼叫 output(0) 獲得,其中 0 代表第一個(也是唯一的)輸出張量,
在示例中,輸出是一個陣列,表示輸入屬于不同類別(“是”(yes)、“否”(no)、“未知”(unknown) 以及“靜默”(silence))的概率,由于它們是按照集合順序排列的,我們可以使用簡單的邏輯來確定概率最高的類別:
TfLiteTensor* output = interpreter.output(0);
uint8_t top_category_score = 0;
int top_category_index;
for (int category_index = 0; category_index < kCategoryCount;
++category_index) {
const uint8_t category_score = output->data.uint8[category_index];
if (category_score > top_category_score) {
top_category_score = category_score;
top_category_index = category_index;
}
}
在示例的其他部分中,使用了一個更加復雜的演算法來平滑多幀的識別結果,該部分在 recognize_commands.h 中有所定義,在處理任何連續的資料流時,也可以使用相同的技術來提高可靠性和準確度,
-
recognize_commands.h
https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/micro/examples/micro_speech/recognize_commands.h
2. 制作 tensorflow_lite_micro.lib
2.1 獲得 TensorFlow Lite Micro 庫
構建庫并從 TensorFlow master branch 中運行測驗,請執行以下命令:
將 TensorFlow project 下載到本地,在終端中輸入以下命令:
git clone https://github.com/tensorflow/tensorflow.git
注:由于 TensorFlow 官方倉庫的更新速度較快,為了方便開發者學習 .lib 庫的制作方法,作者使用 Hash ID 為 5e0ed38eb746f3a86463f19bcf7138a959ddb2d4 版本來進行演示,由于代碼更新,使用 master 版本可能需要對流程或代碼進行微調,
進入 clone 好的倉庫:
cd tensorflow
專案中的 Makefile 能夠生成包含所有源檔案的獨立專案,并支持匯入目前成熟的嵌入式開發環境,目前支持的環境主要有 Arduino, Keil, Make 和 Mbed,
注意:我們為其中一些環境托管預建專案,參閱支持的平臺,
-
支持的平臺
https://tensorflow.google.cn/lite/microcontrollers/overview#supported_platforms
要在 Make 中生成專案,請使用如下指令:
make -f tensorflow/lite/micro/tools/make/Makefile generate_projects
這需要幾分鐘下載并配制依賴,結束后,新的檔案夾生成并包含源檔案,例如 tensorflow/lite/micro/tools/make/gen/linux_x86_64/prj/hello_world/keil 包含了 hello world 的 Keil uVision 工程,
以下以 hello_world 工程為例,分離出與實際應用無關的 tflite_micro 源檔案,用于后續 .lib 庫生成,
運行本目錄下的 lib_extra.py 生成 tflite micro 源檔案包:

腳本成功運行后列印 --tensorflow lite micro source file extract successful-- 資訊,并在對應的 tflitemicro_path 路徑下生成 Source 檔案夾存放 TensorFlow Lite Micro 源檔案,
2.2 將源檔案加入 KEIL 工程并生成 .lib 庫
2.2.1 添加檔案
新建目標芯片的 KEIL 工程(本次示例以 ARM Cortex M4 為例),將 Source 目錄下的 tensorflow 和 third_party 檔案夾匯入到 KEIL 工程根目錄下,并添加 tensorflow 目錄中除 lite/micro/kernels 以及 lite/micro/tools 檔案以外的所有源檔案(包含 .c 和 .cc),如下圖所示:

注意
在添加 tensorflow/lite/micro/kernel 目錄下的源檔案時需要區分 reference 算子和 Arm CMSIS-NN 優化加速算子,tensorflow/lite/micro/kernel 檔案夾內容如下圖中所示:

根據圖中顯示,我們采用 CMSIS-NN 優化加速算子制作 .lib 庫檔案,
注:CMSIS-NN 是 Arm 在 AI 領域針對 IOT 設備開發的神經網路加速庫,其目的是為了讓 AI 在算力和資源有限的設備上落地,更好的發揮 Arm 的生態優勢,相關代碼和檔案已開源,在 TensorFlow Lite Micro 框架下的 CMSIS-NN 算子與 reference 算子性能對比可參考附錄,
-
開源
https://www.keil.com/pack/doc/CMSIS/NN/html/index.html
-
附錄
https://blog.tensorflow.org/2021/02/accelerated-inference-on-arm-microcontrollers-with-tensorflow-lite.html
2.2.1.1 采用 CMSIS-NN 生成 .lib 檔案
需要:
-
添加 tensorflow/lite/micro/kernel/cmsis-nn 源檔案;
-
添加 tensorflow/lite/micro/kernel/ 中的算子時,請不要添加 add.cc,conv.cc,depthwise_conv.cc,softmax.cc,fully_connected.cc,pooling.cc,mul.cc 源檔案;
-
添加 tensorflow/lite/micro/tools 檔案夾下的源檔案,
2.2.1.2 采用 reference 算子生成 .lib 檔案
需要:
-
添加 tensorflow/lite/micro/kernel/ 中的全部算子;
-
無需添加 tensorflow/lite/micro/tools 檔案夾下的源檔案,
2.2.2 配制編譯選項
采用 compiler version 6 編譯器并關閉 Microlib :

選擇 Create Library 選項并修改 .lib 庫名為:tensorflow_lite_micro

配置有關的宏、包含的頭檔案路徑并設定代碼優化等級:

最后點擊編譯鏈接選項,即可在工程根目錄的 Objects 檔案夾下生成 ARM Cortex M4 對應的 .lib 庫,其他內核型號的 tflite_micro 庫以此類推,
3. 在 TencentOS Tiny 中實作端云結合
得益于 TencentOS Tiny 的物聯網組件支持,嵌入式設備可以快速接入騰訊云物聯網平臺,本章節介紹基于 TencentOS Tiny 的物聯網組件以及如何接入騰訊云物聯網開發平臺(IoT Explorer),實作將端側 AI 推理結果發送至云端,實作端云結合,

3.1 qcloud-iot-sdk 軟體架構
騰訊云物聯網開發平臺 IoT Explorer 設備端 C SDK,配合平臺對設備資料模板化的定義,實作和云端基于資料模板協議的資料互動框架,開發者基于 IoT_Explorer C-SDK 資料模板框架,通過腳本自動生成模板代碼,快速實作設備和平臺、設備和應用之間的資料互動,

TencentOS Tiny 的 qcloud-iot-sdk 分四層設計,從上至下分別為平臺服務層、核心協議層、網路層和硬體抽象層,
-
平臺服務層:在網路協議層之上,實作了包括設備接入鑒權,設備影子,資料模板,網關,動態注冊,日志上報和 OTA 等功能,提供相關 API 介面給用戶使用,
-
核心協議層:設備端和 IoT 平臺互動的網路協議包括 MQTT/COAP/HTTP,
-
網路層:實作基于 TLS/SSL(TLS/DTLS) 方式,BSD_socket(TCP/UDP) 方式和 AT_socket 方式的網路協議堆疊,不同服務可根據需要使用不同的協議堆疊介面函式,本例程使用通信模組結合 AT_socket 的方式,
-
硬體抽象層:實作對不同硬體平臺底層操作的抽象封裝,需要針對具體的軟硬體平臺開展移植,分為必須實作和可選實作兩部分 HAL 層介面,
3.2 創建云端設備
開發程序如下,登錄騰訊云開發平臺:
3.2.1 新建產品

3.2.2 定義資料模板
設備端上傳的只讀資料:
-
AI 推理結果:設備端檢測并發送;
設備端接收的控制指令:
-
控制指令:用戶看到有例外發生,可以控制設備端做出某種反應,


3.3 端側開發
3.3.1 移植mbedtls
騰訊云 C SDK 對接云端時如果配置建立安全鏈接,將會用到 mbedtls 加密庫,所以先移植 mbedtls,
1. 將 TencentOS Tiny 中已經移植適配好的 mbedtls 庫作為 TencentOS Tiny 的一個組件:在 components\security\mbedtls 目錄下,將此目錄復制到工程目錄中,復制程序中保持目錄架構不變,并將其余的檔案洗掉,

2. 將 mbedtls 相關的 c 檔案添加到 Keil-MDK 工程中:
- 在 Keil 工程中新建 mbedtls 目錄分組,
- 將 components\security\mbedtls\wrapper\src 目錄下的移植適配檔案添加至 mbedtls 目錄下,
- 將 components\security\mbedtls\3rdparty\src 目錄下的原始碼檔案添加至 mbedtls 目錄下 ,

3. 將 mbedtls 相關的頭檔案都添加到 Keil-MDK 工程中,移植完成,

3.3.2 騰訊 qcloud-iot-sdk 移植
TencentOS Tiny 已將 IoT_Explorer C SDK 移植適配完成,在 components\connectivity\qcloud-iot-explorer-sdk 目錄下包含兩個檔案夾,其中:
-
3rdparty:IoT_Explorer C SDK 原始碼,
-
port\TencentOS_tiny:移植適配檔案 qcloud/port,
在使用 TencentOS Tiny 物聯網作業系統時,只需要添加相關檔案并修改云端設備對接資訊,即可方便快捷的實作端云結合,
接下來將基于上述步驟移植成功的網路工程,講述如何移植 C SDK,
1. 將 TencentOS Tiny 原始碼中 qcloud-iot-explorer-sdk 整個目錄復制到工程目錄中,保持原有目錄架構不變并洗掉其余目錄,

2. 將騰訊云 C SDK 移植到 TencentOS Tiny 的 Keil 工程,
-
在 Keil 工程下新增 qcloud/port 目錄分組,
-
將 components\connectivity\qcloud-iot-explorer-sdk\port\TencentOS_tiny 分組下的部分檔案添加至 qcloud/port 目錄,

3. 添加騰訊云 C SDK 中 MQTT 協議相關原始碼,
-
在 Keil 工程下新增 qcloud/protocol/mqtt 目錄分組,
-
將 components\connectivity\qcloud-iot-explorer-sdk\3rdparty\sdk_src\protocol\mqtt 目錄下的檔案添加至 qcloud/protocol/mqtt 目錄,

4. 添加騰訊云 C SDK 中資料模板相關原始碼,
-
在 Keil 工程下新增 qcloud/services/data_template 目錄分組,
-
將components\connectivity\qcloud-iot-explorer-sdk\3rdparty\sdk_src\services\data_template 目錄下的檔案添加至 qcloud/services/data_template 目錄下,

5. 添加騰訊云 C SDK 中所使用到的工具原始碼,
-
在 Keil 工程下新增 qcloud/utils 目錄分組,
-
將 components\connectivity\qcloud-iot-explorer-sdk\3rdparty\sdk_src\utils 目錄下的檔案添加至 qcloud/utils 目錄,

6. 添加騰訊云 C SDK 中所用到網路封裝層原始碼,
-
在 Keil 工程下新增 qcloud/network 目錄分組,
-
將 components\connectivity\qcloud-iot-explorer-sdk\3rdparty\sdk_src\network 目錄下的檔案添加至 qcloud/network 目錄,
-
將 components\connectivity\qcloud-iot-explorer-sdk\3rdparty\platform\tls\mbedtls 目錄下的檔案添加至 qcloud/network 目錄,

7. 添加頭檔案路徑,

8. 最后添加宏定義 MBEDTLS_CONFIG_FILE=<qcloud/tls_psk_config.h>,指定 mebedtls 庫的組態檔,

移植完成,此時編譯時未發現錯誤資訊,其中警告可暫時忽略,
3.3.3 修改端云對接資訊
修改 HAL_Device_tencentos_tiny.c 檔案,在 TencentOS-tiny\components\connectivity\qcloud-iot-explorer-sdk\port\TencentOS_tiny 目錄中,將下圖中的資料分別替換為控制臺【設備詳情頁】中的引數并保存,
-
產品 ID:將控制臺的產品 ID ,復制到下圖 sg_product_id,
-
設備名稱:將控制臺的設備名稱,復制到下圖 sg_device_name,
-
設備密鑰:將控制臺的設備密鑰,復制到下圖 sg_device_secret,

3.3.4 呼叫 TensorFlow Lite Micro
經過步驟 2.2,我們成功將 TensorFlow Lite Micro 以及 CMSIS-NN 生成 .lib 組件,在應用程式開發中,只需要包含對應的 .h 檔案,即可使能相應功能,
例如,在 TencentOS Tiny 的 example 目錄下包含了相關的 AI 案例,在函式中通過呼叫組件的頭檔案來使能 TensorFlow Lite Micro 以及 CMSIS-NN,
//...
#include "tensorflow/lite/micro/micro_error_reporter.h"
#include "tensorflow/lite/micro/micro_interpreter.h"
#include "tensorflow/lite/micro/micro_mutable_op_resolver.h"
#include "tensorflow/lite/schema/schema_generated.h"
#include "tensorflow/lite/version.h"
//...
撰寫執行緒任務函式進行AI推理:
void task1(void *arg)
{
tflite_micro_init(); //initial
while (1)
{
result = tflite_micro(model_buffer); //Inference
osDelay(50); //delay 50ms
}
}
3.3.5 多執行緒調度
TencentOS Tiny 具備多執行緒調度能力,因此可以將 AI 推理和云端連接在兩個執行緒中分別實作,大大簡化了代碼邏輯并加快開發速度,
-
MCU 與云端之間資料傳輸部分的代碼如下:
void task2(void *arg)
{
printf("connect to IoT Explorer\n");
extern int esp8266_sal_init(hal_uart_port_t uart_port);
extern int esp8266_join_ap(const char *ssid, const char *pwd);
esp8266_sal_init(HAL_UART_PORT_2);
esp8266_join_ap("wifi", "password..");
iot_thread();
}
與云端連接以及收發資料的具體代碼如下:
int deal_up_stream_user_logic(DeviceProperty *pReportDataList[], int *pCount)
{
int i, j;
//upload
for (i = 0, j = 0; i < TOTAL_PROPERTY_COUNT; i++) {
if(eCHANGED == sg_DataTemplate[i].state) {
pReportDataList[j++] = &(sg_DataTemplate[i].data_property);
sg_DataTemplate[i].state = eNOCHANGE;
}
}
*pCount = j;
return (*pCount > 0)?QCLOUD_RET_SUCCESS:QCLOUD_ERR_FAILURE;
}
-
主函式如下:
int main(void)
{
board_init();
printf("Welcome to TencentOS Tiny\r\n");
osKernelInitialize(); // TOS Tiny kernel initialize
osThreadCreate(osThread(application_entry), NULL); // Create TOS Tiny task
osKernelStart(); // Start TOS Tiny
}
4. TencentOS Tiny AI 開發組件
TencentOS Tiny 已將 TensorFlow Lite Micro 以及 CMSIS-NN 集成到 AI 組件中,并通過其他組件與騰訊云無縫相連,打通從云到端整條鏈路,助力 AI 的發展與落地,隨著越來越多的廠商采用 Arm Cortex M55 和 Ethos U NPU IP,相信未來端側 AI 的應用會更加廣闊,
-
Arm Cortex M4
https://www.arm.com/products/silicon-ip-cpu/cortex-m/cortex-m4
-
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
5. 致謝
感謝 TencentOS Tiny 團隊和 TensorFlow 開源社區的支持,感謝開發者鄧可笈,楊慶生和劉恒言的貢獻,
如果您想詳細了解 本文提及 的相關內容,請參閱以下檔案,這些檔案深入探討了這篇文章中提及的許多主題:
-
micro_ops.h
https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/micro/kernels/micro_ops.h
-
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
-
schema_generated.h
https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/schema/schema_generated.h
-
FlatBuffer
https://google.github.io/flatbuffers/
-
version.h
https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/version.h
-
model.h
https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/micro/examples/micro_speech/micro_features/model.h
-
構建與轉換模型
https://tensorflow.google.cn/lite/microcontrollers/build_convert
-
micro_model_settings.h
https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.h
-
common.h
https://github.com/tensorflow/tensorflow/tree/5e0ed38eb746f3a86463f19bcf7138a959ddb2d4/tensorflow/lite/c/common.h
想了解更多關于 TensorFlow 實操經驗分享,請掃描下方二維碼關注 TensorFlow 官方公眾號,或移步官網,查看更多官方內容,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/271881.html
標籤:其他
上一篇:Makerbase SimpleFOC 第二課 基本測驗
下一篇:Temporal-Relational CrossTransformers for Few-Shot Action Recognition
