Windows平台,使用C++调用Tensorflow2.x训练好的模型

主要方法

1.编译C++版本的Tensorflow
2.使用opencv调用模型

编译C++版本的Tensoflow

这里我主要是推荐我觉得可行相关资料链接,我也没走通这条路,大家加油。
https://zhuanlan.zhihu.com/p/259789357
https://www.tensorflow.org/install/source_windows
主要是看官方文档。
我按照官方文档没走通可能是网速问题,翻的不够利索,这边项目时间问题,我先放弃了,如果有走通的兄弟麻烦贴个链接到评论区,我后面再去走走。

使用opencv调用模型

在opencv3以后就有dnn模块,可以使用dnn模块去调用。我测试了一下,opencv3和opencv4的版本都支持这样调用TF2.x版本的模型。

Tensorflow导出模型

#导出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调用模型

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;
}
``
`

你可能感兴趣的:(熊熊要加油,神经网络,机器学习,tensorflow,c++)