OpenVINO的深度学习部署工具套件主要包括两部分,一个是模型优化器,另外一个是推理引擎。模型优化器是由Python编写的,推理引擎是一套C++函数库以及C++的类
工作原理是对训练产生的网络模型进行优化,优化结果转换成中间表示文件,得到IR文件(xml文件和bin文件)。xml文件中包含优化以后的网络拓扑结构,bin文件优化之后的模型参数和模型变量。
对于TensorFlow框架,对应的模型为pb文件。
对于mxnet框架,对应的模型为.params文件
环境配置参照官方
https://software.intel.com/en-us/articles/get-started-with-neural-compute-stick
1.代码github官方网址:
https://github.com/opencv/openvino_training_extensions
git clone https://github.com/opencv/openvino_training_extensions.git
可以在上面的包下载下来后,稍微的修改一下代码,可以把vehicle_attributes的训练跑起来,git上本身有训练数据,我是在linux上的pycharm ,anaconda3下跑完训练的,也就是说训练与openvino没有关系
其它参考网址:
https://github.com/PINTO0309/OpenVINO-YoloV3
2。将训练好的ckpt转换为pb文件。
比如生成了一个reconize.pb,文件路径自己定义,比如我放在了
/home/jerry/test_model_wang/reconize.pb
3: 按照官方地址配置环境时,觉得麻烦,可以参考下面博客来配置openvino
https://blog.csdn.net/weixin_43741611/article/details/89365458
这个博客中
./demo_squeezenet_download_convert_run.sh
这里有问题,原因是环境配置不对,还没有解决
在运行
cd ~/intel/openvino/deployment_tools/demo
./demo_squeezenet_download_convert_run.sh -d MYRIAD
#用棒进行推断,要求xml是16
4:把pb模型转换为openvino推理需要的bin和xml文件
4.1 ctrl_alt_t 打开一个新终端,输入
cd /opt/intel/openvino_2019.1.144/deployment_tools/model_optimizer
4.2 在4.1的终端中,输入
sudo python3 mo.py --framework=tf --input_model=/home/jerry/test_model_wang/graph.pb.frozen --output_dir=/home/jerry/test_model_wang/ --model_name=vehicle_attributes --scale=255 --input_shape=[1,72,72,3] --data_type=FP32
注意:若是tensorflow,可以不指定input_shape,指定--b=1就可以了,但对于mxnet,必须指定input_shape
4.3 可以运行成功,结果如下
[ SUCCESS ] Generated IR model.
[ SUCCESS ] XML file: /home/jerry/test_model_wang/vehicle_attributes.xml
[ SUCCESS ] BIN file: /home/jerry/test_model_wang/vehicle_attributes.bin
[ SUCCESS ] Total execution time: 2.10 seconds.
但是若输入
sudo python3 mo.py --input_model /home/jerry/test_model_wang/reconize.pb
时,就运行报错。
一些问题:Frequently Asked Questions (FAQ)
1. https://software.intel.com/en-us/forums/computer-vision/topic/805425
2. 转换TensorFlow模型时,需要关注一下都可以转换那些层,对于有些层,会转不成功的,比如我的模型中用了keras的
LeakyReLU()层,虽然转换成xml没问题,但转成的xml在推理时就会报错,暂时解决方法,换成ReLU()
3.mo.py文件除了--input_model和--output_dir这个两个参数以外,还有一大波:
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。
4. 对于某些不支持的操作和自定义层,可参考,这个网页How to Build a Custom Layer to Offload Computations to TensorFlow*后面的没看懂,没有试验
4.1 自定义层只支持在cpu,棒子等不支持
4.2 IE推理时是NCHW, 但tensorflow是nhwc,因此在推理时会有一个转换,这些转换会在XML文件中有描述
4.3, 用可选参数-- tensorflow_subgraph_patterns, 后面可以跟用逗号分开的节点名字
4.4 用可选参数--tensorflow_operation_patterns,去掉一些不支持的op,后面是用逗号隔开的正则表达式,比如下面的表达,可以卸载掉所有的Concat, ConcatV2, Add, BiasAdd操作
--tensorflow_operation_patterns "Concat.*,.*Add"