本文讨论在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
由上图可知,vgg16实际执行时间为791.23毫秒,因此其实际上不适用于视频的分析,这里仅作为一个demo来讲解神经计算棒的使用过程。
7.然后,我们下载一张图,到默认路径~/Download/aaa.jpg
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,因此不会出现人的预测结果。
有什么问题可以一起讨论。