我想要一个关于在Keras中将输入rgb图像转换为灰度的最佳方法的规范答案.这个答案提示可能这样的事情最好用Lambda实现,但这对我来说效率低下.在我看来,平均池化层应该能够做到这一点,但我似乎无法弄明白.是否存在我在文档中缺少的RGB到灰度层?看起来这是一个非常普通的操作.
有一些公式可以将彩色图像转换为灰度图像.他们非常有决心,选择通常取决于你是否喜欢更亮或更暗的结果,更好的对比度等.
这里有三个常见的公式.让我们采用"光度"公式.
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评论的那样.如果您的想法只是预处理图像,您可以使用其他工具并避免麻烦.
如果您需要在此操作中跟踪渐变,则只需在模型内执行此操作.