This is the implementation of an ECCV'18 paper, "Fast, Accurate, and Lightweight Super-Resolution with Cascading Residual Network" in Tensorflow (link)
For this implementation, I designed new layers and a model by subclassing, which was a good practice of this tensorflow code guide on 'Making new Layers and Models via subclassing'. (link)
- Language: Python3
- Required Packages: numpy, cv2 (for read image input), and tensorflow
- To install the required packages, type the following command:
- Using tensorflow-gpu==2.0.0
pip3 install numpy opencv-python tensorflow-gpu==2.0.0
- Using higher version of tensorflow
pip3 install numpy opencv-python tensorflow
By subclassing layers and models, we can easily design CARN model simply specifying a few parameters.
- Parameters for CARN model:
- initial_filter_num: represents the number of filters for the inital convolution layer
- num_cas_block: represents the number of cascading blocks
- num_res_block: represents the number of resnet blocks in a cascading block
- num_conv_block: represents the number of convolution layer in a resnet block
- kernel_size: represnets the size of kernel in a convolution layer
- In this implementation, tensorflow-gpu==2.0.0 is installed. If higher version of TF used, you can easily enable 'group convolution' in tf.keras.layers.Conv2D by setting 'groups' attribute to the number of groups you want
- You can remove the last Conv2D layer as its functionality already exists in the upsample layer.
- How to create the CARN model
#Set the model parameters
initial_filter_num = 16
num_cas_block = 1
num_res_block = 2
num_conv_block = 2
kernel_size = 3
#Load your dataset
input = cv2.imread('output.jpg').astype(np.float32)
input_small = cv2.resize(input, None, fx = 1/4, fy = 1/4) / 255.
#Set the training parameters
epochs = 10
optimizer = tf.keras.optimizers.Adam(learning_rate = 1e-4)
#Set the model save path
save_path = 'model'
if not os.path.exists(save_path):
os.makedirs(save_path)
model = CasResNet(initial_filter_num, num_cas_block, num_res_block, num_conv_block, kernel_size)
optimizer = tf.keras.optimizers.Adam(learning_rate = 1e-4)
model.compile(optimizer, loss = tf.keras.losses.MeanSquaredError())
model.fit(input_small[np.newaxis, ...], input[np.newaxis, ...], epochs = epochs)
model.build_graph().summary()
tf.keras.utils.plot_model(model.build_graph(), show_shapes=True, dpi=256)
model.save(save_path)
'''
model = tf.keras.models.load_model(save_path)
result = model(input_small[np.newaxis, ...])
print(result)
'''