Intel® Movidius™ 神经计算棒(NCS)是个使用USB接口的深度学习设备,比U盘略大,功耗1W,浮点性能可达100GFLOPs。

100GFLOPs大概是什么概念呢,i7-8700K有59.26GLOPs,Titan V FP16 有24576GLOPs……(仅供娱乐参考,对比是不同精度的)。

安装NCSDK

目前NCSDK官方安装脚本只支持Ubuntu 16.04和Raspbian Stretch,折腾一下在其他Linux系统运行也是没问题的,例如我用ArchLinux,大概步骤如下:

  1. 安装python 3、opencv、tensorflow 1.4.0还有其他依赖
  2. 编译安装caffe,需要用到这个没合并的PR:Fix boost_python discovery for distros with different naming scheme
  3. 改官方的脚本,跳过系统检查,跳过依赖安装(在第一步就手工装完了)

当我顺利折腾完之外,才发现AUR是有了现成的ncsdk。

安装完成后改LD_LIBRARY_PATH和PYTHONPATH:

export LD_LIBRARY_PATH=/opt/movidius/bvlc-caffe/build/install/lib64/:/usr/local/lib/
export PYTHONPATH="${PYTHONPATH}:/opt/movidius/caffe/python"

模型编译

使用NCS需要把caffe或tensorflow训练好的模型转换成NCS支持的格式。因为Keras有TF后端,所以用Keras的模型也是可以的。这里以Keras自带的VGG16为例:

from keras.applications import VGG16
from keras import backend as K
import tensorflow as tfmn = VGG16()
saver = tf.train.Saver()
sess = K.get_session()
saver.save(sess, "./TF_Model/vgg16")

这里直接用tf.train.Saver保存了一个tf模型,然后用mvNCCompile命令进行编译,需要指定网络的输入和输出节点,-s 12表示使用12个SHAVE处理器:

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

顺利的话就的到一个graph文件。

(这里用了我自己改的TensorFlowParser.py才能用)

模型调优

mvNCProfile命令可以查看模型中每一层使用的内存带宽、算力,模型调优可以以此为参考。

$ mvNCProfile TF_Model/vgg16.meta -in=input_1 -on=predictions/Softmax -s 12Detailed Per Layer ProfileBandwidth   time
#    Name                                        MFLOPs  (MB/s)    (ms)
=======================================================================
0    block1_conv1/Relu                            173.4   304.2   8.510
1    block1_conv2/Relu                           3699.4   662.6  83.297
2    block1_pool/MaxPool                            3.2   831.6   7.366
3    block2_conv1/Relu                           1849.7   419.9  33.158
4    block2_conv2/Relu                           3699.4   474.2  58.718
5    block2_pool/MaxPool                            1.6   923.4   3.317
6    block3_conv1/Relu                           1849.7   171.8  43.401
7    block3_conv2/Relu                           3699.4   180.6  82.579
8    block3_conv3/Relu                           3699.4   179.8  82.921
9    block3_pool/MaxPool                            0.8   919.2   1.666
10   block4_conv1/Relu                           1849.7   137.3  41.554
11   block4_conv2/Relu                           3699.4   169.0  67.442
12   block4_conv3/Relu                           3699.4   169.6  67.232
13   block4_pool/MaxPool                            0.4   929.7   0.825
14   block5_conv1/Relu                            924.8   308.9  20.176
15   block5_conv2/Relu                            924.8   318.0  19.594
16   block5_conv3/Relu                            924.8   314.9  19.788
17   block5_pool/MaxPool                            0.1   888.7   0.216
18   fc1/Relu                                     205.5  2155.9  90.937
19   fc2/Relu                                      33.6  2137.2  14.980
20   predictions/BiasAdd                            8.2  2645.0   2.957
21   predictions/Softmax                            0.0    19.0   0.201
-----------------------------------------------------------------------Total inference time                  750.84
-----------------------------------------------------------------------
Generating Profile Report 'output_report.html'...

可以看到执行1此VGG16推断需要750ms,主要时间花在了几个卷积层,所以这个模型用在实时的视频分析是不合适的,这时可以试试其他的网络,例如SqueezeNet只要48ms:

Detailed Per Layer ProfileBandwidth   time
#    Name                                        MFLOPs  (MB/s)    (ms)
=======================================================================
0    data                                           0.0 78350.0   0.004
1    conv1                                        347.7  1622.7   8.926
2    pool1                                          2.6  1440.0   1.567
3    fire2/squeeze1x1                               9.3  1214.8   0.458
4    fire2/expand1x1                                6.2   155.2   0.608
5    fire2/expand3x3                               55.8   476.3   1.783
6    fire3/squeeze1x1                              12.4  1457.4   0.509
7    fire3/expand1x1                                6.2   152.6   0.618
8    fire3/expand3x3                               55.8   478.3   1.776
9    fire4/squeeze1x1                              24.8  1022.0   0.730
10   fire4/expand1x1                               24.8   176.2   1.093
11   fire4/expand3x3                              223.0   389.7   4.450
12   pool4                                          1.7  1257.7   1.174
13   fire5/squeeze1x1                              11.9   780.3   0.476
14   fire5/expand1x1                                6.0   154.0   0.341
15   fire5/expand3x3                               53.7   359.8   1.314
16   fire6/squeeze1x1                              17.9   639.4   0.593
17   fire6/expand1x1                               13.4   159.5   0.531
18   fire6/expand3x3                              120.9   259.7   2.935
19   fire7/squeeze1x1                              26.9   826.1   0.689
20   fire7/expand1x1                               13.4   159.7   0.530
21   fire7/expand3x3                              120.9   255.2   2.987
22   fire8/squeeze1x1                              35.8   727.0   0.799
23   fire8/expand1x1                               23.9   164.0   0.736
24   fire8/expand3x3                              215.0   191.4   5.677
25   pool8                                          0.8  1263.8   0.563
26   fire9/squeeze1x1                              11.1   585.9   0.388
27   fire9/expand1x1                                5.5   154.1   0.340
28   fire9/expand3x3                               49.8   283.2   1.664
29   conv10                                       173.1   335.8   3.400
30   pool10                                         0.3   676.1   0.477
31   prob                                           0.0     9.5   0.200
-----------------------------------------------------------------------Total inference time                   48.34
-----------------------------------------------------------------------

推断

有了图文件,我们就可以把它加载到NCS,然后进行推断:

from mvnc import mvncapi as mvnc## 枚举设备
devices = mvnc.EnumerateDevices()## 打开第一个NCS
device = mvnc.Device(devices[0])
device.OpenDevice()## 读取图文件
with open("graph", mode='rb') as f:graphfile = f.read()## 加载图
graph = device.AllocateGraph(graphfile)

图加载加载完成后,就可以graph.LoadTensor给它一个输入,graph.GetResult得到结果。

# 从摄像头获取图像
ret, frame = cap.read()# 预处理
img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (224, 224))
img = preprocess_input(img.astype('float32'))# 输入
graph.LoadTensor(img.astype(numpy.float16), 'user object')# 获取结果
output, userobj = graph.GetResult()result = decode_predictions(output.reshape(1, 1000))

识别出鼠标:

Kindle和iPod还算相似吧:)

完整的代码在oraoto/learn_ml/ncs,有MNIST和VGG16的例子。

Movidius神经计算棒初体验相关推荐

  1. movidius 神经计算棒 ncsdk windows 平台 支持 配置 教程

    概述:movidius ncs的ncsdk目前官方还不支持windows,但是inter好像发布了openvino,这个里面是包含ncsdk的好像是支持windows的.现在不讲openvino,讲n ...

  2. Movidius神经计算棒3-完整配置开发环境

    上面是我的微信和QQ群,欢迎新朋友的加入. cd ncsdk/make install 这里有个题外话,英特尔这个玩意搞得不太友好,很多软件都有版本限制,高了或或者低了都要不得 这倒也没啥事,但是有个 ...

  3. 树莓派4B与Intel Movidius计算棒2代实现深度学习应用加速

    树莓派4B与Intel Movidius计算棒2代实现人脸识别加速实例 树莓派 树莓派介绍 教程 操作 换源部分: 安装cmake Intel 神经计算棒环境配置 Intel 神经计算棒简介 Open ...

  4. Movidus 神经计算棒 树莓派平台 ncsdk2.0 完全配置 及 一些问题

    配置之前的琐事和解决方法 之前配置了的1.x版本的ncsdk.错误百出,于是有了另一篇文章就是纯API配置,没有配完全版. 经过我的测试,用以下方法配置是可以用的.配置方法和下面的2.0类似,不过有可 ...

  5. 玩转树莓派之 配置openvino进行神经计算棒2加速

    树莓派4B + openvino 换源参考链接 一. 安装opencv 二. 安装openvino 三. 添加USB规则 四. 运行示例 换源参考链接 一. 安装opencv 参考第三个下载安装的方式 ...

  6. Spark机器人-神经计算棒

    英特尔收购了Movidius公司,该公司生产了名为Netural Computer Stick的计算棒,简称NCS. 该产品发布于2017年,内置Myriad2 VPU视觉计算处理器.支持Caffe深 ...

  7. 北京 | 免费高效训练及OpenVINO™加速推理深度学习实战,送Intel神经计算棒二代...

    当今人工智能时代,深度学习极大得促进了计算机视觉技术的快速应用和成熟,也是算法工程师们必须掌握的一项技能,然而,不同环境的依赖部署,高算力的需求,海量数据量需求及算法应用高硬件成本也让深度学习陷入了规 ...

  8. 英特尔AIDC2018:神经计算棒二代从天而降,软硬生态合作圈尽露锋芒

    允中 发自 国贸大酒店 量子位 报道 | 公众号 QbitAI 浩浩荡荡开了一天半的英特尔人工智能大会(AIDC 2018)刚刚结束.在国贸大酒店三层的大宴会厅里,俨然有地主姿态的英特尔在几场演讲中秀 ...

  9. 树莓派使用神经计算棒1代的准备(Tensorflow)

    硬件:树莓派3B+.神经计算棒1代 步骤: 1.ncsdk的安装 在树莓派连网的情况下,在终端输入 git clone http://github.com/Movidius/ncsdk &&a ...

  10. Alfred Remote初体验

    本文首发:Alfred Remote初体验,本cnblogs博客同步更新 Alfred更新到2.6版本之后,Remote的功能终于可以用了.于是第一时间尝试了一下,感觉还是很棒的BIG那是相当的高. ...

最新文章

  1. Binder 驱动详解(下)
  2. 洛谷——P1605 迷宫
  3. DFT 与 ATPG综 述
  4. SQL 强制指定索引加快查询速度
  5. html怎么让图片自动动起来,css如何让图片动起来?
  6. android模拟器命令行,夜神安卓模拟器命令行整理贴
  7. MyEclipse9.0 XJad的配置
  8. Typora免费版(Typora最后一个版本下载)
  9. Spring学习之浅析refresh()执行逻辑
  10. k8s源码分析 pdf_《k8s-1.13版本源码分析》上github
  11. Tableau交叉表图表
  12. 自动驾驶--高精地图技术
  13. centos7克隆虚拟机
  14. Linux安装谷歌浏览器chrome
  15. C语言实现 扫雷游戏 | 简单项目
  16. VnlnHub Ripper
  17. 20221223英语学习
  18. BZOJ1003: [ZJOI2006]物流运输trans(DP)
  19. 百度网盘极速秒传是什么原理,怎么几个G的刷下就好了?原来是假的,并不是真的将本地文件上传上去了。
  20. 终止python代码运行的三种方式

热门文章

  1. 极飞亮相世界无人机大会,创始人彭斌讲述农业无人机的未来
  2. 数据可视化|用雷达图进行对比分析
  3. 动画插件--WOWJS
  4. 【第三方互联】7、注册成为新浪微博(sina)开发者
  5. Android实现本地图片、视频左右镜像翻转
  6. 服务器怎么改成gpt分区支持,硬盘mbr分区更改成gpt分区的方法
  7. 帝国网站mysql 数据库开发_帝国cms操作数据库函数范例(二次开发)
  8. 身份证号码校验工具类—算法
  9. android 键盘修改回车键监听及无效处理,imeOptions无效处理
  10. 特斯拉又遇致命车祸:车主严重烧伤无法辨认 事故一天后电池复燃