繁体   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