#python #numpy #flask #python-requests #pytorch
#python #numpy #flask #python-запросы #pytorch
Вопрос:
У меня есть изображение, и я хочу отправить его на сервер. Я использую requests
модуль для выполнения простого post-запроса следующим образом (информация — это словарь):
import requests
print(type(info["array_image"]))
print(type(info["visual_features"]))
response = requests.post("url", data=info)
вывод :
<class 'numpy.ndarray'>
<class 'torch.Tensor'>
на стороне сервера я пытаюсь получить их как минимум в виде массивов:
from flask import Flask, request
@app.route('/path', methods=['POST'])
def function_name():
visual_features = request.form['visual_features']
array_image = request.form['array_image']
print(type(array_image))
print(type(visual_features))
вывод:
<class 'str'>
<class 'str'>
Я хочу получить массив байтов для построения изображения, но то, что я получаю, — это строка…
Если я не нашел способ, я буду кодировать массивы в bas64, а затем декодировать его на сервере…
Ответ №1:
Спасибо @praba230890 за то, что он дал мне простой пример.
Я бы все равно записал решение здесь, поскольку предоставленная ссылка не совсем подходит для моего случая.
import pickle
import io
bytes_image = pickle.dumps(info["array_image"])
stream = io.BytesIO(bytes_image)
files = {"bytes_image": stream}
info["array_image"] = None
response = http.post("url", data=info, files=files)
и на стороне сервера:
from flask import Flask, request
@app.route('/path', methods=['POST'])
def function_name():
image = request.files.get('bytes_image')
bytes_image = image.read()
если вы хотите получить изображение из файла, то:
requests.post("http://localhost:5000/predict",
files={"file": open('<PATH/TO/.jpg/FILE>/cat.jpg','rb')})
Решение, которое я сейчас использую:
remember info["array_image"]
— это массив numpy и info
словарь
import io
info["image_shape_width"] = info["array_image"].shape[0]
info["image_shape_height"] = info["array_image"].shape[1]
bytes_image = info["array_image"].tobytes()
stream = io.BytesIO(bytes_image)
files = {"bytes_image": stream}
info["array_image"] = None
response = http.post(self.ip "path", data=info, files=files)
затем получите его
from flask import Flask, request
import numpy as np
@app.route('/path', methods=['POST'])
def function_name():
bytes_image = request.files.get('bytes_image')
bytes_image = bytes_image.read()
array_image = np.frombuffer(bytes_image, dtype=dtype)
shape = (int(request.form['image_shape_width']), int(request.form['image_shape_height']), 3)
array_image = np.reshape(array_image, shape)
image = Image.fromarray(array_image)
Ответ №2:
Вы можете попытаться преобразовать свои данные в правильный JSON или использовать модуль Python pickle, или, если у вас есть изображение, как вы упомянули, вы можете отправить его в виде файла (составной запрос) на сервер, как показано в приведенных здесь примерах.
Комментарии:
1. это половина way…it сработало, но я сохраняю изображение в файле, затем передаю файл в post-запрос … это нехорошо, потому что мне нужно сохранять каждое изображение в хранилище, я хочу передать файл, не сохраняя его