2018-11-12movidius技术文档,供参考

Movidius

1.神经元计算棒

2.1什么是英特尔®Movidius™神经计算棒?

英特尔®Movidius™神经计算棒(NCS)是一款微型无风扇深度学习设备,可用于学习边缘的AI编程。NCS采用相同的低功耗高性能英特尔Movidius视觉处理单元(VPU),可在数百万智能安全摄像头,手势控制无人机,工业机器视觉设备等中找到。

特点:高性能,低功耗。

英特尔®Movidius™神经计算棒(英特尔®Movidius™NCS)是英特尔公司Movidius的嵌入式机器智能平台。通过软件和硬件工具,英特尔Movidius NCS将机器智能和AI从数据中心带入最终用户设备。英特尔Movidius NCS旨在帮助实现机器智能空间的微型化,并加速无处不在的智能设备和系统时代。

英特尔Movidius神经计算棒具备强大的功能,可以在边缘实现深度神经网络(DNN)推理应用的快速原型设计,验证和部署。其低功耗VPU架构支持全新的AI应用程序,这些应用程序不依赖于与云的连接。

NCS与英特尔Movidius神经计算SDK相结合,使深度学习开发人员能够在需要实时推理的低功耗应用上分析,调整和部署卷积神经网络(CNN)。

2.2技术规格

处理器 英特尔®Movidius™VPU

支持的框架 TensorFlow™,Caffe

连接 USB 3.0 Type-A

外形尺寸 USB stick (72.5mm X 27mm X 14mm)

工作温度 0° - 40° C

最低系统要求 x86_64计算机运行Ubuntu * 16.04或

Raspberry Pi 3 Model B运行Stretch桌面或

Ubuntu 16.04 VirtualBox,

USB 2.0 Type-A端口(推荐USB 3.0),

1GB RAM,

4GB free storage space

2.3NCS环境安装

2.3.1前提准备:

1)Ubuntu 16.04系统,RPI3 Model B或Ubuntu VirtualBox。(实测ubuntu19,树莓派zero W也可安装。)

2)英特尔Movidius神经计算棒(NCS)。

3)确保Internet连接以下载和安装NCSDK。

4)python3.5

备注:实际操作中需要使用自己本机自带的python,不可使用ananconda的python环境,否则会报出caffe路径的错误或者其他错误!

5)Keras版本:2.1

备注:如果不使用Keras2.1,会出现符号无法解析的bug或者其他报错!

6)tensorflow版本:1.4.0

备注:如果高于1.6.0,会出现符号无法解析的bug或者其他报错,另外ncsdk安装的过程中如果检测不到tensorflow1.4.0,会重新在线下载!

2.3.2开始安装:

1)打开终端

ubuntu、ubuntu虚拟机和树莓派操作系统都是Ctrl+Alt+T打开终端,或者点击右键Open the terminal直接打开命令行。ubuntu、ubuntu虚拟机和树莓派操作系统是相同的,按以下步骤即可,不赘述。

2)新建工作文件夹

mkdir -p~ / workspace

3)进入新建的工作文件夹

cd ~/workspace

4)github克隆代码

git clone https://github.com/movidius/ncsdk.git

5)进入克隆的代码文件夹

cd ~/workspace/ncsdk

6)编译mvnc环境

sudo make install

备注:官网为make install 实际安装中如果不加sudo 会提示权限的问题。另外已经安装好的环境,也可以执行此步骤,在线下载一些配置文件,并且删除部分在线下载的文件,重新下载。一般按照经验来说,网络良好的状态,执行此步骤需要一个小时左右!这部分和电脑性能有关系,电脑性能越好,需要的时间越少。

7)编译Movidius自带的例子

sudo make examples

备注:一般此步骤都会报错,因为无法在线下载一些模型文件和label标签文件这里面有一些是需要翻墙才能下载的或者是因为文件太大而导致请求超时。但是此步骤执行不通过,不影响使用,也可以使用开发Movidius的第三方python库—mvnc!这里安装Movidius的python开发环境,就是mvnc!特别要注意的是,此语句执行完成之后,需要重开命令行,mvnc环境才能生效。

8)卸载NCSDK

sudo make uninstall

备注:如果需要卸载后重装,推荐在此步骤之前,手动输入

sudo make clean

9)验证是否安装成功

命令行输,如果不报错,则说明安装成功。

python3

import mvnc

2.3.3常见安装异常处理:

1)执行权限问题报错。

参考方法:在执行语句之前加上sudo(sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具)。

2)opencv报错。

参考方法:重新构建opencv

参考文章:https://blog.csdn.net/hzgloveyd/article/details/79031761

3)python路径或者anaconda报错。

参考方法:卸载anaconda或者注释anaconda环境变量。

参考文章:https://www.cnblogs.com/wiessharling/p/4272329.html

4)执行make examples 时报错:

sed: 1: "ncsdk.conf": extra characters at the end of n command

make: *** [prereqs] Error 1

参考文章:https://ncsforum.movidius.com/discussion/331/installing-nc-sdk-make-examples-error

5)caffe导入错误

参考方法:输入:

sudo apt-get instal -reinstall python * -decorator

参考文章:https://ncsforum.movidius.com/discussion/comment/1009/#Comment_1009

6)缺少其他模块,例如scikit-image

参考方法:缺少什么模块下载什么模块。

sudo pip3 install scikit-image

其他故障参考:https://ncsforum.movidius.com/discussion/370/intel-ncs-troubleshooting-help-and-guidelines

7)使用NCSDK工具进行格式转换的时候发生错误

修改/usr/local/bin/ncsdk/Controllers/TensorFlowParser.py 第1059行,完成后如下:

sudo nano /usr/local/bin/ncsdk/Controllers/TensorFlowParser.py

Ctrl+_,输入1059快速跳转到1059行

#desired_shape = node.inputs[1].eval()

desired_shape = node.inputs[1].eval(feed_dict={inputnode + ':0' : input_data})

备注:如果要在此平台上训练自己的数据集,这里必须要修改。一般树莓派上不需要更改,训练主机上需要更改,不然在后续的模型文件格式转换过程中会报错!

3NCSDK开发入门

3.1NCSDK工作流程:

备注:网络训练阶段不使用NCSDK。

3.2NCSDK主要工具

英特尔®Movidius™神经计算SDK提供了用于在开发计算机(主机系统)上分析,调整和编译深度神经网络(DNN)模型的工具。

NCSDK包括一组软件工具,用于编译,配置和检查(验证)运行于Movidius计算棒上的模型图文件(graph)。

NCSDK主要包括三个工具,分别为:

mvNCCompile:将caffe或者tensorflow的模型文件转换生成Movidius识别的模型文件。

mvNCCheck:检查caffe或者tensorflow的模型文件是否可用。

mvNCProfile:测试生成Movidius的模型文件的性能。

注意:mvNCCompile mvNCCheck这两个工具需要把Movidius插到电脑上,否则会报错。

3.2.1mvNCCompile

mvNCCompile是一个命令行工具,可将Caffe或TensorFlow *模型的网络和权重文件编译为英特尔®Movidius™图形文件格式,该格式与英特尔®Movidius™神经计算SDK(英特尔®Movidius™NCSDK)和神经计算API兼容(NCAPI)。

Caffe的格式:

mvNCCompile network.prototxt [-w network.caffemodel] [-s max_number_of_shaves] [-in input_node_name] [-on output_node_name] [-is input_width input_height] [-o output_graph_filename] [-ec]

Tensorflow的格式:

mvNCCompile network.meta [-s max_number_of_shaves] [-in input_node_name] [-on output_node_name] [-is input_width input_height] [-o output_graph_filename] [-ec]

参数详解:

参数 描述

Caffe:

network.prototxt

TensorFlow:

network.meta

network.pb 网络文件的名称(必填)。

[-h,-help] 显示命令的帮助。

[-w weights_file] 从训练中指定权重文件名。对于Caffe,这是.caffemodel文件。如果省略,将使用零权重。

此选项不适用于TensorFlow网络。

[-s max_number_of_shaves] 指定用于网络层的最大SHAVE数(默认值:1)。

可用SHAVE的数量取决于您的神经计算设备。对于某些层,设备运行时代码可能使用较少的SHAVE,其中测量通常显示使用较少的SHAVE没有推理性能下降(并因此显示功率优势)。

[-in input_node_name] 为网络指定备用起点。默认情况下,网络的起点是输入层。此选项启用部分网络处理。当与-on选项一起使用时,用户可以隔离网络中的一个或多个层以进行分析。

TensorFlow网络需要此选项。您可以在创建网络时使用name参数(适用于大多数图层),并将该名称传递给此选项。

要添加不更改网络的命名节点,可以使用以下命令:

x = tensorflow.identity(prev_tensor, name='new_node')

[-on output_node_name] 为网络指定备用端点。默认情况下,网络的终点是输出层。此选项启用部分网络处理。当与-in选项一起使用时,用户可以隔离网络中的一个或多个层以进行分析。

请注意,解析器将在此节点名称的第一个实例处停止(例如,如果Conv与共享名称相同,则不会处理它后面的Relu)。

TensorFlow网络需要此选项。您可以在创建网络时使用name参数(适用于大多数图层),并将该名称传递给此选项。

要添加不更改网络的命名节点,可以使用以下命令:

x = tensorflow.identity(prev_tensor, name='new_node')

[-is input_width input_height] 为输入图层上没有尺寸限制的网络指定输入尺寸。

此选项假定批量大小为1,通道数为3。

[-o output_graph_filename] 指定输出图形文件名。如果未提供,则“graph”将用于文件名。

[-ec] 跳过某些编译器优化以进行连接; 这可能会纠正来自concat层或编译失败的无效结果的一些问题。

例如:

Caffe:

mvNCCompile deploy.prototxt -w bvlc_googlenet.caffemodel -s 12 -in input -on prob -is 224 224 -o GoogLeNet.graph

Tensorflow:

mvNCCompile inception-v1.meta -s 12 -in=input -on=InceptionV1/Logits/Predictions/Reshape_1 -is 224 224 -o InceptionV1.graph

3.2.2mvNCCheck

https://movidius.github.io/blog/mvNCCheck/

mvNCCheck是一个命令行工具,用于检查神经计算设备上Caffe或TensorFlow *神经网络的有效性。

通过使用提供的网络和适当的框架库在设备和主机上的软件中运行推断来完成检查。比较两个推论的结果以确定网络是否通过或失败。前5个推断结果作为输出提供。此工具最适用于图像分类网络。

Caffe的格式:

mvNCCheck network.prototxt [-w network.caffemodel] [-s max_number_of_shaves] [-in input_node_name] [-on output_node_name] [-is input_width input_height] [-i input_filename] [-id top1_validation_ID] [-S scale_factor] [-M mean_subtraction_number/npy_filename] [-cs color_sequence] [-es]

Tensorflow的格式:

mvNCCheck network.meta [-s max_number_of_shaves] [-in input_node_name] [-on output_node_name] [-is input_width input_height] [-i input_filename] [-id top1_validation_ID] [-S scale_factor] [-M mean_subtraction_number/npy_filename] [-cs color_sequence] [-es]

参数详解:

参数 描述

Caffe:

network.prototxt

TensorFlow:

network.meta

network.pb 网络文件的名称(必填)。

[-h -help] 显示命令的帮助。

[-w weights_file] 从训练中指定权重文件名。对于Caffe,这是.caffemodel文件。如果省略,将使用零权重。

此选项不适用于TensorFlow网络。

[-s max_number_of_shaves] 指定用于网络层的最大SHAVE数(默认值:1)。

可用SHAVE的数量取决于您的神经计算设备。对于某些层,设备运行时代码可能使用较少的SHAVE,其中测量通常显示使用较少的SHAVE没有推理性能下降(并因此显示功率优势)。

[-in input_node_name] 为网络指定备用起点。默认情况下,网络的起点是输入层。此选项启用部分网络处理。当与-on选项一起使用时,用户可以隔离网络中的一个或多个层以进行分析。

TensorFlow网络需要此选项。您可以在创建网络时使用name参数(适用于大多数图层),并将该名称传递给此选项。

要添加不更改网络的命名节点,可以使用以下命令:

x = tensorflow.identity(prev_tensor, name='new_node')

[-on output_node_name] 为网络指定备用端点。默认情况下,网络的终点是输出层。此选项启用部分网络处理。当与-in选项一起使用时,用户可以隔离网络中的一个或多个层以进行分析。

请注意,解析器将在此节点名称的第一个实例处停止(例如,如果Conv与共享名称相同,则不会处理它后面的Relu)。

TensorFlow网络需要此选项。您可以在创建网络时使用name参数(适用于大多数图层),并将该名称传递给此选项。

要添加不更改网络的命名节点,可以使用以下命令:

x = tensorflow.identity(prev_tensor, name='new_node')

[-is input_width input_height] 为输入图层上没有尺寸限制的网络指定输入尺寸。

此选项假定批量大小为1,通道数为3。

[-i input_filename] 指定用于验证的输入张量。如果未设置,则将使用具有随机生成数据的张量。

[-S scale_factor] 使用除数来缩放输入的每个值。

通常,图像与每个输入通道的数据一起存储,范围为0到255.如果神经网络期望输入值在0.0到1.0范围内,则使用-S 255将数据缩放到网络的预期范围,因为每个值将除以255。网络期望值在-1.0到1.0范围内,使用-S 128并将-M 128数据扩展到网络的预期范围。

[-M mean_subtraction_number]

[-M npy_filename] 在传递到神经网络之前从输入数据中减去平均值。这可以是一个值或numpy平均文件文件名。

[-id top1_validation_ID] 提供Top-1验证的预期ID。

[-cs color_sequence] 指定神经网络期望的颜色序列:

2,1,0 = BGR (默认值)

0,1,2 = RGB

[-ec] 跳过某些编译器优化以进行连接; 这可能会纠正来自concat层或编译失败的无效结果的一些问题。

例如:

Caffe:

mvNCCheck deploy.prototxt -w bvlc_googlenet.caffemodel -s 12 -in input -on prob -is 224 224 -cs 2,1,0

Tensorflow:

mvNCCheck inception_v1.meta -s 12 -in=input -on=InceptionV1/Logits/Predictions/Reshape_1 -is 224 224 -cs 0,1,2

3.2.3mvNCProfile

mvNCProfile是一个命令行工具,可编译网络以与英特尔®Movidius™神经计算SDK(英特尔®Movidius™NCSDK)配合使用,在连接的神经计算设备上运行网络,并输出文本和HTML配置文件报告。

分析数据包含有关网络性能的逐层统计信息。这有助于确定每层花费多少时间来缩小网络的潜在变化,从而缩短总推理时间。

Caffe格式:

mvNCProfile network.prototxt [-w network.caffemodel] [-s max_number_of_shaves] [-in input_node_name] [-on output_node_name] [-is input_width input_height] [-ec]

Tensorflow格式:

mvNCProfile network.meta [-s max_number_of_shaves] [-in input_node_name] [-on output_node_name] [-is input_width input_height] [-ec]

参数详解:

参数 描述

Caffe:

network.prototxt

TensorFlow:

network.meta

network.pb 网络文件的名称(必填)。

[-w weights_file] 从训练中指定权重文件名。对于Caffe,这是.caffemodel文件。如果省略,将使用零权重。

此选项不适用于TensorFlow网络。

[-s max_number_of_shaves] 指定用于网络层的最大SHAVE数(默认值:1)。

可用SHAVE的数量取决于您的神经计算设备。对于某些层,设备运行时代码可能使用较少的SHAVE,其中测量通常显示使用较少的SHAVE没有推理性能下降(并因此显示功率优势)。

[-in input_node_name] 为网络指定备用起点。默认情况下,网络的起点是输入层。此选项启用部分网络处理。当与-on选项一起使用时,用户可以隔离网络中的一个或多个层以进行分析。

TensorFlow网络需要此选项。您可以在创建网络时使用name参数(适用于大多数图层),并将该名称传递给此选项。

要添加不更改网络的命名节点,可以使用以下命令:

x=tensorflow.identity(prev_tensor, name='new_node')

[-on output_node_name] 为网络指定备用端点。默认情况下,网络的终点是输出层。此选项启用部分网络处理。当与-in选项一起使用时,用户可以隔离网络中的一个或多个层以进行分析。

请注意,解析器将在此节点名称的第一个实例处停止(例如,如果Conv与共享名称相同,则不会处理它后面的Relu)。

TensorFlow网络需要此选项。您可以在创建网络时使用name参数(适用于大多数图层),并将该名称传递给此选项。

要添加不更改网络的命名节点,可以使用以下命令:

x=tensorflow.identity(prev_tensor, name='new_node')

[-is input_width input_height] 为输入图层上没有尺寸限制的网络指定输入尺寸。

此选项假定批量大小为1,通道数为3。

[-ec] 跳过某些编译器优化以进行连接; 这可能会纠正来自concat层或编译失败的无效结果的一些问题。

例如:

Caffe:

mvNCCompile deploy.prototxt -w bvlc_googlenet.caffemodel -s 12 -in input -on prob -is 224 224 -o GoogLeNet.graph

TensorFlow:

mvNCCompile inception-v1.meta -s 12 -in=input -on=InceptionV1/Logits/Predictions/Reshape_1 -is 224 224 -o InceptionV1.graph

3.3NCSDK API概述:

英特尔®Movidius™神经计算SDK(英特尔®Movidius™NCSDK)提供了C / C ++或Python API,用于调用生成的模型图(graph)文件进行硬件加速的推理运算。

3.3.1NCAPI v1:

旧版NCSDK接口,原来的NCSDK使用了NCAPI v1。该版本已被NCAPI v2取代,后者不向后兼容(即使用NCAPI v1编写的程序将无法编译或运行NCAPI v2)。NCAPI v1不再更新。

将Python从NCAPI v1迁移到NCAPI v2:https://movidius.github.io/ncsdk/ncapi/python_api_migration.html

旧版python接口链接:https://movidius.github.io/ncsdk/ncapi/ncapi1/py_api/readme.html

3.3.2NCAPI v2:

创建NCAPI v2是为了在开发神经计算设备的应用程序时为开发人员提供更大的灵活性。NCAPI v2的主要优点是:

1)可以将多个网络图分配给单个神经计算设备(每个设备最多10个图,受设备内存限制)。

2)输入/输出由先进先出(FIFO)队列处理,后者支持排队多个推理输入/输出。

3)支持32位浮点(FP32)输入/输出。

3.3.3NCAPI v2 Python:

英特尔®Movidius™神经计算SDK(英特尔®Movidius™NCSDK)附带一个Python语言API,可通过神经计算设备(如英特尔®Movidius™神经计算棒)实现利用硬件加速深度神经网络的应用程序。

Python API作为单个Python模块(mvncapi.py)提供,在安装NCSDK时将其放置在开发计算机上。它已经过Python 2.7和3.5的验证。

3.4Python API文档:

安装完成后会在ncsdk目录下出现api文件夹,里面的python子文件夹就是python的api。

3.5Python API excel文档:

4NCSDK开发教程及案例

4.1开发教程:

4.1.1导入NCAPI模块

Python NCAPI位于mvnc包中的mvncapi模块中。

from mvnc import mvncapi

您可以使用global_get_option()和global_set_option()为GlobalOption枚举中的选项获取和设置应​​用程序级信息和选项。

4.1.2设置神经计算设备

该设备类表示神经计算设备并提供方法与设备进行通信。

全局函数enumerate_devices()用于获取连接到主机系统的神经计算设备列表。

# Get a list of available device identifiers

device_list = mvncapi.enumerate_devices()

使用从enumerate_devices()调用获得的设备标识符之一初始化设备。

# Initialize a Device

device = mvncapi.Device(device_list[0])

初始化神经计算设备并使用Device.open()打开通信。

# Initialize the device and open communication

device.open()

您可以使用Device.get_option()获取有关设备的信息,以获取DeviceOption枚举中的选项。

注意:如果您使用多个神经计算设备,则必须为每个神经计算设备创建并打开一个单独的设备。

4.1.3 为设备设置网络图和关联的FIFO队列

NCSDK需要使用mvNCCompile NCSDK工具编译的神经网络图形文件。支持TensorFlow *和Caffe的许多网络模型。有关准备与NCSDK一起使用的网络模型的详细信息,请参阅为英特尔®Movidius™神经计算SDK配置网络。

如果有已编译的图形,请将图形文件数据加载到缓冲区。

# Load graph file data

GRAPH_FILEPATH = './graph'

with open(GRAPH_FILEPATH, mode='rb') as f:

    graph_buffer = f.read()

该图形类提供了利用您的网络图的方法。

使用名称字符串初始化Graph。名称字符串可以是您最喜欢的mvncapi.MAX_NAME_SIZE字符,也可以是空字符串。

# Initialize a Graph object

graph = mvncapi.Graph('graph1')

图形输入和输出由FIFO(先进先出)队列完成。该先进先出类表示这些队列之一,并提供用于管理它的方法。

为Graph创建输入和输出Fifo队列,并使用Graph.allocate_with_fifos()将图形分配给您的设备。您可以省略关键字参数以使用默认的Fifo设置,也可以根据需要指定其他值。

# Allocate the graph to the device and create input and output Fifos with default arguments

input_fifo, output_fifo = graph.allocate_with_fifos(device, graph_file_buffer)

# Allocate the graph to the device and create input and output Fifos with keyword arguments (default values shown)

input_fifo, output_fifo = graph.allocate_with_fifos(device, graph_file_buffer,

        input_fifo_type=mvncapi.FifoType.HOST_WO, input_fifo_data_type=mvncapi.FifoDataType.FP32, input_fifo_num_elem=2,

        output_fifo_type=mvncapi.FifoType.HOST_RO, output_fifo_data_type=mvncapi.FifoDataType.FP32, output_fifo_num_elem=2)

可选参数:

input_fifo_type / output_fifo_type:设置Fifo的读/写访问权限。input_fifo将用于为您的网络图提供输入,并且应该是HOST_WO(只写)FifoType,它允许API(“HOST”)写入Fifo。output_fifo将用于从网络图中获取输出,并且应该是HOST_RO(只读)FifoType,它允许API从Fifo读取。

input_fifo_data_type / output_fifo_data_type:设置Fifo将存储的数据类型。Fifos 的默认数据类型是32位浮点(32FP)。您还可以将数据类型设置为16位浮点(16FP)。注意:无论配置输入和输出Fifos的数据类型如何,API都会在执行推断时将张量转换为16FP。

input_fifo_num_elem / output_fifo / num_elem:设置Fifo队列的大小,或每个Fifo将保留的最大元素数。选择一个对您的应用程序流和内存限制有意义的数字。另外请记住,如果输入Fifo已满,写入输入Fifo的方法将被阻止,如果输出Fifo为空,则从输出Fifo读取的方法将被阻止。

有关Fifo创建和分配的更多信息,请参阅Fifo类文档,以便更好地控制Fifo设置。

对于GraphOption枚举中的选项,您可以使用Graph.get_option()获取有关Graph的信息。您可以使用Fifo.get_option()和Fifo.set_option()获取有关Fifo的信息,以获取FifoOption枚举中的选项。

*注意:您必须为要使用的每个网络图形文件创建和分配图形。一个设备可以有一个以上的图形分配给它,但每个图形只能被分配到一个单一的设备。

4.1.4获得输入张量

获取和预处理输入张量的方式取决于个人应用程序。如果使用的是Python3,则cv2模块提供了一种从文件或相机源加载图像的简便方法。

下面是一个使用cv2模块从文件中读取图像并调整其大小以满足网络要求的示例。但是,可能需要对正在使用的网络模型以及要加载的图像进行额外的预处理。

import cv2

# Read an image from file

tensor = cv2.imread('img.jpg')

# Do pre-processing specific to this network model (resizing, subtracting network means, etc.)

你也可以使用numpy来操纵张量。

import numpy

# Convert an input tensor to 32FP data type

tensor = tensor.astype(numpy.float32)

输入张量数据必须是输入Fifo的RW_DATA_TYPE选项指定的数据类型。默认值为32位浮点,但Fifos也可配置为存储16位浮点数据。请参见FifoDataType枚举。张量数据应存储在numpy ndarray中。

4.1.5进行推理

使用Graph.queue_inference_with_fifo_elem()将输入张量写入输入Fifo并将其排队以进行推理。推理完成后,输入张量将从input_fifo队列中删除,结果张量将放在output_fifo队列中。第三个参数必须为None。第四个参数可以是您在读取推理结果时希望与此特定张量关联的任何对象,例如原始张量或窗口句柄,或者无。

# Write the tensor to the input_fifo and queue an inference

graph.queue_inference_with_fifo_elem(input_fifo, output_fifo, tensor, 'user object')

如果输入的Fifo已满,则此方法调用将阻塞,直到有空间写入Fifo。您可以查看有多少元素的输入和输出的FIFO与Fifo.get_option()用于RO_WRITE_FILL_LEVEL和RO_READ_FILL_LEVEL,分别。请注意,推断将需要一些时间才能完成,具体取决于网络模型速度和设备通信延迟,因此您可能需要等待以查看更新的级别。

推理完成后,您可以使用Fifo.read_elem()获取推理结果。这也将返回您传递给Fifo.write_elem()的用户对象。

# Get the results from the output queue

output, user_obj = output_fifo.read_elem()

然后,您可以根据特定网络模型使用输出结果。

4.1.6清理

在关闭与设备的通信之前,使用Graph.destroy()和Fifo.destroy()来销毁Graph和Fifo对象并清理相关的内存。在被摧毁之前,Fifos必须是空的。然后使用Device.close()关闭设备,使用Device.destroy()来销毁Device对象并清理相关内存。

# Clean up

input_fifo.destroy()

output_fifo.destroy()

graph.destroy()

device.close()

device.destroy()

4.2开发示例:

4.2.1示例1:从图中获取输入张量描述符列表。

import mvnc.mvncapi as mvnc

# Create and open a device and create and allocate a graph...

# Get a list of input TensorDescriptor objects from the graph

inputDescs = graph.get_option(mvnc.GraphOption.RO_INPUT_TENSOR_DESCRIPTORS)

4.2.2示例2:为输入Fifo创建并设置通道次要主机张量描述符。

import mvnc.mvncapi as mvnc

# Create and open a device and create and allocate a graph with fifos...

# The n/c/w/h fields for the RW_HOST_TENSOR_DESCRIPTOR must match the dimensions of the RO_GRAPH_TENSOR_DESCRIPTOR, so start with that

host_tensor_descriptor = fifoIn.get_option(mvnc.FifoOption.RO_GRAPH_TENSOR_DESCRIPTOR)

# Set the tensor data type

host_tensor_descriptor.dataType = mvnc.FifoDataType.FP32.value

# For channel-minor data with FP32 data type, there are 4 bytes between each element of the channel

# The horizontal stride (wStride), vertical stride (hStride), and totalSize can be calculated from there

host_tensor_descriptor.cStride = 4

host_tensor_descriptor.wStride = host_tensor_descriptor.cStride * host_tensor_descriptor.c

host_tensor_descriptor.hStride = host_tensor_descriptor.wStride * host_tensor_descriptor.w

host_tensor_descriptor.totalSize = host_tensor_descriptor.hStride * host_tensor_descriptor.h

# Set the option

fifoIn.set_option(mvnc.FifoOption.RW_HOST_TENSOR_DESCRIPTOR, host_tensor_descriptor)

...

4.2.3示例三:列出设备序列

from mvnc import mvncapi

device_list = mvncapi.enumerate_devices()

if not device_list:

    print("Error - No neural compute devices detected.")

else:

    print(len(device_list), "neural compute devices found!")

4.2.4示例四:打印NCAPI版本

from mvnc import mvncapi

# Print the API version

print('NCAPI Version:', mvncapi.global_get_option(mvncapi.GlobalOption.RO_API_VERSION))

4.2.5案例五:全局设置

from mvnc import mvncapi

# Set the global logging level to debug (full verbosity)

mvncapi.global_set_option(mvncapi.GlobalOption.RW_LOG_LEVEL, mvncapi.LogLevel.DEBUG)

4.2.6案例六:Device类的使用

from mvnc import mvncapi

# Get a list of valid device identifiers

device_list = mvncapi.enumerate_devices()

# Create a Device instance for the first device found

device = mvncapi.Device(device_list[0])

# Get the device name and output to console

print(device.get_option(mvncapi.DeviceOption.RO_DEVICE_NAME))

# Open communication with the device

device.open()

#

# Use the device...

#

# Clean up

device.close()

device.destroy()

from mvnc import mvncapi

# Get a list of valid device identifiers

device_list = mvncapi.enumerate_devices()

# Create a Device instance for the first device found

device = mvncapi.Device(device_list[0])

# Open communication with the device

device.open()

#

# Use the device...

#

# Close the device and destroy the device handle

device.close()

device.destroy()

from mvnc import mvncapi

# Get a list of valid device identifiers

device_list = mvncapi.enumerate_devices()

# Create a Device instance for the first device found

device = mvncapi.Device(device_list[0])

# Open communication with the device

device.open()

#

# Use the device...

#

# Close the device and destroy the device handle

device.close()

device.destroy()

from mvnc import mvncapi

# Get a list of valid device identifiers

device_list = mvncapi.enumerate_devices()

# Create a Device instance for the first device found

device = mvncapi.Device(device_list[0])

# Get the device name and output to console

print(device.get_option(mvncapi.DeviceOption.RO_DEVICE_NAME))

# Destroy the device handle

device.destroy()

from mvnc import mvncapi

# Get a list of valid device identifiers

device_list = mvncapi.enumerate_devices()

# Create a Device instance for the first device found

device = mvncapi.Device(device_list[0])

# Open communication with the device

device.open()

#

# Use the device...

#

# Close the device and destroy the device handle

device.close()

device.destroy()

4.2.7案例七:Fifo类使用

"""Example Fifo usage with convenience functions."""

from mvnc import mvncapi

#

# Open a Device, create a Graph, and load graph data from file...

#

# Allocate the Graph and create and allocate two associate Fifos for input and output

input_fifo, output_fifo = graph.allocate_with_fifos(device, graph_buffer)

# Write an input tensor to the input Fifo and queue an inference

graph.queue_inference_with_fifo_elem(input_fifo, output_fifo, input_tensor, None, 'tensor1'

# Read the inference result tensor from the output Fifo

result_tensor, user_obj = output_fifo.read_elem()

#

# Do something with the result...

#

# Destroy the Fifos

input_fifo.destroy()

output_fifo.destroy()

#

# Perform other clean up...

#

"""Example Fifo usage without convenience functions."""

from mvnc import mvncapi

#

# Open a Device and allocate a Graph...

#

# Initialize two Fifos for input and output

input_fifo = mvncapi.Fifo('input1', mvncapi.FifoType.HOST_WO)

output_fifo = mvncapi.Fifo('output1', mvncapi.FifoType.HOST_RO)

# Get input and output TensorDescriptors from the graph

input_descriptor = graph.get_option(mvncapi.GraphOption.RO_INPUT_TENSOR_DESCRIPTORS)

output_descriptor = graph.get_option(mvncapi.GraphOption.RO_OUTPUT_TENSOR_DESCRIPTORS)

# Allocate the Fifo buffers

NUM_ELEMENTS = 2

input_fifo.allocate(device, input_descriptor[0], NUM_ELEMENTS)

output_fifo.allocate(device, output_descriptor[0], NUM_ELEMENTS)

# Write an input tensor to the input_fifo

input_fifo.write_elem(input_tensor, 'tensor1')

#

# Queue an inference with Graph.queue_inference()...

#

# Read the inference result tensor from the output Fifo

result_tensor, user_obj = output_fifo.read_elem()

#

# Do something with the result...

#

# Destroy the Fifos

input_fifo.destroy()

output_fifo.destroy()

#

# Perform other clean up...

#

from mvnc import mvncapi

#

# Open a Device and allocate a Graph...

#

# Create an input Fifo

input_fifo = mvncapi.Fifo('input1', mvncapi.FifoType.HOST_WO)

# Get an input TensorDescriptor from a graph

input_descs = graph.get_option(mvncapi.GraphOption.RO_INPUT_TENSOR_DESCRIPTORS)

# Allocate the Fifo buffer with the graph input TensorDescriptor to the device

NUM_ELEMENTS = 2

input_fifo.allocate(device, input_descs[0], NUM_ELEMENTS

#

# Write elements to the Fifo with Fifo.write_elem() and initiate inferences with Graph.queue_inference()

#

# Destroy the Fifo

input_fifo.destroy()

#

# Perform other clean up...

#

4.2.8案例八:Graph类使用

from mvnc import mvncapi

#

# Create and open a Device...

# Create a Graph

graph = mvncapi.Graph('graph1')

# Read a compiled network graph from file (set the graph_filepath correctly for your graph file)

graph_filepath = './graph'

with open(graph_filepath, 'rb') as f:

    graph_buffer = f.read()

# Allocate the graph on the device and create input and output Fifos

input_fifo, output_fifo = graph.allocate_with_fifos(device, graph_buffer)

#

# Pre-procces your input tensor...

#

# Write the tensor to the input Fifo and queue an inference

graph.queue_inference_with_fifo_elem(input_fifo, output_fifo, input_tensor, None, 'object1')

#

# Read the output from the output_fifo and use it as needed...

#

# Clean up

input_fifo.destroy()

output_fifo.destroy()

graph.destroy()

device.close()

device.destroy()

from mvnc import mvncapi

# Get a list of valid device identifiers

device_list = mvncapi.enumerate_devices()

# Create a Device instance for the first device found

device = mvncapi.Device(device_list[0]

# Open communication with the device

device.open()

# Create a Graph

graph = mvncapi.Graph('graph1')

# Read a compiled network graph from file (set the graph_filepath correctly for your graph file)

graph_filepath = './graph'

with open(graph_filepath, 'rb') as f:

    graph_buffer = f.read()

# Allocate the graph on the device

graph.allocate(device, graph_buffer)

#

# Use the device...

#

# Deallocate and destroy the graph handle, close the device, and destroy the device handle

graph.destroy()

device.close()

device.destroy()

from mvnc import mvncapi

# Create a Graph

graph = mvncapi.Graph('graph1')

# Destroy the Graph

graph.destroy()

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 2,611评论 0 3
  • 早就有人建议过我,把自己的一些想法,现在微博上写在公众号上;可以是关于心理学方面的,也可以是关于哲学方面的,甚至于...
    鎏某某阅读 191评论 0 0
  • 天气实在太冷。他掐灭烟,顺手推开身旁的窄门。 然而即使在这样的胡同里,这家店铺还是显得过分逼仄。堆积的杂物几乎溢出...
    吕晨晨阅读 391评论 0 1
  • 蜂蜜的营养成分均为天然营养物质,其单糖、维生素、酶类等生物活性物质有利于被皮肤细胞的吸收,能有效地改善皮肤表面的营...
    德周蜂蜜阅读 215评论 0 2
  • 夜已深,看到身边熟睡的丈夫,恍惚间才想起自己嫁为人妻已经三月有余。突然就想写点关于感情,关于婚姻的小感悟,权当是把...
    玩个得呱呱呱阅读 399评论 2 1