C++调用tensorflow模型

2021/7/14 22:34:52

本文主要是介绍C++调用tensorflow模型,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

  1. C++ 和python的混合编程

    • windows + vs

      1. 新建一个工程,在工程属性中添加如下的几个

        C:\Users\[user_name]\Anaconda3\include

        C:\Users\[user_name]\Anaconda3\Lib

        C:\Users\[user_name]\Anaconda3\libs

        具体路径根据自己python的安装情况确定。

      2. 添加附加依赖项 pytyhon36.lib,具体参照自己的文件路径以及python版本

      1. 如果需要在DEBUG下运行,需要修改pyconfig.h文件,我的电脑上的位置为C:\Users\chmtt\Anaconda3\include\pyconfig.h 打开以后在293行,将python36_d.lib修改为python36.lib 即可。如果直接在release下运行无需操作。

      2. 假设需要调用的python脚本为

        默认你已经写好tensorflowpython脚本,并能跑成功。(tensorflow的使用不是本文重点)
        c++需要调用的就是这个classify.py里面的evaluate函数,传入图片路径,返回分类结果给c++程序

        from PIL import Image
        import numpy as np
        import tensorflow as tf
        
        def evaluate(pic):
            image = Image.open(pic)
            image = image.resize([256, 256])
            image_array = np.array(image)
            with tf.Graph().as_default():
                	#里面就是对图像读取模型,预测,得到prediction……
                    max_index = np.argmax(prediction)
                    return max_index
        
      3. C++Demo

        #include <Python.h>
        #include <iostream>
        
        
        int main(int argc, char** argv)
        {
            const char* picpath ="/home/pdd/PD/c++/c++python/pic/0.0.jpg";
            Py_Initialize(); 
                if ( !Py_IsInitialized() ) {  
                return -1;  
                }  
                PyRun_SimpleString("import sys");
                PyRun_SimpleString("sys.path.append('./')");
            PyObject* pMod = NULL;
            PyObject* pFunc = NULL;
            PyObject* pParm = NULL;
            PyObject* pRetVal = NULL;
            int iRetVal = -999;
            const  char* modulName="classify";    //这个是被调用的py文件模块名字
            pMod = PyImport_ImportModule(modulName); 
            if(!pMod)
            {
                return -1;
            }
            const char* funcName="evaluate";  //这是此py文件模块中被调用的函数名字
            pFunc = PyObject_GetAttrString(pMod, funcName); 
            if(!pFunc)  
            {   
                return -2;  
            }  
            pParm = PyTuple_New(1);
            PyTuple_SetItem(pParm, 0, Py_BuildValue("s",picpath));//传入的参数,是图片的路径
            pRetVal = PyEval_CallObject(pFunc, pParm);//这里开始执行py脚本
            PyArg_Parse(pRetVal, "i", &iRetVal);//py脚本返回值给iRetVal
            //PyErr_Print();
            std::cout<<iRetVal;
            return iRetVal;
        }
        
    • ubuntu

      安装了anaconda, tensorflow

      C++ 和 python代码与上面类似。在构建执行文件时

      main:c++python.cpp
          g++ -o out c++python.cpp -I/home/pdd/anaconda3/include/python3.6m -lpython3.6m -L /home/pdd/anaconda3/lib
      
      clean:
          rm -rf *.o 
      

      -I后面的/home/pdd/anaconda3/include/python3.6m有需要的Python.h

      -lpython3.6m链接到需要的libpython3.6m.so;

      -L指出链接的路径。

      终端输入make。如果提示需要什么libpython3.6m.so,就把/home/pdd/anaconda3/lib下的libpython3.6m.*.so复制到/usr/lib/下(sudo cp ——–)  此时再次输入make,一切ok!得到out文件,输入./out

  2. 源码编译运行。

    大体的流程如下:

    • 1.使用tensorflow python API编写和训练自己的模型,训练完成后,使用tensorflow saver 将模型保存下来。
    • 2.使用tensorflow c++ API 构建新的session,读取python版本保存的模型,然后使用session->run()获得模型的输出。
    • 3.编译和运行基于tensorflow c++ API写的代码。
    1. Ubuntu
    2. windows


这篇关于C++调用tensorflow模型的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程