对于 Tensorflow 中的一批图像,从其本身减去图像的意思
Subtract Image' mean from itself for a batch of images in Tensorflow
给定一批图像,我想从图像本身中减去图像的均值。
显然,tf.image.per_image_standardization
不是我想要的,因为我不想除以标准差。
而且,frames_normalized = tf.map_fn(lambda frame: tf.reduce_mean(frame, axis=[2]), frames_contrast_adjust)
不是我想要的,因为这会减小原始图像的尺寸。也就是说,如果单个图像的维度是 [112, 112, 3],则 tf.reduce_mean
图像的结果将具有 [112, 112] 的形状。因此,当frames_contrast_adjust
是一批大小为[?, 112, 112, 3]的图像时,frame_normalized
的大小将变为:[?, ?, 112, 3]。
请注意,我确实想在中间使用队列。
非常感谢任何帮助!!
问题已通过将 tf.reduce_mean
中的 keep_dims
参数设置为 true 解决。现在:
tf.map_fn(lambda frame: tf.reduce_mean(frame, axis=[2], keep_dims=True), frames_contrast_adjust)
为了从图像本身减去图像的平均值,我做了以下操作:
frames_normalized = tf.map_fn(lambda frame: frame - tf.reduce_mean(frame, axis=[2], keep_dims=True), input_frames)
如果你想要的操作几乎像 per_image_standadization
但没有方差,你可以看看 tf.image.per_image_standadization 是如何实现的并删除所有与方差相关的东西(我把它注释掉了):
image = ops.convert_to_tensor(image, name='image')
image = control_flow_ops.with_dependencies(_Check3DImage(image, require_static=False), image)
num_pixels = math_ops.reduce_prod(array_ops.shape(image))
image = math_ops.cast(image, dtype=dtypes.float32)
image_mean = math_ops.reduce_mean(image)
#variance = (math_ops.reduce_mean(math_ops.square(image)) -math_ops.square(image_mean))
#variance = gen_nn_ops.relu(variance)
#stddev = math_ops.sqrt(variance)
# Apply a minimum normalization that protects us against uniform images.
#min_stddev = math_ops.rsqrt(math_ops.cast(num_pixels, dtypes.float32))
#pixel_value_scale = math_ops.maximum(stddev, min_stddev)
pixel_value_offset = image_mean
image = math_ops.subtract(image, pixel_value_offset)
#image = math_ops.div(image, pixel_value_scale)
return image
给定一批图像,我想从图像本身中减去图像的均值。
显然,tf.image.per_image_standardization
不是我想要的,因为我不想除以标准差。
而且,frames_normalized = tf.map_fn(lambda frame: tf.reduce_mean(frame, axis=[2]), frames_contrast_adjust)
不是我想要的,因为这会减小原始图像的尺寸。也就是说,如果单个图像的维度是 [112, 112, 3],则 tf.reduce_mean
图像的结果将具有 [112, 112] 的形状。因此,当frames_contrast_adjust
是一批大小为[?, 112, 112, 3]的图像时,frame_normalized
的大小将变为:[?, ?, 112, 3]。
请注意,我确实想在中间使用队列。
非常感谢任何帮助!!
问题已通过将 tf.reduce_mean
中的 keep_dims
参数设置为 true 解决。现在:
tf.map_fn(lambda frame: tf.reduce_mean(frame, axis=[2], keep_dims=True), frames_contrast_adjust)
为了从图像本身减去图像的平均值,我做了以下操作:
frames_normalized = tf.map_fn(lambda frame: frame - tf.reduce_mean(frame, axis=[2], keep_dims=True), input_frames)
如果你想要的操作几乎像 per_image_standadization
但没有方差,你可以看看 tf.image.per_image_standadization 是如何实现的并删除所有与方差相关的东西(我把它注释掉了):
image = ops.convert_to_tensor(image, name='image')
image = control_flow_ops.with_dependencies(_Check3DImage(image, require_static=False), image)
num_pixels = math_ops.reduce_prod(array_ops.shape(image))
image = math_ops.cast(image, dtype=dtypes.float32)
image_mean = math_ops.reduce_mean(image)
#variance = (math_ops.reduce_mean(math_ops.square(image)) -math_ops.square(image_mean))
#variance = gen_nn_ops.relu(variance)
#stddev = math_ops.sqrt(variance)
# Apply a minimum normalization that protects us against uniform images.
#min_stddev = math_ops.rsqrt(math_ops.cast(num_pixels, dtypes.float32))
#pixel_value_scale = math_ops.maximum(stddev, min_stddev)
pixel_value_offset = image_mean
image = math_ops.subtract(image, pixel_value_offset)
#image = math_ops.div(image, pixel_value_scale)
return image