上传 JSON 格式的图片文件
Posted
技术标签:
【中文标题】上传 JSON 格式的图片文件【英文标题】:Upload an image file with JSON Format 【发布时间】:2021-10-09 02:57:42 【问题描述】:我正在尝试构建机器学习算法并使用 REST API 进行部署。当我这样做时,我收到了一些错误,例如“MALFORMED_REQUEST”、“message”:“无法解析来自 JSON 的输入。确保输入是有效的 JSON 格式字符串。”。在下面你可以看到我的代码。你能告诉我我做错了什么吗?提前致谢。
import json
import requests
import base64
#data = 'cat_Test2.jpg'
with open('./Dataset/test2/cat_Test2.jpg', mode='rb') as file:
img = file.read()
data = base64.encodebytes(img).decode('utf-8')
#print(json.dumps(data))
#print(data)
headers = 'Content-Type': 'application/json'
request_uri = 'http://127.0.0.1:5000/invocations'
if __name__ == '__main__':
try:
response = requests.post(request_uri, data=data, headers=headers)
print(response.content)
print('done!!!')
except Exception as ex:
raise (ex)
【问题讨论】:
【参考方案1】:MLflow 模型服务器接受 JSON(pandas split-orient 格式)或 CSV 作为输入。 https://mlflow.org/docs/latest/models.html#deploy-mlflow-models
您需要将图像转换为这两种格式之一。例子: https://github.com/amesar/mlflow-examples/tree/master/python/keras_tf_mnist#score-mnist-png-file
【讨论】:
好吧,谢谢先生,我是机器学习和 mlflow 的新手。它对我来说变得越来越整洁。这些链接对我非常有用【参考方案2】:仅仅因为您已将图像转换为(base64 编码的)字符串,并不意味着它现在是有效的 JSON。
我看到你已经在你的代码中使用了print(json.dumps(data))
,你应该注意到了双引号,而不是print(data)
。
例子:
import json
s = "abc"
print(s)
print(json.dumps(s))
输出:
abc
"abc"
只有加上引号后,字符串才是有效的JSON。
这意味着
response = requests.post(request_uri, data=json.dumps(data), headers=headers)
应该做的工作。
为了完整起见,看看这个加载字符串与加载 JSON 字符串的案例:
import json
s = 'abc'
json.loads(s)
json.decoder.JSONDecodeError:预期值:第 1 行第 1 列(字符 0)
import json
s = '"abc"'
print(json.loads(s))
abc
【讨论】:
以上是关于上传 JSON 格式的图片文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 Retrofit 上传 JSON 格式的多部分图像数据?
python+requests接口自动化4. 接口实现文件(图片)上传