ESP32 & Tensorflow Lite (一)ESP32 & Tensorflow Lite

ESP32 上的機器學習

人工智能之父,艾倫·圖靈很早就曾預測“有一天,人們會帶着電腦在公園散步,並告訴對方,今天早上我的計算機講了個很有趣的事”。

人類一直試圖讓機器具有智能,也就是人工智能(Artificial Intelligence)。從上世紀50年代,人工智能的發展經歷了“推理期”,通過賦予機器邏輯推理能力使機器獲得智能,當時的AI程序能夠證明一些著名的數學定理,但由於機器缺乏知識,遠不能實現真正的智能。因此,70年代,人工智能的發展進入“知識期”,即將人類的知識總結出來教給機器,使機器獲得智能。在這一時期,大量的專家系統問世,在很多領域取得大量成果,但由於人類知識量巨大,故出現“知識工程瓶頸”。

無論是“推理期”還是“知識期”,機器都是按照人類設定的規則和總結的知識運作,永遠無法超越其創造者,其次人力成本太高。於是,一些學者就想到,如果機器能夠自我學習問題不就迎刃而解了嗎!機器學習(Machine Learning)方法應運而生,人工智能進入“機器學習時期”。

機器學習的核心是“使用算法解析數據,從中學習,然後對世界上的某件事情做出決定或預測”。這意味着,與其顯式地編寫程序來執行某些任務,不如教計算機如何開發一個算法來完成任務。

隨着機器學習領域不斷的發展,在移動、嵌入式和 IoT 設備上部署/運行機器學習模型也成爲了可能。這篇文章僅介紹在 ESP32 上如何部署/運行 TensorFlow 模型。在之後的文章中將介紹 “Hello World!” 正弦模型相關代碼。

TensorFlow Lite

TensorFlow 是一個端到端開源機器學習平臺。它擁有一個包含各種工具、庫和社區資源的全面靈活生態系統,可以讓研究人員推動機器學習領域的先進技術的發展,並讓開發者輕鬆地構建和部署由機器學習提供支持的應用。

TensorFlow Lite 是一組工具,可幫助開發人員在移動、嵌入式和 IoT 設備上部署/運行 TensorFlow 模型。 TensorFlow Lite 使設備上的機器學習推理具有低延遲的特性,並使可執行文件更小。

TensorFlow Lite 由兩個主要組件組成:

  • TensorFlow Lite 解釋器 可在許多不同的硬件類型(包括手機,嵌入式 Linux 設備和微控制器)上運行經過優化的模型。
  • TensorFlow Lite 轉換器 將 TensorFlow 模型轉換爲供解釋器使用的有效形式,並且可以優化模型以改善可執行文件大小和性能。

接下來,將介紹如何將 TensorFlow Lite 運行在 ESP32 上,有兩種方式:

  1. 使用 ESP-IDF
  2. 使用 PlatformIO 平臺

使用 ESP-IDF

1. 搭建 ESP-IDF 開發環境

根據 ESP-IDF Programming Guide 安裝 工具鏈 和 ESP-IDF

檢查 ESP-IDF 環境是否已經正確安裝:

  • 檢查 IDF_PATH 環境變量是否已經設置
  • 檢查 idf.pyxtensa-esp32-elf-* 工具鏈是否在 PATH 環境變量中

2. 克隆 TensorFlow

通過下面的命令,將 TensorFlow 克隆到本地:

git clone https://github.com/tensorflow/tensorflow.git

3. 生成 hello_world 示例項目

在 tensorflow 目錄下通過下面的命令,可以生成 hello_world 示例項目:

make -f tensorflow/lite/micro/tools/make/Makefile TARGET=esp generate_hello_world_esp_project

4. 部署到 ESP32

在 hello_world 項目目錄下,編譯、燒錄可執行文件到 ESP32:

cd tensorflow/lite/micro/tools/make/gen/esp_xtensa-esp32/prj/hello_world/esp-idf
idf.py --port /dev/ttyUSB0 flash monitor

運行結果:
在這裏插入圖片描述

使用 PlatformIO 平臺

1. 安裝 TensorFlow Lite 環境(PlatformIO)

首先,需要安裝 PlatformIO ,打開終端輸入:

pip install -U platformio

2. 新建 PlatformIO 項目

接下來可以開始搭建軟件框架了,詳細步驟:

  1. 創建項目目錄,包含 src,lib,include 文件夾
  2. 新建 platformio.ini 文件,文件內容:
[env:esp32doit-devkit-v1]
platform = espressif32
board = esp32doit-devkit-v1
framework = arduino
board_build.partitions = custom.csv
lib_deps=tfmicro
  1. 新建 custom.csv 文件,文件內容:
# Name,   Type, SubType, Offset,   Size, Flags
nvs,      data, nvs,     0x9000,   20K,
otadata,  data, ota,     0xe000,   8K,
firm,	  app,	ota_0, 	 , 3400K,
eeprom,   data, 0x99,    , 4K,
spiffs,   data, spiffs,  , 444K,

3. 生成 hello_world 示例項目

  1. 在項目目錄所在目錄下,克隆 TensorFlow 倉庫

    git clone https://github.com/tensorflow/tensorflow.git

  2. 生成 ESP32 示例項目,獲取生成的 tfmicro 庫和示例模型,在 Tensorflow 目錄下,運行:
    make -f tensorflow/lite/micro/tools/make/Makefile TARGET=esp generate_hello_world_esp_project
    生成的示例項目位於:
    tensorflow/tensorflow/lite/micro/tools/make/gen/esp_xtensa-esp32/prj/hello_world/

4. 修改 PlatformIO 項目

  1. 在 hello_world/esp-idf 目錄中拷貝 tfmicro 文件夾到 項目目錄下的 lib 文件夾

  2. 在 main 目錄中拷貝 sin_model_data.cc 到 項目目錄下的 src 文件夾,拷貝 sine_model_data.h 到 項目目錄下的 include 文件夾

  3. 在 third_party/flatbuffers/include 目錄中拷貝 flatbuffers 目錄到 tfmicro 文件夾.

  4. 在 third_party/gemmlowp 目錄中拷貝 fixedpoint 和 internal 目錄到 tfmicro 文件夾.

  5. 在 third_party 目錄中拷貝 kissfft 目錄到 tfmicro 文件夾.

  6. 在 third_party/flatbuffers/include 目錄中拷貝 flatbuffers 到 tfmicro 文件夾

  7. 在 lib/tfmicro/flatbuffers 目錄下打開 base.h, 將以下代碼段

#if defined(ARDUINO) && !defined(ARDUINOSTL_M_H)
  #include <utility.h>
#else
  #include <utility>
#endif

修改爲:

#include <utility>
  1. 接下來修改 “Hello World!” sin 模型來測試 TensorFlow Lite 是否正常工作,完整的源代碼請在 GitHub 倉庫中查看

代碼倉庫鏈接:ESP32-TensorFlow-Lite-Sample

代碼結構:

5. 部署到 ESP32

在終端中輸入以下命令將可執行文件燒錄到 ESP32:

platformio run -t upload --upload-port /dev/ttyUSB0

在終端中輸入以下命令將打開串口交互終端,輸入一個浮點數,程序將給出 sin 模型預測的值:

screen /dev/ttyUSB0 115200

運行結果:
在這裏插入圖片描述

參考鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章