1.vs2019配置opencv3.4.X版本(我是3.4.15),此处配置过程略
2.上C++代码
#include <opencv2/dnn.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/highgui.hpp> #include <Windows.h> #include <fstream> #include <iostream> #include "highgui.h" using namespace cv; using namespace cv::dnn; using namespace std; int main(int argc, char** argv) { String tf_pb_file = "D:\\Files\\Pycharm_files\\NEWCNN\\frozen_models\\MODEL.pb"; Net net = readNetFromTensorflow(tf_pb_file); float inputdata[1][8] = { {0.089277327 ,0.107121679 ,0.097890143, 1.339686044, 1.150469794, 3.420068931 ,3.934685998, 4.338265198} }; 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; }
此处只需要更换一个tf_pb_file 的pb文件,和一个inputdata[1][8]输入数据就行了。
那pb文件怎么的来呢?
我这里采用python tensorflow先训练完成保存MODEL.h5文件,后将MODEL.h5文件冻结成pb文件,下面是冻结代码
import tensorflow as tf from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2 def convert_h5to_pb(): model = tf.keras.models.load_model("./MODEL.h5", compile=False) model.summary() full_model = tf.function(lambda Input: model(Input)) 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="./frozen_models", name="MODEL.pb", as_text=False) convert_h5to_pb()
这样就完成了调用