intel movidius 神经元计算棒 APIv2详解

版权声明:版权所有,转载请申明并附加链接,谢谢! https://blog.csdn.net/qqqzmy/article/details/85081638

摘要

本文讲解神经元计算棒的python代码的流程
参考网址:
https://movidius.github.io/ncsdk/ncapi/ncapi2/py_api/readme.html

Python NCAPI 流程

1.导入NCAPI模块

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

from mvnc import mvncapi

2.设置神经计算设备

该设备类表示神经计算设备并提供方法与设备进行通信。
全局函数enumerate_devices()用于获取连接到主机系统的神经计算设备列表。

#Get a list of available device identifiers
device_list = mvncapi.enumerate_devices()

# Initialize a Device
device = mvncapi.Device(device_list[0])

# Initialize the device and open communication
device.open()

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

3.为设备设置网络Graph和关联的FIFO队列

NCSDK需要使用mvNCCompile NCSDK工具编译的神经网络Graph文件。支持TensorFlow 和Caffe网络模型。如果有已编译的Graph,可将图形文件数据加载到缓冲区。

# Load graph file data
GRAPH_FILEPATH = './graph'
with open(GRAPH_FILEPATH, mode='rb') as f:
    graph_buffer = f.read()

该Graph类提供了利用你的网络Graph的方法。使用名称字符串初始化Graph。

# Initialize a Graph object
graph = mvncapi.Graph('graph1')

图形输入和输出由FIFO(先进先出)队列完成。该FIFO类表示这些队列之一,并提供用于管理它的方法。
为Graph创建输入和输出FIFO队列,并使用Graph.allocate_with_fifos()将Graph
分配给您的设备。您可以省略关键字参数以使用默认的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读取的方法将被阻止。
对于GraphOption枚举中的选项,您可以使用Graph.get_option()获取有关Graph的信息。您可以使用Fifo.get_option()和Fifo.set_option()获取有关Fifo的信息,以获取FifoOption枚举中的选项。
注意:为要使用的每个网络Graph文件创建和分配Graph。一个设备可以有一个以上的图形分配给它,但每个图形只能被分配到一个单一的设备。

4.获得输入张量

获取和预处理输入张量的方式取决于程序。如果您使用的是Python3,可以使用cv2从文件或相机加载图像。GStreamer也可以替代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中。

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()

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

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()
展开阅读全文

没有更多推荐了,返回首页