(一)关于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下面的库去掉
- sudo rm /usr/local/lib/libopencv_*
2、然后把/usr/local/include的头文件去掉
- 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配置
- 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
- sudo apt-get install git
- git clone https://github.com/OAID/tengine
2、安装依赖项
- 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、配置文件
- cd ~/tengine
- cp makefile.config.example makefile.config
基本不需要改动,默认配置就是ARM64位。实际上tengine项目早起只支持RK3399。此外还有个ACL加速库,后面会提到,这里暂且不启用。
4、编译
5、配置环境(可略过)
- sudo mkdir -p /usr/local/AID/Tengine
- sudo cp -rpf ~/Tengine/install/* /usr/local/AID/Tengine
- wget ftp://ftp.openailab.net/tools/script/gen-pkg-config-pc.sh
- chmod +x ./gen-pkg-config-pc.sh
- sudo ./gen-pkg-config-pc.sh
略过了环境配置,意味着之后的程序cmakelist.txt里面都需要额外配置tengine安装路径。
(四)测试
本帖暂时先运行demo中单张图片识别,查看其单线程运行效果。
在/examples/mobilenet_ssd目录下修改CMakeList.txt文件:
加一句:
- set( TENGINE_DIR /home/pi/tengine/tengine )
里面的路径就是自己安装tengine的路径
加入的位置在
- 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
编译:
(五)运行效果对比
基本介乎200ms和160ms直接跳动,而在khadas的VIM上面运行基本是190ms到200ms,因此初步判断这个demo是吃单线程的,运行在A72核心时160ms一帧,运行在A53核心时域S905X这个四核A53的成绩一样。
效果图后面补充。