|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Heaven_1 于 2021-8-24 20:25 编辑 ; Y0 p" l5 i, E _1 s! D
D4 G h" P0 G% P
Tengine 是 OPEN AI LAB 一款轻量级神经网络推理引擎,它针对 ARM 嵌入式平台进行了专门优化,对 Android、Linux 系统都提供了很好的支持。
Z" P4 V) l8 ~% O4 [ w& u' r6 y而且更加难能可贵的是 Tengine 并不依赖于专用 AI 芯片(即 Tengine 可以利用 GPU、NPU 这些具有专门 AI 加速功能的模块进行 AI 运算,也可以利用通用的 CPU 进行 AI 运算),很多 Arm 平台都可以通过 Tengine 框架对算力进行深度挖掘,从而高效的运行一些 AI 应用。
5 B7 U8 x, R, U2 Z0 W![]()
# `7 F: S9 ]+ y, B% q, R* a
! h9 [/ g7 l6 f5 O* C- }* a/ G本文就是想描述如何在OKMX8MM-C这一 Arm64 平台上搭建 Tengine AI 推理框架,并运行图像识别相关应用。首先在OKMX8MM-C上面移植了基于 Armbian 的 Debian 10 系统,运行的 u-boot 和 linux kernel 都是mainline的。7 Q7 c6 i, f! z* |: y7 f
9 [# w5 n& R+ t2 K编译 Tengine. o- m1 X$ {( H% c
OPEN AI LAB 在 Github 上提供了开源的 Tengine 版本,并提供了比较详细的参考文档,所以可以直接下载源码,根据文档进行编译。
) g8 [2 B" I7 \! k得益于 i.MX8MMini 强大的性能,我们可以直接在 i.MX8MMini 上下载代码,进行编译,免去交叉编译的诸多不便。
8 A% g! F- d" P5 h& [" m- X* ]; O
9 o; S; j9 u) t( r1. 下载源码
2 G0 u$ e2 q- i, P! l7 qgit clone --recurse-submodules https://github.com/OAID/tengine/
0 R7 p! \6 i1 x7 {注意 clone 的时候一定要带 --recurse-submodules 这个参数,否则会下载不完整。
0 ~4 @2 V; Q2 @
2 Z2 u. j3 Q( y: J2. 安装依赖6 c, v+ T+ i p- D2 ^
apt install libprotobuf-dev protobuf-compiler libopencv-dev pkg-config
. i! d s; {* R4 z- C Z9 c, d9 }1 F6 |! o" t
3. 修改配置文件
! n: q( e) d' U* }+ G在源码的 default_config 目录下提供了基于 arm32、arm64、x86 这三个平台的配置文件。( E3 {' W7 A* |; Z0 D. l/ b) k
RK3399 是 Arm64, 所以对应的配置文件为:arm64_linux_native.config。
! z. Q. Z S0 j- h这里要做的修改是,在配置文件中打开 BUILD_SERIALIZER=y 这个选项,否则后面运行的时候可能会遇到Shared library not found: libcaffe-serializer.so: cannot open shared object file: No such file or directory 这个错误。
+ V! `; X' |* E![]()
. ]( p% N L+ K7 E4. 编译) g! c: ?% ?' N5 w; X: F; A
在源码根目录执行如下命令进行编译:2 @. P/ L+ W9 h. |- m, J/ Z/ Z! R
./linux_build.sh default_config/arm64_linux_native.config. g7 {& Y) R1 `' _% {
![]()
6 D' h0 b! Q6 {6 M, i5 \
' C1 g& E) G8 R5. 下载 model 文件. D- V F) ^' N% i
运行这些 AI 应用的时候,需要加载对应的 model 文件,这些文件可以从 OPEN AI LAB 提供的网盘里下载:
, d6 u) n7 |, A4 ahttps://pan.baidu.com/s/1Ar9334MPeIV1eq4pM1eI-Q , 提取码为 hhgc 。+ Z7 p4 q4 H- v9 T s
下载完后需要把这些 model 文件放在 Tengine 源码根目录下的 models 文件夹,所有的 model 文件加在一起比较大,我只上传了后面测试需要用到的部分:- `( m9 i5 ?' E
9 `/ J, c& v A; t8 i
6. 运行 benchmark
, G4 S: I i5 d5 U7 k# t编译完成后默认会在 build/benchmark/bin/ 目录下生成两个供测试用的 benchmark 文件,可以直接执行这两个文件,用来简单的测试,确实是否真正编译成功。% M7 q7 W: O3 R1 z8 d# p2 I
./build/benchmark/bin/bench_sqz ./build/benchmark/bin/bench_mobilenet: c# l1 X# ]7 s9 {! X v
K6 a! S. i, ^7 m
) Z4 W% {9 Y f4 f5 S: L: F编译并运行测试 Demo
- X3 N0 d4 o- pTengine 开放的源码里面还带了几个不错的 图像识别相关的测试 Demo,用来测试和进行 AI 相关的基础学习都很不错。1 j4 ~+ M3 |5 h1 T; [ ~
这些 Demo 的源码在 examples 目录下,在编译之前我们需要修改一个编译脚本 linux_build.sh, 即根据实际情况,正确设置 Tengine 的所在路径,比如我下载编译的 Tengine 代码在 /root/rockdev/tengine 目录下:
- K5 |: Q2 S- I# W* {% C4 ]8 H- G![]()
7 A. H- b e+ ^; R然后在 examples 目录下执行如下命令:
; _2 l! a, m T" G" _' b4 Hmkdir buildcd build/../linux_build.sh make
7 D5 m$ S" t/ C) ^) y( X - K; _# N4 ^' _) m3 f2 E# e( ?
编译完成,主要有 faster_rcnn 、lighten_cnn、 mobilenet_ssd、 mtcnn 、ssd、 yolov2、 YuFaceDetectNet 这几个测试 Demo。4 D" o0 B, x0 G* F) q: e% C. x6 Z
faster_rcnn5 e" ^) c% o& O4 Y! p$ ~
Faster rcnn 是大神 Ross B. Girshick 在 RCNN 和 Fast RCNN 的基础上于 2016 年提出的新模型,综合性能更高,检测速度更快。% {. q% b# x p1 q9 F! F9 i. H/ H
Tengine 版本的 Demo 对下面的图片进行识别:
8 ?* A& s. f d/ t' u$ z ?8 B![]()
7 _7 u- U0 s9 v0 b2 G' E) R运行 faster_rcnn 可执行程序,会生成一张对检测到的物体进行标注后的图像:
) V( Z% Y4 y# d; G + O8 W4 j6 w+ s# {- o
可以看到识别到了 Dog、bicycle、car 三个物体。
1 @6 X2 C6 E9 [; ]0 q: e0 O' H8 wYOLO v2/ y/ O" `3 o/ c0 } @: v& }& Q7 j
YOLO 全称 You look only once,是 2016 年 CVPR 上发表的一篇目标检测论文。2 w i) C9 Z" R% e; Z
YOLOV v2 发表于 2017 年的 CVPR 上,论文名称为《YOLO9000: Better, Faster, Stronger》,获得了 CVPR 2017 Best ** Honorable Mention 大奖。* ?" p7 y7 m' A9 V8 _. i
这里用这个模型来检测和 RCNN 同样的图片:6 V- M. L8 [" q" c8 |
![]()
8 c0 f* b2 X9 N6 j6 {; F从这张图片看,准确性和 RCNN 相当,但是检测速度却快了 将近 6 倍。
- |2 |; o: g' l& }9 `. lSSD
, _0 u6 P) e7 ISSD 全称 Single Shot MultiBox detector, 是一种 one-stage 的通用物体检测算法,作者 Wei Liu,提出于 2016年。
+ K; r# Z$ P# H$ F这里用如下图片做检测:
4 J. {4 m k) B0 u* D9 V2 o& j ) E( o. t- }/ U$ A
运行结果如下:( |' ]. C9 Y, a; S$ [ B
, @7 f4 Q* X# _
有点可惜的是把狗狗给识别错了。& E1 c. t# u3 ~& H. L
mobilenet_ssd) B. d( Q* a" M* t: d5 i1 _
这个是 mobilenet 和 ssd 的结合,对移动设备更友好。
7 \: v1 |' A8 d% q& n使用和 SSD 同样的图片进行检测:
, l: M. X) i3 i$ p5 t1 r) x6 D: {% d![]()
: j' K8 k" Z1 [0 |/ n8 C* ^* j可以看到狗狗检测对了,但是远处有个人漏检了。但是检测速度比 SSD 快了很多。
* X9 r" p+ ?4 P) r* K' MYuFaceDetectNet+ P3 `3 b$ J) z1 P* h4 w6 j
这个是深圳大学于仕琪老师开源的 libfacedetection 的 Tengine 实现版本,libfacedetection 号称最快的人脸检测库。
z1 C/ M+ s9 h3 y测试原图如下:
( y* \* ~4 p* \![]()
+ \: j/ }7 w( g( v8 T
' g$ ?, I6 {" \, A, v3 b测试结果:1 z! p+ s4 S) V& O' H
% w8 J* W" k2 L, W& \* ?+ Y3 n
: d. c0 t5 y% L' ^MTCNN" h' E/ L' ?" U5 N
MTCNN 是另外一种人脸检测方案,提出于 2016 年。
1 U0 M8 c( A$ t' @这里我们采用和 YuFaceDetectNet 同样的图片进行测试:
( l2 m' ^( G, u) f6 [0 d$ `& f![]()
6 \+ {0 B, U2 x: W五张脸全部检测到了,而且时间和 YuFaceDetectNet 差距并不大。 \, @" l8 _' ~' P8 [
/ \( M) Y& R+ Q+ ~- Q
: _4 l/ U. v8 U( k$ N* | |
|