#在Tensorflow2.3框架下训练的深度网络模型,目标用于工业部署,所以需要将训练好的模型保存,转成用于C++工业部署的文件格式,期间不断遇到问题,最终成功转换,记录下过程,避免后人踩坑。
1、tensorflow2.0框架下训练的深度学习模型保存为.pb文件
model.saved(model, "./direction") #model为模型名字,依据自己的模型来修改,"./direction"为保存路径保存后目录下包含.pb文件和variables、assets两个文件夹,如下。此模型保存的文件为模型、参数、变量分开的模式,属于Non-Frozen Models。
--save_model --assets --variables --variables.data-00000-of-00001 --variables.index --saved_model.pb2、安装VS+openvino+Cmake 这里安装都是vs2019社区版 + openvino2020.04。28版 + Cmake3.14.0 网上很多教程,推荐参考 【OpenVINO之二:Windows环境下OpenVINO安装与配置】 【Openvino系列-环境安装(window10+vs2019)(一)】 提醒:安装openvino和Cmake最好默认安装路径,勾选设置环境变量,否则后期会出现些许问题。 *如果出现“cmake不是内部或外部命令”,检测C:\Program Files\CMake\bin是否填入了环境变量,重新添加并打开cmd再次运行即可。【OpenVINO2019R3和VS2015编译配置教程大全】
3、SaveModel模型文件在openvino下转成IR文件,用于部署 注意:采用SaveModel保存后的模型文件属于Non-Frozen Models,无法直接使用以下命令直接pb转IR,网上好多教程都使用以下例如命令,均不适用于tensorflow2.x版本SaveModel保存的模型。
python mo_tf.py --input_model xxx.pb --input_shape [1,224,224,3] --mean_value [127.5,127.5,127.5] --scale 127.5结果都是转换失败,网上有给出解释如下: 【TF2.0 create a single pb file without additional folders or files?】 在openvino官网找到具体操作,教程如下:
配置环境 cd C:\Program Files (x86)\IntelSWTools\openvino\bin\ #使用setupvars.bat配置的环境变量只针对当前打开的cmd,当前如果关闭,openvino环境变量失效 #可以配置固定的环境变量,需要用记事本打开setupvars.bat按照里面的配置,配置到系统变量即可 setupvars.bat 配置成功出现如下结果 配置模型优化器 cd C:\Program Files(x86)\IntelSWTools\openvino\deployment_tools\model_optimizer install_prerequisites_tf.bat #tensorflow框架用,其他框架执行其他文件 开始转换模型文件为IR格式,参考 【openvino Tensorflow Modell】SavedModel format of TensorFlow 1.x and 2.x versions: 1.In this case, a model consists of a special directory with a .pb file and several subfolders: variables, assets, and assets.extra. For more information about the SavedModel directory, refer to the README file in the TensorFlow repository. 2.To convert such TensorFlow model: Go to the <INSTALL_DIR>/deployment_tools/model_optimizer directory Run the mo_tf.py script with a path to the SavedModel directory to convert a model:
python3 mo_tf.py --saved_model_dir <SAVED_MODEL_DIRECTORY>
不过执行不成功,然后我重新将python3改成python,管理员身份执行命令:
python mo_tf.py --saved_model_dir <SAVED_MODEL_DIRECTORY> --output_dir <DIRECTORY> --input_shape [1,128,128,3] --mean_value [127.5,127.5,127.5] --scale 127.5 --data_type=FP32 //--save_model_dir: tensorflow2.0 SaveModel后的模型文件, --**assets** --**variables**--variables.data-00000-of-00001--variables.index --**saved_model.pb** //--input_shape: 输入模型的张量维度 //--mean_value: 这里是归一化([0,255]-[-1,1])中的减均值 //--scale: 这里是归一化([0,255]-[-1,1])中的整除 //--data_type: 设定网络节点的精度,如FP32、FP16、U8更改后执行成功,结果如下: 模型文件成功转成.bin/.mapping/.xml三个文件,至此成功转换。
折腾了将近四天时间,徘徊在tensorflow保存pb文件 和 pb转IR文件这两个过程, 总结:
Tensorflow2.0框架下保存SaveModel模型,包含的.pb文件仅包含模型结构,无法直接单独用openvino转成IR文件,在保存.pb文件这一操作上花费了一两天的时间,把各种方法都使用了,还是没能成功,期间还把Tensorflow1.x的操作方法也尝试了,当然也没用。一开始没有觉察openvino转换.pb文件对Tensorflow版本是由不同的操作(适应性), 经夏博提醒,转换思想,从openvino软件转tensorflow1.x和tensorflow2.x模型文件操作方法是否有区别的角度寻找解决方法,结果在官网找到解决的操作,不复杂,只是没有找到对的方法。执行官网的操作命令后,仍然出现权限的问题,重新以管理员身份进入cmd后执行命令,成功。 希望对大家有所帮助!