|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Heaven_1 于 2021-8-24 20:25 编辑
; |/ E) l5 ^2 O& m7 B" j. L. i( y, O, g% O$ q( v1 b6 j
Tengine 是 OPEN AI LAB 一款轻量级神经网络推理引擎,它针对 ARM 嵌入式平台进行了专门优化,对 Android、Linux 系统都提供了很好的支持。& i) [- H! U( d4 m' q) I* \
而且更加难能可贵的是 Tengine 并不依赖于专用 AI 芯片(即 Tengine 可以利用 GPU、NPU 这些具有专门 AI 加速功能的模块进行 AI 运算,也可以利用通用的 CPU 进行 AI 运算),很多 Arm 平台都可以通过 Tengine 框架对算力进行深度挖掘,从而高效的运行一些 AI 应用。5 H/ w& u# i3 Y6 `- ?. G
![]()
9 h& ~3 @' _7 R
( p( K: ^; H6 u1 N; T) Y0 B本文就是想描述如何在OKMX8MM-C这一 Arm64 平台上搭建 Tengine AI 推理框架,并运行图像识别相关应用。首先在OKMX8MM-C上面移植了基于 Armbian 的 Debian 10 系统,运行的 u-boot 和 linux kernel 都是mainline的。
5 H$ e/ {) v: k# a- o: P$ |+ U
* o5 K9 n1 N1 Q' d1 O编译 Tengine
' j1 S. K/ u H: m. ^4 _& mOPEN AI LAB 在 Github 上提供了开源的 Tengine 版本,并提供了比较详细的参考文档,所以可以直接下载源码,根据文档进行编译。) `2 i z4 C5 U9 u9 B2 Y, G8 U
得益于 i.MX8MMini 强大的性能,我们可以直接在 i.MX8MMini 上下载代码,进行编译,免去交叉编译的诸多不便。( x6 \% C# c7 U! a- f9 v
: _0 x1 W2 @; B& F. k8 s3 j
1. 下载源码
P8 y8 O P5 w7 qgit clone --recurse-submodules https://github.com/OAID/tengine/
7 e1 v) z4 v! _4 ]6 r, b注意 clone 的时候一定要带 --recurse-submodules 这个参数,否则会下载不完整。. k4 f0 `: u2 n( G) y
# @; `/ \$ |& H1 B% n5 R( d2. 安装依赖" O- \' o4 d* ^: ]( ]
apt install libprotobuf-dev protobuf-compiler libopencv-dev pkg-config
+ X2 i2 A! J1 l
6 ]8 l. N) s' C9 m; D# \7 }# k g4 O# q" o3. 修改配置文件* a4 w" O8 _. U+ } U5 p
在源码的 default_config 目录下提供了基于 arm32、arm64、x86 这三个平台的配置文件。
9 R, w7 \$ X/ R& w* Q, ORK3399 是 Arm64, 所以对应的配置文件为:arm64_linux_native.config。
, M( t; y2 t$ I% Z! D6 v4 h这里要做的修改是,在配置文件中打开 BUILD_SERIALIZER=y 这个选项,否则后面运行的时候可能会遇到Shared library not found: libcaffe-serializer.so: cannot open shared object file: No such file or directory 这个错误。
% r/ g n9 c* i s3 D( O, L![]()
8 b- A3 _6 P. E9 R! u4 W4 U4. 编译
- I, M! I9 b( W1 t4 x7 `, D7 }在源码根目录执行如下命令进行编译:# i# b* T8 A& U. E7 r
./linux_build.sh default_config/arm64_linux_native.config4 o) Q2 P! C8 }4 `
![]()
6 m3 l8 r* V, U T" k: X" L8 d- W6 [
5. 下载 model 文件2 B ]0 H, K9 ~) t
运行这些 AI 应用的时候,需要加载对应的 model 文件,这些文件可以从 OPEN AI LAB 提供的网盘里下载:
+ U% t1 c) r2 A- ^% O' Bhttps://pan.baidu.com/s/1Ar9334MPeIV1eq4pM1eI-Q , 提取码为 hhgc 。6 {) m% d* z3 y3 R- [
下载完后需要把这些 model 文件放在 Tengine 源码根目录下的 models 文件夹,所有的 model 文件加在一起比较大,我只上传了后面测试需要用到的部分:
+ d& y( ~) s6 [8 V $ u8 J: U/ i& M; t- ^7 \* ~
6. 运行 benchmark
5 X( D0 C: n5 |6 G: c5 U* [2 g编译完成后默认会在 build/benchmark/bin/ 目录下生成两个供测试用的 benchmark 文件,可以直接执行这两个文件,用来简单的测试,确实是否真正编译成功。( @, X$ j/ D, f5 W
./build/benchmark/bin/bench_sqz ./build/benchmark/bin/bench_mobilenet- f0 y5 ^1 c. Q* Q% s _- P
![]()
3 M" ~ S8 {9 ^0 k! F
" U8 y5 w$ f- h+ a编译并运行测试 Demo
9 z& O: K$ m$ b- A$ {3 X& {Tengine 开放的源码里面还带了几个不错的 图像识别相关的测试 Demo,用来测试和进行 AI 相关的基础学习都很不错。
, c& Y, i2 `7 O6 D# v这些 Demo 的源码在 examples 目录下,在编译之前我们需要修改一个编译脚本 linux_build.sh, 即根据实际情况,正确设置 Tengine 的所在路径,比如我下载编译的 Tengine 代码在 /root/rockdev/tengine 目录下:8 T5 w# d2 J4 U" }% E/ r+ F
![]()
! V: u& S0 L4 G( R/ w- m. n! {' f然后在 examples 目录下执行如下命令:" q/ i8 }3 v# L3 G) I
mkdir buildcd build/../linux_build.sh make
. \' S" c- R$ _2 y; k# \8 ? ( a! D( L7 m, w" ~1 `
编译完成,主要有 faster_rcnn 、lighten_cnn、 mobilenet_ssd、 mtcnn 、ssd、 yolov2、 YuFaceDetectNet 这几个测试 Demo。; ^% M" A' U* Q7 e* J
faster_rcnn
/ |: a5 T3 ~) S1 W: GFaster rcnn 是大神 Ross B. Girshick 在 RCNN 和 Fast RCNN 的基础上于 2016 年提出的新模型,综合性能更高,检测速度更快。
2 l$ `/ j7 r$ u5 {Tengine 版本的 Demo 对下面的图片进行识别:0 }0 M4 n+ F8 S7 n& Y
![]()
. D$ q s/ _" `1 R4 X9 ~/ _4 [. J运行 faster_rcnn 可执行程序,会生成一张对检测到的物体进行标注后的图像:. D4 T5 k1 R. \; g8 d% t: ^9 V" n
![]()
, k4 r- j; D; A* t可以看到识别到了 Dog、bicycle、car 三个物体。, _7 i5 {/ w/ D' ^1 A* q8 _+ t
YOLO v2
& J0 \1 U2 o' Z0 k2 H# j4 h" Y8 aYOLO 全称 You look only once,是 2016 年 CVPR 上发表的一篇目标检测论文。
8 S% l9 h. k' k, [% qYOLOV v2 发表于 2017 年的 CVPR 上,论文名称为《YOLO9000: Better, Faster, Stronger》,获得了 CVPR 2017 Best ** Honorable Mention 大奖。
% |" m$ k" Q4 m0 w这里用这个模型来检测和 RCNN 同样的图片:& [1 t6 k/ O& ?. ~1 d! \* a7 e5 X
- J' d. F2 y& C
从这张图片看,准确性和 RCNN 相当,但是检测速度却快了 将近 6 倍。
8 b3 Q* A$ X, x/ HSSD! H8 A; t9 y1 J& x! l* r7 d" I
SSD 全称 Single Shot MultiBox detector, 是一种 one-stage 的通用物体检测算法,作者 Wei Liu,提出于 2016年。4 }/ m2 U [# P. D
这里用如下图片做检测:
+ r! @" F$ @$ H1 O5 N0 P 5 _+ `! v" `) [: S: }2 u# b
运行结果如下:
& x' U& R! T5 H6 l - J0 P3 i+ t# }3 Q( Z% L
有点可惜的是把狗狗给识别错了。
( s5 L/ \1 ]7 \4 I3 Lmobilenet_ssd
7 J" k3 x" x( p* a; o* Z这个是 mobilenet 和 ssd 的结合,对移动设备更友好。
8 b* g6 z0 z1 r" r3 A使用和 SSD 同样的图片进行检测:" L$ a4 g+ N4 v q6 R
2 _( J5 A) G2 o% [( v1 {
可以看到狗狗检测对了,但是远处有个人漏检了。但是检测速度比 SSD 快了很多。- n6 J: O5 W0 i2 {
YuFaceDetectNet) X/ I4 v9 e/ W; m7 ~
这个是深圳大学于仕琪老师开源的 libfacedetection 的 Tengine 实现版本,libfacedetection 号称最快的人脸检测库。
* b5 D. U8 m2 @, s8 P测试原图如下:" t! Y6 w* X/ D
& g. ~: B7 T9 j7 D/ P
" t; ?; @, H4 M/ W m
测试结果:- y' z3 U# m+ r5 u$ ^
* m* E* A h4 i3 R
) E9 s* c" G9 j. W' D
MTCNN
# [5 j. r$ h) g3 \% l+ Y% Y' J. yMTCNN 是另外一种人脸检测方案,提出于 2016 年。9 _5 h2 H7 I# t( _4 l
这里我们采用和 YuFaceDetectNet 同样的图片进行测试:
u% x s: O4 x6 I![]()
( x4 Y n" o7 h/ A+ a8 ? A五张脸全部检测到了,而且时间和 YuFaceDetectNet 差距并不大。) F- w: K! q/ _4 s0 ` w- Q! Z, R( ^. W& f$ e
9 p2 p! F2 ?% y1 K4 X' N/ {/ C Q" s0 g6 q" r
|
|