设为首页 加入收藏

TOP

c++调用python+tensorflow模型(深度学习)
2017-08-06 10:23:15 】 浏览:3216
Tags:调用 python tensorflow 模型 深度 学习

目前深度学习越来越火,学习、使用tensorflow的相关工作者也越来越多。但是目前绝大部分的python都是拥有着丰富的python的API,而c++的API不够完善。这就导致绝大多是使用tensorflow的项目都是基于python。
如果项目是由c++编写,想调用python下的tensorflow?可参考本教程:


本机环境:

Ubuntu14 python3.5 tensorflow1.2

具体步骤:

1.python环境
首先安装python。记住python一定选择64bit,目前tensorflow不支持32位的python,这也是我之前被坑过的地方。,下载Anaconda后直接

bash Anaconda3-4.3.1-Linux-x86_64.sh

就可以安装,然后

gedit ~/.bashrc

在最后面加上

export PATH=/<你的anaconda路径>/bin:$PATH

python安装路径添加到系统路径中,这样在终端敲python后会运行安装的python3.6,如下图所示,代表安装成功:
安装pytohn成功

2.tensorflow
直接终端输入:

pip install tensorflow

就会自动帮你安装到python下。
如果出现类似“没有找到匹配版本”(或者红色英文提示),那么你可能装的是python32bit版本,暂时不支持tensorflow!
安装成功后在终端如下操作:
tensorflow安装成功
显示tensorflow版本,表示安装成功!

3.C++Demo

一个简单的c++调取python+tensorflow的demo,实际项目需要时刻依葫芦画瓢

#include 
  
   
#include 
   
     int main(int argc, char** argv) { 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; char* modulName="classify"; //这个是被调用的py文件模块名字 pMod = PyImport_ImportModule(modulName); if(!pMod) { return -1; } char* funcName="eva luate"; //这是此py文件模块中被调用的函数名字 pFunc = PyObject_GetAttrString(pMod, funcName); if(!pFunc) { return -2; } pParm = PyTuple_New(1); PyTuple_SetItem(pParm, 0, Py_BuildValue("s",picpath));//传入的参数,是图片的路径 pRetVal = Pyeva l_CallObject(pFunc, pParm);//这里开始执行py脚本 PyArg_Parse(pRetVal, "i", &iRetVal);//py脚本返回值给iRetVal //PyErr_Print(); std::cout<
    
     

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

from PIL import Image
import numpy as np
import tensorflow as tf

def eva luate(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

5.c++调用python脚本的环境
这时候需要写一个简单的makefile加入需要的依赖环境。例如c++代码第一行的Python.h和相关的库文件。
简单的makefile如下:

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,结果如下:
结果图
得到结果0。任务完成!

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Hadoop之MapReduce执行原理 下一篇g++和gcc的区别

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目