前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >tensoflow serving 实战之GAN 识别门牌号的识别服务接口

tensoflow serving 实战之GAN 识别门牌号的识别服务接口

作者头像
十四君
发布2019-11-27 10:10:07
5630
发布2019-11-27 10:10:07
举报
文章被收录于专栏:UrlteamUrlteam
TensorFlow服务

TensorFlow服务,托管模型并提供远程访问。TensorFlow服务有一个很好的文档的架构和有用的教程。不幸的是,这个有点难用,你需要做较大改动来为自己的模型提供服务。

安装测试使用请参看  安装并测试demo

目录:

作为一个例子,采取了一个GAN模型的半监督学习

  • 街景房屋号码数据集上训练半监督学习的GAN模型
  • 使用GAN鉴别器来预测房屋号码。作为输出,有10个对应于从0到9的数字的预测信心分数。
  • 让TensorFlow在Docker容器中服务我的模型
  • 创建客户端以请求数字图像的分数

您可以在我的GitHub信息库中找到实现细节。

主要步骤是:

对于正在使用TensorFlow创建Deep Learning模型的任何人来说,前两个步骤非常简单,我不想在这里详细介绍。但是最后两个步骤对我来说是相当新的,我花了一些时间来了解它的工作原理和所需要的。

TensorFlow服务。它是什么?

TensorFlow服务实现运行机器学习模型的服务器,并提供对它们的远程访问。常见的任务是提供数据(例如图像)的预测和分类。

几个技术亮点:

  • 服务器实现GRPC接口,因此您无法从浏览器发出请求。相反,我们需要创建一个可以通过GRPC进行通信的客户端
  • TensorFlow服务已经为存储为Protobuf的模型提供了操作
  • 您可以创建自己的实例来处理以其他格式存储的模型

所以我需要将我的模型导出到Protobuf。Protobuf协议缓冲区(或Protobuf)允许高效的数据序列化。它是一个软件的开源软件,已经开发出来了…,对,谷歌:-)

将模型导出为Protobuf

TensorFlow服务提供SavedModelBuild类,将模型保存为Protobuf。这里描述很好。

我的GAN模型接受一个形状[batch_num,width,height,channels]的图像张量,其中批次数为1,用于投放(您只能预测一个图像在时间),宽度和高度为32像素,图像通道数为3必须对输入图像进行缩放,使每个像素在[-1,1]的范围内,而不在[0,255]的范围内。

从另一方面,服务模式必须接受JPEG图像作为输入,因此为了服务,我需要注入层以将JPEG转换为所需的图像张量。

首先,我实现了图像转换。这对我来说有点棘手。

代码语言:javascript
复制
serialized_tf_example = tf.placeholder(
                            tf.string,name ='input_image')
feature_configs = {'image / encoded':tf.FixedLenFeature(
                                         shape = [],
                                         dtype = tf.string),}
tf_example = tf.parse_example(serialized_tf_example,feature_configs) 
jpegs = tf_example ['image / encoded'] 
images = tf.map_fn(preprocess_image,jpegs,dtype = tf.float32) 
image = tf.squeeze(images,[0])
#现在图像形状是(1,?,?,3)

基本上,您需要一个占位符,用于串行输入图像,功能配置(字典名称到功能),您可以列出预期输入(在我的情况下为JPEG格式的图像/编码)和功能类型。然后,您解析序列化示例并从中提取JPEG。最后一步是将JPEG转换为所需的图像张量。请参阅我的GitHub的实现细节(preprocess_image方法)。

然后我可以使用该图像张量作为我的GAN模型的输入,创建会话对象并加载保存的检查点。

代码语言:javascript
复制
...... 
net = GAN(images,z_size,learning_rate,drop_rate = 0。)
......
saver = tf.train.Saver() 
whth tf.Session() as sess:
    #从上一个检查点恢复模型
    ckpt = tf.train.get_checkpoint_state(FLAGS.checkpoint_dir)     
    saver.restore(sess,ckpt.model_checkpoint_path)
......

接下来的挑战是,如何使用提供的SavedModelBuilder将还原的模型转换为Protobuf。

代码语言:javascript
复制
builder = tf.saved_model.builder.SavedModelBuilder(export_path)

您必须使用输入,输出和方法名称(例如分类或预测)创建所谓的签名。TensorFlow提供了一个方法tf.saved_model.utils.build_tensor_info来创建张量信息。我用它来定义输入和输出(在我的情况下的分数)。

代码语言:javascript
复制
predict_tensor_inputs_info = \ 
    tf.saved_model.utils.build_tensor_info(jpegs)
predict_tensor_scores_info = \ 
    tf.saved_model.utils.build_tensor_info(net.discriminator_out)

现在我准备好创建签名。

代码语言:javascript
复制
prediction_signature =(
    tf.saved_model.signature_def_utils.build_signature_def(
        inputs = {'images':predict_tensor_inputs_info},
        outputs = {'scores':predict_tensor_scores_info},
        method_name = \ 
            tf.saved_model.signature_constants.PREDICT_METHOD_NAME)

“图像”“分数”是预定义的名称,您必须在输入和输出字典中使用它们。

教程 TensorFlow团队中创建两个签名 – 一个用于分类,一个用于预测。我不想要任何分类结果,所以预测签名对我来说足够了。

最后一步 – 保存模型。

代码语言:javascript
复制
legacy_init_op = tf.group(tf.tables_initializer(),
                          name ='legacy_init_op')
builder.add_meta_graph_and_variables(
    sess,
    [tf.saved_model.tag_constants.SERVING],
    signature_def_map = {'predict_images':prediction_signature},
    legacy_init_op = legacy_init_op)
builder.save()

这是非常简单的,现在你的模型存储为Protobuf。导出文件夹的结构应该是:

  • variables.data -xxx-of-yyyvariables.index的变量文件夹
  • saved_model.pb文件

工作的第一部分完成 – 模型成功导出为Protobuf。

把它放在一起

环境

我在以下环境中开发和测试:

  • GPU供电的PC(NVidia GeForce GTX 1060 6 GB)
  • Ubuntu 16.04
  • 蟒蛇 4.3.14
  • Python 3.5
  • TensorFlow 1.1,GPU构建。注意:我有TensorFlow 1.2的问题,所以我回到以前的版本
自己试试

以下是您需要执行的步骤,以便自己尝试。

  • 克隆来源
代码语言:javascript
复制
cd ~
git clone <a class="markup--anchor markup--pre-anchor" href="https://github.com/Vetal1977/tf_serving_example.git" target="_blank" rel="nofollow noopener" data-href="https://github.com/Vetal1977/tf_serving_example.git">https://github.com/Vetal1977/tf_serving_example.git
</a>cd tf_serving_example
  • 训练模型
代码语言:javascript
复制
python3 svnh_semi_supervised_model_train.py

下载date 约需5-10分钟,并测试街景房屋号码数据集和另一个测试集合 需要20分钟训练模型(在我的环境中)。

  • 检查保存模型
代码语言:javascript
复制
ls ./checkpoints

您应该看到数据,索引和元数据文件。

  • 导出模型到Protobuf由TensorFlow提供服务
代码语言:javascript
复制
python3 svnh_semi_supervised_model_saved.py --checkpoint-dir =。/ checkpoints --output_dir =。/ gan-export --model-version = 1

应打印出以下内容

代码语言:javascript
复制
成功将GAN模型版本'1'导出到'./gan-export'

如果你输入

代码语言:javascript
复制
ls ./gan-export/1

你应该得到变量文件夹和saved_model.pb文件。

如何测试接口?

启动接口服务

代码语言:javascript
复制
tensorflow_model_server --port=9000 --model_name=gan --model_base_path=/home/abc/Desktop/tf_serving_example-master/gan-export

首先从二进制文件中恢复为图像文件

代码语言:javascript
复制
python3 svnh_semi_supervised_model_save_test_images.py

可以从该目录下看到svnh_test_images 随机抽取64张的门派图像

发起请求

代码语言:javascript
复制
python svnh_semi_supervised_client.py --server=localhost:9000 --image=./svnh_test_images/image_22.jpg

返回信息如下:

代码语言:javascript
复制
outputs {
  key: "scores"
  value {
    dtype: DT_FLOAT
    tensor_shape {
      dim {
        size: 1
      }
      dim {
        size: 10
      }
    }
    float_val: 9.66807189862e-10
    float_val: 0.000227736207307
    float_val: 0.980206489563
    float_val: 8.44745736686e-05
    float_val: 0.0005895147915
    float_val: 4.84909996601e-08
    float_val: 2.95252248179e-05
    float_val: 0.0188583470881
    float_val: 3.83840551876e-06
    float_val: 9.54504270761e-12
  }
}

其中的float_val 就是其softmax的数值,可以这么理解,从上到下共计10行,代表该图对其数值 0-9的分别预测信心度,越靠近1则信心越高,

我测试的图是

 则float第三行 的数值是最大的。说明预测对了

训练过程如下:

代码语言:javascript
复制
Raising pool_size_limit_ from 100 to 110
		Classifier train accuracy:  0.19
		Classifier test accuracy 0.136140135218
		Step time:  0.05168628692626953
		Epoch time:  22.38613224029541
Epoch 1
		Classifier train accuracy:  0.244
		Classifier test accuracy 0.274585125999
		Step time:  0.030593395233154297
		Epoch time:  21.693989753723145
Epoch 2
		Classifier train accuracy:  0.394
		Classifier test accuracy 0.445221266134
		Step time:  0.030382871627807617
		Epoch time:  21.80638337135315
Epoch 3
		Classifier train accuracy:  0.58
		Classifier test accuracy 0.533804548248
		Step time:  0.03650689125061035
		Epoch time:  21.941813707351685

原创文章,转载请注明: 转载自URl-team

本文链接地址: tensoflow serving 实战之GAN 识别门牌号的识别服务接口

Related posts:

  1. 目标检测笔记二:Object Detection API 小白实践指南
  2. CNN结构模型一句话概述:从LeNet到ShuffleNet
  3. TensorFlow识别字母扭曲干扰型验证码-开放源码与98%模型
  4. TensorFlow 资源大全–中文版
  5. image net 2012数据集以及中文标签分享
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-10-102,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • TensorFlow服务
  • 目录:
  • TensorFlow服务。它是什么?
  • 将模型导出为Protobuf
  • 把它放在一起
    • 环境
      • 自己试试
      • 如何测试接口?
      • Related posts:
      相关产品与服务
      验证码
      腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档