1.Tina SDK打开内核NNA驱动支持

make kernel_menuconfig->打开 CONFIG_SUNXI_NNA

 这样,内核才会出现/dev/nna设备节点

 2.编译YOLO算法用例库

算法用例库的布局如下图所示,

编译前,需要调整Makefile中默认的编译器路径未正确路径:

 编译过程:

编译生成了可执行测试文件yolo3

 将整个目录拷贝到TF卡上,卡挂载到V833平台上,输出警告不用管.

 2.运行测试用例

首次执行yolo3用例,运行失败,会出现找不到库的问题。

问题的原因是用例找不到NNA的runtime库,我们需要将runtime库添加到LD_LIBRARY_PATH环境变量下面,根据上面的目录结构,我们找到runtime库的location在路径:

添加runtime库路径到环境变量,重新运行用例,执行成功:

3.用例解读

首先看用例目录中唯一的一张图片,图片内容展示的是一名勇敢的冲浪运动员在冲浪,比较明显的物体有人和冲浪板。

我们看用例识别出了什么? 

root@(none):/mnt/extsd/YOLOV3_Demo# ./yolov3
[  282.552689] NNA: nna_open irqnum = 312
nna_fd = 4[  282.557041] NNA: enable nna  irq

AwG2dCreate!
Load model param and bin...
data scale: 127.404358
conv 81_599 scale: 4.844433
conv 93_685 scale: 3.955845
conv 105_772 scale: 3.481591

Read and transform data...
image width: 612, image height: 612
resized image width: 416, resized image height: 416
padded image width: 416, padded image height: 416

Infer by IPU...
Infer sucessfully!

Dequantize...
0, output width 13, output height 13, output channel 255
1, output width 26, output height 26, output channel 255
2, output width 52, output height 52, output channel 255

Infer by CPU...
detect object num: 2
0, label 1, class person, prob 0.999197, x1 213, y1 138, x2 399, y2 375
1, label 38, class surfboard, prob 0.770885, x1 258, y1 322, x2 516, y2 410
[  285.378372] NNA: disable nna  irq
[  285.382302] NNA: nna_release irqnum = 312
root@(none):/mnt/extsd/YOLOV3_Demo#

可以看到,识别除了两个物体,第一个%99.9的概率是一个人,并且给出了对角线的坐标值,识别出的第二个物体是滑板,它的概率是%77.088,并且也给出了对角线的坐标值.

我们根据提供的坐标信息,绘制出矩形框,直观的看一下人形检测算法的结果是什么:

import cv2
 
fname = './test.bmp'
img = cv2.imread(fname)

pt1 = (213, 138)
pt2 = (399, 375)
cv2.rectangle(img, pt1, pt2, (0, 255, 0), 2)

pt3 = (258, 322)
pt4 = (516, 410)
cv2.rectangle(img, pt3, pt4, (255, 0, 0), 2)

cv2.imwrite('22.jpg', img)

绘制结果:

可以看到结论还是蛮精确的。

用例调试:

打开Tina strace通过strace探测用例需要用到哪些设备:

strace跟踪的结果是:

root@(none):/mnt/extsd/YOLOV3_Demo# strace -f -e trace=open,openat ./yolov3
open("/usr/lib/eyesee-mpp/libawipubsp.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/mnt/extsd/YOLOV3_Demo/3rdparty/lib/libawipubsp.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
open("/usr/lib/eyesee-mpp/libawnn.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/mnt/extsd/YOLOV3_Demo/3rdparty/lib/libawnn.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
open("/usr/lib/eyesee-mpp/libyolov3.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/mnt/extsd/YOLOV3_Demo/3rdparty/lib/libyolov3.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
open("/usr/lib/eyesee-mpp/libstdc++.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/mnt/extsd/YOLOV3_Demo/3rdparty/lib/libstdc++.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOEN[  771.885964] NNA: nna_open irqnum = 312
T (No such file or directory)
open("/etc/ld-musl-armhf.path", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or dire[  771.894841] NNA: enable nna  irq
ctory)
open("/lib/libstdc++.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
open("/usr/lib/eyesee-mpp/libgcc_s.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/mnt/extsd/YOLOV3_Demo/3rdparty/lib/libgcc_s.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/lib/libgcc_s.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
open("/dev/mem", O_RDWR|O_NONBLOCK|O_LARGEFILE|O_CLOEXEC) = 3
open("/dev/nna", O_RDWR|O_NONBLOCK|O_LARGEFILE|O_CLOEXEC) = 4
nna_fd = 4
open("/dev/ion", O_RDONLY|O_LARGEFILE)  = 5
open("/dev/cedar_dev", O_RDONLY|O_LARGEFILE) = 6
AwG2dCreate!
open("/dev/g2d", O_RDWR|O_LARGEFILE)    = 7
Load model param and bin...
open("./model/yolov3_int8.param", O_RDONLY|O_LARGEFILE) = 8
open("./model/yolov3_int8.bin", O_RDONLY|O_LARGEFILE) = 8
data scale: 127.404358
conv 81_599 scale: 4.844433
conv 93_685 scale: 3.955845
conv 105_772 scale: 3.481591

Read and transform data...
open("./data/000000004765.bmp", O_RDONLY|O_LARGEFILE) = 8
image width: 612, image height: 612
resized image width: 416, resized image height: 416
padded image width: 416, padded image height: 416

Infer by IPU...
Infer sucessfully!

Dequantize...
0, output width 13, output height 13, output channel 255
1, output width 26, output height 26, output channel 255
2, output width 52, output height 52, output channel 255

Infer by CPU...
detect object num: 2
0, label 1, class person, prob 0.999197, x1 213, y1 138, x2 399, y2 375
1, label 38, class surfboard, prob 0.770885, x1 258, y1 322, x2 516, y2 410
[  774.230116] NNA: disable nna  irq
[  774.234289] NNA: nna_release irqnum = 312
+++ exited with 0 +++
root@(none):/mnt/extsd/YOLOV3_Demo#

打开的设备列表:

运行库有三个,libawipubsb.so和libawnn.so是算子库,而libyolov3是算法库,客户可以用自己的算法库,但是一般都要用我们的算子库。

以libawnn.so为例,它其中的实现函数反命名后,可以看到它和算法的联系:

对于用自己算法库的客户,只需要下面两个库即可

比如下面,算子库是libawipubsp.a,libawnn.a,算法库是libpdet.a

3.使用EMMC 启动固件

AW 方案支持SD/EMMC,NOR,NAND启动机制.而且SD/EMMC启动优先级更高.

默认配置下生成的固件是nor启动固件,固件名为tina_v833-perf1_uart0_nor.img,末尾带有_nor的标志.

通过调整配置后,可以将固件启动模式改为EMMC启动,固件名称为tina_v833-perf1_uart0.img.

烧录后EMMC启动固件后,挂载TF卡的过程,插拔TF卡,可以验证mmcblk0是EMMC卡,而mmclbk1是TF卡.

所以我们挂载的话,就要挂载/dev/mmcblk1p1设备

测试YOLO用例: 

注意事项:

过程中遇到测试时候NPU出现卡死的问题,原因是NPU内核驱动发生死锁,解决办法是升级新的驱动:

文件分析:

AWNNInit->AWNNDeInit->AWNNInit->......

NPU运行库有三个:

libawipubsp.so:是对AI运行环境所需设备的封装,可以认为是bsp.

libawnn.so:是算子封装,可以不用我们的算法,但是只要利用到NPU加速,算子是需要的。

libyolov3.so: 是算法封装,从功能角度定义的,比如人形识别,人脸识别等等。

model目录是网络模型文件,包括两个

yolov3_int8.bin:网络权重和bias.

yolov3_int8.param:网络结构描述.

data目录:

000000004765.bmp是待测图片。

Thumbs.db:缩略图文件,没有作用,可以删去。

include目录:

AWNN_image.h:对应libawnn.so库.

AWNN_interface.h:包含AWNNInit, AWNNDeInit的声明,对用libyolo3.so文件

stb_image.h:貌似是一个开源实现,是一个image loader,翻译过来就是图像加载器。在darknet和android sdk中都有遇到,当然我们的也有

darknet中的用法:

 实现:

yolov3_utils.h:根据下图读符号表分析,yolov3_utils.h应该对应的是libyolo3.so库.

通过对头文件分析,我们发现只有libawipubsp.so没有对应的头文件,这恰好说明它的基础底层地位,它是AI运行时环境的的BSP实现,封装了对Linux AI设备模型中各类设备的调用,都已经包在两外两个库里面了,所以不会由用户主动调用它,自然也不需要头文件。

三种库的依赖关系如下:


结束!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐