0

我目前正在尝试实现自己的功能来在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

我期望这样做是以相同的方式翻转所有图像/蒙版 ifflip_lr > 0.5flip_ud > 0.5,但实际发生的是某些图像将被翻转而没有翻转蒙版和 v/v。有没有人经历过这个并且知道如何解决它?

提前致谢

4

1 回答 1

3

根据以下行代码:

        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]

您仅将增强应用于蒙版。如果您的任务是分割,那么您对掩码应用的任何增强都应该应用于groundtruth 图像。

我发现以下实现更容易:

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

它能做什么:

  1. 生成一个介于 0 和 1 之间的随机浮点标量。
  2. 如果大于.5则翻转图像和蒙版

您还可以使用tf.image.flip_left_right进行水平翻转。

tf.image.flip_up_down

于 2018-12-14T12:54:40.887 回答