EDA365电子论坛网

标题: 飞凌嵌入式 基于NXP i.MX8MMini 运行tengine [打印本页]

作者: 祢豆子    时间: 2021-8-24 17:26
标题: 飞凌嵌入式 基于NXP i.MX8MMini 运行tengine
本帖最后由 Heaven_1 于 2021-8-24 20:25 编辑 1 P9 h+ v0 z5 D% O8 E6 J$ F

/ ]3 v, |- M- d4 }, J  Y+ j( cTengine 是 OPEN AI LAB 一款轻量级神经网络推理引擎,它针对 Arm 嵌入式平台进行了专门优化,对 Android、Linux 系统都提供了很好的支持。! S8 E5 i8 }" e) d5 Q
而且更加难能可贵的是 Tengine 并不依赖于专用 AI 芯片(即 Tengine 可以利用 GPU、NPU 这些具有专门 AI 加速功能的模块进行 AI 运算,也可以利用通用的 CPU 进行 AI 运算),很多 Arm 平台都可以通过 Tengine 框架对算力进行深度挖掘,从而高效的运行一些 AI 应用。
+ P0 S5 X% n8 u0 _5 F1 Z7 f* c! @, z  ~$ d* D

% p1 n- z' P; M2 N6 E本文就是想描述如何在OKMX8MM-C这一 Arm64 平台上搭建 Tengine AI 推理框架,并运行图像识别相关应用。首先在OKMX8MM-C上面移植了基于 Armbian 的 Debian 10 系统,运行的 u-boot 和 linux kernel 都是mainline的。. ^7 w0 r6 P: \- r/ M5 _
, b+ Y2 g& c2 `5 U
编译 Tengine, [/ {7 x5 |, J; `1 G- _1 ^5 [4 \# I
OPEN AI LAB 在 Github 上提供了开源的 Tengine 版本,并提供了比较详细的参考文档,所以可以直接下载源码,根据文档进行编译。
: F+ w* d, `% j" e( K! D1 J8 r  Q得益于 i.MX8MMini 强大的性能,我们可以直接在 i.MX8MMini 上下载代码,进行编译,免去交叉编译的诸多不便。5 ^0 d7 A& L0 l# a# O6 ]( X3 F

" @* P& Y+ }' x) |& s3 [1. 下载源码5 [+ H8 K* o% T
git clone --recurse-submodules https://github.com/OAID/tengine/( b0 M( p6 T2 t( k$ U; J
注意 clone 的时候一定要带 --recurse-submodules 这个参数,否则会下载不完整。
& z: ~0 w7 m. q/ Q2 P- o# w2 ^" R$ N2 x
2. 安装依赖
" F" H0 @3 ?* s9 O% F% T6 S5 Vapt install libprotobuf-dev protobuf-compiler libopencv-dev  pkg-config. z  S- q! L7 _0 S

3 A6 i3 G: ?$ s2 i2 A+ L* u3. 修改配置文件
+ h1 u; z- e) X2 o在源码的 default_config 目录下提供了基于 arm32、arm64、x86 这三个平台的配置文件。
0 N1 Z0 g. v: r. J- eRK3399 是 Arm64, 所以对应的配置文件为:arm64_linux_native.config。
. r- I3 L! r5 [3 ]1 i6 Y7 O这里要做的修改是,在配置文件中打开 BUILD_SERIALIZER=y 这个选项,否则后面运行的时候可能会遇到Shared library not found: libcaffe-serializer.so: cannot open shared object file: No such file or directory 这个错误。
2 y3 O! p; S$ V8 P. S( Z% a2 ?  w; ]3 ~+ Y4 q' Q, I! Q9 g
4. 编译# x8 I, n5 M' r. @9 Y4 z" j
在源码根目录执行如下命令进行编译:8 E: d' V& Z- @
./linux_build.sh default_config/arm64_linux_native.config6 L/ ]2 O3 [& h! w3 c$ z
8 e5 \$ f1 Z0 Y4 [1 f' h# ?
: C% n) t8 I7 O  ?
5. 下载 model 文件% `& e9 k8 f% }* i; }' W- B
运行这些 AI 应用的时候,需要加载对应的 model 文件,这些文件可以从 OPEN AI LAB 提供的网盘里下载:# r8 S% B# C7 B7 `
https://pan.baidu.com/s/1Ar9334MPeIV1eq4pM1eI-Q , 提取码为 hhgc 。
; W- q" s( P+ X6 P! n, J下载完后需要把这些 model 文件放在 Tengine 源码根目录下的 models 文件夹,所有的 model 文件加在一起比较大,我只上传了后面测试需要用到的部分:' Z- m  F' }  e7 L0 [) ?: A0 Y0 |& ]

; Y* O; p& h$ o  W- @6 z# j$ _& m6. 运行 benchmark
7 ~8 |* u3 e% l9 S9 r9 ]% ~8 z% c编译完成后默认会在 build/benchmark/bin/ 目录下生成两个供测试用的 benchmark 文件,可以直接执行这两个文件,用来简单的测试,确实是否真正编译成功。; e- |+ r- ^9 s  ^: ?# h3 H
./build/benchmark/bin/bench_sqz ./build/benchmark/bin/bench_mobilenet, f$ E' k+ p8 ?' S  R; E6 P$ ^
/ {9 M; w# D, [  G  @
0 q8 `: N7 z; w6 R* y3 p, u1 [
编译并运行测试 Demo& c( F( e1 Q* q5 h
Tengine 开放的源码里面还带了几个不错的 图像识别相关的测试 Demo,用来测试和进行 AI 相关的基础学习都很不错。
2 A  |6 a/ m+ F7 D$ |9 g; v这些 Demo 的源码在 examples 目录下,在编译之前我们需要修改一个编译脚本 linux_build.sh, 即根据实际情况,正确设置 Tengine 的所在路径,比如我下载编译的 Tengine 代码在 /root/rockdev/tengine 目录下:
% ]4 a8 D9 S; h6 F  m# V
6 O# g: J- s0 V然后在 examples 目录下执行如下命令:
4 Q% Q( l3 N) M2 P/ d) z* Q" _mkdir buildcd build/../linux_build.sh make+ K4 _% w4 O; o. U* I+ {) \
7 g, u5 x! {! H+ G0 }2 t0 i
编译完成,主要有 faster_rcnn 、lighten_cnn、 mobilenet_ssd、 mtcnn 、ssd、 yolov2、 YuFaceDetectNet 这几个测试 Demo。
- O- z+ Z2 N9 I% R" K2 B" \faster_rcnn- X. J  h  I: X$ j, v  W* z& t
Faster rcnn 是大神 Ross B. Girshick 在 RCNN 和 Fast RCNN 的基础上于 2016 年提出的新模型,综合性能更高,检测速度更快。
" }* T6 F# o, h/ f8 [Tengine 版本的 Demo 对下面的图片进行识别:
" L5 Q' A3 h, h; ^( c6 |$ h: z7 E$ Y; N5 z0 C7 ^4 N, C
运行 faster_rcnn 可执行程序,会生成一张对检测到的物体进行标注后的图像:5 {# G) S9 v9 ]2 P- P; N$ ^3 x. t! F
" e$ |, N" a# Y6 ]
可以看到识别到了 Dog、bicycle、car 三个物体。0 m. {# Y. R# n5 {- m
YOLO v2
, D6 s6 e2 E9 a" m' q. x6 wYOLO 全称 You look only once,是 2016 年 CVPR 上发表的一篇目标检测论文。
9 D8 h  z1 D- V6 s9 {7 x  PYOLOV v2 发表于 2017 年的 CVPR 上,论文名称为《YOLO9000: Better, Faster, Stronger》,获得了 CVPR 2017 Best ** Honorable Mention 大奖。& E+ k& a8 \6 u" X' c
这里用这个模型来检测和 RCNN 同样的图片:
8 U' P* g. t0 Y) ]% G; y+ u! z' y# D% ?( k& K7 L* q! l
从这张图片看,准确性和 RCNN 相当,但是检测速度却快了 将近 6 倍。
/ G( L5 M0 {& I7 W3 ?  FSSD
0 r3 T2 l0 G" ~SSD 全称 Single Shot MultiBox detector, 是一种 one-stage 的通用物体检测算法,作者 Wei Liu,提出于 2016年。1 }; f; w. c% m8 o; C
这里用如下图片做检测:- s" y8 g7 P6 Y% M
7 @" s2 D$ y/ r- }0 }% l! W  V6 _
运行结果如下:
% `4 {& X& w/ {3 u( x, {
# {1 R  a5 i7 d有点可惜的是把狗狗给识别错了。
  K9 l" @1 {" p9 O/ H: ~5 Gmobilenet_ssd
' k0 h7 q! u3 k* R这个是 mobilenet 和 ssd 的结合,对移动设备更友好。
$ D9 L- u5 u) ?使用和 SSD 同样的图片进行检测:! a  \3 t# T* v

! S% r8 h# L( a- k7 e- @! W" n! {0 I可以看到狗狗检测对了,但是远处有个人漏检了。但是检测速度比 SSD 快了很多。
0 r- Q( p" ]  s- |' @YuFaceDetectNet4 h) g" n" x4 z# E
这个是深圳大学于仕琪老师开源的 libfacedetection 的 Tengine 实现版本,libfacedetection 号称最快的人脸检测库。: j" F# W+ @6 F: m" H# \/ i& m; U
测试原图如下:
3 D; `" E4 i+ ~& \" y2 N2 ]& O! Q- m; ~

: U# E3 T1 J5 ]. v. c; I2 w测试结果:
6 J  g( Q) h1 j- K, r
! x, c, n& Q9 x( b3 J. Z$ P) }8 b" P
MTCNN
: c1 c1 |. z* p( l/ QMTCNN 是另外一种人脸检测方案,提出于 2016 年。
  l1 A. C- J: D; Q6 F$ o这里我们采用和 YuFaceDetectNet 同样的图片进行测试:
& p  U) D$ z, j1 V0 q+ O% P7 a  ^; z' t! g( j* H
五张脸全部检测到了,而且时间和 YuFaceDetectNet 差距并不大。
& P- l5 L6 n% z; c- N8 Z, {) l' m. q+ o. k  J

5 N; e; `9 T" \0 I9 i
作者: rendezvous    时间: 2021-8-24 20:04
针对ARM嵌入式平台进行了专门优化
; S% m9 ~" L4 ~  J- h0 L




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2