树莓派是国内比较流行的一款卡片式计算机,但是受限于其硬件配置,用树莓派玩深度学习似乎有些艰难。最近OPENAI为嵌入式设备推出了一款AI框架Tengine,其对于配置的要求相比传统框架降低了很多,我尝试着在树莓派上进行了搭建并成功运行了YOLOv2网络。
Tengine简介
- Tengine 是OPEN AI LAB 为嵌入式设备开发的一个轻量级、高性能并且模块化的引擎。
- Tengine在嵌入式设备上支持CPU,GPU,DLA/NPU,DSP异构计算的计算框架,实现异构计算的调度器,基于ARM平台的高效的计算库实现,针对特定硬件平台的性能优化,动态规划计算图的内存使用,提供对于网络远端AI计算能力的访问支持,支持多级别并行,整个系统模块可拆卸,基于事件驱动的计算模型,吸取已有AI计算框架的优点,设计全新的计算图表示。
安装Tengine
使用树莓派自带的系统环境,根据Tengine官方文档进行安装和配置。
1.安装git
sudo apt-get install git
2.用git下载源码
git clone https://github.com/OAID/tengine/
3.安装支持库
libprotobuf: for load caffemodel
sudo apt install libprotobuf-dev protobuf-compiler libboost-all-dev libgoogle-glog-dev
libopencv: for image preprocessing in test samples
sudo apt install libopencv-dev
由于树莓派自带的系统为armv7,不支持Tengine现有的官方计算库,因此需要使用BLAS库进行运算,安装命令为:
sudo apt-get install libopenblas-dev
如果要使用Caffe库,可以参考 http://caffe.berkeleyvision.org/installation.html 进行配置。
4.配置文件修改
首先进入tengine目录下,复制配置文件
cd ~/tengine
cp makefile.config.example makefile.config
接下来对makefile.config进行编辑(可以使用vi指令或用图形界面直接打开),首先在开头部分注释掉arm64选项,这样就会自动启用默认的arm32。
#Set the target arch
#CONFIG_ARCH_ARM64=n
然后在后面找到BLAS库相关配置,取消掉前面的注释,来启用BLAS库。
#Use BLAS as the operator implementation
#
CONFIG_ARCH_BLAS=y
5.编译
进入tengine目录下,进行编译。
cd ~/tengine
make
测试YOLOv2
1.下载模型
Tengine提供了YOLOv2的训练好的模型,我们可以直接在github上Tengineg关于YOLOv2的文档页中给的链接下载。将以下两个文件下载后存入tengine目录下models文件夹中。
yolo-voc.prototxt
yolo-voc.caffemodel
2.编译例程
根据官方文档进行编译操作出现了头文件无法找到的问题,使用YaHei大佬在《RK3399上Tengine平台搭建》的方法,单独对yolov2进行编译。
首先进入tengine目录下的examples目录下yolov2的子目录,在cmake的配置文件CMakeLists.txt的开头部分增加一个变量的指定,修改为:
cmake_minimum_required (VERSION 2.8)
project(YOLOV2)
set( TENGINE_DIR /home/pi/tengine )
set( INSTALL_DIR ${TENGINE_DIR}/install/)
set( TENGINE_LIBS tengine)
...
接下来仍在该子目录内执行编译指令
cmake .
make
注:若cmake时提示指令无法识别,可以用以下命令安装cmake
sudo apt-get install cmake
得到如下信息,说明编译成功。
[100%] Linking CXX executable YOLOV2
[100%] Built target YOLOV2
3.运行例程
还是在当前目录下,运行生成的YOLOV2文件
./YOLOV2
良久的等待后,出现例程的运行结果:
proto file not specified,using /home/pi/tengine/models/yolo-voc.prototxt by default
model file not specified,using /home/pi/tengine/models/yolo-voc.caffemodel by default
image file not specified,using /home/pi/tengine/tests/images/ssd_dog.jpg by default
tensor: region created by node: region is not consumed
add the node: region into output list
load model done!
num box: 5
num class: 20
car :84%
BOX:( 446 , 73 ),( 675 , 176 )
dog :92%
BOX:( 120 , 179 ),( 323 , 545 )
bicycle :85%
BOX:( 121 , 142 ),( 557 , 441 )
======================================
[DETECTED IMAGE SAVED]: save.jpg
======================================
--------------------------------------
repeat 1 times, avg time per run is 7754.38 ms
Release Graph Executor for graph graph
Release workspace default resource
可以看到例程运行耗时接近八秒,考虑到例程仅识别了一张图片一次,算法运行速度很不理想。对比在RK3399上的表现,除了树莓派的硬件配置较低外,所使用的计算库的不同也是重要的原因,BLAS的库计算性能要差于Tengine提供的官方库。