创客神器NanoPi
直播中

tinnu

8年用户 133经验值
擅长:可编程逻辑 嵌入式技术 控制/MCU
私信 关注
[经验]

Nanopc-t4 + tengine = mobilenet_ssd一帧仅需200ms


(一)关于tengine
2017年12月30日,Tengine AIOT平台正式开源,这个有着跟淘宝Web服务器同样名称的AIOT引擎,能够运行在ARM平台上,并把本应该比yolo更慢的SSD算法加速到200ms以内。
可惜是我试用恰逢tengine默默无闻时,完全没有耳闻这款产品。当时嵌入式深度学习环境还相当荒芜,比如TF lite这些根本没有发展起来,在嵌入式平台运行深度学习几乎没什么选择。
我曾经还一度以为ARM linux平台上可以装Tensorflow,但实际上到了18年末,Tensorflow才出现ARM linux平台的适配包,当时我看见anaconda上面有个arm字眼的包还以为真的可以装到arm上,结果捣鼓了半天,屁都运行不了。


18年的时候出现过这样一则资讯:
引用: 谷歌的几位大神员工合力贡献出了一个适用于ARM aarch64架构的TensorFlow安装包。
所以当时opencv几乎是arm平台跑深度学习的唯一选择。不得不说intel这个开源项目的成员们牛逼哄哄,在那个荒芜的时代生生把DNN模块挤进了opencv3.3里面,让嵌入式玩家也能用得上深度学习。但跨平台终究是牺牲了性能。
我当时使用opencv的dnn模块时,一帧足足要600ms+才运算完,这已经是人能直观感受到的迟滞了。

(二)nanopc-t4镜像与opencv问题
一开始使用的是18年1月份的镜像,听说19年9月份又出了新的镜像,内部还集成了opencv4.1,因此匆匆忙忙去刷了一把,具体是typec-friendlydesktop-bionic-4.4-arm64-20190903.tgz
但各位板友看完之后不要急着去下,这是个坑。友善官方适配的这个opencv4.1简直可以说是坑爹版,环境配置有蜜汁问题,我搞了好久没搞好,无奈只能把原本的库删掉,重新编译了以前的3.4.3,还搞出一堆问题。
关于如何编译opencv3.4.3我就不赘述了,反正那个预装的QT环境也是有蜜汁问题的,所以不能带上with_qt(坑啊)

接下来是去掉4.1版本的opencv。
1、首先要把/usr/local/lib下面的库去掉
  1. sudo rm /usr/local/lib/libopencv_*
2、然后把/usr/local/include的头文件去掉
  1. sudo rm /usr/local/include/opencv
3、再把/etc/ld.so.conf.d/opencv.conf 及 opencv.conf.d下面所有的关于opencv的路径清掉
4、/etc/bash.bashrc 脚本里面看一看还有没有opencv相关配置
(由于距离写帖子的时间有些久,加之自己动手搞过一些其他配置,所以不太清楚哪些配置是原本带有的,第四项应该是原本镜像系统没有配置的,不过最好看看吧。
5、去掉cmake下面的opencv4配置
  1. mv -r /usr/local/lib/cmake/opencv4/
这一点很容易漏掉,如果不这么做,编译tengine会出错:
引用: pi@NanoPC-T4:~/tengine/tengine/examples/build$ ../linux_build.sh
-- CMAKE_INSTALL_PREFIX = /usr/local
CMake Error at /usr/local/lib/cmake/opencv4/OpenCVModules.cmake:403 (message):
  The imported target "opencv_core" references the file

     "/usr/local/lib/libopencv_core.so.4.1.0"

  but this file does not exist.  Possible reasons include:

  * The file was deleted, renamed, or moved to another location.

  * An install or uninstall procedure did not complete successfully.

  * The installation package was faulty and contained

     "/usr/local/lib/cmake/opencv4/OpenCVModules.cmake"

  but not all the files it references.

Call Stack (most recent call first):
  /usr/local/lib/cmake/opencv4/OpenCVConfig.cmake:112 (include)
  mtcnn/CMakeLists.txt:30 (find_package)


-- Configuring incomplete, errors occurred!
See also "/home/pi/tengine/tengine/examples/build/CMakeFiles/CMakeOutput.log".

出错了之后,该回来,需要先make clean然后在 make 才能通过。

接下来对编译好的opencv3.4.3 make install 就行啦

(三)安装tengine
1、下载tengine
  1. sudo apt-get install git
  2. git clone https://github.com/OAID/tengine
2、安装依赖项
  1. sudo apt install libprotobuf-dev protobuf-compiler libboost-all-dev libgoogle-glog-dev libopenblas-dev
第一个参考资料里面少了一项libopenblas-dev,编译时会报错:
引用: /usr/bin/ld: cannot find -lopenblas
collect2: error: ld returned 1 exit status
CMakeFiles/MSSD.dir/build.make:164: recipe for target 'MSSD' failed
make[2]: *** [MSSD] Error 1
3、配置文件
  1. cd ~/tengine
  2. cp makefile.config.example makefile.config
基本不需要改动,默认配置就是ARM64位。实际上tengine项目早起只支持RK3399。此外还有个ACL加速库,后面会提到,这里暂且不启用。
4、编译
  1. make -j4
  2. make install
5、配置环境(可略过)
  1. sudo mkdir -p /usr/local/AID/Tengine
  2. sudo cp -rpf ~/Tengine/install/* /usr/local/AID/Tengine
  3. wget ftp://ftp.openailab.net/tools/script/gen-pkg-config-pc.sh
  4. chmod +x ./gen-pkg-config-pc.sh
  5. sudo ./gen-pkg-config-pc.sh
略过了环境配置,意味着之后的程序cmakelist.txt里面都需要额外配置tengine安装路径。

(四)测试
本帖暂时先运行demo中单张图片识别,查看其单线程运行效果。
在/examples/mobilenet_ssd目录下修改CMakeList.txt文件:
加一句:
  1. set( TENGINE_DIR /home/pi/tengine/tengine )
里面的路径就是自己安装tengine的路径
加入的位置在
  1. set( INSTALL_DIR ${TENGINE_DIR}/install/)
前面。
如果位置错了,会报错误:
引用: Scanning dependencies of target MSSD
[ 33%] Building CXX object CMakeFiles/MSSD.dir/mssd.cpp.o
/home/khadas/tengine/tengine/examples/mobilenet_ssd/mssd.cpp:32:27: fatal error: tengine_c_api.h: No such file or directory
compilation terminated.
CMakeFiles/MSSD.dir/build.make:62: recipe for target 'CMakeFiles/MSSD.dir/mssd.cpp.o' failed
make[2]: *** [CMakeFiles/MSSD.dir/mssd.cpp.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/MSSD.dir/all' failed
make[1]: *** [CMakeFiles/MSSD.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
编译:
  1. cmake .
  2. make
  3. ./MSSD


(五)运行效果对比
基本介乎200ms和160ms直接跳动,而在khadas的VIM上面运行基本是190ms到200ms,因此初步判断这个demo是吃单线程的,运行在A72核心时160ms一帧,运行在A53核心时域S905X这个四核A53的成绩一样。
效果图后面补充。


回帖(1)

tinnu

2019-9-14 18:52:40
(五)运行效果对比
nanopc-t4运行效果:

t4+tengine.png
基本介乎200ms和160ms之间,但并不是均匀分布,而是两点分布,说明这个demo是吃单线程的,运行在A72核心时160ms一帧,运行在A53核心时域S905X这个四核A53的成绩一样。
此外我在khadas的VIM上面运行基本是190ms到200ms,可以作证在A53+64位系统上运行该demo基本是190ms+左右:

khadas+tengine.png
另外,在X86平台的虚拟机上也运行过一次,CPU方面是i5 8500,只配备单核+2G内存(似乎不吃内存?),由于tengine的优化只支持到arm,因此x86平台是基于openblas库的,但饶是如此,其成绩依然远远甩开嵌入式平台:
x86+tengine.png
但x86对arm平台的优势也并非绝对。在cloudstudio平台上,运行结果甚至不如A53:
cloudstudio+tengine.png
cloudstudio平台是使用E5 CPU,主频达到2.4G:
CPU.png
超过实验中ARM平台的主频,看样子果然对ARM平台优化更好啊。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分