高效地调整一组 np.array 图像的大小

8

我有一个4D np.array的大小为(10000,32,32,3),它代表了一组由1万张RGB图像组成的数据集。

我该如何使用skimage.transform.resize或其他函数高效地调整所有图像的大小,以便将(32,32)插值到(224,224)?我更喜欢使用skimage来完成这个任务,但我也愿意接受任何不使用tf.image.resize_images的解决方案。

我的当前解决方法是使用tf.image.resize_images,但它会在后续处理过程中(在jupyter笔记本中)引起GPU内存问题(无法释放内存),因此我想替换它。

示例:

import tensorflow as tf
X = tf.image.resize_images(X,[224, 224])
with tf.Session() as sess:
    X = X.eval()
2个回答

6

我可能不会接受自己的答案,但似乎一个简单的for循环实际上相当快(从top显示大约300%的CPU利用率)。

from skimage.transform import resize

imgs_in = np.random.rand(100, 32, 32, 3)
imgs_out = np.zeros((100,224,224,3))

for n,i in enumerate(imgs_in):
    imgs_out[n,:,:,:] = resize(imgs_in[n,:,:,:], imgs_out.shape[1:], anti_aliasing=True)

print(imgs_out.shape)

在我的机器上,似乎比ndi.zoom快7-8倍。我认为进一步使用multiprocessing并行化将会更好。


3
有一种可能性是使用scipy.ndimage.zoom,它可以处理您的图像集合,并使用给定阶数的样条插值来上采样您的图像。
import numpy as np
import scipy.ndimage as ndi

imgs_in = np.random.rand(100, 32, 32, 3)
factor = 224/imgs_in.shape[1]
imgs_out = ndi.zoom(imgs_in, (1, factor, factor, 1), order=2)
print(imgs_out.shape)

预期的形状为(100, 224, 224, 3)

您需要检查运行时间和结果是否符合您的需求。调整插值顺序可能会影响此结果:使用二阶和(默认)三阶样条之间存在明显的速度差异,但代价是插值质量下降。


1
谢谢你的回答。这似乎有效,我可能需要使用它。运行时间似乎比tensorflow版本慢一个数量级,但这会引起其他问题。 - Austin
1
@Austin 确实,从 CPU 和内存使用情况来看,我怀疑很少进行向量化处理。但我想一个普通的计划 C 总是会派上用场的... - Andras Deak -- Слава Україні
2
这是否是使用joblib或多线程/多进程处理10000张图片的好选择? - Mark Setchell
@MarkSetchell 我想是的。但这可能适用于一般问题。GPU是否与其他类型的并行化相容?我不能说我在这个主题上特别精通。 - Andras Deak -- Слава Україні

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接