上传 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. 接口实现文件(图片)上传

python+requests接口自动化4. 接口实现文件(图片)上传

php图片上传检测是否为真实图片格式

php判断上传文件是不是图片,如果是,返回图片格式