目前深度学习越来越火,学习、使用tensorflow的相关工作者也越来越多。但是目前绝大部分的python都是拥有着丰富的python的API,而c++的API不够完善。这就导致绝大多是使用tensorflow的项目都是基于python。
如果项目是由c++编写,想调用python下的tensorflow?可参考本教程(tensorflow模型是CNN卷积神经网络)
具体步骤:
1.python环境
首先安装python,可以在Anaconda官网直接下载。记住python一定选择64bit,目前tensorflow不支持32位的python,这也是我之前被坑过的地方。下载Anaconda后直接
1
|
bash Anaconda3 - 4.3 . 1 - Linux - x86_64.sh
|
就可以安装,然后
1
|
gedit ~ / .bashrc
|
在最后面加上
1
|
export PATH = / <你的anaconda路径> / bin :$PATH
|
将python安装路径添加到系统路径中,这样在终端敲python后会运行安装的python3.6,如下图所示,代表安装成功:
2.tensorflow
直接终端输入:
pip install tensorflow
就会自动帮你安装到python下。
如果出现类似“没有找到匹配版本”(或者红色英文提示),那么你可能装的是python32bit版本,暂时不支持tensorflow!
安装成功后在终端如下操作:
显示tensorflow版本,表示安装成功!
3.C++Demo
一个简单的c++调取python+tensorflow的demo,按照实际需要可以依葫芦画瓢。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#include <Python.h>
#include <iostream>
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= "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;
}
|
4.tensorflow的python脚本
默认你已经写好tensorflow的python脚本,并能跑成功。(tensorflow的使用不是本文重点)
c++需要调用的就是这个classify.py里面的evaluate函数,传入图片路径,返回分类结果给c++程序。
1
2
3
4
5
6
7
8
9
10
11
|
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
|
5.c++调用python脚本的环境
这时候需要写一个简单的makefile加入需要的依赖环境。例如c++代码第一行的Python.h和相关的库文件。
简单的makefile如下:
1
2
3
4
|
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。任务完成!
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。如果你想了解更多相关内容请查看下面相关链接
原文链接:https://blog.csdn.net/qq_34484472/article/details/76598852