1. 程式人生 > >使用Movidius神經計算棒進行vgg16演算法預測

使用Movidius神經計算棒進行vgg16演算法預測

本文討論在Ubuntu16.04的系統中使用Movidius神經計算棒,進行vgg16演算法預測。

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,因此不會出現人的預測結果。

有什麼問題可以一起討論。