C++调用tensorflow教程

 更新时间:2018年10月16日 12:05:31   作者:Panda_Peng  
今天小编就为大家分享一篇关于C++调用tensorflow教程,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

目前深度学习越来越火,学习、使用tensorflow的相关工作者也越来越多。但是目前绝大部分的python都是拥有着丰富的python的API,而c++的API不够完善。这就导致绝大多是使用tensorflow的项目都是基于python。

如果项目是由c++编写,想调用python下的tensorflow?可参考本教程(tensorflow模型是CNN卷积神经网络)

具体步骤:

1.python环境

首先安装python,可以在Anaconda官网直接下载。记住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,如下图所示,代表安装成功:

2.tensorflow

直接终端输入:

pip install tensorflow

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

显示tensorflow版本,表示安装成功!

3.C++Demo

一个简单的c++调取python+tensorflow的demo,按照实际需要可以依葫芦画瓢。

#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++程序。

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如下:

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。任务完成!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • 如何在C语言中提取Shellcode并执行

    如何在C语言中提取Shellcode并执行

    Shellcode是一种独立于应用程序的机器代码,通常用于实现特定任务,如执行远程命令、注入恶意软件或利用系统漏洞,本文将深入探讨如何在C语言中提取Shellcode,并通过XOR加密技术增加其混淆程度,文中通过代码示例讲解的非常详细,需要的朋友可以参考下
    2023-12-12
  • C/C++ Qt QChart绘图组件的具体使用

    C/C++ Qt QChart绘图组件的具体使用

    QtCharts 组件是QT中提供图表绘制的模块,用来绘制常规图形,本文就详细的介绍了QChart的使用,以及柱状图,折线图等常用的图形的实现,感兴趣的可以了解一下
    2021-11-11
  • C++实现动态分配const对象实例

    C++实现动态分配const对象实例

    这篇文章主要介绍了C++实现动态分配const对象实例,包括了const对象的创建、删除及应用实例,需要的朋友可以参考下
    2014-10-10
  • C++算法学习之贪心算法的应用

    C++算法学习之贪心算法的应用

    贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。本文为大家准备了几个示例,从而能深入了解贪心算法的应用,需要的可以参考一下
    2022-05-05
  • 一篇文章带你了解C语言二分查找

    一篇文章带你了解C语言二分查找

    这篇文章主要为大家详细介绍了C语言二分查找法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Qt实现界面滑动切换效果的思路详解

    Qt实现界面滑动切换效果的思路详解

    这篇文章主要介绍了Qt实现界面滑动切换效果,主要包括设计思路及主要函数讲解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Qt实现文件的压缩和解压缩操作

    Qt实现文件的压缩和解压缩操作

    这篇文章主要为大家详细介绍了如何使用Qt库中的QZipReader和QZipWriter实现文件的压缩和解压缩功能,文中的示例代码简洁易懂,需要的可以参考一下
    2024-12-12
  • C++中不得不说的map容器

    C++中不得不说的map容器

    大家好,本篇文章主要讲的是C++中不得不说的map容器,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • C语言实现三子棋游戏(初级版)

    C语言实现三子棋游戏(初级版)

    这篇文章主要为大家详细介绍了C语言实现三子棋游戏初级版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • C++预定义的流对象基本示例详解

    C++预定义的流对象基本示例详解

    这篇文章主要为大家介绍了C++预定义的流对象基本示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04

最新评论