欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用Movidius神经计算棒进行vgg16算法预测

程序员文章站 2022-05-30 14:18:39
...

本文讨论在Ubuntu16.04的系统中使用Movidius神经计算棒,进行vgg16算法预测。

神经计算SDK官方网站https://movidius.github.io/ncsdk/install.html

1.首先在系统中安装python3.5,这里不再赘述。

2.然后进行神经计算SDK的安装,注意安装过程中记得将计算棒插入USB接口。

本文以NCSDK2的版本进行讲解,依次执行以下安装命令:

wget https://ncs-forum-uploads.s3.amazonaws.com/ncsdk/ncsdk-02_05_00_02-full/ncsdk-2.05.00.02.tar.gz
tar xvf ncsdk-2.05.00.02.tar.gz
cd ncsdk-2.05.00.02
make install
make examples

如果因为环境问题导致安装不成功,具体冲突可查看官网说明。

3.安装成功后,将caffe或者tensorflow训练好的模型进行编译,NCSDK会自动安装tensorflow1.7.0的版本。本文以vgg16为例,建立model_build.py:

from keras.applications import VGG16
from keras import backend as K
import tensorflow as tf

mn = VGG16()
saver = tf.train.Saver()
sess = K.get_session()
saver.save(sess, "./TF_Model/vgg16")

4.然后运行此文件

python model_build.py

此处用tf.train.Saver()保存了一个tf模型。

5.在终端采用如下命令进行编译,指定网络的输入和输出节点

mvNCCompile TF_Model/vgg16.meta -in=input_1 -on=predictions/Softmax -s 12

其中,-s 12表示使用12个SHAVE处理器

然后,可得到一个graph文件。

6.使用如下命令,查看模型每一层的运行情况:

mvNCProfile TF_Model/vgg16.meta -in=input_1 -on=predictions/Softmax -s 12

使用Movidius神经计算棒进行vgg16算法预测

由上图可知,vgg16实际执行时间为791.23毫秒,因此其实际上不适用于视频的分析,这里仅作为一个demo来讲解神经计算棒的使用过程。

7.然后,我们下载一张图,到默认路径~/Download/aaa.jpg

使用Movidius神经计算棒进行vgg16算法预测

8.编写predict-vgg16.py文件,将graph加载到神经计算棒设备中进行预测。代码如下:

from mvnc import mvncapi as mvnc
import cv2
import numpy
import sys
from keras.applications import VGG16
from keras.applications.vgg16 import preprocess_input, decode_predictions
from keras.preprocessing.image import load_img, img_to_array
import matplotlib.pyplot as plt

img = load_img(sys.argv[1], target_size=(224, 224)) # 命令行第一个参数输入图片路径,转化为目标大小
img = img_to_array(img) #转化格式
img = preprocess_input(img) #预处理

print("NCS")

devices = mvnc.enumerate_devices() #获取连接到主机系统的神经计算设备列表

device = mvnc.Device(devices[0]) #调用第一个NCS设备
device.open() #打开通信

with open("graph", mode='rb') as f: #读取图文件,转化为二进制流
    graphfile = f.read()

graph = mvnc.Graph('aaaa') #初始化一个名为aaaa的图
input_fifo,output_fifo=graph.allocate_with_fifos(device,graphfile) #创建输入和输出先进先出队列,将图加载到设备
tensor=img.astype(numpy.float32) #输入张量数据必须是输入Fifo的RW_DATA_TYPE选项指定的数据类型。默认值为32位浮点
graph.queue_inference_with_fifo_elem(input_fifo,output_fifo,tensor,'user object') #将输入张量写入输入Fifo并将其排队以进行推理
output,user_obj=output_fifo.read_elem() #推理完成后,使用Fifo.read_elem()获取推理结果。

result = decode_predictions(output.reshape(1, 1000)) #获取结果
print(result) #输出结果

# 关闭队列、图和设备
input_fifo.destroy()
output_fifo.destroy()
graph.destroy()
device.close()
device.destroy()

9.运行predict-vgg16.py文件预测此图片

python predict-vgg16.py ~/Downloads/aaa.jpg

结果如下:

NCS
[[('n04350905', 'suit', 0.89990234), ('n04591157', 'Windsor_tie', 0.025924683), ('n03680355', 'Loafer', 0.024169922), ('n02883205', 'bow_tie', 0.019729614), ('n03832673', 'notebook', 0.0046310425)]]

可以看到,关于suit,即西装的概率是最高的,为0.89990234,可知预测成功。vgg16不是预测人的model,因此不会出现人的预测结果。

有什么问题可以一起讨论。