当Intel的神经棒遇到NVIDIA的Jetson TX2

今天,来自石家庄铁道大学的杨萌同学给大家介绍如何在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文件的路径

  • -w network.caffemode:模型文件的路径
  • -s MaxNumberOfShaves:1, 2, 4, 8, 12。默认为12
  • -in InputNodeName:选择指定一个特定的输入图层(它将匹配prototxt文件中的名称,可选项)
  • -on OutputNodeName:默认情况下网络是通过输出张量进行处理的,这个选项允许用户在网络中选择一个替代端点(可选项)
  • -is InputWidth InputHeight:输入尺寸,需要与网络匹配
  • -o OutputGraphFilename:生成的graph文件存储路径

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进行推理

参数预定义:

  • GRAPH_PATH:graph文件路径;
  • IMAGE_PATH:要分类的图片的路径;
  • IMAGE_DIM:由选择的神经网络定义的图像尺寸;例:GoogLeNet uses 224x224 pixels, AlexNet uses 227x227 pixels
  • IMAGE_STDDEV:由选择的神经网络定义的标准差(标度值);例:GoogLeNet uses no scaling factor, InceptionV3 uses 128 (stddev = 1/128)
  • IMAGE_MEAN:平均减法是深度学习中常用的一种技术,用于对数据进行中心处理。例:ILSVRC dataset, the mean is B = 102 Green = 117 Red = 123

使用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/

(本文指导老师:石家庄铁道大学王老师)

原文发布于微信公众号 - 吉浦迅科技(gpusolution)

原文发表时间:2018-05-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CreateAMind

开源|MultiNet模型解决Kitti数据集自动驾驶中的道路分割、车辆检测和街道分类(附源代码)

MultiNet能够同时完成道路分割、汽车检测和道路分类的任务。MultiNet模型的实时存档速度和分割性能都处于最先进水平。详细的模型描述请查阅我们的论文。

1053
来自专栏weixuqin 的专栏

facenet 进行人脸识别测试

3384
来自专栏FreeBuf

让你家的楼宇门变聪明:基于树莓派实现任意终端控制楼宇门

原创作者:豆豆青春不喂狗 一、背景 寒冷冬天的早晨,你躺在被窝里,门铃响了,你需要立刻起床穿衣服,然后去开门。现在,树莓派能帮你获得一个从容穿衣的时间。 二、摘...

2219
来自专栏ChaMd5安全团队

三个有趣的脱壳例子

最近看了youtube上的一些视频教程,看到了几个有趣的脱壳方式。这里介绍下。具体的视频教程在MalwareAnalysisForHedgehogs和hashe...

3345
来自专栏人人都是极客

2.运行一个demo

在 Object Detection API 的示例代码中包含了一个训练识别宠物的 Demo,包括数据集和相应的一些代码。虽然本课程中我们会自己准备数据和脚本来...

3716
来自专栏人工智能LeadAI

毫秒级检测!你见过带GPU加速的树莓派吗?

34510
来自专栏从流域到海域

Ubuntu16.04使用Anaconda5搭建TensorFlow使用环境 图文详细教程

本文转载于:http://blog.csdn.net/solo95/article/details/78960389,即专栏作者本人的博客,保留所有版权,禁止转...

2885
来自专栏梦里茶室

毫秒级检测!你见过带GPU的树莓派吗?

树莓派3B+英特尔神经计算棒进行高速目标检测 转载请注明作者梦里茶 ? 代码: 训练数据预处理: https://gist.github.com/ahan...

2.6K8
来自专栏Hadoop实操

Hadoop之上的模型训练 - CDSW1.4新功能模块

CDSW1.4提供了一个新的实验室模块,可以让数据科学家运行批处理的实验。从而跟踪代码版本,输入参数和输出指标与文件。如下图所示,这个功能可以帮助数据科学家实现...

822
来自专栏每日一篇技术文章

OpenGLES_入门07_加载3D模型

OpenGL 自身不能直接加载模型文件,我们的思路很简单,就是把模型文件转成顶点数据,颜色数据,法线向量数据,纹理坐标,然后通过OpenGL 提供的API 把数...

693

扫码关注云+社区