Tensorflow深度学习网络应用——英特尔神经计算棒编译

      因为偶然的机会,我接触到从事嵌入式开发的团队的英特尔神经计算棒项目,得以熟悉英特尔神经计算棒的使用过程。本篇博客主要是记录我5天来的调试工作,为将来从事嵌入式开发,有可能应用到神经计算棒做图像处理的同志留一些经验。

      首先来介绍英特尔这款神经计算棒。英特尔这款计算棒,利用自己开发的Movidius视觉处理单元(VPU)来加速计算,使得处理图像分类任务的深度学习网络可以方便快速的移植到嵌入式开发板上,它之于嵌入式开发板类似于GPU于电脑主机,但是本身这个计算棒还是和GPU有很大差距的。目前这款计算棒只支持Ubuntu16.04等以上的系统,支持c语言、c++和python开发。团队开发的环境正好是搭载Ubuntu16.04 的嵌入式板,因此我完全是在Ubuntu16.04的电脑上使用python3.5完成了神经计算棒的整个开发,移植到嵌入式板上毫无差别。而英特尔神经计算棒的开发,主要就是将深度学习网络固化成计算棒可识别的graph格式,需要明确网络的输入节点和输出节点以便编译器识别。

  1.  开始开发工作,首先要安装计算棒本身的软件工具下载。有两个版本,因为版本2功能更多,支持的网络更多,所以这里我安装的是2.0.5的版本。
  2. 确定深度学习网络使用的深度学习框架。计算棒支持TensorFlow、caffe两大网络框架,在这里我使用的是TensorFlow。TensorFlow开发指南
  3. 确定要使用的网络结构和编译方法。这一步是很容易出现bug的,一般刚上手计算棒的人很难通过编译,这也和计算棒本身编译资料少,使用者少,相关排错帖子少有关,我在开发的时候,也花了大量的时间在编译上。首先,在TensorFlow的网络开发指南上,将TensorFlow编写的网络分为3种编译方法:
  • 基于TensorFlow的几个典型网络,有收入计算棒的示例网络中的网络比如mobilenet等,可以直接下载TensorFlow的源代码和weight存储文件,将其固化成graph使用。具体的操作方法在指南中有附。可以在GitHub上查找支持的网络支持网络。
  • 基于TensorFlow-slim搭建的网络,slim是TensorFlow的一个API,基于这个API搭建的网络的编译方法,但是因为我不熟悉Slim这个API,所以我也没有用
  • 基于TensorFlow自行搭建的网络,多数开发者用的可能是这种网络。自行训练的网络需要将网络结构和参数保存成xxx.ckpt 文件,这个文件将被转换成拥有输入节点和输出节点的新的网络结构xxx_inference.ckpt,最后再由xxx_inference.meta文件编译成graph文件。在TensorFlow开发指南上有说明网络的修改方法,主要是:

(1)添加输入节点,并命名(命名这点很重要,因为编译器是靠名字找到输入节点和输出节点的)

(2)修改网络结构,去掉dropout层 

(3)添加输出节点并命名(输出节点一定要命名,并且不能将网络的最后一个节点直接作为输出节点,这个我也不知道为什么,但是直接将网络的最后一个节点作为输出节点报错了) 

(4)重新加载之前网络的.ckpt文件,生成一个新的有输入节点和输出节点的网络的ckpt文件   

(5)最后编译(如果你所有的操作都做了,但是不一定能编译通过,因为计算棒的编译器并不是支持TensorFlow所有的函数,如果你用了它不支持的函数。。。。。就会报错找不到此函数-错误号5,但是如果通过了,基本上就可以用了)

mvNCCompile mnist_inference.meta -s 12 -in 输入节点名 -on 输出节点名 -o xxx.graph

 (6)调用自己生成的graph来测试graph,在这里我们发现了graph文件只能输出一维数组。。。。。所以设计网络时要确定自己的输出是有效的 

       在这次开发中,我使用的是YOLO_small网络,网络工作是圈出图像中人的位置。这是一个简单模型,使用TensorFlow自行编写,选择第三种编译方式。本身模型更改并不难,但是在编译过程中遇到了很多的问题,比如TensorFlow的函数计算棒不支持、找不到输出节点、输出的数据格式不支持等等。

        好在使用的编译器ncsdk2.0.5支持了Tiny_YOLO_V2网络,因此我在Tiny_YOYLO_v2网络上进行了修改编译,最终生成了可用的grapy。之后会保存提交整个文档,包含Tiny_YOLO_V2网络的编译、调用文件,以及自己修改的mnist的示例代码以供参考。

最后说一下计算棒的使用体验。目前来讲,我觉得英特尔计算棒的开发工作还在一个起步阶段,它的编译、纠错等方面还没有形成系统,使用者遇到问题需要花很大的力气查错,而网络上计算棒的使用帖少之又少。而且计算棒支持的网络比较少,应用还比较窄,因此目前还有很多局限,建议开发者使用计算棒支持的网络进行开发,这样可以规避很多漏洞。鸣谢和我一起开发的师兄,给了我很多指导。

你可能感兴趣的:(计算棒)