簡體   English   中英

如何在將圖像發布到 Rest API 時提高傳輸速度

[英]How to increase transfer speed when POSTing an image to a Rest API

I am new to developing Rest APIs and trying to deploy a machine learning model for image segmentation using Python and Rest APIs.
在服務器端我使用 FastAPI,而在客戶端我使用 Python 請求庫。 客戶端已經將圖像大小調整為 model 的必要輸入大小,因此不會發送不必要的大圖像。 服務器將接收到的圖像饋送到 model 並返回二進制分割掩碼。 圖像和掩碼從 numpy arrays 轉換為列表,然后作為 json 數據發送。
下面是一些代碼,代表我剛剛描述的內容。 由於我無法在此處提供 model,因此此最小可重現示例中的服務器將返回它收到的相同圖像。

server.py

import uvicorn
from fastapi import FastAPI
import numpy as np
from datetime import datetime

app = FastAPI()

@app.get('/test')
def predict_and_process(data: dict = None):
    start = datetime.now()
    if data:
        image = np.asarray(data['image'])
        print("Time to run: ", datetime.now() - start)
        return {'prediction': np.squeeze(image).tolist()}
    else:
        return {'msg': "Model or data not available"}

def run():
    PORT = 27010
    uvicorn.run(
        app,
        host="127.0.0.1", 
        port=PORT,
    )


if __name__=='__main__':
    run()

client.py

import requests
import numpy as np
import json
from matplotlib.pyplot import imread 
from skimage.transform import resize
from datetime import datetime

def test_speed():
    path_to_img = r"path_to_some_image"
    
    image = imread(path_to_img)
    image = resize(image, (1024, 1024))
    img_list = image.tolist()

    data = {'image': img_list}
    start = datetime.now()
    respond = requests.get('http://127.0.0.1:27010/test', json=data)

    prediction = respond.json()['prediction']
    print("time for prediction: {}".format(datetime.now()-start))

if __name__=='__main__':
    test_speed()

來自服務器的 output 是:

(cera) PS C:\Users\user_name\Desktop\MRM\REST> python .\server.py
[32mINFO[0m:     Started server process [[36m20448[0m]
[32mINFO[0m:     Waiting for application startup.
[32mINFO[0m:     Application startup complete.
[32mINFO[0m:     Uvicorn running on [1mhttp://127.0.0.1:27010[0m (Press CTRL+C to quit)
Time to run:  0:00:00.337099
[32mINFO[0m:     127.0.0.1:61631 - "[1mGET /test HTTP/1.1[0m" [32m200 OK[0m

來自客戶端的 output 是:

(cera) PS C:\Users\user_name\Desktop\MRM\REST> python .\client.py
time for prediction: 0:00:16.845123

由於在服務器上運行的代碼不到一秒,因此將圖像從客戶端傳輸到服務器(或返回)所需的時間大約是 8 秒,這絕對是太長了。
我無法發送較小的圖像,因為 model 的輸入大小需要保持不變。

因此,對於部署/REST 新手來說:從 REST API 獲得我的預測的專業/最佳實踐方法是什么? 我認為有限制,因為我使用的是 python 但 16 秒對我來說似乎太長了。
先感謝您!

正如@slizb 所指出的,將圖像編碼為 base64 使一切變得更快。 而不是img_list = img.to_list()使用

data = {'shape': image.shape, 'img': base64.b64encode(image.tobytes())}

並在服務器上

image = np.frombuffer(base64.b64decode(data.img)).reshape(data.shape)

確保也發送形狀,因為 numpy 不會“記住”緩沖區中的形狀,所以我需要手動.reshape()圖像。
總時間下降到大約 1 秒,這主要是我的 model 的推理時間。

我建議通讀本文檔並嘗試為您的圖片上傳路線提供的示例。

https://fastapi.tiangolo.com/tutorial/request-files/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM