當TensorFlow邂逅ESP32——爲ESP32設置TensorFlow Lite環境

原做者: Wezley Shermanhtml

連接: https://towardsdatascience.com/tensorflow-meet-the-esp32-3ac36d7f32c7git

若是我必須選擇一個最喜歡的計算領域,我會選擇嵌入式系統。我很是喜歡在資源受限的環境中優化代碼所帶來的挑戰。 當我意識到TensorFlow Lite支持微控制器時,我興奮地幾乎掀翻了個人桌子。 我有幾個ESP32-CAM模塊,我想用於家庭安全系統。個人想法是部署一個能識別人的模型,一旦相機拍到人就開始錄音。我不想在這裏使用運動感應,由於我有一隻狗會絆倒傳感器。 我認爲TensorFlow Lite是這個用例的一個很好的工具。我能夠訓練一個模型來識別桌面上的人,而後將其部署到個人ESP32-CAM模塊中。 在閱讀了TensorFlow Lite文檔以後,很明顯,使用PlatformIO並不像調用:github

platformio lib install tfmicro

除非我想使用Adafruit庫(spoiler:我不想)。 通過一些仔細的嘗試和錯誤,我可以讓TensorFlow Lite在ESP32上和PlatformIO玩得很好。 本指南將介紹如何編譯「Hello World」示例,並使用支持Arduino-ESP32的PlatformIO將其上載到ESP32-CAM模塊。api

爲PlatformIO部署設置TensorFlow Lite

你要作的第一件事就是安裝PlatformIO。要打開終端並鍵入:數組

pip install -U platformio

如今,建立項目的根目錄。此目錄還應包含srclibinclude的子目錄。 在項目的根目錄中,建立一個名爲platformio.ini的文件。此文件將包含PlatformIO初始化開發環境所需的全部信息。安全

參考這裏ide

接下來,須要建立一個名爲custom.csv的文件。這是ESP32閃存的分區信息。您能夠根據應用程序的須要和ESP32的閃存大小格式化分區表。關於ESP32分區表的更多信息能夠在這裏找到。下面是custom.csv文件的格式: 參考這裏函數

完成全部這些設置後,繼續克隆TensorFlow存儲庫(包括TensorFlow Lite)。您能夠將其下載爲.zip並解壓縮到您選擇的目錄,或者使用git克隆:工具

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

下載TensorFlow存儲庫後,從TensorFlow Lite文件夾中生成一個示例ESP32項目。咱們但願生成一個示例項目,以即可以獲取生成的tfmicro庫和示例模型。要生成示例項目,請導航到根「tensorflow」文件夾並運行:

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

這將生成一個示例項目,該項目將位於:

tensorflow/lite/experimental/micro/tools/make/gen/esp_xtensa-esp32/prj/hello_world

導航到hello_world/esp-idf目錄,並將tfmicro文件夾從components複製到前面建立的lib文件夾中。若是計劃運行示例程序以確保正確設置環境,請將sin_model_data.ccsin_model_data.h從主文件夾複製到srcinclude文件夾。 您的文件結構如今應該相似於:

Project Directory Structure 項目目錄結構

到目前爲止還很容易,對吧? 你快完成了!您只須要調整tfmicro庫文件夾中的一些內容,這樣PlatformIO就能夠看到TensorFlow Lite須要的全部第三方庫。 導航到tfmicro文件夾。您應該看到兩個文件夾:tensorflowthird_party。 進入third_party/flatbuffers/include並將flatbuffers子目錄複製到tfmicro根目錄中。 接下來,進入third_party/gemmlowp並將fixedpoint和內部目錄複製到tfmicro根目錄中。 最後,將kissfft目錄從third_party複製到tfmicro根目錄。 此時,您能夠繼續並刪除third_party目錄。 經過將全部third_party庫移動到tfmicro根目錄中,PlatformIO能夠識別並使用它們。 項目的最終結構應以下所示:

File structure for a TensorFlow Lite ESP32 Project TensorFlow Lite ESP32項目的文件結構

文件結構完成後,導航到lib/tfmicro/flatbuffers並在base.h中打開base.h,將第34行從如下位置:

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

更改成:

#include <utility>

如今完成了!惟一要作的就是導入並在項目中使用TensorFlow Lite。

建立示例項目

爲了測試TensorFlow Lite是否正常工做,我改編了「Hello World!「Arduino-ESP32草圖中使用的正弦模型。 下面我將會引導你完成如下的工做!

包括

我作的第一件事是導入項目將使用的全部庫

參考這裏

這些庫以下:

  • Arduino .h— Arduino支持! :)
  • math.h — 這裏專門用於M_PI的定義(稍後討論)。
  • all_ops_resolver.h — 定義用於運行模型的操做。
  • micro_error_reporter.h — 用於錯誤報告。
  • micro_interpreter.h — 運行模型。
  • sine_model_data.h — 咱們正在使用的示例模型。

全局變量

接下來,我來設置變量:

參考這裏

我定義的第一個全局變量是存儲模型生成的數組的內存池。TensorFlow的文檔說明,您可能必須根據不一樣模型的實驗得出池大小。爲此,我使用了TensorFlow爲運行sine模型提供的示例代碼。 而後我定義了模型、解釋器和輸入/輸出節點。

設置設計

定義了全局變量後,就能夠設置環境了。 在「setup()」函數中,我以115200波特的速度啓動串行,並導入正弦模型。

參考這裏

而後我實例化了TensorFlow Lite微解釋器

參考這裏

最後,我將模型的張量分配到定義爲全局的內存池中,並將輸入和輸出變量設置爲它們對應的節點。

參考這裏

「setup()」函數結束。要點:我導入了模型,建立了解釋器,並將模型加載到內存中。

控制迴路設計

「setup()」函數完成後,我開始實現控制循環邏輯。 對於控制迴路,我等待用戶從串行輸入並將其轉換爲浮點。而後我檢查以確保用戶輸入在模型的參數(0–2*PI)內:

參考這裏

而後,我將模型的輸入節點設置爲解析用戶輸入,調用解釋器,而後輸出結果:

參考這裏

部署到ESP32

代碼完成後,您可使用PlatformIO部署到ESP32:

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

Uploading to the ESP32 上傳到ESP32

而後,您可使用:

screen /dev/ttyUSB0 115200

Running Sine Model on ESP32 在ESP32上運行正弦模型

就這樣!我真的很驚訝TensorFlow竟能如此容易地將模型部署到微控制器上。下一篇文章中我將介紹如何使用TensorFlow建立一個模型,以及如何將其轉換爲能夠由TensorFlow Lite運行的東西! GitHub項目地址: https://github.com/wezleysherman/ESP32-TensorFlow-Lite-Sample

PS:我是黑胡桃實驗室社區的一名成員,最近常常在看一些老外作的有趣的人工智能項目,若是有興趣或疑問能夠在評論區或私信與我交流~。

相關文章
相關標籤/搜索