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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM