image_denoising.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. from keras.layers import Input, Conv3D, MaxPooling3D, UpSampling3D
  2. from keras.models import Model
  3. from keras import backend as K
  4. from keras.callbacks import TensorBoard
  5. import os
  6. import json
  7. import pandas as pd
  8. import numpy as np
  9. import argparse
  10. from sklearn.utils import shuffle
  11. import cv2
  12. from modules.utils import config as cfg
  13. def generate_model(input_shape):
  14. input_img = Input(shape=input_shape) # adapt this if using `channels_first` image data format
  15. x = Conv3D(32, (1, 3, 3), activation='relu', padding='same')(input_img)
  16. x = MaxPooling3D((1, 2, 2), padding='same')(x)
  17. x = Conv3D(32, (1, 3, 3), activation='relu', padding='same')(x)
  18. x = MaxPooling3D((1, 2, 2), padding='same')(x)
  19. x = Conv3D(32, (1, 3, 3), activation='relu', padding='same')(x)
  20. encoded = MaxPooling3D((1, 2, 2), padding='same')(x)
  21. print(encoded)
  22. x = Conv3D(32, (1, 3, 3), activation='relu', padding='same')(encoded)
  23. x = UpSampling3D((1, 2, 2))(x)
  24. x = Conv3D(32, (1, 3, 3), activation='relu', padding='same')(x)
  25. x = UpSampling3D((1, 2, 2))(x)
  26. x = Conv3D(32, (1, 3, 3), activation='relu', padding='same')(x)
  27. x = UpSampling3D((1, 2, 2))(x)
  28. decoded = Conv3D(3, (1, 3, 3), activation='sigmoid', padding='same')(x)
  29. autoencoder = Model(input_img, decoded)
  30. autoencoder.compile(optimizer='adadelta', loss='mse')
  31. return autoencoder
  32. def main():
  33. # load params
  34. parser = argparse.ArgumentParser(description="Train Keras model and save it into .json file")
  35. parser.add_argument('--data', type=str, help='dataset filename prefix (without .train and .test)', required=True)
  36. parser.add_argument('--output', type=str, help='output file name desired for model (without .json extension)', required=True)
  37. parser.add_argument('--batch_size', type=int, help='batch size used as model input', default=cfg.keras_batch)
  38. parser.add_argument('--epochs', type=int, help='number of epochs used for training model', default=cfg.keras_epochs)
  39. args = parser.parse_args()
  40. p_data_file = args.data
  41. p_output = args.output
  42. p_batch_size = args.batch_size
  43. p_epochs = args.epochs
  44. # load data from `p_data_file`
  45. ########################
  46. # 1. Get and prepare data
  47. ########################
  48. print("Preparing data...")
  49. dataset_train = pd.read_csv(p_data_file + '.train', header=None, sep=";")
  50. dataset_test = pd.read_csv(p_data_file + '.test', header=None, sep=";")
  51. print("Train set size : ", len(dataset_train))
  52. print("Test set size : ", len(dataset_test))
  53. # default first shuffle of data
  54. dataset_train = shuffle(dataset_train)
  55. dataset_test = shuffle(dataset_test)
  56. print("Reading all images data...")
  57. # getting number of chanel
  58. n_channels = len(dataset_train[1][1].split('::'))
  59. print("Number of channels : ", n_channels)
  60. img_width, img_height = cfg.keras_img_size
  61. # specify the number of dimensions
  62. if K.image_data_format() == 'channels_first':
  63. if n_channels > 1:
  64. input_shape = (1, n_channels, img_width, img_height)
  65. else:
  66. input_shape = (n_channels, img_width, img_height)
  67. else:
  68. if n_channels > 1:
  69. input_shape = (1, img_width, img_height, n_channels)
  70. else:
  71. input_shape = (img_width, img_height, n_channels)
  72. # `:` is the separator used for getting each img path
  73. if n_channels > 1:
  74. dataset_train[1] = dataset_train[1].apply(lambda x: [cv2.imread(path, cv2.IMREAD_GRAYSCALE) for path in x.split('::')])
  75. dataset_test[1] = dataset_test[1].apply(lambda x: [cv2.imread(path, cv2.IMREAD_GRAYSCALE) for path in x.split('::')])
  76. else:
  77. dataset_train[1] = dataset_train[1].apply(lambda x: cv2.imread(x, cv2.IMREAD_GRAYSCALE))
  78. dataset_test[1] = dataset_test[1].apply(lambda x: cv2.imread(x, cv2.IMREAD_GRAYSCALE))
  79. x_dataset_train = dataset_train[1].apply(lambda x: np.array(x).reshape(input_shape))
  80. x_dataset_test = dataset_test[1].apply(lambda x: np.array(x).reshape(input_shape))
  81. y_dataset_train = dataset_train[0].apply(lambda x: cv2.imread(x).reshape(input_shape))
  82. y_dataset_test = dataset_test[0].apply(lambda x: cv2.imread(x).reshape(input_shape))
  83. # format data correctly
  84. x_data_train = np.array([item[0].reshape(input_shape) for item in x_dataset_train.values])
  85. x_data_test = np.array([item[0].reshape(input_shape) for item in x_dataset_test.values])
  86. y_data_train = np.array([item[0].reshape(input_shape) for item in y_dataset_train.values])
  87. y_data_test = np.array([item[0].reshape(input_shape) for item in y_dataset_test.values])
  88. # load model
  89. autoencoder = generate_model(input_shape)
  90. # tensorboard --logdir=/tmp/autoencoder
  91. autoencoder.fit(x_data_train, y_data_train,
  92. epochs=100,
  93. batch_size=32,
  94. shuffle=True,
  95. validation_data=(x_data_test, y_data_test),
  96. callbacks=[TensorBoard(log_dir='/tmp/autoencoder', histogram_freq=0, write_graph=False)])
  97. ##############
  98. # save model #
  99. ##############
  100. if not os.path.exists(cfg.saved_models_folder):
  101. os.makedirs(cfg.saved_models_folder)
  102. # save the model into HDF5 file
  103. model_output_path = os.path.join(cfg.saved_models_folder, p_output + '.json')
  104. json_model_content = autoencoder.to_json()
  105. with open(model_output_path, 'w') as f:
  106. print("Model saved into ", model_output_path)
  107. json.dump(json_model_content, f, indent=4)
  108. autoencoder.save_weights(model_output_path.replace('.json', '.h5'))
  109. if __name__ == "__main__":
  110. main()