开源框架---tensorflow c++ API 运行第一个“手写字的例子”

开源框架---tensorflow c++ API 运行第一个“手写字的例子”

开源框架---tensorflow c++ API 运行第一个“手写字的例子”

#CMakeLists.txt

cmake_minimum_required (VERSION 2.8.8)
project (tf_example)
 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++11 -W")

#link_directories(./lib)

include_directories(
   /home/u/tf1.13/tensorflow-GPU
   /home/u/tf1.13/tensorflow-GPU/bazel-genfiles
   /home/u/tf1.13/tensorflow-GPU/bazel-bin/tensorflow
   /home/u/tf1.13/tensorflow-GPU/tensorflow/contrib/makefile/downloads/nsync/public
   /home/u/tf1.13/tensorflow-GPU/tensorflow/contrib/makefile/gen/protobuf/include
   /usr/local/include/eigen3
   /home/u/tf1.13/tensorflow-GPU/tensorflow/contrib/makefile/downloads/absl
   ) 

add_executable(tf_test  tf.cpp) 

#link_directories(./lib)
#target_link_libraries(tf_test tensorflow_cc tensorflow_framework)

target_link_libraries(tf_test /home/u/tf1.13/tensorflow-GPU/bazel-bin/tensorflow/libtensorflow_cc.so.1 /home/u/tf1.13/tensorflow-GPU/bazel-bin/tensorflow/libtensorflow_framework.so.1)
//tf.cpp

/*
 * test tensorflow_cc c++ successfully
 * load mnist.pb model successfully
 * conference:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/label_image
 * */

//@wp conference:https://blog.csdn.net/wd1603926823/article/details/92843830
#include <fstream>
#include <utility>
#include <vector>
#include <Eigen/Core>
#include <Eigen/Dense>
 
#include "tensorflow/cc/ops/const_op.h"
#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/lib/core/errors.h"
#include "tensorflow/core/lib/core/stringpiece.h"
#include "tensorflow/core/lib/core/threadpool.h"
#include "tensorflow/core/lib/io/path.h"
#include "tensorflow/core/lib/strings/stringprintf.h"
#include "tensorflow/core/platform/env.h"
#include "tensorflow/core/platform/init_main.h"
#include "tensorflow/core/platform/logging.h"
#include "tensorflow/core/platform/types.h"
#include "tensorflow/core/public/session.h"
#include "tensorflow/core/util/command_line_flags.h"
 
using namespace std;
using namespace tensorflow;
using namespace tensorflow::ops;
using tensorflow::Flag;
using tensorflow::Tensor;
using tensorflow::Status;
using tensorflow::string;
using tensorflow::int32;
 
static Status ReadEntireFile(tensorflow::Env* env, const string& filename,
                             Tensor* output) {
  tensorflow::uint64 file_size = 0;
  TF_RETURN_IF_ERROR(env->GetFileSize(filename, &file_size));
 
  string contents;
  contents.resize(file_size);
 
  std::unique_ptr<tensorflow::RandomAccessFile> file;
  TF_RETURN_IF_ERROR(env->NewRandomAccessFile(filename, &file));
 
  tensorflow::StringPiece data;
  TF_RETURN_IF_ERROR(file->Read(0, file_size, &data, &(contents)[0]));
  if (data.size() != file_size) {
    return tensorflow::errors::DataLoss("Truncated read of '", filename,
                                        "' expected ", file_size, " got ",
                                        data.size());
  }
//  output->scalar<string>()() = data.ToString();
  output->scalar<string>()() = string(data);
  return Status::OK();
}
 
Status ReadTensorFromImageFile(const string& file_name, const int input_height,
                               const int input_width, const float input_mean,
                               const float input_std,
                               std::vector<Tensor>* out_tensors) {
  auto root = tensorflow::Scope::NewRootScope();
  using namespace ::tensorflow::ops;
 
  string input_name = "file_reader";
  string output_name = "normalized";
 
  // read file_name into a tensor named input
  Tensor input(tensorflow::DT_STRING, tensorflow::TensorShape());
  TF_RETURN_IF_ERROR(
      ReadEntireFile(tensorflow::Env::Default(), file_name, &input));
 
  // use a placeholder to read input data
  auto file_reader =
      Placeholder(root.WithOpName("input"), tensorflow::DataType::DT_STRING);
 
  std::vector<std::pair<string, tensorflow::Tensor>> inputs = {
      {"input", input},
  };
 
  // Now try to figure out what kind of file it is and decode it.
  const int wanted_channels = 1;
//  tensorflow::Output image_reader;
//  if (tensorflow::StringPiece(file_name).ends_with(".png")) {
//    image_reader = DecodePng(root.WithOpName("png_reader"), file_reader,
//                             DecodePng::Channels(wanted_channels));
//  } else if (tensorflow::StringPiece(file_name).ends_with(".gif")) {
//    // gif decoder returns 4-D tensor, remove the first dim
//    image_reader =
//        Squeeze(root.WithOpName("squeeze_first_dim"),
//                DecodeGif(root.WithOpName("gif_reader"), file_reader));
//  } else if (tensorflow::StringPiece(file_name).ends_with(".bmp")) {
//    image_reader = DecodeBmp(root.WithOpName("bmp_reader"), file_reader);
//  } else {
//    // Assume if it's neither a PNG nor a GIF then it must be a JPEG.
//    image_reader = DecodeJpeg(root.WithOpName("jpeg_reader"), file_reader,
//                              DecodeJpeg::Channels(wanted_channels));
//  }
  tensorflow::Output image_reader;
    if (tensorflow::str_util::EndsWith(file_name, ".png")) {
      image_reader = DecodePng(root.WithOpName("png_reader"), file_reader,
                               DecodePng::Channels(wanted_channels));
    } else if (tensorflow::str_util::EndsWith(file_name, ".gif")) {
      // gif decoder returns 4-D tensor, remove the first dim
      image_reader =
          Squeeze(root.WithOpName("squeeze_first_dim"),
                  DecodeGif(root.WithOpName("gif_reader"), file_reader));
    } else if (tensorflow::str_util::EndsWith(file_name, ".bmp")) {
      image_reader = DecodeBmp(root.WithOpName("bmp_reader"), file_reader);
    } else {
      // Assume if it's neither a PNG nor a GIF then it must be a JPEG.
      image_reader = DecodeJpeg(root.WithOpName("jpeg_reader"), file_reader,
                                DecodeJpeg::Channels(wanted_channels));
    }
  // Now cast the image data to float so we can do normal math on it.
  auto float_caster =
      Cast(root.WithOpName("float_caster"), image_reader, tensorflow::DT_FLOAT);
 
  auto dims_expander = ExpandDims(root.WithOpName("expand"), float_caster, 0);
 
  float input_max = 255;
  Div(root.WithOpName("div"),dims_expander,input_max);
 
  tensorflow::GraphDef graph;
  TF_RETURN_IF_ERROR(root.ToGraphDef(&graph));
 
  std::unique_ptr<tensorflow::Session> session(
      tensorflow::NewSession(tensorflow::SessionOptions()));
  TF_RETURN_IF_ERROR(session->Create(graph));
//  std::vector<Tensor> out_tensors;
//  TF_RETURN_IF_ERROR(session->Run({}, {output_name + ":0", output_name + ":1"},
//                                    {}, &out_tensors));
  TF_RETURN_IF_ERROR(session->Run({inputs}, {"div"}, {}, out_tensors));
  return Status::OK();
}
 
 
int main()
{
  Session* session;
  Status status = NewSession(SessionOptions(), &session);//创建新会话Session
 
  string model_path="model.pb";
  GraphDef graphdef; //Graph Definition for current model
 
  Status status_load = ReadBinaryProto(Env::Default(), model_path, &graphdef); //从pb文件中读取图模型;
  if (!status_load.ok()) {
      std::cout << "ERROR: Loading model failed..." << model_path << std::endl;
      std::cout << status_load.ToString() << "
";
      return -1;
  }
  Status status_create = session->Create(graphdef); //将模型导入会话Session中;
  if (!status_create.ok()) {
      std::cout << "ERROR: Creating graph in session failed..." << status_create.ToString() << std::endl;
      return -1;
  }
  cout << "Session successfully created."<< endl;
  string image_path= "/home/u/tf1.13/tensorflow-c-mnist/digit.jpg";
  int input_height =28;
  int input_width=28;
  int input_mean=0;
  int input_std=1;
  std::vector<Tensor> resized_tensors;
  Status read_tensor_status =
      ReadTensorFromImageFile(image_path, input_height, input_width, input_mean,
                              input_std, &resized_tensors);
  if (!read_tensor_status.ok()) {
    LOG(ERROR) << read_tensor_status;
    cout<<"resing error"<<endl;
    return -1;
  }
 
  const Tensor& resized_tensor = resized_tensors[0];
  std::cout << resized_tensor.DebugString()<<endl;
 
  vector<tensorflow::Tensor> outputs;
  string output_node = "softmax";
  Status status_run = session->Run({{"inputs", resized_tensor}}, {output_node}, {}, &outputs);
 
  if (!status_run.ok()) {
      std::cout << "ERROR: RUN failed..."  << std::endl;
      std::cout << status_run.ToString() << "
";
      return -1;
  }
  //Fetch output value
  std::cout << "Output tensor size:" << outputs.size() << std::endl;
  for (std::size_t i = 0; i < outputs.size(); i++) {
      std::cout << outputs[i].DebugString()<<endl;
  }
 
  Tensor t = outputs[0];                   // Fetch the first tensor
  int ndim2 = t.shape().dims();             // Get the dimension of the tensor
  auto tmap = t.tensor<float, 2>();        // Tensor Shape: [batch_size, target_class_num]
  int output_dim = t.shape().dim_size(1);  // Get the target_class_num from 1st dimension
  std::vector<double> tout;
 
  // Argmax: Get Final Prediction Label and Probability
  int output_class_id = -1;
  double output_prob = 0.0;
  for (int j = 0; j < output_dim; j++)
  {
        std::cout << "Class " << j << " prob:" << tmap(0, j) << "," << std::endl;
        if (tmap(0, j) >= output_prob) {
              output_class_id = j;
              output_prob = tmap(0, j);
           }
  }
 
  std::cout << "Final class id: " << output_class_id << std::endl;
  std::cout << "Final class prob: " << output_prob << std::endl;
 
  return 0;
}
u@u160406:~/tf1.13/tensorflow-c-mnist/build$ cmake ..
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/u/tf1.13/tensorflow-c-mnist/build


u@u160406:~/tf1.13/tensorflow-c-mnist/build$ make
Scanning dependencies of target tf_test
[ 50%] Building CXX object CMakeFiles/tf_test.dir/tf.cpp.o
[100%] Linking CXX executable tf_test
[100%] Built target tf_test


u@u160406:~/tf1.13/tensorflow-c-mnist/build$ ./tf_test
2019-10-15 10:43:40.577836: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcuda.so.1
2019-10-15 10:43:40.599739: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:983] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2019-10-15 10:43:40.600269: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1618] Found device 0 with properties: 
name: GeForce RTX 2080 Ti major: 7 minor: 5 memoryClockRate(GHz): 1.65
pciBusID: 0000:01:00.0
2019-10-15 10:43:40.600401: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudart.so.10.0
2019-10-15 10:43:40.601114: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcublas.so.10.0
2019-10-15 10:43:40.601796: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcufft.so.10.0
2019-10-15 10:43:40.601986: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcurand.so.10.0
2019-10-15 10:43:40.603086: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusolver.so.10.0
2019-10-15 10:43:40.603734: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusparse.so.10.0
2019-10-15 10:43:40.605733: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7
2019-10-15 10:43:40.605793: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:983] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2019-10-15 10:43:40.606283: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:983] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2019-10-15 10:43:40.606722: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1746] Adding visible gpu devices: 0
2019-10-15 10:43:40.606738: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudart.so.10.0
2019-10-15 10:43:40.697274: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1159] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-10-15 10:43:40.697295: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1165]      0 
2019-10-15 10:43:40.697302: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1178] 0:   N 
2019-10-15 10:43:40.697444: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:983] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2019-10-15 10:43:40.697830: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:983] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2019-10-15 10:43:40.698271: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:983] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2019-10-15 10:43:40.698632: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1304] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 10138 MB memory) -> physical GPU (device: 0, name: GeForce RTX 2080 Ti, pci bus id: 0000:01:00.0, compute capability: 7.5)
Session successfully created.
2019-10-15 10:43:41.417655: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:983] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2019-10-15 10:43:41.419321: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1618] Found device 0 with properties: 
name: GeForce RTX 2080 Ti major: 7 minor: 5 memoryClockRate(GHz): 1.65
pciBusID: 0000:01:00.0
2019-10-15 10:43:41.419390: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudart.so.10.0
2019-10-15 10:43:41.419423: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcublas.so.10.0
2019-10-15 10:43:41.419448: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcufft.so.10.0
2019-10-15 10:43:41.419471: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcurand.so.10.0
2019-10-15 10:43:41.419497: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusolver.so.10.0
2019-10-15 10:43:41.419523: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusparse.so.10.0
2019-10-15 10:43:41.419549: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7
2019-10-15 10:43:41.419667: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:983] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2019-10-15 10:43:41.421127: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:983] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2019-10-15 10:43:41.422501: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1746] Adding visible gpu devices: 0
2019-10-15 10:43:41.422566: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1159] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-10-15 10:43:41.422592: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1165]      0 
2019-10-15 10:43:41.422613: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1178] 0:   N 
2019-10-15 10:43:41.423170: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:983] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2019-10-15 10:43:41.424636: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:983] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2019-10-15 10:43:41.426045: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1304] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 10138 MB memory) -> physical GPU (device: 0, name: GeForce RTX 2080 Ti, pci bus id: 0000:01:00.0, compute capability: 7.5)
Tensor<type: float shape: [1,28,28,1] values: [[[0.992156923][0.0823529437][0]]]...>
2019-10-15 10:43:44.755529: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcublas.so.10.0
2019-10-15 10:43:45.821366: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7
Output tensor size:1
Tensor<type: float shape: [1,10] values: [0.000222602132 0.951202273 0.00674963091...]...>
Class 0 prob:0.000222602,
Class 1 prob:0.951202,
Class 2 prob:0.00674963,
Class 3 prob:0.00721128,
Class 4 prob:0.0029518,
Class 5 prob:0.0100965,
Class 6 prob:0.0119467,
Class 7 prob:0.00218653,
Class 8 prob:0.00189467,
Class 9 prob:0.00553806,
Final class id: 1
Final class prob: 0.951202


u@u160406:~/tf1.13/tensorflow-c-mnist/build$ 

@https://github.com/zhangcliff/tensorflow-c-mnist 会报错:

开源框架---tensorflow c++ API 运行第一个“手写字的例子”


参照@https://blog.csdn.net/wd1603926823/article/details/92843830解决问题。

”“”“找了很久原因没解决。因为我去看string_view的源码,真的没有报错的这几个成员函数。所以可能是我用错了版本还是这几个函数已经被废弃。

今天终于解决了。原来上面这个例程是按照 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/label_image/main.cc  仿照这个来写的,而外国人进行了更新,国内很多人以前的博客都是老版本,所以我使用会出问题。 ”“”“