Code前端首页关于Code前端联系我们

微信小程序遇上TensorFlow:服务器端实现

terry 2年前 (2023-09-22) 阅读数 76 #移动小程序
微信小程序遇上TensorFlow:Server端实现

10月1日跑了半程马拉松庆祝国庆,10月2日决定去一个没去过的景点:张之洞和武汉博物馆。今天宅在家里,吃吃喝喝,想着做一个识别狗的微信小程序。 微信小程序遇上TensorFlow:Server端实现

自从想到开发一款识别狗的APP,我的第一反应就是开发一个微信小程序。与手机原生应用相比,微信小程序易于开发和安装。特别是,它们不需要安装,可以立即使用。它们特别适合单一功能应用和偶尔使用。

在实施方案的过程中,首先想到的就是TensorFlow.js,它可以在手机上实现深度学习,无需服务器。但TensorFlow.js不支持微信小程序,所以我们只好选择小程序+服务器模式。而且我不擅长Web+服务器开发,所以正如《这个中秋,我开发了一个识别狗狗的app》中提到的,我首先使用TensorFlow Lite实现了一个Android应用程序。这个 Android 应用程序更像是一个试点项目。这个国庆假期我有很多空闲时间,所以我决定做一个微信小程序。

由于采用端服务器模式,图像识别是在服务器端完成的,所以主要功能都在服务器端实现。首先我们来说一下服务器端的实现。

TensorFlow服务

服务端实现方案有很多,包括C++/Java/Python。我什至考虑过使用 Node.js 来实现它。上周在浏览Google开发者大会资料时,我发现TensorFlow已经提供了服务器部署解决方案:TensorFlow Serving。

TensorFlow Serving 是一种灵活的高性能服务器系统,适用于专为生产环境设计的机器学习模型。 TensorFlow 服务可以轻松部署新算法和实验,同时保持相同的服务器架构和 API。 TensorFlow Serving 提供了与 TensorFlow 模型的全面集成解决方案,并且可以轻松扩展以服务其他类型的模型。

详细信息请访问:tensorflow.google.cn/serving/

我们正在不断开发TensorFlow服务。直接引用示例将无法实现所需的功能。经过多方查找资料,终于解决了整个过程。

SavedModel

TensorFlow 提供两种模型格式:

  • 检查点,它们依赖于创建模型的代码。
  • SavedModel,这是一种独立于创建模型的代码的格式。

SaveModel 是一种独立于语言的、可恢复的密封序列化格式。 TensorFlow 提供了多种与 SavedModel 交互的机制,例如 tf.saved_model API、Estimator API 和 CLI。 TensorFlow 需要 SavedModel 格式的模型文件。

重新训练并保存为SavedModel

正如文章中提到的,《这个中秋,我开发了一个识别狗狗的app》狗识别的深度学习模型不需要从头开始训练,但我们必须在现有模型的基础上应用迁移学习和重新训练。鉴于模型安装在服务器上,我选择了Inception V3模型,识别能力更强。

标记的狗数据集使用斯坦福狗数据集。请自行下载并解压,然后运行以下命令进行训练:

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

训练好的模型将位于 models/inception_v3/1 文件夹中,其中 1 为版本号,并且可以通过输入重新训练命令行参数。 py 脚本。 ?根据文档,启动tensorflow模型服务器非常简单。添加rest_api_port参数启动服务器并提供RESTful API。这个API可以方便微信小程序与其进行通信。

tensorflow_model_server --rest_api_port=8501 --model_base_path=$PWD/models/inception_v3
复制代码

但是这样启动tensorflow模型服务端后,却很长时间没有与客户端通信。正当我一头雾水的时候,在github上看到了一个项目:github.com/tobegit3hub...微信小程序遇上TensorFlow:Server端实现

简单来说,Simple TensorFlow Serving就是对TensorFlow Serving的封装,这是一个通用且易于使用的机器学习服务楷模。

它也非常雄心勃勃,声称支持以下功能:

  • 支持分布式 TensorFlow 模型
  • 支持标准 RESTful / HTTP API
  • 支持输入❙支持❙其他命令行工具
  • 支持客户端使用任何编程语言
  • 支持自动生成客户端代码,无需编码
  • 支持在图像模型中使用原始图像文件同时得出结论请求 模型服务
  • 支持动态在线和离线模型版本
  • 支持为 TensorFlow 模型加载新的自定义操作
  • 通过可配置的//基本身份验证支持安全身份验证 TenchyyFo CNTK / ONNX / H2o / Scikit-learn / XGBoost / PMML 和许多其他模型

我什么最喜欢的是自动客户代码生成功能。在此之前,我查了很多资料,都没有搞清楚客户端和服务端的通信方式。它还提供了一个 Web 界面,用于查看模型的结构和签名。这个签名也是我花了很长时间才想出来的。

浏览器访问:http://127.0.0.1:8500,Web界面如下:微信小程序遇上TensorFlow:Server端实现

简单的TensorFlow Serving安装非常简单:

pip install simple_tensorflow_serving
复制代码

接下来在服务器上启动:❀❙have♹❀❙客户端小程序开发我还没开始学习。我们先用python写一个客户端并测试一下。借助,我们可以自动生成客户端代码 功能:

curl http://localhost:8500/v1/models/default/gen_client?language=python > test_client.py
复制代码

自动生成的代码如下:

#!/usr/bin/env python

import requests

def main():
  endpoint = "http://ilego.club:8500"
  json_data = {"model_name": "default", "data": {"image": [[[[1.0, 1.0, 1.0], [1.0, 1.0, 1.0], [1.0, 1.0, 1.0], [1.0, 1.0, 1.0], [1.0, 1.0, 1.0]]]]}}
  result = requests.post(endpoint, json=json_data)
  print(result.text)

if __name__ == "__main__":
  main()
复制代码

可以看到,客户端向服务端发送了一段JSON数据,并接收到结果。根据图像读取、图像缩放、转换为JSON格式数据修改这段代码,就完成了测试客户端代码。请阅读代码:github.com/mogoweb/aie…

你可以尝试测试一下。一张狗的图片:

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。

总结

这个服务器还远远不够完美,还存在一些问题:

  1. 客户端和服务器上的图片都是以JSON格式传输的,图片数据是从二进制转为JSON字符串,有空间利用率低。考虑对图像数据进行 Base64 编码。
  2. 预测效果比较。从发送请求到收到响应需要几十秒的时间,而且我们还没有找到瓶颈在哪里。
  3. 并发支持,因为这只是一个简单的测试。如果考虑到产品的阶段性,同时识别多个手机微信小程序,还有很多工作要做。

作者:云水木希
链接:https://juejin.im/post/5bb6c4da6fb9a05d330ad053
来源:掘金
版权归作者所有。商业转载请联系作者获得许可。非商业转载请注明来源。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门