ARM+Movidius VPU 目标识别调试笔记(一)

 

写在前面

Movidius 是一家被Intel收购的计算机视觉创业公司。Intel收购Movidius之后,在AI和边缘计算方面的布局又增加了一支生力军。Movidius的AI芯片分为Myriad x VPU和Myriad 2 VPU两种。

最近我用Myraid VPU做了一个项目,目标是开发一款目标识别的智能相机。硬件方面使用的是海思3516D做为主芯片,VPU作为深度学习加速芯片。硬件使用的是桐烨科技的智能相机,在此感谢桐烨科技老总的友情赞助以及朋友们的帮助。首先我们可以看看桐烨科技这款相机的技术分析,然后我们再看看这款相机的产品说明。有兴趣的朋友们千万要认准桐烨科技哦。

 

功能设计

通过查看前面的一些链接和技术博客,使我们对硬件信息有了基本的了解。

那么如果要在这个智能相机上实现目标识别的应用,我们大致需要研究完成以下几件工作:

1、实现主芯片Hi3516D和VPU之间的通信。

2、将目标识别的算法模型导入到VPU上运行。

3、从VPU中获取目标识别的结果。

4、实现目标识别结果的可视化。

5、算法耗时、准确率、召回率等指标的测试。

所以,下文的调试笔记我也准备按照以上这几个阶段来记录。

 

通信功能

我们看硬件通信链路,硬件上,Hi3516D和VPU通过USB2.0通信。既然是使用的USB,那这样就比较方便调试了,支持热插拔,调试时可以随意在PC端和嵌入式端切换。实际上在调试的过程中,我也多次这样切换后进行对比,先保证VPU板在PC端运行正常,然后再往嵌入式端进行移植。

软件上,要实现通信功能,首先需要安装SDK、看demo、运行demo。只有先把官方的demo跑通,才能确保后面的工作顺利进行。

 

SDK环境搭建

说到Movidius的SDK,很容易能搜索到,文末列出的参考链接[1]中就详细记录了VPU的NCSDK的安装过程以及环境搭建过程。另外就是,前段时间听说Intel有一套叫做OpenVino Toolkit,这套工具库提供了一套边缘计算的解决方案,为Intel的几套用于边缘计算的芯片方案搭建了一个集成的中间件平台。它囊括的硬件AI芯片包括:FPGA、Atom、GPU和Moviduis,我暂时还没去花精力研究这套解决方案,所以暂时也不太清楚能否用在我手头上的这套智能相机上。看得出Intel在边缘计算方面确实是煞费苦心。

言归正传,说回到Movidius Ncsdk环境搭建。

网上搜索一下,发现很多人在树莓派上面搭建环境,基本操作都是先从python安装开始,在python环境之上安装Ncsdk的python版本。但是,其实Ncsdk是有C语言版本的,而且,如果我们要在智能相机上面移植一个python3,很显然是不切实际的。既然Ncsdk支持C语言版本,那么移植python3就完全没有必要了。

下面来说说SDK移植的详细步骤:

1、安装Ncsdk

Ncsdk linux版本需要安装在ubuntu 64位版本上,所以我使用的是ubuntu 16.04虚拟机来进行安装,安装过程参考文末的参考链接[1]或者[2],整个安装过程是基于python3的环境进行自动安装,基本上安装问题不大,如果出现问题应该就是一些依赖库版本不匹配之类的问题导致的。

安装后的目录结构如下图一所示:

ARM+Movidius VPU 目标识别调试笔记(一)_第1张图片

其中NCSDK-2.05.00.02.tar.gz压缩包是安装过程中自动下载的,真正的SDK源码和工具等都在这里面。

api目录:这个目录是从 NCSDK-2.05.00.02.tar.gz 包中解压出来的api源码;

docs目录:这个目录是帮助文档的存储路径;

examples目录:这个目录是官方demo的存储路径;

extras目录:这个是docker存储路径;

同时,默认在/opt路径下面生成一个名为 movidius 的目录,目录结构如下图二所示:

ARM+Movidius VPU 目标识别调试笔记(一)_第2张图片

其中NCSDK目录里面存放了一些api和编译计算图的工具,这些工具在后面会用到,其他的两个文件夹暂不关注,因为我在项目中使用的是tensorflow作为深度学习模型开发框架,所以没有关注caffe部分。

至此,基于ubuntu的Ncsdk就安装完成了,此时我们就可以运行一些demo了。demo的验证部分我放到后面去说,因为我们最终是要将sdk运行在Hi3516D上面,所以需要移植出基于armv7l的sdk,下面就说说移植过程。

2、移植SDK

将SDK移植到ARM上需要编译出两个库文件:libmvnc.so、libusb.so。

libmvnc.so:这个库是提供了VPU的相关调用接口的实现,这个库是通过Ncsdk下面api目录中的src编译生成。

libusb.so:这个库是提供的usb设备调用接口,Ncsdk中直接通过调用该库来实现usb通信,所以我们使用开源库编译即可。

移植过程时需要使用Hi3516D的SDK,Hi3516的SDK需要在ubuntu 32位系统下安装和编译目标程序。

所以,我需要切换到一个32的ubuntu虚拟机去编译mvnc库文件,编译配置如下:

1、安装的是060版本的SDK,使用的交叉编译器为arm-hisiv400-linux-gcc。

2、进入到图一所示的Ncsdk根目录,编译命令为:

make api ARCH=arm CC=arm-hisiv400-linux-gcc

3、编译过程中会因为C库的原因出现一些编译错误,所以需要稍微改动改动Makefile文件和源文件,解决编译报错即可。

4、我们的目标是编译出libmvnc.so库即可,在没安装python环境时,会出现一些其他的报错信息,如下:

/bin/sh: python3: command not found
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: 'module' object has no attribute 'getsitepackages'

这些错误信息都可以忽略。

编译完成之后会生成一个libmvnc.so,大小大概在100KB左右。

有了这两个动态库,我们就可以将SDK中的demo程序拷贝到板端进行验证了。

3、验证SDK

软件的世界,从HelloWorld开始,所以理所当然Ncsdk中提供了一个hello_ncs_cpp的demo程序。

进入到图一所示的路径,在 examples\app\hello_ncs_cpp 中,我们编译出 hello_ncs_cpp 程序即可。运行该程序需要三个依赖文件:

1、libmvnc.so

2、libusb.so 

3、MvNCAPI-ma2450.mvcmd:VPU 的固件,默认的程序在打开设备,获取设备handle时需要先将固件烧录到VPU中。固件文件存放在 api/src/mvnc 目录,如果固件不存在,会出现如下图三所示的错误打印:

# ./hello_ncs_cpp 
ncDeviceOpen: 506, File path ./mvnc/MvNCAPI-ma2450.mvcmd
W: [         0] ncDeviceOpen:510        ncDeviceOpen() XLinkBootRemote returned error 3
Error- ncDeviceOpen failed    ncStatus value: -2
D: [         0] XLinkConnect:782        XLinkConnect() device name 1.4-ma2450 
usb 1-1.4: new high-speed USB device number 11 using hiusb-ehci when arch is arm
D: [         0] dispatcherStart:673     dispatcherStart() starting a new thread - schedulerId 0 
D: [         0] dispatcherAddEvent:531  receiving event USB_PING_REQ 0
D: [         0] addNextQueueElemToProc:371      received event USB_PING_REQ 0
D: [         0] eventSchedulerRun:432   eventSchedulerRun() schedulerId 0
D: [         0] dispatcherRequestServe:288      ------------------------UNserved USB_PING_REQ
D: [         0] dispatcherEventSend:726 sending 5 10
D: [         0] eventReader:234 Reading USB_WRITE_REQ (scheduler Id 0, fd 0x1d14330)
usbdev114 -> /dev/usbdev1.11

如果需要屏蔽加载过程,需要把Makefile中的 #CFLAGS+=-DXLINK_NO_BOOT 注释打开。

如果以上三个文件都正确,程序会顺利执行。

经过以上这些调试工作,我们就调通了主芯片和VPU之间的通信,接下来就针对算法导入功能进行详细地说明。请看参考链接[3]中的内容。

 

参考链接

[1]、Movidius NCS SDK环境搭建

[2]、Movidius 官网

[3]、ARM+Movidius VPU 目标识别调试笔记(二)

你可能感兴趣的:(海思,tensorflow,深度学习)