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

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

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

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

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

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

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

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

项目主页: https://github.com/mogoweb/AIDog

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

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

链接: 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 --allMetaGraphDef 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_FLOATshape: (-1, 299, 299, 3)name: Placeholder:0The given SavedModel SignatureDef contains the following output(s):outputs['prediction'] tensor_info:dtype: DT_FLOATshape: (-1, 120)name: final_result:0Method 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 --allMetaGraphDef 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_STRINGshape: unknown_rankname: base64_string:0The given SavedModel SignatureDef contains the following output(s):outputs['prediction'] tensor_info:dtype: DT_FLOATshape: (-1, 120)name: import_1/final_result:0Method name is: tensorflow/serving/predict

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

申请证书

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

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

安装Simple TensorFlow Serving

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

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 88return 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 88return 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 mainargs.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_alltag_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年工作顺利,心想事成!

识狗君微信小程序的部署相关推荐

  1. 微信小程序详细图文教程-10分钟完成微信小程序开发部署发布

    很多朋友都认为微信小程序申请.部署.发布很难,需要很长时间. 实际上,微信和腾讯云同是腾讯产品,已经提供了10分钟(根据准备资源情况,已完成小程序申请认证)完成小程序开发.部署.发布的方式.当然,实现 ...

  2. 酷狗音乐微信小程序插件使用实践

    该插件集成音乐的搜索.播放等功能,适用于各种和音乐相结合的应用场景,支持微信小程序.h5,原生APP等平台的接入. 1.申请接入 在微信小程序管理后台"设置-第三方设置-插件管理" ...

  3. Javaweb和微信小程序项目部署阿里云服务器总结(上)

    谈到微信小程序的java后台怎么部署在阿里云服务器上的问题,弯弯绕绕,好多坑,网上的博客资料也特别乱,博主也是在没有任何经验和指导下花了几天的工夫才完成的.这里为了方便大家不踩坑,总结了下整个流程和注 ...

  4. 微信小程序详细图文教程-10分钟完成微信小程序开发部署发布(3元获取腾讯云服务器带小程序支持系统)...

    很多朋友都认为微信小程序申请.部署.发布很难,需要很长时间. 实际上,微信和腾讯云同是腾讯产品,已经提供了10分钟(根据准备资源情况,已完成小程序申请认证)完成小程序开发.部署.发布的方式.当然,实现 ...

  5. 微信小程序详细图文教程-10分钟完成微信小程序开发部署发布 小程序趟过的坑,你遇到几个??

    很多朋友都认为微信小程序申请.部署.发布很难,需要很长时间. 实际上,微信和腾讯云同是腾讯产品,已经提供了10分钟(根据准备资源情况,已完成小程序申请认证)完成小程序开发.部署.发布的方式.当然,实现 ...

  6. 雪狐微信小程序商城部署教程(本地+云服务器)

    课程链接:http://www.studyfox.cn/262.html 微信小程序项目实战第二季小程序商城 http://www.studyfox.cn/258.html 微信小程序项目实战第三季小 ...

  7. 打通微信小程序自动化部署最后一步-微信第三方平台

    之前在公司搭建了一个前端部署平台(cb-cycle),涉及小程序.网页应用的部署.(流程节点可自定义开发,原则上任意程序都可以实现部署,甚至不至于部署). 无奈小程序自动化只能到上传代码(minipr ...

  8. 基于Node.js+MySQL开发的开源微信小程序商城(微信小程序)部署环境

    在网上搜到小程序设计的项目,下载前辈的代码到本地环境,接下来需要如何部署代码到本地,并能够看到完整的效果展示. 服务器端: https://github.com/tumobi/nideshop Nid ...

  9. python flask实战订餐系统微信小程序-59flask部署单进程启动服务

    欢迎关注原创 Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn. ...

最新文章

  1. ROS2概述和实践入门
  2. BZOJ 4417 Luogu P3990 [SHOI2013]超级跳马 (DP、矩阵乘法)
  3. mave工程中的一个类调用另一个聚合工程的一个类_谈谈设计模式:建造者模式在jdk中的体现,它和工厂模式区别?...
  4. 使用NW.js封装微信公众号菜单编辑器为桌面应用
  5. ionic4 组件的使用(二)
  6. 深航 App 劫持微信;董明珠:给员工分房加薪是应得的回报;ofo 复活 | 极客头条...
  7. 【BZOJ】【2626】JZPFAR
  8. Python strip lstrip rstrip使用方法(字符串处理空格)
  9. 华人小伙在美开网店卖鞋 一年销售额超八亿
  10. kindle阅读订阅的google reader时,词典不能工作的修正
  11. 这12款idea插件,能让你代码飞起来!
  12. 算法心得:高效算法的奥秘 作者:[美] Henry S. Warren, Jr.
  13. PMP---项目经理解决冲突的8种模式,走过路过不要错过
  14. Dcloud产品HbuilderX、uniapp你用过吗
  15. strstr(str1,str2) 函数
  16. java环境变量设置.
  17. go区块链培训怎么样?深度讲解椭圆曲线加密算法ECC和椭圆曲线数字签名算法ECDSA
  18. 这年头,能坐上火箭的东西不多啊!Java版本号算一个!
  19. [ 网络协议篇 ] 一篇文章让你掌握什么是 数字证书 ?什么是SSL ?什么是 TLS ?
  20. 用python解决五格与起名问题

热门文章

  1. cookie与session机制
  2. 论文解读:Improving Machine Reading Comprehension with Contextualized Commonsense Knowledge
  3. java--继承--上转型--接口的实践作业--USB模拟器
  4. 2016百度之星 - 资格赛(Astar Round1) B
  5. 请问下载那种软件可以使模糊的照片变清晰?谢谢~_百度知道
  6. [Swift5] Swift 设置自定义预编译宏
  7. java使用jdbc连接oracle,实现自定义sql查询,加载字段注释
  8. OA工作流之“接口设计”
  9. 飘零无影 --------------我喜欢这个网名..
  10. 读《走出软件作坊》有感