点击上方蓝字关注我们
微信公众号:OpenCV学堂
投稿作者:小黄弟,
来自:中国电科智慧城市建模仿真与智能技术重点实验室
文字编辑:gloomyfish
前言概述
tensorflow框架一般都是基于Python调用,但是有些时候跟应用场景,我们希望调用tensorflow C语言的接口,在C++的应用开发中使用它。要这么干,首先需要下载tensorflow源码,完成编译,然后调用相关的API函数实现C语言版本的调用,完成模型的加载、前向推理预测与解析。
本文主要讲DeeplabV3+语义分割模型的tensorflow C接口部署,不涉及到模型的训练过程,训练过程可以参考:
https://github.com/tensorflow/models/tree/master/research/deeplab.
官方提供了PASCAL VOC 2012,Cityscapes,ADE20K不同数据集上预训练好的模型,同时还有基于ImageNet预训练好的不同backbone网络, 包括mobilenetv2,xception,resnet,我们可以根据自己的需求来选择合适的backbone。本文不涉及tensorflow C版本的编译,只是讲解如何通过API调用预训练模型进行前向推理预测,模型的导出文件为:
frozen_inference_graph.pb
Mat转Tensor
在tensorflow中,输入数据格式为Tensor格式,有专门的函数读取图片及转换,但这样给图像预处理带来了不便,所以一般情况下,会先用opencv对图像进行读取及预处理,再从opencv的Mat格式转为tensorflow的Tensor格式,代码如下:区区几行代码,却是参考了无数资料及测试才得出来的,真是心酸
1TF_Tensor* CreateTensor(TF_DataTypedata_type, conststd::int64_t* dims, std::size_tnum_dims, constvoid* data, std::size_tlen) 2{
3 if (dims == nullptr || data == nullptr)
4 {
5 returnnullptr;
6 }
7 TF_Tensor* tensor = TF_AllocateTensor(data_type, dims, static_cast<int>(num_dims), len);
8 if (tensor == nullptr)
9 {
10 returnnullptr;
11 }
12 void* tensor_data = TF_TensorData(tensor);
13 if (tensor_data == nullptr)
14 {
15 TF_DeleteTensor(tensor);
16 returnnullptr;
17 }
18 std::memcpy(TF_TensorData(tensor), data, std::min(len, TF_TensorByteSize(tensor)));
19 return tensor;
20}
21
22TF_Tensor* Mat2Tensor(cv::Matimg) 23{
24 conststd::vector<std::int64_t>input_dims = { 1, 513, 513, 3 };
25 autodata_size = sizeof(std::uint8_t);
26 for (autoi : input_dims)
27 {
28 data_size *= i;
29 }
30 cv::resize(img, img, cv::Size(513, 513));
31 cvtColor(img, img, cv::COLOR_RGB2BGR);
32 TF_Tensor* image_input = CreateTensor(TF_UINT8, input_dims.data(), input_dims.size(), img.data, data_size);
33 returnimage_input;
34}
GPU资源设置
我们在执行推理的过程中,可能并不希望模型使用全部的GPU资源,又或者希望不同模型使用不同的GPU资源,这个时候需要设置。代码如下:
1TF_SessionOptions *options = TF_NewSessionOptions();
2uint8_tconfig[16] = { 0x32, 0xe, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x3f, 0x20, 0x1, 0x2a, 0x1, 0x30};
3TF_SetConfig(options, (void*)config, 16, status);
这个是模型使用25%的GPU资源,GPU的id为0,通过如下python代码即可获得配置参数。
1import tensorflow as tf
2gpu_options = tf.GPUOptions(allow_growth=True,per_process_gpu_memory_fraction=0.25,visible_device_list='0')
3config = tf.ConfigProto(gpu_options=gpu_options)
4serialized = config.SerializeToString()
5list(map(hex, serialized))
6print(list(map(hex, serialized)))
利用上面的配置,逐步打开及关闭3个模型的GPU使用情况如下图:
实例演示
这是一个自己训练的用于分割细菌的模型,效果如下图。
推荐阅读
2019原创技术文章汇总
2018年原创技术文章汇总
OpenCV4系统化学习路线图-视频版本!
OpenCV实战 | 噪声生成与图像加噪声