``````

In [14]:

#TENSORFLOW IMPLEMENTATION

%matplotlib inline
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from skimage import io, color
import cv2

SF = 2   #scaling factor, i.e. how much do you want to scale your image (here, twice of original image)

ip_height = 160
ip_width = 240

``````
``````

In [15]:

#there are total of 100 images (i chose 50 for training and 20 are for testing)
#but i am not using all of them

x_ = np.array([images for i,images in enumerate(temp1)],dtype =np.float32).reshape(-1,160,240,1)
y_ = np.array([images for i,images in enumerate(temp2)],dtype= np.float32).reshape(-1,1,320*480)

xx = np.array(x_).astype(np.float32)   #x is tensor - (160, 240,1)
yy = np.array(y_).astype(np.float32)   #y is a vector- (1,320*480)
'''

change these numbers according to your
train and test set sizes....

'''
xtest =np.array(x_[:1])        #test set
ytest =np.array(y_[:1])

xx=xx[1:9]                        #train set
yy=yy[1:9]

X = tf.placeholder(tf.float32, shape=(None, 160, 240, 1),name="X" )        # input
Y = tf.placeholder(tf.float32,shape=(None, 1, 320*480),name="Y" )      # actual output
print(len(xtest))

``````
``````

1

``````
``````

In [16]:

def conv2d(x, W, b, strides=1, act_fn = 1):
# Conv2D wrapper, with bias and relu activation(only if act_fn=1)
x = tf.nn.conv2d(x, W, strides=[1, strides, strides, 1], padding='SAME')
x = tf.nn.bias_add(x, b)
if act_fn ==1:
return tf.nn.relu(x)
else:
return x

def dil_conv2d(x, W, b, rate=2):
# Dilation Conv2D wrapper, with bias but no activation
x = tf.nn.atrous_conv2d(x, W , rate, padding='SAME')
x = tf.nn.bias_add(x, b)
return x

``````
``````

In [23]:

# Store layer's weight & bias   ------   weights here are equivalent to 'filters' in tensorflow

with tf.device("/gpu:0"):
def CNN(X):
weights = {
# 5x5 conv, 1 input, 32 outputs                             FEATURE REP.
'wc1': tf.Variable(tf.random_normal([3, 3, 1, 32])*0.0008,name='wc1',dtype=tf.float32),

# 5x5 conv, 32 inputs, 32 outputs                           SHRINKING
'wc2': tf.Variable(tf.random_normal([3, 3, 32, 16])*0.0008,'wc2',dtype=tf.float32),

# 5x5 conv, 32 inputs, 16 outputs                           NON-LINEAR MAPPING
'wc3': tf.Variable(tf.random_normal([3, 3, 16, 32])*0.0008, 'wc3',dtype=tf.float32),
# 3X3 dilation conv, 16 inputs, 16 outputs                  NON-LINEAR MAPPING
'wd1': tf.Variable(tf.random_normal([3, 3, 32,32])*0.0008,'wd1',dtype=tf.float32),
# 5x5 conv, 32 inputs, 16 outputs                           NON-LINEAR MAPPING
'wc4': tf.Variable(tf.random_normal([3, 3, 32,32])*0.0008,'wc4',dtype=tf.float32),
# 3X3 dilation conv, 16 inputs, 16 outputs                  NON-LINEAR MAPPING
'wd2': tf.Variable(tf.random_normal([3, 3, 32,32])*0.0008,'wd2',dtype=tf.float32),
# 5x5 conv, 32 inputs, 16 outputs                           NON-LINEAR MAPPING
'wc5': tf.Variable(tf.random_normal([3, 3, 32,16])*0.0008,'wc5',dtype=tf.float32),

# 5x5 conv, 16 inputs, 64 outputs                           EXPANSION
'wc6': tf.Variable(tf.random_normal([3, 3, 16, 32])*0.0008,'wc6',dtype=tf.float32),

}

biases = {
'bc1': tf.Variable(tf.random_normal([32]),dtype=tf.float32),    #FEATURE REPRESENTATION

'bc2': tf.Variable(tf.random_normal([16]),dtype=tf.float32),     #SHRINKING

'bc3': tf.Variable(tf.random_normal([32]),dtype=tf.float32),     #NON-LINEAR MAPPING
'bd1': tf.Variable(tf.random_normal([32]),dtype=tf.float32),     #NON-LINEAR MAPPING
'bc4': tf.Variable(tf.random_normal([32]),dtype=tf.float32),     #NON-LINEAR MAPPING
'bd2': tf.Variable(tf.random_normal([32]),dtype=tf.float32),     #NON-LINEAR MAPPING
'bc5': tf.Variable(tf.random_normal([16]),dtype=tf.float32),     #NON-LINEAR MAPPING

'bc6': tf.Variable(tf.random_normal([32]),dtype=tf.float32),    #EXPANSION
}

X = tf.cast(tf.reshape(X, shape=[-1, 160, 240, 1]),tf.float32)

c1 = conv2d(X, weights['wc1'], biases['bc1'])    #FEATURE REP

c2 = conv2d(c1, weights['wc2'], biases['bc2'])          #SHRINKING

c3 = conv2d(c2, weights['wc3'], biases['bc3'])          #NON-LINEAR MAPPING
d1 = dil_conv2d(c3, weights['wd1'], biases['bd1'])
c4 = conv2d(d1, weights['wc4'], biases['bc4'])
d2 = dil_conv2d(c4, weights['wd2'], biases['bd2'])
c5 = conv2d(d2, weights['wc5'], biases['bc5'])

c6 = conv2d(c5, weights['wc6'], biases['bc6'], act_fn =0)     #EXPANSION (LOCAL QUEUE JUMPING)
c6 = tf.nn.relu(c6)
#DECONVOLUTION
op_image =tf.contrib.layers.conv2d_transpose(c6, num_outputs=1, kernel_size=(3,3), stride=2, padding="same")
op_image = tf.reshape(op_image, ( -1,1, 320*480),"op_image")     #reshape the o/p image to a vector

return op_image

``````
``````

In [ ]:

with tf.device("/gpu:0"):
def train_cnn(X):
prediction = CNN(X)
print(prediction)
#mse
loss = tf.reduce_mean(tf.pow(tf.subtract(prediction, Y), 2.0))
#optimizer
# i used same optimizers with different learning rate.

with tf.Session(config=tf.ConfigProto(allow_soft_placement=True)) as sess:
sess.run(tf.global_variables_initializer())

for epoch in range(20):
l = sess.run(loss, feed_dict={X: xx, Y: yy})
sess.run(train1, feed_dict={X: xx, Y: yy})
print('Epoch', epoch+1, 'completed,  loss:\t', l)

for epoch in range(20,45):
l = sess.run(loss, feed_dict={X: xx, Y: yy})
sess.run(train2, feed_dict={X: xx, Y: yy})
print('Epoch', epoch+1, 'completed,  loss:\t', l)

for epoch in range(45,70):
l = sess.run(loss, feed_dict={X: xx, Y: yy})
sess.run(train3, feed_dict={X: xx, Y: yy})
print('Epoch', epoch+1, 'completed,  loss:\t', l)

print("\n TEST ERROR : ", sess.run(loss, feed_dict={X: xtest, Y: ytest}))

a = sess.run(prediction, feed_dict={X: xtest} )
b = np.array(a,dtype = np.uint8).reshape(1,80,120)

for i in range(1):
#save images in directory
cv2.imwrite(str,b[i])
#show images
fig = plt.figure()
plt.imshow(b[i], cmap ='gray')

``````
``````

In [ ]:

train_cnn(X)

``````
``````

Tensor("op_image_3:0", shape=(?, 1, 153600), dtype=float32)
Epoch 1 completed,  loss:	 16574.5
Epoch 2 completed,  loss:	 15528.3
Epoch 3 completed,  loss:	 14228.9
Epoch 4 completed,  loss:	 11941.6
Epoch 5 completed,  loss:	 6737.02
Epoch 6 completed,  loss:	 85436.7
Epoch 7 completed,  loss:	 4886.78
Epoch 8 completed,  loss:	 8674.23
Epoch 9 completed,  loss:	 10453.2
Epoch 10 completed,  loss:	 11340.4
Epoch 11 completed,  loss:	 11707.2
Epoch 12 completed,  loss:	 11874.1
Epoch 13 completed,  loss:	 11942.5
Epoch 14 completed,  loss:	 11959.5
Epoch 15 completed,  loss:	 11917.3

``````