Tensorflow C API 从训练到部署:使用 C API 进行预测和部署

前述博文 Tensorflow C++ 从训练到部署(2):简单图的保存、读取与 CMake 编译Tensorflow C++ 从训练到部署(3):使用 Keras 训练和部署 CNN 使用 Tensorflow/Keras 的 Python API 进行训练,并使用 C++ API 进行了预测。由于 C++ API 需要编译 Tensorflow 源码,还是比较麻烦的。而 Tensorflow 官方提供了 C API 编译好的库文件,相对部署上比较容易(直接复制库文件到自己的工程即可),本文将介绍使用 C API 进行预测的方法。对于 Python 训练部分,与前述文章相同不做赘述。

0、系统环境
Ubuntu 16.04
Tensorflow 1.12.0

1、安装依赖
1、GPU 支持安装(可选)
CUDA 9.0
cnDNN 7.x

2、Tensorflow 1.12.0
下载地址:
https://www.tensorflow.org/install/lang_c

其中 1.12.0 的下载地址如下(我这里提供了包含TX2 aarch64在内的几个版本):

TensorFlow C libraryCUDAcuDNNURL
Linux x86_64 CPUxxhttps://pan.baidu.com/s/1FDdXCgtJJlDJP8ziDs6dow
Linux x86_64 GPU9.07.xhttps://pan.baidu.com/s/1qxDntkQ-rcgvp1xxrSKW0w
macOS CPUxxhttps://pan.baidu.com/s/1F6NdNtCxg11P_EpEdsqttA
Linux aarch64 GPU (TX2)9.07.0.5https://pan.baidu.com/s/1mI76203wY9Nd5US4sH5-pg

将库解压到 third_party/libtensorflow 目录。

如果上面的版本都不符合你的需求,你可以参照这篇文章编译你需要的版本。

2、TFUtils 工具类
为了简便起见,我们首先将常用的 C API 封装为

1)文件 utils/TFUtils.hpp:

2)文件 utils/TFUtils.cpp:

3、简单图的读取与预测
在前述文章 Tensorflow C++ 从训练到部署(2):简单图的保存、读取与 CMake 编译 中我们已经介绍了一个 c=a*b 的简单“网络”是如何计算的。

其中 Python 构建网络和预测部分就不重复了,详见该文所述。这里直接给出 C API 的代码:

文件名:simple/load_simple_net_c_api.cc

简单解释一下:

这一行是加载 pb 文件。

这一段是创建两个输入 tensor 以及输入的 ops。注意这里的 CreateTensor 在后面都需要调用 DeleteTensors 进行内存释放。输出的 tensors 还没创建先定义为 nullptr。

这一行是运行网络。

这两行是从输出的 output_tensors 读取数据到一个二维vector const std::vector>,我们这里输出只有 "c" 一个名字,而且只有一个索引 0,因此直接取出 data[0] 就是我们原本想要的输出。

编译运行这一文件,如果没有问题则会得到如下输出:

4、CNN的读取与预测
与刚才小节3相似,CNN网络也是一样的流程,还是以最基本的 fashion_mnist 为例,该网络的训练和保存流程请参考之前的文章。这里我们仅介绍 C API 进行预测的部分。由于我们这里需要读取一幅图并转化成 Tensor 输入网络,我们构造一个简单的函数 Mat2Tensor 实现这一转换:

1)Met2Tensor 部分文件:fashion_mnist/utils/mat2tensor_c_cpi.h

2)网络读取与预测,这部分与刚才的小节3基本一样,就不做解释了:

编译运行这一文件,如果没有问题,则会得到如下输出:

到此,我们就完成了使用 C API 运行 Tensorflow Model 的流程。

本文中的全部代码均已开源:
https://github.com/skylook/tensorflow_cpp

参考文献
[1] https://github.com/Neargye/hello_tf_c_api
[2] https://www.tensorflow.org/api_docs/python/tf/contrib/saved_model/save_keras_model
[3] https://www.tensorflow.org/install/lang_c

3 Comments

Add a Comment

您的邮箱地址不会被公开。 必填项已用 * 标注