您现在的位置是:首页 >其他 >几种存segmentation mask方法对比网站首页其他
几种存segmentation mask方法对比
简介几种存segmentation mask方法对比
发现同一幅图的原图(.jpg, 1920 × 1080 1920 imes 1080 1920×1080)才 155K,其用 .npy 存的 segmentation mask 居然有 2M。按理 segmentation mask 只有一个通道,数据量应该更少,可能是不同文件压缩方法导致差异。这里比较几种存 mask 的方法:
- .npy
- .mat
- .jpg
- .png
import numpy as np
import scipy.io as sio
from PIL import Image
# 读原 mask
m = np.load("42.npy")
print(m.shape, m.dtype) # (1080, 1920) uint8
# 存 jpg、png、mat,右键属性看文件大小
i = Image.fromarray(m).convert("RGB")
i.save("42.jpg")
i.save("42.png", "PNG")
sio.savemat("42.mat", {"mask": m}, do_compression=True)
# 重读,看跟原 npy mask 有无差异
jpg = np.asarray(Image.open("42.jpg"))
print(jpg.shape, jpg.dtype) # (1080, 1920, 3) uint8
png = np.asarray(Image.open("42.png"))
print(png.shape, png.dtype) # (1080, 1920, 3) uint8
mat = sio.loadmat("42.mat")["mask"]
print(mat.shape, mat.dtype) # (1080, 1920) uint8
# 比较 jpg 差异
for i in range(jpg.shape[2]):
print("jpg diff:", i, (m != jpg[:, :, i]).sum())
# jpg diff: 0 46349
# jpg diff: 1 46349
# jpg diff: 2 46349
# 比较 png 差异
for i in range(png.shape[2]):
print("png diff:", i, (m != png[:, :, i]).sum())
# png diff: 0 0
# png diff: 1 0
# png diff: 2 0
# 比较 mat 差异
print("mat diff:", (m != mat).sum())
# mat diff: 0
用 .jpg 存会失真!因为有损压缩吧,.png 就不会。再看大小(win10):
Size | Size on disk | |
---|---|---|
原图(.jpg) | 155 KB (159,646 bytes) | 156 KB (159,744 bytes) |
.npy mask | 1.97 MB (2,073,728 bytes) | 1.98 MB (2,076,672 bytes) |
.jpg mask | 44.5 KB (45,595 bytes) | 48.0 KB (49,152 bytes) |
.png mask | 16.5 KB (16,940 bytes) | 20.0 KB (20,480 bytes) |
.mat mask | 12.2 KB (12,574 bytes) | 16.0 KB (16,384 bytes) |
Conclusion
还是 .mat 压得更小,.png 也还行,两种都不会失真,且比 .npy 小。numpy 也有压缩方法 numpy.packbits,但用起来没有 .mat 方便,且似乎压缩率不如 .mat,见:压缩二进制numpy数据。
当是 instance/panoptic segmentation mask 的时候,可能要另存一个 mask 表示 instance id,可以考虑:
- png:一个 channel 表示 class id、一个 channel 表示 instance id,第三个 channel 不用(png 可以只有 3 个 channels);
- mat:class id 和 instance id 分别存一个 矩阵。
此时推荐用 .mat 吧,是以 dict 的形式存的,形如:{"class": class_id_mask, "instance": instance_id_mask}
,更可读。不过如果大小超过 2G 会报错,见:h5py存取简例。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。