andyshrk 发表于 2020-1-7 20:19:10

在 RK3399 开发板上部署 Tengine AI 框架

本帖最后由 andyshrk 于 2020-1-7 20:20 编辑

Tengine on rk3399TengineTengine 是 OPEN AI LAB 一款轻量级神经网络推理引擎,它针对 Arm 嵌入式平台进行了专门优化,对 Android、Linux 系统都提供了很好的支持。而且更加难能可贵的是 Tengine 并不依赖于专用 AI 芯片(即 Tengine 可以利用 GPU、NPU 这些具有专门 AI 加速功能的模块进行 AI 运算,也可以利用通用的 CPU 进行 AI 运算),很多 Arm 平台都可以通过 Tengine 框架对算力进行深度挖掘,从而高效的运行一些 AI 应用。https://andyshrk.gitee.io/imgrepo/Tengine-rk3399/Tengine-framework.png本文就是想描述如何在 RK3399 这一 Arm64 平台上搭建 Tengine AI 推理框架,并运行图像识别相关应用。这里用的 RK3399 平台是一块基于 RK3399 的 Leez P710 开发板,我在上面移植了基于 Armbian 的 Debian 10 系统,运行的 u-boot 和 linux kernel 都是mainline的。具体过程可以参考这篇文章:在 RK3399 上部署最新的 Linux 5.4 和 U-Boot v2020 .01 。编译 TengineOPEN AI LAB 在 Github 上提供了开源的 Tengine 版本,并提供了比较详细的参考文档,所以可以直接下载源码,根据文档进行编译。得益于 RK3399 强大的性能,我们可以直接在 RK3399 上下载代码,进行编译,免去交叉编译的诸多不便。、
[*]下载源码git clone --recurse-submodules https://github.com/OAID/tengine/注意 clone 的时候一定要带 --recurse-submodules 这个参数,否则会下载不完整。
[*]安装依赖apt install libprotobuf-dev protobuf-compiler libopencv-devpkg-config
[*]修改配置文件在源码的 default_config 目录下提供了基于 arm32、arm64、x86 这三个平台的配置文件。RK3399 是 Arm64, 所以对应的配置文件为:arm64_linux_native.config。这里要做的修改是,在配置文件中打开 BUILD_SERIALIZER=y 这个选项,否则后面运行的时候可能会遇到Shared library not found: libcaffe-serializer.so: cannot open shared object file: No such file or directory 这个错误。https://andyshrk.gitee.io/imgrepo/Tengine-rk3399/Tengine-defconfig.png
[*]编译在源码根目录执行如下命令进行编译:./linux_build.sh default_config/arm64_linux_native.confighttps://andyshrk.gitee.io/imgrepo/Tengine-rk3399/Tengine-build.png
[*]下载 model 文件运行这些 AI 应用的时候,需要加载对应的 model 文件,这些文件可以从 OPEN AI LAB 提供的网盘里下载:https://pan.baidu.com/s/1Ar9334MPeIV1eq4pM1eI-Q , 提取码为 hhgc 。下载完后需要把这些 model 文件放在 Tengine 源码根目录下的 models 文件夹,所有的 model 文件加在一起比较大,我只上传了后面测试需要用到的部分:https://andyshrk.gitee.io/imgrepo/Tengine-rk3399/Tengine-models.png
[*]运行 benchmark编译完成后默认会在 build/benchmark/bin/ 目录下生成两个供测试用的 benchmark 文件,可以直接执行这两个文件,用来简单的测试,确实是否真正编译成功。./build/benchmark/bin/bench_sqz ./build/benchmark/bin/bench_mobilenet https://andyshrk.gitee.io/imgrepo/Tengine-rk3399/Tengine-benchmark.png
编译并运行测试 DemoTengine 开放的源码里面还带了几个不错的 图像识别相关的测试 Demo,用来测试和进行 AI 相关的基础学习都很不错。这些 Demo 的源码在 examples 目录下,在编译之前我们需要修改一个编译脚本 linux_build.sh,即根据实际情况,正确设置 Tengine 的所在路径,比如我下载编译的 Tengine 代码在 /root/rockdev/tengine 目录下:data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==然后在 examples 目录下执行如下命令:mkdir buildcd build/../linux_build.sh makehttps://andyshrk.gitee.io/imgrepo/Tengine-rk3399/Tengine-example-build.png编译完成,主要有 faster_rcnn 、lighten_cnn、 mobilenet_ssd、 mtcnn 、ssd、 yolov2、 YuFaceDetectNet 这几个测试 Demo。faster_rcnnFaster rcnn 是大神 Ross B. Girshick 在 RCNN 和Fast RCNN 的基础上于 2016 年提出的新模型,综合性能更高,检测速度更快。Tengine 版本的 Demo 对下面的图片进行识别:https://andyshrk.gitee.io/imgrepo/Tengine-rk3399/Tengine-ssd_dog.jpg运行 faster_rcnn 可执行程序,会生成一张对检测到的物体进行标注后的图像:https://andyshrk.gitee.io/imgrepo/Tengine-rk3399/Tengine-faster-rcnn.png可以看到识别到了 Dog、bicycle、car 三个物体。YOLO v2YOLO 全称 You look only once,是 2016 年 CVPR 上发表的一篇目标检测论文。YOLOV v2 发表于 2017 年的 CVPR 上,论文名称为《YOLO9000: Better, Faster, Stronger》,获得了 CVPR 2017 Best Paper Honorable Mention 大奖。这里用这个模型来检测和 RCNN 同样的图片:https://andyshrk.gitee.io/imgrepo/Tengine-rk3399/Tengine-Yolov2.png从这张图片看,准确性和 RCNN 相当,但是检测速度却快了 将近 6 倍。SSDSSD 全称 Single Shot MultiBox Detector, 是一种 one-stage 的通用物体检测算法,作者 Wei Liu,提出于 2016年。这里用如下图片做检测:https://andyshrk.gitee.io/imgrepo/Tengine-rk3399/Tengine-ssd_horse.jpg运行结果如下:https://andyshrk.gitee.io/imgrepo/Tengine-rk3399/Tengine-ssd.png有点可惜的是把狗狗给识别错了。mobilenet_ssd这个是 mobilenet 和 ssd 的结合,对移动设备更友好。使用和 SSD 同样的图片进行检测:https://andyshrk.gitee.io/imgrepo/Tengine-rk3399/Tengine-MSSD.png可以看到狗狗检测对了,但是远处有个人漏检了。但是检测速度比 SSD 快了很多。YuFaceDetectNet这个是深圳大学于仕琪老师开源的 libfacedetection 的 Tengine 实现版本,libfacedetection 号称最快的人脸检测库。测试原图如下:https://andyshrk.gitee.io/imgrepo/Tengine-rk3399/Tengine-face5.jpg测试结果:
https://andyshrk.gitee.io/imgrepo/Tengine-rk3399/Tengine-face-det.pngMTCNNMTCNN 是另外一种人脸检测方案,提出于 2016 年。这里我们采用和 YuFaceDetectNet 同样的图片进行测试:https://andyshrk.gitee.io/imgrepo/Tengine-rk3399/Tengine-MTCNN-face5.png五张脸全部检测到了,而且时间和 YuFaceDetectNet差距并不大。写在最后其实对于 AI 和图像识别来说我是一个门外汉,写这篇文章的目的是想告诉大家如何把 Tengine 这一开源的 AI 框架部署到手边的 Arm 开发板上,以及即使没有 强大的 NPU,GPU,我们也可以进行一些 AI 相关的实践。如果对 AI 或者图像识别感兴趣,这也许是一个很好入门切入点。本文首发于公众号:HackforFun更多原创请扫码关注https://andyshrk.gitee.io/imgrepo/blog.jpg

gotoorder 发表于 2020-4-9 11:59:32

感谢分享
页: [1]
查看完整版本: 在 RK3399 开发板上部署 Tengine AI 框架