我想要一个关于在Keras中将输入rgb图像转换为灰度图像的最佳方法的规范答案。 This answer暗示也许这样的事情最好用Lambda来实现,但这对我来说效率低下。在我看来Average Pooling layers应该能够做到这一点,但我似乎无法弄清楚这一点。是否存在我在文档中缺少的RGB到灰度层?看起来这是一个非常普通的操作。
答案 0 :(得分:6)
有一些公式可以将彩色图像转换为灰度图像。 他们非常确定,选择通常取决于你是否喜欢更亮或更暗的结果,更好的对比度等。
Three common formulas are here。让我们来看看"光度"式。
result = 0.21 R + 0.72 G + 0.07 B
这只能通过lambda层来实现。并且它没有用处,它只是必要的数学。
def converter(x):
#x has shape (batch, width, height, channels)
return (0.21 * x[:,:,:,:1]) + (0.72 * x[:,:,:,1:2]) + (0.07 * x[:,:,:,-1:])
将此lambda图层添加到模型中:
Lambda(converter)
尽管AveragePooling似乎是这样,但这些层意味着减少空间"维度,而不是"渠道"。您需要大量的解决方法并重新整形,以使其中一个池模式适用于渠道。
如果您更喜欢使用tensorflow中的现成公式,请再次使用lambda图层,现在使用此函数,基于您提供的答案:
Lambda(lambda x: tf.image.rgb_to_grayscale(x))
converter
的其他选项:
#perhaps faster? perhaps slower?
def converter(x):
weights = K.constant([[[[0.21 , 0.72 , 0.07]]]])
return K.sum(x*weights, axis=-1,keepdims=True)
Stepan Novikov评论道。如果您的想法只是预处理图像,您可以使用其他工具并避免麻烦。
如果您需要在此操作中跟踪渐变,则只需在模型内执行此操作。
答案 1 :(得分:4)
在Keras中,有一种更简单的方法> = 2.1.6在RGB和灰度之间进行转换。使用ImageDataGenerator类增强图像数据时,可以使用flow_from_directory方法创建一个生成器对象,该对象可用于使用fit_generator方法来训练模型。
flow_from_directory方法的优点是它具有几个参数来执行更多图像处理,其中之一是color_mode,可以将其设置为“ rgb”或“灰度”。我不确定为什么此参数包含在生成器对象中,而不包含在ImageDataGenerator对象参数中,但是可以解决问题。
如果您愿意花点力气来设置生成器(文档:here),则可以使用此生成器以及其他一些有用的预处理参数。