我在TFRecord文件中保存灰度图像。然后我的想法是在我的GPU上对它们进行颜色映射(当然只使用TF),这样它们就可以获得三个通道(它们将用于预先训练好的VGG-16型号,因此它们必须有三个通道)。
有没有人知道如何正确吗?
我尝试使用自制的TF颜色映射脚本,使用for循环,tf.scatter_nd
和一个shape = (256,3)
的映射数组...但它花了很长时间。
修改
img_rgb = GRAY SCALE IMAGE WITH 3 CHANNELS
cmp = [[255,255,255],
[255,255,253],
[255,254,250],
[255,254,248],
[255,254,245],
...
[4,0,0],
[0,0,0]]
cmp = tf.convert_to_tensor(cmp, tf.int32) # (256, 3)
hot = tf.zeros([224,224,3], tf.int32)
for i in range(img_rgb.shape[2]):
for j in range(img_rgb.shape[1]):
for k in range(img_rgb.shape[0]):
indices = tf.constant([[k,j,i]])
updates = tf.Variable([cmp[img_rgb[k,j,i],i]])
shape = tf.constant([256, 3])
hot = tf.scatter_nd(indices, updates, shape)
这是我的尝试,我知道它不是最佳选择,但这是我能想到的唯一解决方案。
答案 0 :(得分:1)
我们来帮忙。如果每个人都编写了最佳代码,就不需要Stackoverflow。 :)
以下是我将如何取代最后7行(未经测试的代码):
conv_img = tf.gather( params = cmp,
indices = img_rgb[ :, :, 0 ] )
基本上,不需要for循环,Tensorflow将为您做到这一点,并且更快。 tf.gather()
将根据提供的索引从cmp
收集元素,这里将是img_rgb
的第0个频道。每个收集的元素将包含来自cmp
的三个通道,因此当您将它们放在一起时,它将形成一个图像。
我现在没时间测试,跑步,抱歉。希望它有效。
答案 1 :(得分:0)
感谢{@ {3}}
import matplotlib
import matplotlib.cm
import tensorflow as tf
def colorize(value, vmin=None, vmax=None, cmap=None):
"""
A utility function for TensorFlow that maps a grayscale image to a matplotlib
colormap for use with TensorBoard image summaries.
Arguments:
- value: 2D Tensor of shape [height, width] or 3D Tensor of shape
[height, width, 1].
- vmin: the minimum value of the range used for normalization.
(Default: value minimum)
- vmax: the maximum value of the range used for normalization.
(Default: value maximum)
- cmap: a valid cmap named for use with matplotlib's `get_cmap`.
(Default: 'gray')
Example usage:
```
output = tf.random_uniform(shape=[256, 256, 1])
output_color = colorize(output, vmin=0.0, vmax=1.0, cmap='plasma')
tf.summary.image('output', output_color)
```
Returns a 3D tensor of shape [height, width, 3].
"""
# normalize
vmin = tf.reduce_min(value) if vmin is None else vmin
vmax = tf.reduce_max(value) if vmax is None else vmax
value = (value - vmin) / (vmax - vmin) # vmin..vmax
# squeeze last dim if it exists
value = tf.squeeze(value)
# quantize
indices = tf.to_int32(tf.round(value * 255))
# gather
cm = matplotlib.cm.get_cmap(cmap if cmap is not None else 'gray')
colors = tf.constant(cm.colors, dtype=tf.float32)
value = tf.gather(colors, indices)
return value
您也可以尝试tf.image.grayscale_to_rgb
,尽管似乎只有一种颜色映射选择,gray
。