在Keras Lambda层中调整输入图像的大小

21

我想让我的Keras模型使用OpenCV或类似工具来调整输入图像的大小。

我已经看到过使用ImageGenerator的方法,但我更希望自己编写生成器,并在第一层中使用keras.layers.core.Lambda简单地调整图像的大小。

我应该怎么做?

1个回答

26
如果您正在使用TensorFlow后端,则可以在Lambda层中使用tf.image.resize_images()函数来调整图像的大小。 以下是一个小例子以说明这一点:
import numpy as np
import scipy.ndimage
import matplotlib.pyplot as plt

from keras.layers import Lambda, Input
from keras.models import Model
from keras.backend import tf as ktf


# 3 channel images of arbitrary shape
inp = Input(shape=(None, None, 3))
try:
    out = Lambda(lambda image: ktf.image.resize_images(image, (128, 128)))(inp)
except :
    # if you have older version of tensorflow
    out = Lambda(lambda image: ktf.image.resize_images(image, 128, 128))(inp)

model = Model(input=inp, output=out)
model.summary()

X = scipy.ndimage.imread('test.jpg')

out = model.predict(X[np.newaxis, ...])

fig, Axes = plt.subplots(nrows=1, ncols=2)
Axes[0].imshow(X)
Axes[1].imshow(np.int8(out[0,...]))

plt.show()

我遇到了之前相同的问题。在预测时,我收到一个错误,指出找不到“ktf”。当然,在我的预测脚本中应用了相同的导入语句。我还尝试将其更改为完整路径“keras.backend.tf”,但仍然出现“NameError”:名称“keras”未定义。 - Sam Hammamy
1
@SamHammamy 看起来你运行预测脚本的环境中没有安装 keras。尝试仅导入 keras 并查看是否有效。如果有效,请查看它使用的后端是哪一个。此外,你可以使用 import tensorflow as tf 代替从 keras 后端获取 tf,并进行相同的操作。 - indraforyou
当然它有keras。我通过在生成器中调整大小运行了几周的预测。但是,这是一个树莓派板,我从网上找到的自定义pip轮上安装了TensorFlow。正如我所说,如果我在生成器中调整大小,它可以正常工作。我还发现了这个解决方案,今天我需要进行调查 https://gist.github.com/bzamecnik/a33052ec46ee7efeb217856d98a4fb5f - Sam Hammamy
1
有几件事情可以做...在系统上进行训练。当你有一组好的权重时,使用它在嵌入式系统上运行...这将通过批量大小减少嵌入式系统的内存需求。第二个是使用Theano后端...TensorFlow需要更多的内存。 - indraforyou
我在AWS上使用p2.xlarge实例进行训练。我知道我没有说清楚。我认为问题出在预测时的树莓派上。无论如何,我不想在这上面花太多时间。如果我在生成器中调整大小并在预测之前在树莓派上调整大小,一切都很好。再次感谢! - Sam Hammamy
显示剩余2条评论

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