我目前正在尝试实现自己的功能,以在tensorflow
中进行配对数据扩充。为此,我需要将随机图像变换应用于输入图像,并将相关变换应用于输出蒙版(即旋转和翻转)。但是,图像翻转/反转无法正常工作。我目前拥有的代码示例如下:
def paired_data_augmentation(image_masks_tuple):
#the image_masks_tuple contains an image as its first
#and masks as the remaining elements
def flipper(image_masks,mode = 'lr'):
image = image_masks[0]
masks = image_masks[1:]
if mode == 'lr':
image_masks = [
tf.reverse(m,[0]) for m in image_masks]
elif mode == 'ud':
image_masks = [
tf.reverse(m,[1]) for m in image_masks]
image = image_masks[0]
masks = image_masks[1:]
return [image,*new_masks]
image = image_masks_tuple[0]
masks = image_masks_tuple[1:]
image = tf.image.convert_image_dtype(image, dtype=tf.float32)
flip_lr = tf.random_uniform([])
flip_ud = tf.random_uniform([])
tmp = [image,*masks]
tmp = tf.cond(
tf.greater_equal(flip_lr,0.5),
lambda: flipper(tmp,mode = 'lr'),
lambda: tmp)
set_shape(tmp)
tmp = tf.cond(
tf.greater_equal(flip_ud,0.5),
lambda: flipper(tmp,mode = 'ud'),
lambda: tmp)
set_shape(tmp)
return tmp
我期望这样做的是如果使用flip_lr > 0.5
或flip_ud > 0.5
,则以相同的方式翻转所有图像/遮罩,但是实际上发生的是某些图像将被翻转而没有遮罩翻转和v / v。有人经历过并且知道如何解决吗?
预先感谢
答案 0 :(得分:1)
按照以下代码行:
if mode == 'lr':
image_masks = [
tf.reverse(m,[0]) for m in image_masks]
elif mode == 'ud':
image_masks = [
tf.reverse(m,[1]) for m in image_masks]
您仅将增强应用于蒙版。如果您的任务是分割,那么您要对蒙版应用的任何增广处理也应应用于地面真实图像。
我发现以下实现更容易:
def flip_image_vertically(image, mask):
"""Randomly flip an image and label vertically (left to right).
"""
uniform_random = tf.random_uniform([], 0, 1.0)
flip_cond = tf.less(uniform_random, .5)
image = tf.cond(flip_cond, lambda: tf.image.flip_up_down(image), lambda: image)
mask = tf.cond(flip_cond, lambda: tf.image.flip_up_down(mask), lambda: mask)
return image, mask
它的作用:
您还可以使用 tf.image.flip_left_right 进行水平翻转。