识狗君微信小程序的部署

日历哗啦啦的往前翻,很快就要翻过2018,迎来2019年。今天预报了好久的大雪终于降临到了武汉,外面白雪皑皑,家中温暖如春,这个时候感觉最惬意。古人有诗云:绿蚁新醅酒,红泥小火炉。晚来天欲雪,能饮一杯无?,而现代人则在朋友圈中欢呼着下雪,各有各的庆祝方式,并无高下之分。

在后台有收到朋友询问识狗君微信小程序的部署,我开始觉得之前的几篇文章已经讲的很清楚,问的朋友多了,返回去再看,发觉几篇文章是站在开发的角度写的,比较散,决定在2018年最后的一篇文章整理一下关于识狗君微信小程序的部署,算是对2018年机器学习项目的一个总结。

如果你还不了解识狗君微信小程序这个项目,请参考以下几篇文章:

当微信小程序遇上TensorFlow:Server端实现

当微信小程序遇上TensorFlow:Server端实现补充

当微信小程序遇上TensorFlow:小程序实现

当微信小程序遇上TensorFlow:接收base64编码图像数据

当微信小程序遇上TensorFlow:终章

项目主页: github.com/mogoweb/AID…

说是微信小程序的部署,但本文并不打算讲解如何申请、开发和审核微信小程序,而是说明服务端的部署。如果想了解微信小程序的开发,请参考腾讯官方文档。

以下步骤中涉及到的模型、数据集,我上传到了百度网盘,可以根据需要下载:

链接: https://pan.baidu.com/s/1kaoiV_uMFS_7IK-HMO1G8A 提取码: ct9e
复制代码
训练模型

这个步骤是可选步骤,你可以使用训练好的模型:inception_v3.tar.gz,这个版本是我在Google官方inception V3模型的基础上,使用stanford dog datasets数据集训练而得的模型,请注意和原版的区别。

如果想自行训练模型,请接着往下看。

带标签的狗狗数据集采用stanford dog datasets,请自行下载并解压,然后执行如下命令进行训练:

python retrain.py --image_dir=./Images --saved_model_dir=models/inception_v3 --model_version 2
复制代码

训练的模型保存于models/inception_v3/2,其中2是版本号,可以通过retrain.py脚本的命令行参数进行指定。

**注意:**这个训练过程会从网络下载Inception V3原版模型,需要翻墙才行。无法翻墙的朋友也可以采用如下的方法,将tfhub_modules.tgz的内容解压到/tmp目录下,内容大体如下:

alex@alex-550-279cn:~/work/ai/workspace/AIDog/serving$ ls -la /tmp/tfhub_modules/
total 88
drwxr-xr-x  3 alex alex  4096 12月 30 19:27 .
drwxrwxrwt 15 root root 73728 12月 30 19:31 ..
drwxr-xr-x  4 alex alex  4096 10月  9 10:04 11d9faf945d073033780fd924b2b09ff42155763
-rw-rw-r--  1 alex alex   161 10月  9 10:04 11d9faf945d073033780fd924b2b09ff42155763.descriptor.txt
alex@alex-550-279cn:~/work/ai/workspace/AIDog/serving$ 
复制代码

这个训练过程有点长,在的PC上带GTX 960的显卡训练,大约需要两个小时。

让模型接收base64编码图像

通过上一个步骤训练出的模型接收的是(299, 299, 3)的二进制图像数据,这种二进制数据不方便通过HTTP传递,HTTP传输二进制数据常用的方案是对二进制数据进行base64编码。

如何看出模型接收什么类型数据?我们可以通过save_model_cli.py脚本查看模型的签名,这个脚本由tensorflow提供,如果你下载了tensorflow源码,在其 tensorflow/python/tools/ 目录下,可以使用如下命令查看我们训练出来的模型:

python ~/work/ai/tensorflow/tensorflow/tensorflow/python/tools/saved_model_cli.py show --dir ~/work/ai/workspace/AIDog/serving/models/inception_v3/2 --all

MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:

signature_def['serving_default']:
  The given SavedModel SignatureDef contains the following input(s):
    inputs['image'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 299, 299, 3)
        name: Placeholder:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['prediction'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 120)
        name: final_result:0
  Method name is: tensorflow/serving/predict

复制代码

从中我们可以看出模型的输入参数名为image,其shape为(-1, 299, 299, 3),这里-1代表可以批量输入,通常我们只输入一张图像,所以这个维度通常是1。输出参数名为prediction,其shape为(-1, 120),-1和输入是对应的,120代表120组狗类别的概率。

为了让模型接收base64编码图片,我们在模型的输入前面增加一层,进行base64及解码处理:

python rebuild_model.py --model_dir models/inception_v3/3 --origin_model_dir models/inception_v3/2/
复制代码

其中:

  • model_dir 参数为接收base64输入模型输出的目录
  • origin_model_dir 参数为上一个步骤训练出来的模型

这个时候我们再来看看第三个版本模型的签名:

python ~/work/ai/tensorflow/tensorflow/tensorflow/python/tools/saved_model_cli.py show --dir ~/work/ai/workspace/AIDog/serving/models/inception_v3/3 --all

MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:

signature_def['serving_default']:
  The given SavedModel SignatureDef contains the following input(s):
    inputs['image'] tensor_info:
        dtype: DT_STRING
        shape: unknown_rank
        name: base64_string:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['prediction'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 120)
        name: import_1/final_result:0
  Method name is: tensorflow/serving/predict
复制代码

可以看到,模型的输入为字符串数据,即base64编码字符串。

申请证书

因为微信小程序要求HTTP请求走更加安全的HTTPS协议,所以必须提供一个SSL证书。

我们可以上阿里云申请一个免费的证书,虽然有效期只有一年,但商业用的证书比较贵,根据需要选择吧。需要注意的是,阿里云上申请证书很隐蔽,我也是尝试了好几个组合,那个免费证书的选项才出现。因为我的主机就是托管在阿里云上,域名也是使用阿里云的DNS服务,所以申请完后,很快就审核通过,然后就可以下载证书。证书下载时我选择证书for Nginx,下载下来就是两个文件:一个pem文件,一个key文件。

安装Simple TensorFlow Serving

这个Simple TensorFlow Serving是一个Google官方TensorFlow Serving的封装,是机器学习模型的通用且易于使用的服务。项目主页:github.com/tobegit3hub…

Simple TensorFlow Serving的安装非常简单:

pip install simple_tensorflow_serving
复制代码
启动服务

接下来启动server:

simple_tensorflow_serving --enable_ssl=True --model_base_path="./tensorflow/serving/models/inception_v3" --secret_pem="./certs/215052392380319.pem" --secret_key="./certs/215052392380319.key" --log_level="debug" --debug=True
复制代码

其中:

  • enable_ssl参数表示是否启用https
  • model_base_path指定模型的基础路径,需要注意的是,这个基础路径不带版本号数字,我们可以有多个版本的模型,所以这个目录下可能有1, 2, 3之类的子目录,分别对应不同版本的模型,微信小程序或客户端可以选择使用哪个版本
  • secret_pem 和 secret_key 为证书申请过程中获得的两个证书文件
  • 后面两个参数用于调试,可以不用

要验证服务器是否部署成功,可以使用简单的客户端程序测试一下:

python test_client.py --image=./Images/n02116738-African_hunting_dog/n02116738_1105.jpg
复制代码

结果如下:

n02116738 african hunting dog 0.780203342438
n02115913 dhole 0.0102733308449
n02092002 scottish deerhound 0.00600153999403
复制代码

前面是类别标签,后面是属于某个类别的概率,上面结果中Top 1概率0.78。

微信小程序的代码可以参见github项目,这里就不多说明了。

Q & A
  1. 在执行saved_model_cli.py脚本时,出现如下错误是什么原因?
/data/ai/anaconda3/envs/keras/lib/python3.6/importlib/_bootstrap.py:219: RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility. Expected 96, got 88
  return f(*args, **kwds)
/data/ai/anaconda3/envs/keras/lib/python3.6/importlib/_bootstrap.py:219: RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility. Expected 96, got 88
  return f(*args, **kwds)
Traceback (most recent call last):
  File "tensorflow/python/tools/saved_model_cli.py", line 913, in <module>
    sys.exit(main())
  File "tensorflow/python/tools/saved_model_cli.py", line 909, in main
    args.func(args)
  File "tensorflow/python/tools/saved_model_cli.py", line 610, in show
    _show_all(args.dir)
  File "tensorflow/python/tools/saved_model_cli.py", line 192, in _show_all
    tag_sets = saved_model_utils.get_saved_model_tag_sets(saved_model_dir)
AttributeError: module 'tensorflow.python.tools.saved_model_utils' has no attribute 'get_saved_model_tag_sets'
复制代码

: 是由于tensorflow源码和python环境中安装的tensorflow包版本不一致,可以使用python环境中安装的tensorflow包中的那个saved_model_cli.py脚本。

小结

到这里,关于识狗君微信小程序的部署就讲完了,如果这个步骤中有疑问的地方,请与我联系。

马上就要到2019年了,在这里祝各位朋友在2019年工作顺利,心想事成!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值