Reconstructing an image after using extract_image_patches

后端 未结 7 1406
一生所求
一生所求 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:20

    Use Update#2 - One small example for your task: (TF 1.0)

    Considering image of size (4,4,1) converted to patches of size (4,2,2,1) and reconstructed them back to image.

    import tensorflow as tf
    image = tf.constant([[[1],   [2],  [3],  [4]],
                     [[5],   [6],  [7],  [8]],
                     [[9],  [10], [11],  [12]],
                    [[13], [14], [15],  [16]]])
    
    patch_size = [1,2,2,1]
    patches = tf.extract_image_patches([image],
        patch_size, patch_size, [1, 1, 1, 1], 'VALID')
    patches = tf.reshape(patches, [4, 2, 2, 1])
    reconstructed = tf.reshape(patches, [1, 4, 4, 1])
    rec_new = tf.space_to_depth(reconstructed,2)
    rec_new = tf.reshape(rec_new,[4,4,1])
    
    sess = tf.Session()
    I,P,R_n = sess.run([image,patches,rec_new])
    print(I)
    print(I.shape)
    print(P.shape)
    print(R_n)
    print(R_n.shape)
    

    Output:

    [[[ 1][ 2][ 3][ 4]]
      [[ 5][ 6][ 7][ 8]]
      [[ 9][10][11][12]]
      [[13][14][15][16]]]
    (4, 4, 1)
    (4, 2, 2, 1)
    [[[ 1][ 2][ 3][ 4]]
      [[ 5][ 6][ 7][ 8]]
      [[ 9][10][11][12]]
      [[13][14][15][16]]]
    (4,4,1)
    

    Update - for 3 channels (debugging..)

    working only for p = sqrt(h)

    import tensorflow as tf
    import numpy as np
    c = 3
    h = 1024
    p = 32
    
    image = tf.random_normal([h,h,c])
    patch_size = [1,p,p,1]
    patches = tf.extract_image_patches([image],
       patch_size, patch_size, [1, 1, 1, 1], 'VALID')
    patches = tf.reshape(patches, [h, p, p, c])
    reconstructed = tf.reshape(patches, [1, h, h, c])
    rec_new = tf.space_to_depth(reconstructed,p)
    rec_new = tf.reshape(rec_new,[h,h,c])
    
    sess = tf.Session()
    I,P,R_n = sess.run([image,patches,rec_new])
    print(I.shape)
    print(P.shape)
    print(R_n.shape)
    err = np.sum((R_n-I)**2)
    print(err)
    

    Output :

    (1024, 1024, 3)
    (1024, 32, 32, 3)
    (1024, 1024, 3)
    0.0
    

    Update 2

    Reconstructing from output of extract_image_patches seems difficult. Used other functions to extract patches and reverse the process to reconstruct which seems easier.

    import tensorflow as tf
    import numpy as np
    c = 3
    h = 1024
    p = 128
    
    
    image = tf.random_normal([1,h,h,c])
    
    # Image to Patches Conversion
    pad = [[0,0],[0,0]]
    patches = tf.space_to_batch_nd(image,[p,p],pad)
    patches = tf.split(patches,p*p,0)
    patches = tf.stack(patches,3)
    patches = tf.reshape(patches,[(h/p)**2,p,p,c])
    
    # Do processing on patches
    # Using patches here to reconstruct
    patches_proc = tf.reshape(patches,[1,h/p,h/p,p*p,c])
    patches_proc = tf.split(patches_proc,p*p,3)
    patches_proc = tf.stack(patches_proc,axis=0)
    patches_proc = tf.reshape(patches_proc,[p*p,h/p,h/p,c])
    
    reconstructed = tf.batch_to_space_nd(patches_proc,[p, p],pad)
    
    sess = tf.Session()
    I,P,R_n = sess.run([image,patches,reconstructed])
    print(I.shape)
    print(P.shape)
    print(R_n.shape)
    err = np.sum((R_n-I)**2)
    print(err)
    

    Output:

    (1, 1024, 1024, 3)
    (64, 128, 128, 3)
    (1, 1024, 1024, 3)
    0.0
    

    You could see other cool tensor transformation functions here : https://www.tensorflow.org/api_guides/python/array_ops

提交回复
热议问题