PaddleHub:自定义Module的Serveing

  • 0. 提要
  • 1. 客服端请求
  • 1.1 图片转base64
  • 1.2 求任务的构建
  • 2. 服务端的解析
  • 3. 启动服务

0. 提要

serving涉及到的主要是以base64请求服务器和服务器解码base64所产生的问题

github:detect_test_for_PaddleHub

PaddleHub自定义Module

1. 客服端请求

客户端请求主要完成图片转base64,以及请求任务的构建

1.1 图片转base64

关于图片转base64在python:base64与图片的互转的文章中有所描述,但是该文章中是将图片转为base64,默认是”bytes“类型,但是对于服务器请求,”bytes“是无法json化的,所以需要将”bytes“转为字符串”str“类型;同理,在解码(base64转图片)时,我们必须将”str“的base64数据转为”bytes“才能顺利解码。

with open(img_path,'rb') as f:
    base64=base64.b64encode(f.read())   # 得到”bytes“类型的base64数据
    image_base64 = base64.decode('utf-8') # 为了能够json请求,再次转为”str“

1.2 求任务的构建

完整的客户端请求代码:

import requests
import json
import base64

if __name__ == "__main__":
    img_path=r"temp.jpeg"
    with open(img_path,'rb') as f:
        base64=base64.b64encode(f.read())   # 得到”bytes“类型的base64数据
        image_base64 = base64.decode('utf-8') # 为了能够json请求,再次转为”str“

    # ”image64“一定是自定义Module中@serving函数的参数同名
    # 当有多个参数需要传递时,在@serving函数中定义名字对应的入参即可
    data = {"image64": image_base64}
    # 指定预测方法为detect_test并发送post请求,content-type类型应指定json方式
    url = "http://127.0.0.1:5959/predict/detect_test"
    # 指定post请求的headers为application/json方式
    headers = {"Content-Type": "application/json"}

    r = requests.post(url=url, headers=headers, data=json.dumps(data))

    # 打印预测结果
    print(r.json())

2. 服务端的解析

代码如下:

@serving
def predict_serving(self, image64):  # 接收客户端json中"image64"中的数据
	# 将”str“类型的转为”bytes“类型的base64数据
    image64_bytes=image64.encode('utf-8')
	# 将base64解码为图片数据
    debase64_data = base64.b64decode(image64_bytes)
    # ........
    # 在这里你可以根据需要将图片数据保存为文件、numpy矩阵数据,opencv图像数据等

3. 启动服务

现在你写好了包含serving的项目,如何使用?

  1. 安装
    hub insall your_project
  2. 启动服务
$ hub serving start --modules your_project \
                    --port XXXX \
                    --use_gpu \
                    --use_multiprocess \
                    --workers \
                    --gpu \

比如:
hub serving start --modules detect_test --port 5959
启动detect_test项目,使用5959端口
然后运行客户端代码(主要代码中的端口号和这里一致)即可请求

你可能感兴趣的:(paddlepaddle,python)