我有一个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笔记本中完成后不会释放内存),所以我想更换它。
示例:
import tensorflow as tf
X = tf.image.resize_images(X,[224, 224])
with tf.Session() as sess:
X = X.eval()
答案 0 :(得分: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 :(得分:3)
我不太可能接受我自己的答案,但是似乎简单的for循环实际上相当快(例如,ui <- fluidPage(
textInput("text", "Enter your text here")
)
server <- function(input, output) {
output$value <- renderText({ input$text })
}
shinyApp(ui, server)
的cpu利用率约为300%)。
top
似乎比我的计算机上的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)
快7-8倍。我认为,尝试进一步将其与ndi.zoom
并行化。