调用Clarifai食品检测模型触发ValueError错误的解决求助
解决Clarifai gRPC调用时的ValueError: too many values to unpack (expected 2)
问题描述
我正在开发食品图片识别功能:上传图片后用Clarifai食品检测模型识别,将结果展示在HTML页面,代码如下:
from flask import Flask,render_template,request,redirect,url_for ,session from PIL import Image import pandas as pandas from werkzeug.utils import secure_filename from clarifai_grpc.grpc import api from clarifai_grpc.grpc.api import service_pb2, resources_pb2 from clarifai_grpc.grpc.api.status import status_code_pb2 from clarifai_grpc.channel.clarifai_channel import ClarifaiChannel from clarifai_grpc.grpc.api import service_pb2_grpc stub = service_pb2_grpc.V2Stub(ClarifaiChannel.get_grpc_channel()) app=Flask(__name__,template_folder='templates',static_folder='static') app.secret_key='a' @app.route('/',methods=['POST','GET']) def food(): metadata = (('authorization', 'Key {XXXXXXX}')) if request.method =='POST' : file = request.files['Image'] image = Image.open(file) my_request =service_pb2.PostModelOutputsRequest(model_id='9504135848be0dd2c39bdab0002f78e9',inputs=[resources_pb2.Input(data=resources_pb2.Data(image=resources_pb2.Image(base64=file.getvalue())))]) response = stub.PostModelOutputs(my_request,metadata=metadata) print(response) if response.status.code != status_code_pb2.SUCCESS: raise Exception("Request failed, status code: " + str(response.status.code)) names = [] confidences = [] for concept in response.outputs[0].data.concepts: names.append(concept.name) confidences.append(concept.value) return render_template('button.html',img=image,searchResults=names) return render_template('button.html') if __name__=="__main__": app.run(debug=True ,host='0.0.0.0')
运行时执行response = stub.PostModelOutputs(my_request,metadata=metadata)一行出现错误:
ValueError: too many values to unpack (expected 2)
解决方案
核心问题:metadata格式错误
gRPC的metadata参数要求传入一个由(key, value)二元组组成的可迭代对象(列表或元组),你当前的写法metadata = (('authorization', 'Key {XXXXXXX}'))在Python中等价于('authorization', 'Key {XXXXXXX}')——这是一个二元组,而非包含二元组的可迭代对象。gRPC会尝试迭代这个二元组的每个元素(即字符串),将每个字符串拆分为key-value对,从而触发“too many values to unpack”错误。
修正方法二选一:
# 方式1:使用列表(推荐) metadata = [('authorization', 'Key {XXXXXXX}')] # 方式2:使用带逗号的元组(确保是包含单个二元组的元组) metadata = (('authorization', 'Key {XXXXXXX}'),)
额外潜在问题修正
- 你导入了
pandas但未使用,可以删除该行代码以优化项目结构。 - 直接将PIL Image对象
img=image传给模板无法在HTML中渲染,需要将图片转换为base64字符串或保存到静态目录后传递路径。例如转换为base64的代码:import base64 from io import BytesIO # 在获取file并打开图片后添加 img_buffer = BytesIO() image.save(img_buffer, format='JPEG') img_base64 = base64.b64encode(img_buffer.getvalue()).decode('utf-8') # 模板中使用:<img src="data:image/jpeg;base64,{{ img_base64 }}"> return render_template('button.html', img_base64=img_base64, searchResults=names)
内容的提问来源于stack exchange,提问作者Safee987
相关产品推荐
相关产品推荐

