首页 > 解决方案 > 将 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

标签: pythonnumpypython-imaging-library

解决方案


推荐阅读