tensorflow  python创建模型,训练模型,得到.pb模型文件后,用c++ api进行预测

 #include <iostream>
#include <map> #include "tensorflow/cc/ops/image_ops.h"
#include "tensorflow/cc/ops/standard_ops.h"
#include "tensorflow/core/framework/graph.pb.h"
#include "tensorflow/core/framework/tensor.h"
#include "tensorflow/core/graph/default_device.h"
#include "tensorflow/core/graph/graph_def_builder.h"
#include "tensorflow/core/platform/logging.h"
#include "tensorflow/core/platform/types.h"
#include "tensorflow/core/public/session.h" using namespace std ;
using namespace tensorflow;
using tensorflow::Tensor;
using tensorflow::Status;
using tensorflow::string;
using tensorflow::int32; //从文件名中读取数据
Status ReadTensorFromImageFile(string file_name, const int input_height,
const int input_width,
vector<Tensor>* out_tensors) {
auto root = Scope::NewRootScope();
using namespace ops; auto file_reader = ops::ReadFile(root.WithOpName("file_reader"),file_name);
const int wanted_channels = ;
Output image_reader;
std::size_t found = file_name.find(".png");
//判断文件格式
if (found!=std::string::npos) {
image_reader = DecodePng(root.WithOpName("png_reader"), file_reader,DecodePng::Channels(wanted_channels));
}
else {
image_reader = DecodeJpeg(root.WithOpName("jpeg_reader"), file_reader,DecodeJpeg::Channels(wanted_channels));
}
// 下面几步是读取图片并处理
auto float_caster =Cast(root.WithOpName("float_caster"), image_reader, DT_FLOAT);
auto dims_expander = ExpandDims(root, float_caster, );
auto resized = ResizeBilinear(root, dims_expander,Const(root.WithOpName("resize"), {input_height, input_width}));
// Div(root.WithOpName(output_name), Sub(root, resized, {input_mean}),{input_std});
Transpose(root.WithOpName("transpose"),resized,{,,,}); GraphDef graph;
root.ToGraphDef(&graph); unique_ptr<Session> session(NewSession(SessionOptions()));
session->Create(graph);
session->Run({}, {"transpose"}, {}, out_tensors);//Run,获取图片数据保存到Tensor中 return Status::OK();
} int main(int argc, char* argv[]) { string graph_path = "aov_crnn.pb";
GraphDef graph_def;
//读取模型文件
if (!ReadBinaryProto(Env::Default(), graph_path, &graph_def).ok()) {
cout << "Read model .pb failed"<<endl;
return -;
} //新建session
unique_ptr<Session> session;
SessionOptions sess_opt;
sess_opt.config.mutable_gpu_options()->set_allow_growth(true);
(&session)->reset(NewSession(sess_opt));
if (!session->Create(graph_def).ok()) {
cout<<"Create graph failed"<<endl;
return -;
} //读取图像到inputs中
int input_height = ;
int input_width = ;
vector<Tensor> inputs;
// string image_path(argv[1]);
string image_path("test.jpg");
if (!ReadTensorFromImageFile(image_path, input_height, input_width,&inputs).ok()) {
cout<<"Read image file failed"<<endl;
return -;
} vector<Tensor> outputs;
string input = "inputs_sq";
string output = "results_sq";//graph中的输入节点和输出节点,需要预先知道 pair<string,Tensor>img(input,inputs[]);
Status status = session->Run({img},{output}, {}, &outputs);//Run,得到运行结果,存到outputs中
if (!status.ok()) {
cout<<"Running model failed"<<endl;
cout<<status.ToString()<<endl;
return -;
} //得到模型运行结果
Tensor t = outputs[];
auto tmap = t.tensor<int64, >();
int output_dim = t.shape().dim_size(); return ;
}
g++ -g  tf_predict.cpp -o tf_predict -I /usr/include/eigen3 -I /usr/local/include/tf  -L/usr/local/lib/ `pkg-config --cflags --libs protobuf`  -ltensorflow_cc  -ltensorflow_framework

也可以用opencv c++库读取图片Mat复制到Tensor中

 tensorflow::Tensor readTensor(string filename){
tensorflow::Tensor input_tensor(DT_FLOAT,TensorShape({,,,}));
Mat src=imread(filename,);
Mat dst;
resize(src,dst,Size(,));//resize
Mat dst_transpose=dst.t();//transpose auto tmap=input_tensor.tensor<float,>(); for(int i=;i<;i++){//Mat复制到Tensor
for(int j=;j<;j++){
tmap(,i,j,)=dst_transpose.at<uchar>(i,j);
}
} return input_tensor;
}

也可用指针引用的方式转换

             tensorflow::Tensor input_tensor(DT_FLOAT,TensorShape({,height,width,}));
float *tensor_data_ptr = input_tensor.flat<float>().data();
cv::Mat fake_mat(dst.rows, dst.cols, CV_32FC(src.channels()), tensor_data_ptr);
dst.convertTo(fake_mat, CV_32FC3);

tensorflow c++ API加载.pb模型文件并预测图片的更多相关文章

  1. xBIM 实战01 在浏览器中加载IFC模型文件

    系列目录    [已更新最新开发文章,点击查看详细]  一.创建Web项目 打开VS,新建Web项目,选择 .NET Framework 4.5  选择一个空的项目 新建完成后,项目结构如下: 二.添 ...

  2. xBIM 实战02 在浏览器中加载IFC模型文件并设置特效

    系列目录    [已更新最新开发文章,点击查看详细]  在模型浏览器中加载模型后,可以对模型做一些特殊操作.下图是常用的设置. 都是通过 xbim-viewer.js 中的 API 来设置以达到一定的 ...

  3. iOS 加载本地 HTML 文件 CSS 样式图片无效果

    在开发的过程中,有时候需要加载一些 HTML 页面,对于不太复杂的界面,基本上都可以放到本地用 UIWebview 来加载,但是在开发过程中会碰到 UIWebview 加载出来的 HTML 页面没有图 ...

  4. tensorflow数据加载、模型训练及预测

    数据集 DNN 依赖于大量的数据.可以收集或生成数据,也可以使用可用的标准数据集.TensorFlow 支持三种主要的读取数据的方法,可以在不同的数据集中使用:本教程中用来训练建立模型的一些数据集介绍 ...

  5. 机器学习之保存与加载.pickle模型文件

    import pickle from sklearn.externals import joblib from sklearn.svm import SVC from sklearn import d ...

  6. Qt3D使用assimp加载常规模型文件

    Qt3D使用assimp加载三维模型文件,assimp支持很多常规格式的三维模型格式: 其中支持导入的格式有: 3D 3DS 3MF AC AC3D ACC AMJ ASE ASK B3D BLEND ...

  7. 开园第一篇---有关tensorflow加载不同模型的问题

    写在前面 今天刚刚开通博客,主要想法跟之前某位博主说的一样,希望通过博客园把每天努力的点滴记录下来,也算一种坚持的动力.我是小白一枚,有啥问题欢迎各位大神指教,鞠躬~~ 换了新工作,目前手头是OCR项 ...

  8. iOS边练边学--plist文件,懒加载,模型初使用--补充instancetype

    一.什么是plist文件 1>将数据直接写在代码里面,不是一种合理的做法.如果数据经常修改,就要经常翻开对应的代码进行修改,造成代码扩展性低 2>因此,可以考虑将经常变得数据放在文件中进行 ...

  9. 查看tensorflow pb模型文件的节点信息

    查看tensorflow pb模型文件的节点信息: import tensorflow as tf with tf.Session() as sess: with open('./quantized_ ...

随机推荐

  1. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记1——创建窗口&GDI

    第1章 创建窗口 步骤: 窗口类的设计 窗口类的注册 窗口的正式创建 窗口的显示与更新 消息循环体系 窗口过程函数处理消息 1. 设计:使用WNDCLASSEX结构体,这里注意的是C++中的结构体中的 ...

  2. 机器学习方法(五):逻辑回归Logistic Regression,Softmax Regression

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入. 前面介绍过线性回归的基本知识, ...

  3. QT中ui更改后不能更新的解决方法

    ui源文件到界面显示的原理可以网上搜索,这里不再描述.简单讲就是先要从*.ui生成ui_*.h然后再编译,所以界面未更新实际上是因为ui_*.h这个文件没有更新导致的. 出现此问题后我尝试了以下几个方 ...

  4. cmd命令和加密文件玩法

    文本里写入: .LOGsysteminfo //电脑信息ipconfig //ip获取ping baidu.com//测试网络,查看网站服务器地址 9:03 2017/11/10 netplwiz / ...

  5. JSTL 1.1与JSTL 1.2之间的区别?如何下载JSTL 1.2?

    JSTL 1.1与JSTL 1.2之间的区别?如何下载JSTL 1.2? JSTL 1.2中不要求standard.jar架包 您可以在Maven中央仓库中找到它们: http://repo2.mav ...

  6. BootstrapTable与KnockoutJS相结合实现增删改查功能

    http://www.jb51.net/article/83910.htm KnockoutJS是一个JavaScript实现的MVVM框架.通过本文给大家介绍BootstrapTable与Knock ...

  7. 剑指offer-判断是否是平衡二叉树

    private boolean isBalanced = true; public boolean IsBalanced_Solution(TreeNode root) { height(root); ...

  8. java中的object... args参数

    关于java方法中Object... args参数的含义 在阅读google发布的volley源码时,突然看到一个方法中存在这样的写法,如 :v(String format, Object... ar ...

  9. java 反射 获取Class对象的三种方式

    String str="hello world"; //方式一 :通过对象的getClass()方法 Class<?> clazz1 =str.getClass(); ...

  10. python strip() 函数和 split() 函数的详解及实例

    strip是删除的意思:split则是分割的意思.strip可以删除字符串的某些字符,split则是根据规定的字符将字符串进行分割. 1.Python strip()函数 介绍 函数原型 声明:s为字 ...