|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Heaven_1 于 2021-8-24 20:25 编辑
/ \6 Z7 f$ x4 x" b+ Q" u2 M6 v! ^0 P" K% d) ?
Tengine 是 OPEN AI LAB 一款轻量级神经网络推理引擎,它针对 ARM 嵌入式平台进行了专门优化,对 Android、Linux 系统都提供了很好的支持。
- U6 J. N2 W% j5 g' L5 g而且更加难能可贵的是 Tengine 并不依赖于专用 AI 芯片(即 Tengine 可以利用 GPU、NPU 这些具有专门 AI 加速功能的模块进行 AI 运算,也可以利用通用的 CPU 进行 AI 运算),很多 Arm 平台都可以通过 Tengine 框架对算力进行深度挖掘,从而高效的运行一些 AI 应用。
" C* \( ^2 ]) B! T![]()
- o$ \) w9 J) G
9 ?+ |/ e2 R( n本文就是想描述如何在OKMX8MM-C这一 Arm64 平台上搭建 Tengine AI 推理框架,并运行图像识别相关应用。首先在OKMX8MM-C上面移植了基于 Armbian 的 Debian 10 系统,运行的 u-boot 和 linux kernel 都是mainline的。
6 Y0 T! P) D. Q: t. v% m. A4 ^7 Z0 q" i* W7 _% J3 b! X
编译 Tengine
2 L8 Q* l; g* z, r) EOPEN AI LAB 在 Github 上提供了开源的 Tengine 版本,并提供了比较详细的参考文档,所以可以直接下载源码,根据文档进行编译。- A& Q9 `+ q- u3 T0 M* A7 n) N
得益于 i.MX8MMini 强大的性能,我们可以直接在 i.MX8MMini 上下载代码,进行编译,免去交叉编译的诸多不便。1 B# G& c6 x, n/ {) f3 F& D# r
& x; D0 u0 ?( ~0 D7 o# r, h( i6 c1. 下载源码" B! Q% H. |, s' f; e |5 J
git clone --recurse-submodules https://github.com/OAID/tengine/
5 K3 T' ^3 O! I/ |注意 clone 的时候一定要带 --recurse-submodules 这个参数,否则会下载不完整。/ j7 B2 s/ M6 P* x- w3 I
7 a3 r; M: F, Y2 F N/ }, z( Y
2. 安装依赖
' Q0 a! G) t- p+ Capt install libprotobuf-dev protobuf-compiler libopencv-dev pkg-config# j7 L* h' V4 g$ Z. Q
$ K: ^# H: ]" t# e3. 修改配置文件" U9 }8 y- M: g q4 t% f1 [5 y
在源码的 default_config 目录下提供了基于 arm32、arm64、x86 这三个平台的配置文件。
8 x* t& ?. F+ [# `, y# o* aRK3399 是 Arm64, 所以对应的配置文件为:arm64_linux_native.config。- K6 M2 r( o- ^3 v# c( A
这里要做的修改是,在配置文件中打开 BUILD_SERIALIZER=y 这个选项,否则后面运行的时候可能会遇到Shared library not found: libcaffe-serializer.so: cannot open shared object file: No such file or directory 这个错误。5 t i- ?, H% Z/ g! ~
![]()
; `' ~, T' G+ m' z4. 编译
% M# A1 \! h* O/ J在源码根目录执行如下命令进行编译:/ G# F- @- ]/ O' G* w3 L
./linux_build.sh default_config/arm64_linux_native.config
8 g5 y' j, v7 L$ `" U ( K: a$ {+ ^' P# K& j
$ N0 |5 m9 p: F2 a3 k) u5. 下载 model 文件
" Q# u9 E2 E. F5 ^& z运行这些 AI 应用的时候,需要加载对应的 model 文件,这些文件可以从 OPEN AI LAB 提供的网盘里下载:
/ U& K O& y, F9 u% l" ehttps://pan.baidu.com/s/1Ar9334MPeIV1eq4pM1eI-Q , 提取码为 hhgc 。
, h& r5 W V# M下载完后需要把这些 model 文件放在 Tengine 源码根目录下的 models 文件夹,所有的 model 文件加在一起比较大,我只上传了后面测试需要用到的部分:
, x1 V; U- h ^; Q) Q. b5 x $ h- G, `' \( c* D! j/ U# L+ P
6. 运行 benchmark
" L1 B! x+ \ W; ?% f! p; _! {编译完成后默认会在 build/benchmark/bin/ 目录下生成两个供测试用的 benchmark 文件,可以直接执行这两个文件,用来简单的测试,确实是否真正编译成功。* {9 f3 A8 ?" C( O& f: K* a% g/ G
./build/benchmark/bin/bench_sqz ./build/benchmark/bin/bench_mobilenet
7 t/ ~/ a! U" R/ j![]()
! S# G$ {* q, b$ P) j1 q3 R( u
% i `& J6 D( g: `编译并运行测试 Demo
. Q5 Z' K1 F6 N; K R7 u' zTengine 开放的源码里面还带了几个不错的 图像识别相关的测试 Demo,用来测试和进行 AI 相关的基础学习都很不错。
. n. i% `2 S6 y6 |" I$ [: W这些 Demo 的源码在 examples 目录下,在编译之前我们需要修改一个编译脚本 linux_build.sh, 即根据实际情况,正确设置 Tengine 的所在路径,比如我下载编译的 Tengine 代码在 /root/rockdev/tengine 目录下:+ d: k8 h; A# @+ l0 ^* v! ] _
8 O' \. l5 W L9 r
然后在 examples 目录下执行如下命令:
& r" L0 j) a9 y N. p2 Omkdir buildcd build/../linux_build.sh make
* d) z0 ]: K0 q![]()
0 }5 ]9 O B1 Q- N9 a& e; `编译完成,主要有 faster_rcnn 、lighten_cnn、 mobilenet_ssd、 mtcnn 、ssd、 yolov2、 YuFaceDetectNet 这几个测试 Demo。' g( }: j& r1 u! ^/ M( W
faster_rcnn
; y* W# X6 n" X* N5 Z! tFaster rcnn 是大神 Ross B. Girshick 在 RCNN 和 Fast RCNN 的基础上于 2016 年提出的新模型,综合性能更高,检测速度更快。
9 H7 e5 e5 e% d9 X5 C# dTengine 版本的 Demo 对下面的图片进行识别:) m2 b7 x. O* O1 y1 x% K
3 u- n) H$ p8 A1 L. V, D
运行 faster_rcnn 可执行程序,会生成一张对检测到的物体进行标注后的图像:' G6 ]( Z6 w) ?6 P
! H. w r% a8 q9 x0 U* K" F
可以看到识别到了 Dog、bicycle、car 三个物体。
. {5 c$ S. e7 I6 wYOLO v2
) A/ E0 H" q$ J* q. L9 s" TYOLO 全称 You look only once,是 2016 年 CVPR 上发表的一篇目标检测论文。
' z6 a% ]& h% e6 P# }0 ]4 rYOLOV v2 发表于 2017 年的 CVPR 上,论文名称为《YOLO9000: Better, Faster, Stronger》,获得了 CVPR 2017 Best ** Honorable Mention 大奖。& k, S$ h: ^/ Y. _) x! e6 D
这里用这个模型来检测和 RCNN 同样的图片:
; c0 ~7 c1 c9 ~9 G/ G& L 7 D$ v: [8 g/ H% i8 D! h
从这张图片看,准确性和 RCNN 相当,但是检测速度却快了 将近 6 倍。
7 ~! L1 M5 c6 ?' {' ~SSD3 y$ m! L3 {2 y O; V) c }
SSD 全称 Single Shot MultiBox detector, 是一种 one-stage 的通用物体检测算法,作者 Wei Liu,提出于 2016年。9 r/ f! w6 s, g5 h( E) Z! c
这里用如下图片做检测:
- q( i" q4 ]6 r- V3 N! I- r7 b0 \ 1 \/ R/ a( B Y2 }2 U
运行结果如下:
4 c' Z. g/ B$ j+ V- j $ s% C7 }! V. h
有点可惜的是把狗狗给识别错了。
# ]; `" B) ?. Y1 gmobilenet_ssd8 H& Z+ B% Q, I# S
这个是 mobilenet 和 ssd 的结合,对移动设备更友好。
: ~2 Z" L2 i- g3 O, F( |1 d, _使用和 SSD 同样的图片进行检测:$ @; t. \5 p+ E& k* a6 [
![]()
4 U% z, H' x5 M! p8 c2 i! j7 u可以看到狗狗检测对了,但是远处有个人漏检了。但是检测速度比 SSD 快了很多。7 g1 {; o3 g- k! q
YuFaceDetectNet* X- L+ b/ l2 z! {: c, y4 h
这个是深圳大学于仕琪老师开源的 libfacedetection 的 Tengine 实现版本,libfacedetection 号称最快的人脸检测库。
3 P$ L6 b) y" F7 \$ o9 w0 Q测试原图如下:
& F/ ~1 a. v; c# c ( q% J9 J, v {
# m- e3 j/ w( m4 x
测试结果:
5 b& ^; i+ T$ i! G4 y7 [+ f5 n 3 }! h) `8 u, n+ J6 W' l0 i" |8 Z4 Z
$ L( N1 q9 p6 h9 g5 J
MTCNN
; f7 G7 [# Q/ V. J# Y6 eMTCNN 是另外一种人脸检测方案,提出于 2016 年。0 t2 o0 |. f$ v' f$ Q
这里我们采用和 YuFaceDetectNet 同样的图片进行测试:
: d' H# S& F& B$ b. x8 A![]()
8 O4 O; p3 j5 Y. v* s& P w五张脸全部检测到了,而且时间和 YuFaceDetectNet 差距并不大。
6 a3 _3 x& a0 z+ e0 g: R6 ^, S1 T$ X; j8 m: s: X/ {
1 W; j+ n3 O0 v0 p |
|