【问题标题】:Efficiently resize batch of np.array images有效地调整一批 np.array 图像的大小
【发布时间】:2019-04-04 02:28:24
【问题描述】:

我有一个 4D np.array 大小 (10000,32,32,3),代表一组 10000 个 RGB 图像。

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

我当前的解决方案是使用tf.image.resize_images,但它会在我的管道中导致 GPU 内存问题(在 jupyter notebook 完成后不会释放内存),所以我想替换它。

例子:

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

【问题讨论】:

    标签: python python-3.x tensorflow image-resizing scikit-image


    【解决方案1】:

    一种可能性是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)

    您必须检查运行时和结果是否符合您的需要。调整插值阶数可能会影响这一点:二阶和(默认)三阶样条曲线之间存在明显的速度差异,这是以插值质量为代价的。

    【讨论】:

    • 感谢您的回答。这似乎有效,我可能不得不使用它。运行时似乎比 tensorflow 版本慢一个数量级,但这会导致其他问题。
    • @Austin 确实,查看 CPU 和内存使用情况,我怀疑几乎没有进行矢量化。但我想一个行人计划 C 可能总能派上用场……
    • 这不是 joblib 或 10,000 张图像的多线程/多处理的理想选择吗?
    • @MarkSetchell 我猜是的。但这可能适用于一般问题。 GPU 是否可以很好地与其他类型的并行化配合使用?我不能说我对这个主题特别精通。
    【解决方案2】:

    我不太可能接受我自己的答案,但似乎一个简单的 for 循环实际上相当快(据说来自 top 的 CPU 利用率约为 300%)。

    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 进一步并行化会更好。

    【讨论】:

      猜你喜欢
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多