如何在TensorFlow Serving中向本地YOLO模型传递单张图片?
解决TensorFlow Serving传递单张图片到YOLO模型的TypeError问题
你遇到的这个错误很典型——CopyFrom()方法要求传入的是TensorFlow的TensorProto对象,但你直接传了OpenCV读取后得到的numpy数组,类型不匹配自然会报错。下面是完整的修正方案,一步步帮你搞定单张图片的传递:
1. 补充必要的导入与初始化
首先你需要导入tensorflow的make_tensor_proto工具,用来把numpy数组转换成TensorProto;另外还要记得创建PredictRequest对象(你的代码里漏掉了这一步):
from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_service_pb2_grpc import cv2 as cv import tensorflow as tf import grpc import numpy as np # 初始化通道和stub(注意补上主机地址,默认是localhost) channel = grpc.insecure_channel("localhost:8501") stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) # 创建PredictRequest对象(关键!你之前的代码缺少这一步) request = predict_pb2.PredictRequest() request.model_spec.name = 'yolo' request.model_spec.signature_name = 'predict'
2. 图片预处理与格式转换
YOLO模型通常期望输入是**[batch_size, height, width, channels]**格式的张量,所以单张图片需要先增加batch维度,再转成TensorProto:
# 读取图片 image = cv.imread("test.jpg") # 图片预处理(完全匹配你训练YOLO时的预处理规则,示例仅供参考) # 调整到模型要求的输入尺寸,比如640x640 input_shape = (640, 640) image = cv.resize(image, input_shape) # 如果模型要求归一化到0-1区间,就除以255.0 image = image / 255.0 # 增加batch维度:从(640,640,3)变为(1,640,640,3) image = image[np.newaxis, ...] # 把numpy数组转换成TensorProto tensor_proto = tf.make_tensor_proto(image, dtype=tf.float32)
3. 传递TensorProto到请求中
现在就可以把转换好的TensorProto赋值给request的inputs了:
request.inputs['images'].CopyFrom(tensor_proto) # 发送请求并获取结果 response = stub.Predict(request, timeout=10.0) # 解析响应(根据你的YOLO模型输出格式自行处理) predictions = response.outputs['outputs'].float_val
关键注意点
- 务必保证图片预处理的步骤和你训练YOLO模型时的逻辑完全一致(比如尺寸、归一化方式、通道顺序),否则模型会输出错误结果。
- 如果你的模型输入是整数类型(比如0-255的uint8),记得在
make_tensor_proto里把dtype改成tf.uint8。
内容的提问来源于stack exchange,提问作者Saurabh
相关产品推荐
相关产品推荐

