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

原作者: Wezley Sherman

鏈接: https://towardsdatascience.com/tensorflow-meet-the-esp32-3ac36d7f32c7

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

platformio lib install tfmicro

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

爲PlatformIO部署設置TensorFlow Lite

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

pip install -U platformio

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

參考這裏

接下來,需要創建一個名爲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:我是黑胡桃實驗室社區的一名成員,最近經常在看一些老外做的有趣的人工智能項目,如果有興趣或疑問可以在評論區或私信與我交流~。

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