我正在用mark-R-Cnn进行实例分割,结果是一个布尔2d数组。我正在处理大图像(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),但这慢了4倍。比我的方法 array_to_jpg_image ...
关于如何以更有效的方式实现此目标的任何想法吗?
这是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