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

  • 2019 年 11 月 27 日
  • 筆記

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转换为所需的图像张量。

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

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模型的输入,创建会话对象并加载保存的检查点。

......  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。

builder = tf.saved_model.builder.SavedModelBuilder(export_path)

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

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)

现在我准备好创建签名。

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团队中创建两个签名 – 一个用于分类,一个用于预测。我不想要任何分类结果,所以预测签名对我来说足够了。

最后一步 – 保存模型。

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的问题,所以我回到以前的版本

自己试试

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

  • 克隆来源
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
  • 训练模型
python3 svnh_semi_supervised_model_train.py

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

  • 检查保存模型
ls ./checkpoints

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

  • 导出模型到Protobuf由TensorFlow提供服务
python3 svnh_semi_supervised_model_saved.py --checkpoint-dir =。/ checkpoints --output_dir =。/ gan-export --model-version = 1

应打印出以下内容

成功将GAN模型版本'1'导出到'./gan-export'

如果你输入

ls ./gan-export/1

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

如何测试接口?

启动接口服务

tensorflow_model_server --port=9000 --model_name=gan --model_base_path=/home/abc/Desktop/tf_serving_example-master/gan-export

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

python3 svnh_semi_supervised_model_save_test_images.py

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

发起请求

python svnh_semi_supervised_client.py --server=localhost:9000 --image=./svnh_test_images/image_22.jpg

返回信息如下:

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第三行 的数值是最大的。说明预测对了

训练过程如下:

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 识别门牌号的识别服务接口

  1. 目标检测笔记二:Object Detection API 小白实践指南
  2. CNN结构模型一句话概述:从LeNet到ShuffleNet
  3. TensorFlow识别字母扭曲干扰型验证码-开放源码与98%模型
  4. TensorFlow 资源大全–中文版
  5. image net 2012数据集以及中文标签分享