主頁 >  其他 > 社區分享|Arm 中國生態技術市場經理教你玩轉 TFLite Micro 端云一體解決方案

社區分享|Arm 中國生態技術市場經理教你玩轉 TFLite Micro 端云一體解決方案

2021-04-03 13:16:51 其他

本文來自社區投稿與征集,作者 鄭亞斌,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 = &micro_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

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more