原做者: 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
如今,建立項目的根目錄。此目錄還應包含src、lib和include的子目錄。 在項目的根目錄中,建立一個名爲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.cc和sin_model_data.h從主文件夾複製到src和include文件夾。 您的文件結構如今應該相似於:
項目目錄結構
到目前爲止還很容易,對吧? 你快完成了!您只須要調整tfmicro庫文件夾中的一些內容,這樣PlatformIO就能夠看到TensorFlow Lite須要的全部第三方庫。 導航到tfmicro文件夾。您應該看到兩個文件夾:tensorflow和third_party。 進入third_party/flatbuffers/include並將flatbuffers子目錄複製到tfmicro根目錄中。 接下來,進入third_party/gemmlowp並將fixedpoint和內部目錄複製到tfmicro根目錄中。 最後,將kissfft目錄從third_party複製到tfmicro根目錄。 此時,您能夠繼續並刪除third_party目錄。 經過將全部third_party庫移動到tfmicro根目錄中,PlatformIO能夠識別並使用它們。 項目的最終結構應以下所示:
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
上傳到ESP32
而後,您可使用:
screen /dev/ttyUSB0 115200
在ESP32上運行正弦模型
就這樣!我真的很驚訝TensorFlow竟能如此容易地將模型部署到微控制器上。下一篇文章中我將介紹如何使用TensorFlow建立一個模型,以及如何將其轉換爲能夠由TensorFlow Lite運行的東西! GitHub項目地址: https://github.com/wezleysherman/ESP32-TensorFlow-Lite-Sample
PS:我是黑胡桃實驗室社區的一名成員,最近常常在看一些老外作的有趣的人工智能項目,若是有興趣或疑問能夠在評論區或私信與我交流~。