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-yyy和variables.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 识别门牌号的识别服务接口
Related posts:
- 目标检测笔记二:Object Detection API 小白实践指南
- CNN结构模型一句话概述:从LeNet到ShuffleNet
- TensorFlow识别字母扭曲干扰型验证码-开放源码与98%模型
- TensorFlow 资源大全–中文版
- image net 2012数据集以及中文标签分享