簡體   English   中英

通過 requests.post 將 numpy 數組(實際上是圖像)發送到 API 的最佳方式(性能)是什么? (Python)

[英]What is the best way (performance) to send an numpy array (an image actually) by requests.post to an API? (python)

我想知道如何通過請求的 post 方法發送一個 3 維 numpy 數組; 如果可能的話,如何壓縮這些數據。 最好的方法可能是:

  • 數據量更小
  • 更少的圖書館
  • 更少的計算時間
  • 你想要什么..

我見過這種模式:

作為文件發送:

requests.post(api_url, files={'image': open(img_path, 'rb')})

作為編碼數組發送:

# image_np is a numpy array
_, img_encoded = cv2.imencode('.jpg', image_np)
requests.post(api_url, data=img_encoded.tobytes())

作為緩沖區發送:

buf = io.BytesIO()
plt.imsave(buf, image_np, format='jpg')
image_data = buf.getvalue()
requests.post(api_url, data=image_data)

作為字符串 base64 發送:

with open(img_path, 'rb') as fp:
    img_encoded = str(b64encode(fp.read()))
    
r = requests.post(api_url, json={'image': img_encoded})

首先,不會有完美的方法來最小化以下所有三個因素:

  • 數據量更小
  • 更少的圖書館
  • 更少的計算時間

會有一些權衡,我可以解釋每種方法的權衡,以便讓您清楚地了解每種方法,但是在所做的權衡中找到完美的最佳點在很大程度上取決於用例。

我將在這里丟棄較少的庫部分,因為您已經以 JPG 格式壓縮圖像,這隱含地意味着您在內部使用 libJPEG。 並且 JPG 確實提供了相當不錯的壓縮率,因此我們將僅使用 JPEG 格式的 go。

數據量更小

要減少有效負載,我們可以嘗試以下操作:

  • 減小圖像尺寸,這可以顯着減小圖像尺寸,但是您必須找到正確的閾值,在該閾值處,您的 object 檢測精度會隨着圖像尺寸的減小而大大降低。 對計算時間的影響最小
  • 其次,您可以嘗試減少顏色(基本上是對 RGB 域進行下采樣)。 雖然 JPEG 已經為您完成了這些工作,但它試圖保留大部分顏色信息。 如果處理 (255, 255, 255) 和 (255, 255, 250) 不會影響 object 檢測 model 的准確性,那么您可以只使用int(color/5)*5對圖像顏色域進行下采樣。 對計算時間的影響最小
  • 我們可以嘗試的最后一件事是完全丟棄 colors。 並使用灰度圖像代替 RGB colors。 這也取決於您的 object 檢測 model,是對顏色數據敏感還是只需要灰度信息。 對計算時間的中等影響

暫無
暫無

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

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