python - 如何将base64图像发送到gRPC tf服务服务器而不是http请求?
问题描述
当我在 tf-serving 中提供对象检测模型并通过 http 请求访问它时,我有一个工作代码。相同的代码是:
import requests
import base64
import json
URL = "http://10.10.1.38:8501/v1/models/test_model:predict"
headers = {"content-type": "application/json"}
image = "test111.jpg"
image_content = base64.b64encode(open(image,'rb').read())
encodedStr = str(image_content, "utf-8")
body = {"signature_name": "predict_images","inputs": [{"b64":encodedStr}]}
response = requests.post(URL, data=json.dumps(body), headers = headers)
我想做同样的事情,但使用 gRPC 客户端代码。
代码是:
import grpc
from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2_grpc
image = "test111.jpg"
image_content = base64.b64encode(open(image,'rb').read())
encodedStr = str(image_content, "utf-8")
server = 'localhost:8500'
channel = grpc.insecure_channel(server)
stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)
request = predict_pb2.PredictRequest()
request.model_spec.name = 'test_model'
request.model_spec.signature_name = 'predict_images'
request.inputs['inputs'].CopyFrom(tf.contrib.util.make_tensor_proto(encodedStr, shape=[1]))
result_future = stub.Predict(request,40.)
但这会引发以下错误:
_Rendezvous: <_Rendezvous of RPC that terminated with:
status = StatusCode.INVALID_ARGUMENT
details = "assertion failed: [Unable to decode bytes as JPEG, PNG, GIF, or BMP]
[[{{node map/while/decode_image/cond_jpeg/cond_png/cond_gif/Assert_1/Assert}}]]"
debug_error_string = "{"created":"@1579785768.913000000","description":"Error received from peer","file":"src/core/lib/surface/call.cc","file_line":1017,"grpc_message":"assertion failed: [Unable to decode bytes as JPEG, PNG, GIF, or BMP]\n\t [[{{node map/while/decode_image/cond_jpeg/cond_png/cond_gif/Assert_1/Assert}}]]","grpc_status":3}"
>
解决方案
如果有人仍在寻找答案,您只需将图像字节对象作为列表传递给 dtype=tf.string 的 tf.make_tensor_proto。
以下代码应该可以工作:
import grpc
from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2_grpc
image = "test_img.jpg"
image_bytes = open(image,'rb').read()
server = 'localhost:8500'
channel = grpc.insecure_channel(server)
stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)
request = predict_pb2.PredictRequest()
request.model_spec.name = 'default'
request.model_spec.signature_name = 'serving_default'
request.inputs['bytes_inputs'].CopyFrom(tf.make_tensor_proto([image_bytes], dtype=tf.string))
result_future = stub.Predict(request)
推荐阅读
- python-3.x - 检查两个不同列中的df中的两个值是否存在于不同的df中?
- android - 如何将文件从 Firebase 存储 url 下载到内部存储
- java - 具有 websocket“http_upgrade”配置的 Tomcat 虚拟主机
- java - 用于验证可能包含小数和特定长度的数字的字符串的正则表达式
- xaml - 如何在旋转后修复图像重叠标签
- ios - iOS Ad Hoc 安装在 2 台特定设备上失败
- java - 有没有办法向 mvn `process-classes` 阶段添加依赖项?
- ionic-framework - 如何以编程方式调用离子刷新功能?
- sql - 在 SQL Server 存储过程中根据时间查找正确的班次
- spring-boot - NoSuchMethodError SpringBoot 启动失败