Reconstructing an image after using extract_image_patches

后端 未结 7 1378
一生所求
一生所求 2020-12-16 14:37

I have an autoencoder that takes an image as an input and produces a new image as an output.

The input image (1x1024x1024x3) is split into patches (1024x32x32x3) bef

7条回答
  •  北海茫月
    2020-12-16 15:12

    Since I also struggled with this, I post a solution that might be useful to others. The trick is to realize that the inverse of tf.extract_image_patches is its gradient, as suggested here. Since the gradient of this op is implemented in Tensorflow, it is easy to build the reconstruction function:

    import tensorflow as tf
    from keras import backend as K
    import numpy as np
    
    def extract_patches(x):
        return tf.extract_image_patches(
            x,
            (1, 3, 3, 1),
            (1, 1, 1, 1),
            (1, 1, 1, 1),
            padding="VALID"
        )
    
    def extract_patches_inverse(x, y):
        _x = tf.zeros_like(x)
        _y = extract_patches(_x)
        grad = tf.gradients(_y, _x)[0]
        # Divide by grad, to "average" together the overlapping patches
        # otherwise they would simply sum up
        return tf.gradients(_y, _x, grad_ys=y)[0] / grad
    
    # Generate 10 fake images, last dimension can be different than 3
    images = np.random.random((10, 28, 28, 3)).astype(np.float32)
    # Extract patches
    patches = extract_patches(images)
    # Reconstruct image
    # Notice that original images are only passed to infer the right shape
    images_reconstructed = extract_patches_inverse(images, patches) 
    
    # Compare with original (evaluating tf.Tensor into a numpy array)
    # Here using Keras session
    images_r = images_reconstructed.eval(session=K.get_session())
    
    print (np.sum(np.square(images - images_r))) 
    # 2.3820458e-11
    

提交回复
热议问题