OpenVINO工具包配置TensorFlow模型(一)

最近领导考虑到生产成本的问题,想要在CPU上运行神经网络,于是研究了一阵Intel推出的OpenVINO工具包。下面主要是介绍在Ubuntu16.04上使用OpenVINO配置TensorFlow模型。

OpenVINO深度学习部署工具套件

OpenVINO的深度学习部署工具套件主要包括两部分,一个是模型优化器,另外一个是推理引擎。模型优化器是由Python编写的,推理引擎是一套C++函数库以及C++的类。

工作原理是对训练产生的网络模型进行优化,优化结果转换成中间表示文件,得到IR文件(xml文件和bin文件)。xml文件中包含优化以后的网络拓扑结构,bin文件优化之后的模型参数和模型变量。

对于TensorFlow框架,对应的模型为pb文件。

环境准备工作

安装

首先,官网上有详细的安装步骤:Install the Intel® Distribution of OpenVINO™ toolkit for Linux*

但是,配置环境总是一件麻烦的事,鬼知道会缺失什么依赖包,到头来没装好不说,还可能影响已有的环境┑( ̄Д  ̄)┍。在即将入坑之际,我发现了现成的docker image,于是果断选择跳过官方指导。。。

sudo docker run -it cortexica/openvino /bin/bash

(使用sudo docker search openvino命令可找到很多相关的images,cortexica/openvino这个image的描述里提到了Ubuntu16.04,所以我选择了这一个)

配置模型优化器

运行容器,进入模型优化器 prerequisites文件夹(不同images中的路径可能有差异,但从deployment_tools这层目录开始应该都一样)

cd  /opt/intel/computer_vision_sdk/deployment_tools/model_optimizer/install_prerequisites

运行脚本

sudo ./install_prerequisites.sh

运行demo验证安装成功

这一步我跳过了,具体操作可以参考Use the Demo Scripts to Verify Your Installation

转换TensorFlow模型

先来关注一下可以转的层:Supported TensorFlow Layers

PS:点名RandomUniform是Not supported。。。什么仇什么怨,不支持别写在表里好不好

其实转的过程很简单,就两小步:

1、进入model_optimizer文件夹

cd  /opt/intel/computer_vision_sdk/deployment_tools/model_optimizer

2、使用mo_tf.py脚本将pb文件转为IR文件

python mo_tf.py --input_model <INPUT_MODEL>.pb --output_dir <OUTPUT PATH>

幻想是丰富的,现实是残酷的,如果真这么简单就能成功,那还记录个啥哦(*/ω╲*) 

对于大部分模型来说,直接运行mo_tf.py得到的应该都是各种各样的ERROR,下面正文正式开始

使用转化参数

mo_tf.py文件除了--input_model和--output_dir这个两个参数以外,还有一大波:

mo_tf文件可输入参数

下面介绍几个比较重要的

Mean and Scale Values

一般来说在训练时我们都会使用归一化的输入,比如从0~255归一化到0~1。还有在使用Image Net等公开数据集的时候,会进行一个去均值的操作。这些都属于简单的数据预处理,乍一看好像和网络没啥关系,但其实影响很大,重点在于预处理部分的代码有没有被写进TensorFlow的拓扑结构里。

如果预处理部分被写进拓扑结构里了,这种主要就是在训练网络时直接读取的原始数据,然后用tf里的函数进行预处理的情况。这种情况下得到的模型,在pb文件里会有预处理相关的node,这些node也会直接转化到xml文件中(前提是OpenVINO支持。。。我在预处理结中使用的tf.map_fn对多图进行处理就一直报错)。

另一种情况是拓扑结构里没有预处理部分,举例就是用numpy对原始数据进行了处理,然后作为tf网络的输入,输入到网络中。由于拓扑结构中没有预处理部分,虽然pb转IR的时候也可以成功,但之后推理的结果肯定是错的。这个时候就需要用到相关参数--scale、 --scale_values,、--mean_values。当mean value和scale value被同时指定时,数据先减去mean value,再除以scale value。

python mo_tf.py --input_model <model_name>.pb --scale_values [59,59,59] --mean_values [177,177,177]

至于怎么看拓扑结构里有没有预处理部分,restore pb文件打印出所有node是一种办法,再直观一点,使用Netron,把pb文件导进去可以直接可视化网络~

这一个参数其实并不影响模型转化的成功与否,只不过没注意的话,转化笑嘻嘻,推理mmp。

接下来的参数会直接影响转化的成败。

Input Shapes

在TensorFlow中, 输入的placeholderr的shape可以被设成None或者-1。这种设置在对输入任意尺寸图片和调整batch size时非常方便。但遗憾的是OpenVINO不接受这么随意的输入。。。

如果在pb文件中,输入没有明确的尺寸的话,需要加入--input_shape参数指定shape,比如[1,128,128,3]。对于batch size不定的情况,再调用mo_tf.py后面加上-b。这两个参数不能同时使用。

python mo_tf.py --input_model <model_name>.pb --input_shape [1,128,128, 3]

python mo_tf.py --input_model <model_name>.pb -b 1

Is_Training

神经网络的输入除了输入数据,一般还会有一个区分train和valid(test)状态的is_training,用来控制batch norm和dropout的状态。这里也有两种情况:

1、train和valid是两份代码,这种情况下,is_training在各自的代码里是True和False的定值,并不会再程序运行中切换,此时的pb文件应该固定的是valid代码中狗的graph,再pb转IR的过程中也无需多加参数;

2、在train的过程中同时进行valid,此时is_training是一个placeholder,会在train时传入True,再valid时传入False,在pb文件中也会存在这个node,此时就需要使用参数--freeze_placeholder_with_value,将is_training(node的名字以自己网络中的为准)的值定为False。

python mo_tf.py --input_model <model_name>.pb --freeze_placeholder_with_value “is_training->False"

Tensorflow模型特有的参数

--tensorflow_use_custom_operations_config

这个参数我没有用到,主要是使用TensorFlow Object Detection API中的模型时会用到,需要传入相应的json配置文件。网上很多在转SSD、Faster RCNN、YOLO等模型发生错误时,使用这个参数导入配置文件后都成功了。

--disable_nhwc_to_nchw

这个参数主要是转换输入维度的,NHWC和NCHW,默认会从NHWC转为NCHW。

实验结果

我自己转换了一个4分类模型,转好后的IR文件存在/opt/intel/computer_vision_sdk/deployment_tools/model_optimizer/model路径下

进入推理引擎文件夹

cd /opt/intel/computer_vision_sdk/deployment_tools/inference_engine/samples/build/intel64/Release

进行推理

./classification_sample -d CPU -i <TEST_IMAGE_PATH> -m <XML_PATH>

在i7-8700KCPU3.70GHz硬件条件下,分类50张图片,

直接使用CPU前传pb文件耗时903.15 ms,使用OpenVINO引推理引擎耗时176.72 ms

总结:加速效果还是明显的,但使用自己的模型转IR文件还是很复杂的,自定义层的转化还需要多多研究~

参考

Intel OpenVINO配置和使用 - James的博客 - CSDN博客

Using the Model Optimizer to Convert TensorFlow* Models | Intel® Software

Model Optimizer Developer Guide | Intel® Software

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,924评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,781评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,813评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,264评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,273评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,383评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,800评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,482评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,673评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,497评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,545评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,240评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,802评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,866评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,101评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,673评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,245评论 2 341

推荐阅读更多精彩内容