python - 将 Pillow 字节图像转换为 numpy 数组非常慢
问题描述
我正在使用 mark-R-Cnn 进行实例分割,结果是一个布尔二维数组。我正在处理大图像(2448、3264),每个图像都有很多对象。保存结果(或仅将其保存在内存中)是巨大的,例如 30Gb !我不知道为什么 2d numpy 布尔数组占用这么多空间(掩码也是 2448x3264)。所以我将它存储为一个字节,从而将总内存占用减少到只有几 Mb。我面临的问题是我需要将其转换回一个 numpy 数组,以便能够检测具有 X、Y 坐标的点是否在对象的掩码内(我在不同的函数中做了很多),并且这个操作np.asarray(im_arr)非常慢,在 1000 次迭代的循环中需要 6 秒。我也尝试像这样使用openCV进行转换:mask = cv2.imdecode(n, cv2.IMREAD_UNCHANGED)[:, :, 3].astype(bool),但这比我的方法array_to_jpg_image慢 4 倍...
关于如何以更有效的方式做到这一点的任何想法?
这是一个 2d 布尔掩码的示例:https ://pastebin.pl/view/92a7d1db
谢谢 !
from PIL import Image
import numpy as np
import io
def mask_image_to_array(mask):
img_pil = Image.fromarray(np.array(mask, dtype=np.uint8))
img_pil.putpalette([0,0,0,255,255,255])
bytes_io = io.BytesIO()
img_pil.save(bytes_io, format='PNG', transparency=0, optimize=0)
bytes = bytes_io.getvalue()
return bytes
def array_to_jpg_image(bytes):
im_arr = Image.open(io.BytesIO(bytes))
return np.asarray(im_arr)
print(justBlademask[0][0]['masks'][:,:,0].shape)
#(2448, 3264)
#justBlademask is a boolean mask , from instance segmentation
test = mask_image_to_array(justBlademask[0][0]['masks'][:,:,0])
start_time = time.time()
for i in range(1000):
test3 = array_to_jpg_image(test)
print('Total time elapsed: %.2f seconds' % (time.time() - start_time))
#Total time elapsed: 6.49 seconds
解决方案
推荐阅读
- scons - 为什么我不能从伪构建器 (AddMethod) 中修改构建环境?
- common-lisp - 如何获取 Quicklisp 提供的每个系统的所有依赖项列表?
- python - 如何使用 Python 中的 Pillow 在图片上添加单词并将其中一个加粗?
- reactjs - 尝试将部署推送到 Firebase 托管合并到主分支并给我一个错误:进程完成,退出代码 254
- angular - Angular,woocommerce,wordpress JWT AUTH 登录错误,不正确的 200 OK 来自服务器的响应可能破坏登录尝试
- javascript - 从 json javascript 获取数据
- opengl - 如何允许用户为 openGL 软件自定义着色器
- python - 如何解开 pyparsing 辅助函数的结果?
- intellij-idea - Intellij 错误地突出显示括号对?
- python - 如何从递归字典值中填充数据框?