как отправить массив numpy или тензор pytorch через http post запрос с использованием модуля запросов и Flask

#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-запрос … это нехорошо, потому что мне нужно сохранять каждое изображение в хранилище, я хочу передать файл, не сохраняя его