树莓派是国内比较流行的一款卡片式计算机,但是受限于其硬件配置,用树莓派玩深度学习似乎有些艰难。最近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