You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:58:52