serving涉及到的主要是以base64请求服务器和服务器解码base64所产生的问题
github:detect_test_for_PaddleHub
PaddleHub自定义Module
客户端请求主要完成图片转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“
完整的客户端请求代码:
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())
代码如下:
@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图像数据等
现在你写好了包含serving的项目,如何使用?
hub insall your_project
$ 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端口
然后运行客户端代码(主要代码中的端口号和这里一致)即可请求