樹莓派是國內比較流行的一款卡片式計算機,但是受限於其硬件配置,用樹莓派玩深度學習似乎有些艱難。最近OPENAI為嵌入式設備推出了一款AI框架Tengine,其對於配置的要求相比傳統框架降低了很多,我嘗試着在樹莓派上進行了搭建並成功運行了Mobilenet-SSD。
Tengine簡介
- Tengine 是OPEN AI LAB 為嵌入式設備開發的一個輕量級、高性能並且模塊化的引擎。
- Tengine在嵌入式設備上支持CPU,GPU,DLA/NPU,DSP異構計算的計算框架,實現異構計算的調度器,基於ARM平台的高效的計算庫實現,針對特定硬件平台的性能優化,動態規划計算圖的內存使用,提供對於網絡遠端AI計算能力的訪問支持,支持多級別並行,整個系統模塊可拆卸,基於事件驅動的計算模型,吸取已有AI計算框架的優點,設計全新的計算圖表示。
編譯安裝開源版Tengine
安裝相關工具
sudo apt-get install git cmake
安裝支持庫
sudo apt-get install libprotobuf-dev protobuf-compiler libboost-all-dev libgoogle-glog-dev libopencv-dev libopenblas-dev
- protobuf 是一種輕便高效的數據存儲格式,這是caffe各種配置文件所使用的數據格式
- boost 是一個c++的擴展程序庫,稍后Tengine的編譯依賴於該庫
- google-glog 是一個google提供的日志系統的程序庫
- opencv 是一個開源的計算機視覺庫
- openblas 是一個開源的基礎線性代數子程序庫
下載&編譯
以下的所有步驟建議在pi用戶下完成(而非root),不然可能報錯。
1.從github上下載最新的開源版Tengine源碼
git clone https://github.com/OAID/Tengine.git
2.切換工作目錄到Tengine
cd Tengine
3.准備好配置文件
Tengine目錄下提供了配置模板 makefile.config.example 文件
cp makefile.config.example makefile.config
4.修改配置文件 makefile.config
由於開源版的Tengine不支持針對armv7的優化,所以需要用openblas替代實現;
將 CONFIG_ARCH_ARM64=y 這一行注釋掉(行首加井號 #)以關閉ARM64架構的優化實現;
解除 CONFIG_ARCH_ARM32=y 這一行解除注釋(刪除行首的井號 #)以開啟BLAS計算庫的實現方式
CONFIG_ARCH_BLAS=y 這一行不需要解除注釋
5.編譯並安裝
make -j4 make install
這里的 -j4 表示開啟四個線程進行編譯
測試
1.下載mobilenet-ssd模型並放置在 Tengine/models 目錄下
兩個文件:MobileNetSSD_deploy.caffemodel 和 MobileNetSSD_deploy.prototxt
下載鏈接(提取碼為57vb):https://pan.baidu.com/s/1LXZ8vOdyOo50IXS0CUPp8g
如果是測試YOLOv2則下載
yolo-voc.prototxt
yolo-voc.caffemodel
2.將工作目錄切換到mobilenet-ssd示例程序的目錄下
cd ~/Tengine/examples/mobilenet_ssd
3.編譯示例程序
cmake -DTENGINE_DIR=/home/pi/Tengine . make
這里 -DTENGINE_DIR用於為cmake指定環境變量TENGINE_DIR,該變量可以在CMakeLists.txt文件中找到
4.運行示例程序
./MSSD
指定參數:
./MSSD -p mssd.prototxt -m mssd.caffemodel -i img.jpg
等待良久后,出現例程的運行結果:
可以看到例程運行耗時2分鍾,考慮到例程僅識別了一張圖片一次,算法運行速度很不理想。
對比在RK3399上的表現,除了樹莓派的硬件配置較低外(我用的樹莓派3B),所使用的計算庫的不同也是重要的原因,BLAS的庫計算性能要差於Tengine提供的官方庫。
參考鏈接:
1. https://blog.csdn.net/qq_33287871/article/details/99686969
2. https://songrbb.github.io/2018/08/17/利用Tengine在樹莓派上跑深度學習網絡/?tdsourcetag=s_pctim_aiomsg
3. https://github.com/OAID/Tengine/tree/master/examples/mobilenet_ssd