c++、python混合编程(c++调用tensorflow lite转换模型)

1.混合编程的目的

为了在C++主程序中调用,python训练好的神经网络模型,来预测数据。

2.环境

1.win10,
2.vs2015
3.python3.7

3.在VS中配置环境和库

在这里插入图片描述
说明:我的python使用anaconda虚环境安装。
1.右击项目->属性->VC++目录
1)包含目录:
Python安装路径/include
2)库目录:
Python安装路径/libs

2.右击项目->属性->连接器->输入->附加依赖库
在这里插入图片描述
1.debug下:
python安装目录/libs/python37.lib
2.release下:
python安装目录/libs/python37_d.lib
请注意:
1、debug配置的时候可能没有python37_d.lib,那就把python37.lib复制一个,然后重命名为python37_d.lib就可以啦
2、如果一直报错,但是包含头文件等都没有问题,那么你需要看一下你的python是32位还是64位的。然后根据python的环境去配置vs的环境。
若是64位。请在这里修改为X64

在这里插入图片描述

4.C++中运行python代码

在这里插入图片描述
三个文件如图所示:
tensor_model.h

#include<python.h>

float tensor_model(float size, float gap);

tensor_model.cpp

#include"tensor_model.h"

float tensor_model(float size, float gap)
{
	float res = 0;

   //这里需修改成你的主机上python安装的目录
	Py_SetPythonHome(L"C:\\Users\\caichunbing\\Anaconda3");
	//嵌入python代码
	Py_Initialize();
	PyObject *pModule, *pFunc;
	PyObject *pValue, *psize, *pName;
	
	//导入tensor_model.py
	pName = PyUnicode_DecodeFSDefault("tensor_model");
	pModule = PyImport_Import(pName);
	Py_DECREF(pName);
	if (pModule != NULL)
	{
		//若导入tensor_model.py 导入成功,则加载模块里的func函数
		pFunc = PyObject_GetAttrString(pModule, "func");
		if (pFunc != NULL)
		{
			psize = PyTuple_New(2);
			PyTuple_SetItem(psize, 0, PyFloat_FromDouble(size));
			PyTuple_SetItem(psize, 1, PyFloat_FromDouble(gap));
			//传入参数
			pValue = PyObject_CallObject(pFunc, psize);
			res = PyFloat_AsDouble(pValue);
		}
		else
		{
			printf("load func  failure");
		}
	}

main.cpp

#include"tensor_model.h"

int main()
{
	float size = 1000;
	float gap = 25;
	float r;

	r= tensor_model(size, gap);

	printf("size=%f  gap=%f  ==> r=%f", size, gap, r);
	getchar();
	return 0;
}

注意,需导入tensor_model.py 需和生成的.exe文件 放在同一个目录。
在这里插入图片描述
下面是tensor_model.py代码

import numpy as np
import tensorflow as tf
def func(Size,Gap):
    #读取用tensorflow lite转换为.tflite的神经网络模型
    interpreter = tf.lite.Interpreter(model_path="./save_model.tflite")
    interpreter.allocate_tensors()
    input_details = interpreter.get_input_details()
    output_details = interpreter.get_output_details()
    input_shape = input_details[0]['shape']
    sizemax=200.0
    sizemin=60.0
    gapmax=96.20340108290398
    gapmin=19.23409151033765
    rmax=336.965204923026
    rmin=45.09967318837701
    size=Size
    gap=Gap
	#归一化操作
    x1 = (size - sizemin) / (sizemax - sizemin)
    x2 = (gap - gapmin) / (gapmax - gapmin)
    input_data=np.array(np.array([[x1,x2]]), dtype=np.float32)
    interpreter.set_tensor(input_details[0]['index'], input_data)
    interpreter.invoke()
    output_data = interpreter.get_tensor(output_details[0]['index'])
	#反归一化操作
    predout = output_data * (rmax - rmin) + rmin
	//得到从神经网络的输出值
    pre=float(predout)
    return pre

注意,save_model.tflite模型文件需和main.cpp源文件放在一起
在这里插入图片描述
5.参考:用tensorflow lite工具,转换模型为.tflite

import tensorflow as tf

#saved_model.pb文件所在目录
saved_model_dir = "./save/saved_model"
input_arrays = ['Placeholder']
output_arrays = ['add_1']
input_shapes={'Placeholder':[None,2]}
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir,input_arrays,input_shapes,output_arrays)
tflite_model = converter.convert()
open("save_model.tflite", "wb").write(tflite_model)
发布了43 篇原创文章 · 获赞 19 · 访问量 8531

猜你喜欢

转载自blog.csdn.net/weixin_43590290/article/details/97390830