C++调用tensorflow模型
C++ 和python的混合编程
windows + vs
新建一个工程,在工程属性中添加如下的几个
C:\Users\[user_name]\Anaconda3\include
C:\Users\[user_name]\Anaconda3\Lib
C:\Users\[user_name]\Anaconda3\libs
具体路径根据自己python的安装情况确定。
添加附加依赖项
pytyhon36.lib
,具体参照自己的文件路径以及python版本
如果需要在
DEBUG
下运行,需要修改pyconfig.h
文件,我的电脑上的位置为C:\Users\chmtt\Anaconda3\include\pyconfig.h
打开以后在293行,将python36_d.lib
修改为python36.lib
即可。如果直接在release
下运行无需操作。假设需要调用的
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
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
源码编译运行。
大体的流程如下:
- 1.使用
tensorflow python API
编写和训练自己的模型,训练完成后,使用tensorflow saver
将模型保存下来。 - 2.使用
tensorflow c++ API
构建新的session
,读取python
版本保存的模型,然后使用session->run()
获得模型的输出。 - 3.编译和运行基于
tensorflow c++ API
写的代码。
- Ubuntu
- windows
- 1.使用
C++调用tensorflow模型的更多相关文章
- ML.NET调用Tensorflow模型示例——MNIST
ML.NET在不久前发行了1.0版本,在考虑这一新轮子的实际用途时,最先想到的是其能否调用已有的模型,特别是最被广泛使用的Tensorflow模型.于是在查找了不少资料后,有了本篇示例.希望可以有抛砖 ...
- 用C++调用tensorflow在python下训练好的模型(centos7)
本文主要参考博客https://blog.csdn.net/luoyexuge/article/details/80399265 [1] bazel安装参考:https://blog.csdn.net ...
- 将TensorFlow模型变为pb——官方本身提供API,直接调用即可
TensorFlow: How to freeze a model and serve it with a python API 参考:https://blog.metaflow.fr/tensorf ...
- [翻译] Tensorflow模型的保存与恢复
翻译自:http://cv-tricks.com/tensorflow-tutorial/save-restore-tensorflow-models-quick-complete-tutorial/ ...
- Tensorflow模型的格式
转载:https://cloud.tencent.com/developer/article/1009979 tensorflow模型的格式通常支持多种,主要有CheckPoint(*.ckpt).G ...
- 移动端目标识别(1)——使用TensorFlow Lite将tensorflow模型部署到移动端(ssd)之TensorFlow Lite简介
平时工作就是做深度学习,但是深度学习没有落地就是比较虚,目前在移动端或嵌入式端应用的比较实际,也了解到目前主要有 caffe2,腾讯ncnn,tensorflow,因为工作用tensorflow比较多 ...
- 移动端目标识别(2)——使用TENSORFLOW LITE将TENSORFLOW模型部署到移动端(SSD)之TF Lite Developer Guide
TF Lite开发人员指南 目录: 1 选择一个模型 使用一个预训练模型 使用自己的数据集重新训练inception-V3,MovileNet 训练自己的模型 2 转换模型格式 转换tf.GraphD ...
- tensorflow 模型保存与加载 和TensorFlow serving + grpc + docker项目部署
TensorFlow 模型保存与加载 TensorFlow中总共有两种保存和加载模型的方法.第一种是利用 tf.train.Saver() 来保存,第二种就是利用 SavedModel 来保存模型,接 ...
- 一份快速完整的Tensorflow模型保存和恢复教程(译)(转载)
该文章转自https://blog.csdn.net/sinat_34474705/article/details/78995196 我在进行图像识别使用ckpt文件预测的时候,这个文章给我提供了极大 ...
- 使用tensorflow-serving部署tensorflow模型
使用docker部署模型的好处在于,避免了与繁琐的环境配置打交道.使用docker,不需要手动安装Python,更不需要安装numpy.tensorflow各种包,直接一个docker就包含了全部.d ...
随机推荐
- 京东LBS推荐算法实践
作者:京东零售 郑书剑 1.推荐LBS业务介绍 1.1 业务场景 现有的同城购业务围绕京东即时零售能力搭建了到店.到家两种业务场景.同城业务与现有业务进行互补,利用高频,时效性快的特点,可以有效提升主 ...
- [网络]HTTPS下服务器与浏览器的通信:HTTPS背后的加密算法 | TLS := SSL [转载]
全文转载自: HTTPS背后的加密算法 - 博客园 1 概述: 基本原理/过程 当你在浏览器的地址栏上输入https开头的网址后,浏览器和服务器之间会在接下来的几百毫秒内进行大量的通信.InfoQ的这 ...
- 【深度学习】【图像分类网络】(二)VisionTransformer
Transformer简介  const HtmlWebpackPlugin = require('html-webpack-plugin') const M ...
- 一文掌握ArrayList和LinkedList源码解读
大家好,我是Leo! 今天来看一下ArrayList和LinkedList的源码,主要是看一下常用的方法,包括像add.get.remove方法,大部分都是从源码直接解读的,相信大家读完都会有一定收获 ...
- #Powerquery pq从入门到精通,笔记梳理
详细视频可以B站搜索,ms_excel博主,看leila的视频翻译课,powerquery从入门到精通. 后续也会根据自己工作来更新这部分的实际用法.
- 2022-09-14:以下go语言代码输出什么?A:0 0;B:0 1;C:1 1;D:1 0。 package main func main() { println(f(1)) } func
2022-09-14:以下go语言代码输出什么?A:0 0:B:0 1:C:1 1:D:1 0. package main func main() { println(f(1)) } func f(x ...
- 2020-12-04:mysql 表中允许有多少个 TRIGGERS?
福哥答案2020-12-04: 在 Mysql 表中允许有六个触发器,如下:BEFORE INSERTAFTER INSERTBEFORE UPDATEAFTER UPDATEBEFORE DELET ...
- 2022-05-30:给定一个n*2的二维数组,表示有n个任务。 一个信息是任务能够开始做的时间,另一个信息是任务的结束期限,后者一定大于前者,且数值上都是正数, 你作为单线程的人,不能并行处理任务,
2022-05-30:给定一个n*2的二维数组,表示有n个任务. 一个信息是任务能够开始做的时间,另一个信息是任务的结束期限,后者一定大于前者,且数值上都是正数, 你作为单线程的人,不能并行处理任务, ...
- 2021-05-26:给定一个char[][] matrix
2021-05-26:给定一个char[][] matrix,也就是char类型的二维数组,再给定一个字符串word,可以从任何一个某个位置出发,可以走上下左右,能不能找到word?char[][] ...