我无法将大量小图像文件(大约 90k png 图像)加载到单个 3D np.array
中。
当前的解决方案需要几个小时,这是不可接受的。
图片大小为 64x128。
我有一个名为 pd.DataFrame
的 labels
,其中包含图像的名称,并希望以与 labels
变量中相同的顺序导入其图像。
我目前的解决方案是:
dataset = np.empty([1, 64, 128], dtype=np.int32)
for file_name in labels['file_name']:
array = cv.imread(f'{IMAGES_PATH}/{file_name}.png', cv.COLOR_BGR2GRAY)
dataset = np.append(dataset, [array[:]], axis=0)
据我统计,最耗时的操作是 dataset = np.append(dataset, [array[:]], axis=0)
,每张图像大约需要 0.4 秒。
是否有更好的方法导入此类文件并将其存储在 np.array
中?
我正在考虑多处理,但我希望 labels
和 dataset
的顺序相同。
答案 0 :(得分:0)
游戏开发人员通常将成束的小图像连接成一个大文件,然后使用大小和偏移量来切出当前需要的部分。以下是如何使用 imagemagick 完成此操作的示例:
montage -mode concatenate -tile 1x *.png out.png
但话又说回来,它不会解决读取 90k 小文件的问题。魔法有它自己的特点,在您的情况下可能会也可能不会出现。
另外,我最初没有注意到您在使用 np.append(dataset, [array[:]], axis=0)
时遇到问题。
那是非常糟糕的线路。在循环中追加永远不是高性能代码。
要么预先分配数组并写入它。或者使用 numpy 的函数在 once 处连接多个数组:
dataset = np.empty([int(90e3), 64, 128], dtype=np.int32)
for i,file_name in enumerate(labels['file_name']):
array = cv.imread(f'{IMAGES_PATH}/{file_name}.png', cv.COLOR_BGR2GRAY)
dataset[i,:,:] = array