1.编译C++版本的Tensorflow
2.使用opencv调用模型
这里我主要是推荐我觉得可行相关资料链接,我也没走通这条路,大家加油。
https://zhuanlan.zhihu.com/p/259789357
https://www.tensorflow.org/install/source_windows
主要是看官方文档。
我按照官方文档没走通可能是网速问题,翻的不够利索,这边项目时间问题,我先放弃了,如果有走通的兄弟麻烦贴个链接到评论区,我后面再去走走。
在opencv3以后就有dnn模块,可以使用dnn模块去调用。我测试了一下,opencv3和opencv4的版本都支持这样调用TF2.x版本的模型。
#导出pb模型,tensorflow默认模型
model_path= r'E:\ComputerVision\Code\tensorflow_model'
model.save(model_path)
如果直接使用opencv库调用模型会发生错误,需要冻结模型
from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2
import tensorflow.compat.v1 as tf
# Convert Keras model to ConcreteFunction
full_model = tf.function(lambda x: model(x))
full_model = full_model.get_concrete_function(
tf.TensorSpec(model.inputs[0].shape, model.inputs[0].dtype))
# Get frozen ConcreteFunction
frozen_func = convert_variables_to_constants_v2(full_model)
frozen_func.graph.as_graph_def()
layers = [op.name for op in frozen_func.graph.get_operations()]
print("-" * 50)
print("Frozen model layers: ")
for layer in layers:
print(layer)
print("-" * 50)
print("Frozen model inputs: ")
print(frozen_func.inputs)
print("Frozen model outputs: ")
print(frozen_func.outputs)
# Save frozen graph from frozen ConcreteFunction to hard drive
tf.io.write_graph(graph_or_graph_def=frozen_func.graph,
logdir=r'E:\ComputerVision\Code\tensorflow_model',
name="frozen_graph.pb",
as_text=False)
opencv配置我就不讲了,相信大家已经配置好了环境。
#include
#include
#include
#include
int main(int argc, char** argv)
{
//使用tensorflow框架
//读取模型
string pbfile = "E:\\ComputerVision\\Code\\tensorflow_model\\assets\\frozen_graph.pb";
Net net = readNetFromTensorflow(pbfile);
//输入使用的参数转换为Mat类型
float inputdata[1][8] = { {117,13,0,0.22,109.5107,20,50,12} };
Mat data(1, 8, CV_32FC1,inputdata);
//将输入模型中得到结果放在tmp中,tmp的尺寸等于你的输出层
net.setInput(data);
Mat tmp = net.forward();
cout << "tmp" << tmp << endl;
float result = tmp.at<float>(0, 1);
cout << result << endl;
return 0;
}
``
`