今天,来自石家庄铁道大学的杨萌同学给大家介绍如何在Jetson TX2上安装Intel神经棒——想像一下如果NV和Intel在AI领域强强联合,会出现什么效果?
It is very Interesting!
1
Intel神经计算棒简介
神经计算棒(Neural Compute Stick, NCS),图1所示,可以对神经网络的计算起到加速的作用。
图1 神经计算棒
它的技术参数如下:
处理器 | Intel 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 3B Stretch desktopUbuntu 16.04虚拟机,USB 2.0 Type-A 接口 (推荐 USB 3.0),1GB RAM,4GB 存储空间 |
2
工作方式
NCS工作方式分为两种,一种是在主机上将训练好的模型生成NCS可执行graph文件,该文件用于推理过程;另一种是在树莓派、Jetson TX2等便携式计算机上加速推理过程。
2.1 主机端
安装:
将神经计算棒插入主机中,在终端执行以下命令:
git clone https://github.com/movidius/ncsdk
cd ncsdk
make install
make install的作用如下:
(1)检查安装Tensorflow;
(2)检查安装Caffe(SSD-caffe);
(3)编译安装ncsdk(不包含inference模块,只包含mvNCCompile相关模块,用来将Caffe或Tensorflow模型转成NCS graph的)
之后执行:
make example
程序顺利运行不报错的话,就说明已经安装成功了。
使用:
将训练好的模型生成NCS可以执行的graph文件,在终端执行以下命令:
mvNCCompile network.prototxt -w network.caffemodel -s MaxNumberOfShaves -in InputNodeName -on OutputNodeName-is InputWidth InputHeight -o OutputGraphFilename
network.prototxt:.prototxt文件的路径
2.2 在Jetson TX2上如何安装NCS
在TX2上只完成推理(Inference)过程,所以只需安装API-only模式即可,将NCS插入到TX2上。
(1)安装依赖:
sudo apt-get install -y libusb-1.0-0-dev libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler libatlas-base-dev git automake byacc lsb-release cmake libgflags-dev libgoogle-glog-dev liblmdb-dev swig3.0 graphviz libxslt-dev libxml2-dev gfortran python3-dev python-pip python3-pip python3-setuptools python3-markdown python3-pillow python3-yaml python3-pygraphviz python3-h5py python3-nose python3-lxml python3-matplotlib python3-numpy python3-protobuf python3-dateutil python3-skimage python3-scipy python3-six python3-networkx python3-tk
(2)下载源码:
mkdir ~/workspace
cd ~/workspace
git clone https://github.com/movidius/ncsdk
(3)编译和安装NCSDK API框架
cd ~/workspace/ncsdk/api/src
make
sudo make install
(4)测试
cd ~/workspace
git clone https://github.com/movidius/ncappzoo
cd ncappzoo/apps/hello_ncs_py
python3 hello_ncs.py
出现以下结果:
Hello NCS! Device opened normally.
Goodbye NCS! Device closed normally.
NCS device working.
API-only模式安装成功。
3
如何在Jetson TX2利用NCS进行推理
参数预定义:
使用NCS做图像分类的5个步骤:
从mvnc库中引入mvncapi模块
import mvnc.mvncapi as mvnc
01
将NCS插入应用处理器(Ubuntu笔记本电脑/台式机)USB端口时,它将自身列为USB设备。通过调用API来查找枚举的NCS设备:
# Look for enumerated Intel Movidius NCS device(s); quit program if none found.
devices = mvnc.EnumerateDevices()
if len( devices ) == 0:
print( 'No devices found' )
quit()
如果插入了多个NCS,还需要选择一个NCS并打开:
# Get a handle to the first enumerated device and open it
device = mvnc.Device( devices[0] )
device.OpenDevice()
02
加载graph文件到NCS
# Read the graph file into a buffer
with open( GRAPH_PATH, mode='rb' ) as f:
blob = f.read()
# Load the graph buffer into the NCS
graph = device.AllocateGraph( blob )
03
将图像加载到Intel Movidius NCS上以运行推理
图像预处理:
1.调整图像大小/裁剪图像以匹配预先训练的网络定义的尺寸。例:GoogLeNet uses 224x224 pixels, AlexNet uses 227x227 pixels.
2.每个通道的平均值(蓝色,绿色和红色)从整个数据集中减去。这是深度学习中常用的一种技术,可以集中数据。
3.将图像转换为半精度浮点数(fp16)数组(NCS输入数据格式为fp16),并使用LoadTensor函数调用将图像加载到NCS上。skimage库可以在一行代码中完成此操作。
# Read & resize image (Image size is defined during training)
img = print_img = skimage.io.imread( IMAGES_PATH )
img = skimage.transform.resize( img, IMAGE_DIM, preserve_range=True )
# Convert RGB to BGR [skimage reads image in RGB, but Caffe uses BGR]
img = img[:, :, ::-1]
# Mean subtraction & scaling [A common technique used to center the data]
img = img.astype( numpy.float32 )
img = ( img - IMAGE_MEAN ) * IMAGE_STDDEV
# Load the image as a half-precision floating point array
graph.LoadTensor( img.astype( numpy.float16 ), 'user object' )
04
从NCS读取并打印推理结果
# Get the results from NCS
output, userobj = graph.GetResult()
# Print the results
print('\n------- predictions --------')
labels = numpy.loadtxt( LABELS_FILE_PATH, str, delimiter = '\t' )
order = output.argsort()[::-1][:6]
for i in range( 0, 5 ):
print ('prediction ' + str(i) + ' is ' + labels[order[i]])
# Display the image on which inference was performed
skimage.io.imshow( IMAGES_PATH )
skimage.io.show( )
05
卸载图形并关闭设备
为了避免内存泄漏和/或分段错误,我们应该关闭所有打开的文件或资源并释放所有使用的内存。
graph.DeallocateGraph()
device.CloseDevice()
4
运行Demo
Demo采用Adrian Rosebrock博客Real-time object detection on the Raspberry Pi with the Movidius NCS - PyImageSearch里的程序(https://www.pyimagesearch.com/2018/02/19/real-time-object-detection-on-the-raspberry-pi-with-the-movidius-ncs/),这个程序基于Mobilenet-ssd模型对视频流做实时检测,如图2所示,Demo采用USB摄像头读取实时视频。图3为检测结果。
图2 TX2搭载NCS做检测
图3 检测结果
通过NCS加速,Demo对视频的处理速度可以达到7.67FPS;由于树莓派USB接口为2.0接口,会影响主机和NCS的通信速度,其视频处理速度为3.4FPS;而运行OpenCV 3.4.0中的dnn模块中的mobilenet-ssd Demo进行物体检测时,帧频仅为4.89FPS。需要说明是,这仅仅是一个安装教程,如何提高检测精度和检测速度,还需要大家进一步深挖。
参考
https://github.com/movidius/ncsdk
https://movidius.github.io/blog/ncs-apps-on-rpi/
https://movidius.github.io/blog/ncs-image-classifier/
https://www.pyimagesearch.com/2018/02/19/real-time-object-detection-on-the-raspberry-pi-with-the-movidius-ncs/
(本文指导老师:石家庄铁道大学王老师)