概述
最近一直在研究用opencv的dnn模块调用已训练好的tensorflow .pb模型。先声名一下,最终还是没有调用成功,但是中间趟过了好多的坑,觉得有必要记录一下,并且最终没有调用成功的主要原因是我想要加载的模型中的一部分确实是和opencv调用tensorflow模型存在冲突。
首先,我想要调用的模型是keras训练出来的OCR模型,因此,需要先把已有的.hdf5模型文件转换成.pb文件,这里使用这个方法就行https://github.com/amir-abdi/keras_to_tensorflow,该方法既可以转换保存了网络和权重的模型,也可以转换只保存权重的模型,不过对于仅保存权重的模型,需要在模型的基础上再生成一个模型json文件,关于这个网上的方法比较多(https://blog.csdn.net/qq_35290785/article/details/95245155)。转换成pb模型后,我又测试了一下,确保模型可以正常预测。
接下来就是要用dnn调用pb模型了,于是使用
cv2.dnn.readNetFromTensorflow('./model.pb')
加载pb模型,报错:
Input layer not found: out/bias in function 'cv::dnn::dnn4_v20191202::`anonymous-namespace'::TFImporter::connect'
经查,这个问题基本上就是没有同时加载.pbtxt文件导致的。那就用pb生成.pbtxt,这里我使用了不同版本的代码,生成出来的pbtxt内容也不尽相同,但是最终找到了这个比较靠谱的方法,也是opencv开发者推荐的方法:https://github.com/opencv/opencv/wiki/TensorFlow-text-graphs。用了这个后,我发现之前我用的生成pbtxt的方法确实让我陷入坑中好久。其中最大的一个坑就是这个错误:
cv::dnn::dnn4_v20191202::`anonymous-namespace'::addConstNodes'
对于这个问题我几乎翻遍了所有Opencv Issues 和 Stackoverflow上的所有相关问题,觉得也就是这个还不错,值得参考https://github.com/opencv/opencv/issues/17174。当然,这个问题我最终还是通过换成了官方生成pbtxt的方法后解决的。
最后,我遇到了这个问题:
Only NHWC <-> NCHW permutations are allowed. in function 'cv::dnn::dnn4_v20191202::`anonymous-namespace'::TFImporter::populateNet
然后我发现opencv调用tensorflow时只接受NHWC或者NCHW两种模式的输入,可是我用的这个模型里面,竟然把H和W调换了一下…没办法了…谁让这是别人写的模型,我只有调用的份,因此发现没有办法了,opencv调用的方式看来是堵死了,下步准备使用tensorflow c++尝试去调用吧…
最后
以上就是忧郁白羊为你收集整理的Opencv dnn模块调用tensorflow模型的全部内容,希望文章能够帮你解决Opencv dnn模块调用tensorflow模型所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复