From 3bada8818338fed550e821be16d38f6990c63cc8 Mon Sep 17 00:00:00 2001
From: tomrink <rink@ssec.wisc.edu>
Date: Tue, 8 Nov 2022 13:45:24 -0600
Subject: [PATCH] snapshot...

---
 modules/deeplearning/espcn_l1b_l2.py | 181 ++++++++++++++++-----------
 1 file changed, 111 insertions(+), 70 deletions(-)

diff --git a/modules/deeplearning/espcn_l1b_l2.py b/modules/deeplearning/espcn_l1b_l2.py
index 6dc9e816..2b3ebc57 100644
--- a/modules/deeplearning/espcn_l1b_l2.py
+++ b/modules/deeplearning/espcn_l1b_l2.py
@@ -1,7 +1,8 @@
 import glob
 import tensorflow as tf
-from util.setup import logdir, modeldir, cachepath, now, ancillary_path
-from util.util import EarlyStop, normalize, denormalize, resample
+from util.setup import logdir, modeldir, now, ancillary_path
+from util.util import EarlyStop, normalize, denormalize, resample, resample_2d_linear, get_grid_values_all, \
+    resample_2d_linear_one
 import os, datetime
 import numpy as np
 import pickle
@@ -32,6 +33,8 @@ NOISE_TRAINING = False
 NOISE_STDDEV = 0.10
 DO_AUGMENT = True
 
+IMG_DEPTH = 1
+
 # setup scaling parameters dictionary
 mean_std_dct = {}
 mean_std_file = ancillary_path+'mean_std_lo_hi_l2.pkl'
@@ -47,26 +50,29 @@ f.close()
 mean_std_dct.update(mean_std_dct_l1b)
 mean_std_dct.update(mean_std_dct_l2)
 
-# data_params = ['temp_10_4um_nom', 'temp_11_0um_nom', 'temp_12_0um_nom', 'temp_13_3um_nom', 'temp_3_75um_nom',
-#                'temp_6_7um_nom', 'temp_6_2um_nom', 'temp_7_3um_nom', 'temp_8_5um_nom', 'temp_9_7um_nom']
-data_params = ['temp_10_4um_nom', 'temp_11_0um_nom', 'temp_12_0um_nom', 'temp_13_3um_nom', 'temp_3_9um_nom',
-               'temp_6_7um_nom']
-# data_params = ['refl_0_65um_nom', 'temp_11_0um_nom', 'cld_temp_acha', 'cld_press_acha', 'cloud_fraction']
-label_params = ['refl_0_65um_nom', 'temp_11_0um_nom', 'cld_temp_acha', 'cld_press_acha', 'cloud_fraction', 'cld_opd_acha']
+DO_ZERO_OUT = False
 
+# label_param = 'cloud_fraction'
+label_param = 'cld_opd_dcomp'
+# label_param = 'cloud_probability'
 
-DO_ZERO_OUT = False
+params = ['temp_11_0um_nom', 'temp_12_0um_nom', 'refl_0_65um_nom', label_param]
+data_params = ['temp_11_0um_nom', 'refl_0_65um_nom']
+
+label_idx = params.index(label_param)
+
+print('data_params: ', data_params)
+print('label_param: ', label_param)
 
-label_idx = 1
-label_param = label_params[label_idx]
 
 x_134 = np.arange(134)
 y_134 = np.arange(134)
-#x_134_2 = x_134[3:131:2]
-#y_134_2 = y_134[3:131:2]
 x_134_2 = x_134[2:133:2]
 y_134_2 = y_134[2:133:2]
 
+slc_x = slice(3, 131)
+slc_y = slice(3, 131)
+
 
 def build_residual_conv2d_block(conv, num_filters, block_name, activation=tf.nn.leaky_relu, padding='SAME', scale=None):
     # kernel_initializer = 'glorot_uniform'
@@ -179,12 +185,9 @@ class ESPCN:
         self.test_data_nda = None
         self.test_label_nda = None
 
-        self.n_chans = len(data_params)
+        self.n_chans = len(data_params) + 1
 
         self.X_img = tf.keras.Input(shape=(None, None, self.n_chans))
-        # self.X_img = tf.keras.Input(shape=(36, 36, self.n_chans))
-        # self.X_img = tf.keras.Input(shape=(34, 34, self.n_chans))
-        # self.X_img = tf.keras.Input(shape=(66, 66, self.n_chans))
 
         self.inputs.append(self.X_img)
 
@@ -192,25 +195,16 @@ class ESPCN:
 
     def get_in_mem_data_batch(self, idxs, is_training):
         if is_training:
-            label_files = self.train_label_files
-            data_files = self.train_data_files
+            files = self.train_data_files
         else:
-            label_files = self.test_label_files
-            data_files = self.test_data_files
+            files = self.test_data_files
 
-        label_s = []
         data_s = []
         for k in idxs:
-            f = label_files[k]
-            nda = np.load(f)
-            label_s.append(nda)
-
-            f = data_files[k]
+            f = files[k]
             nda = np.load(f)
             data_s.append(nda)
-
-        label = np.concatenate(label_s)
-        data = np.concatenate(data_s)
+        input_data = np.concatenate(data_s)
 
         add_noise = None
         noise_scale = None
@@ -220,22 +214,30 @@ class ESPCN:
 
         data_norm = []
         for k, param in enumerate(data_params):
-            tmp = data[:, k, :, :]
-            tmp = resample(x_134, y_134, tmp, x_134_2, y_134_2)
+            tmp = input_data[:, k, :, :]
             tmp = normalize(tmp, param, mean_std_dct, add_noise=add_noise, noise_scale=noise_scale)
+            tmp = resample_2d_linear(x_134, y_134, tmp, x_134_2, y_134_2)
             data_norm.append(tmp)
-        data = np.stack(data_norm, axis=3)
-        data = data.astype(np.float32)
 
-        # label = label[:, label_idx, :, :]
-        label = label[:, label_idx, 3:131:2, 3:131:2]
-        # label = label[:, label_idx, 3:131, 3:131]
-        label = np.expand_dims(label, axis=3)
-        label = label.astype(np.float32)
+        tmp = input_data[:, label_idx, :, ]
+        if label_param != 'cloud_fraction':
+            tmp = normalize(tmp, label_param, mean_std_dct, add_noise=add_noise, noise_scale=noise_scale)
+        else:
+            tmp = np.where(np.isnan(tmp), 0, tmp)
+        tmp = resample_2d_linear(x_134, y_134, tmp, x_134_2, y_134_2)
+        data_norm.append(tmp)
 
+        data = np.stack(data_norm, axis=3)
+
+        label = input_data[:, label_idx, slc_y, slc_x]
         if label_param != 'cloud_fraction':
             label = normalize(label, label_param, mean_std_dct)
-            # label = label = scale(label, label_param, mean_std_dct)
+        else:
+            label = np.where(np.isnan(label), 0, label)
+        label = np.expand_dims(label, axis=3)
+
+        data = data.astype(np.float32)
+        label = label.astype(np.float32)
 
         if is_training and DO_AUGMENT:
             data_ud = np.flip(data, axis=1)
@@ -312,16 +314,14 @@ class ESPCN:
         dataset = dataset.map(self.data_function_evaluate, num_parallel_calls=8)
         self.eval_dataset = dataset
 
-    def setup_pipeline(self, train_data_files, train_label_files, test_data_files, test_label_files, num_train_samples):
+    def setup_pipeline(self, train_data_files, test_data_files, num_train_samples):
 
         self.train_data_files = train_data_files
         self.test_data_files = test_data_files
-        self.train_label_files = train_label_files
-        self.test_label_files = test_label_files
 
         trn_idxs = np.arange(len(train_data_files))
         np.random.shuffle(trn_idxs)
-        tst_idxs = np.arange(len(train_data_files))
+        tst_idxs = np.arange(len(test_data_files))
 
         self.get_train_dataset(trn_idxs)
         self.get_test_dataset(tst_idxs)
@@ -336,6 +336,7 @@ class ESPCN:
         print('num test samples: ', tst_idxs.shape[0])
         print('setup_pipeline: Done')
 
+
     def setup_test_pipeline(self, test_data_files):
         self.test_data_files = test_data_files
         tst_idxs = np.arange(len(test_data_files))
@@ -359,7 +360,7 @@ class ESPCN:
         kernel_initializer = 'he_uniform'
         momentum = 0.99
 
-        num_filters = 32
+        num_filters = 64
 
         input_2d = self.inputs[0]
         print('input: ', input_2d.shape)
@@ -382,18 +383,19 @@ class ESPCN:
 
         conv_b = build_residual_conv2d_block(conv_b, num_filters, 'Residual_Block_5', scale=scale)
 
-        conv_b = tf.keras.layers.Conv2D(num_filters, kernel_size=3, strides=1, padding=padding, kernel_initializer=kernel_initializer)(conv_b)
+        # conv_b = tf.keras.layers.Conv2D(num_filters, kernel_size=3, strides=1, padding=padding, kernel_initializer=kernel_initializer)(conv_b)
 
-        conv = conv + conv_b
+        # conv = conv + conv_b
+        conv = conv_b
         print(conv.shape)
 
-        # conv = tf.keras.layers.Conv2D(num_filters * (factor ** 2), 3, padding='same')(conv)
-        # print(conv.shape)
+        conv = tf.keras.layers.Conv2D(IMG_DEPTH * (factor ** 2), 3, padding='same')(conv)
+        print(conv.shape)
 
         conv = tf.nn.depth_to_space(conv, factor)
         print(conv.shape)
 
-        self.logits = tf.keras.layers.Conv2D(1, kernel_size=3, strides=1, padding=padding, name='regression')(conv)
+        self.logits = tf.keras.layers.Conv2D(IMG_DEPTH, kernel_size=1, strides=1, padding=padding, activation=activation, name='regression')(conv)
 
         print(self.logits.shape)
 
@@ -591,7 +593,6 @@ class ESPCN:
 
         ckpt = tf.train.Checkpoint(step=tf.Variable(1), model=self.model)
         ckpt_manager = tf.train.CheckpointManager(ckpt, ckpt_dir, max_to_keep=3)
-
         ckpt.restore(ckpt_manager.latest_checkpoint)
 
         self.reset_test_metrics()
@@ -604,42 +605,35 @@ class ESPCN:
 
         print('loss, acc: ', self.test_loss.result().numpy(), self.test_accuracy.result().numpy())
 
-    def do_evaluate(self, nda_lr, param, ckpt_dir):
+    def do_evaluate(self, data, ckpt_dir):
 
         ckpt = tf.train.Checkpoint(step=tf.Variable(1), model=self.model)
         ckpt_manager = tf.train.CheckpointManager(ckpt, ckpt_dir, max_to_keep=3)
 
         ckpt.restore(ckpt_manager.latest_checkpoint)
 
-        data = normalize(nda_lr, param, mean_std_dct)
-        #data = np.expand_dims(data, axis=0)
-        #data = np.expand_dims(data, axis=3)
-
         self.reset_test_metrics()
 
         pred = self.model([data], training=False)
         self.test_probs = pred
         pred = pred.numpy()
 
-        return denormalize(pred, param, mean_std_dct)
-
-    def run(self, directory):
-        train_data_files = glob.glob(directory+'data_train*.npy')
-        valid_data_files = glob.glob(directory+'data_valid*.npy')
-        train_label_files = glob.glob(directory+'label_train*.npy')
-        valid_label_files = glob.glob(directory+'label_valid*.npy')
+        return pred
 
-        train_data_files.sort()
-        valid_data_files.sort()
+    def run(self, directory, ckpt_dir=None, num_data_samples=50000):
+        train_data_files = glob.glob(directory+'data_train_*.npy')
+        valid_data_files = glob.glob(directory+'data_valid_*.npy')
+        train_data_files = train_data_files[::2]
+        valid_data_files = valid_data_files[::2]
 
-        self.setup_pipeline(train_data_files, train_label_files, valid_data_files, valid_label_files, 100000)
+        self.setup_pipeline(train_data_files, valid_data_files, num_data_samples)
         self.build_model()
         self.build_training()
         self.build_evaluation()
-        self.do_training()
+        self.do_training(ckpt_dir=ckpt_dir)
 
     def run_restore(self, directory, ckpt_dir):
-        valid_data_files = glob.glob(directory + 'data_valid*.npy')
+        valid_data_files = glob.glob(directory + 'data_*.npy')
         self.num_data_samples = 1000
         self.setup_test_pipeline(valid_data_files)
         self.build_model()
@@ -647,12 +641,59 @@ class ESPCN:
         self.build_evaluation()
         self.restore(ckpt_dir)
 
-    def run_evaluate(self, nda_lr, param, ckpt_dir):
+    def run_evaluate(self, data, ckpt_dir):
         self.num_data_samples = 80000
         self.build_model()
         self.build_training()
         self.build_evaluation()
-        return self.do_evaluate(nda_lr, param, ckpt_dir)
+        return self.do_evaluate(data, ckpt_dir)
+
+
+def run_restore_static(directory, ckpt_dir):
+    nn = ESPCN()
+    nn.run_restore(directory, ckpt_dir)
+
+
+def run_evaluate_static(in_file, out_file, ckpt_dir):
+    N = 8
+    sub_y, sub_x = (N+1) * 128, (N+1) * 128
+    y_0, x_0, = 2500 - int(sub_y/2), 2500 - int(sub_x/2)
+
+    slc_y_2, slc_x_2 = slice(1, 128*N + 6, 2), slice(1, 128*N + 6, 2)
+    y_2, x_2 = np.arange((128*N)/2 + 3), np.arange((128*N)/2 + 3)
+    t, s = np.arange(1, (128*N)/2 + 2, 0.5), np.arange(1, (128*N)/2 + 2, 0.5)
+
+    h5f = h5py.File(in_file, 'r')
+    grd_a = get_grid_values_all(h5f, 'temp_11_0um_nom')
+    grd_a = grd_a[y_0:y_0+sub_y, x_0:x_0+sub_x]
+    grd_a = grd_a[slc_y_2, slc_x_2]
+    grd_a = normalize(grd_a, 'temp_11_0um_nom', mean_std_dct)
+    grd_a = resample_2d_linear_one(x_2, y_2, grd_a, t, s)
+
+    grd_b = get_grid_values_all(h5f, 'refl_0_65um_nom')
+    grd_b = grd_b[y_0:y_0+sub_y, x_0:x_0+sub_x]
+    grd_b = grd_b[slc_y_2, slc_x_2]
+    grd_b = normalize(grd_b, 'refl_0_65um_nom', mean_std_dct)
+    grd_b = resample_2d_linear_one(x_2, y_2, grd_b, t, s)
+
+    grd_c = get_grid_values_all(h5f, label_param)
+    grd_c = grd_c[y_0:y_0+sub_y, x_0:x_0+sub_x]
+    grd_c = grd_c[slc_y_2, slc_x_2]
+    if label_param != 'cloud_fraction':
+        grd_c = normalize(grd_c, label_param, mean_std_dct)
+    grd_c = resample_2d_linear_one(x_2, y_2, grd_c, t, s)
+
+    data = np.stack([grd_a, grd_b, grd_c], axis=2)
+    data = np.expand_dims(data, axis=0)
+
+    nn = ESPCN()
+    out_sr = nn.run_evaluate(data, ckpt_dir)
+    if label_param != 'cloud_fraction':
+        out_sr = denormalize(out_sr, label_param, mean_std_dct)
+    if out_file is not None:
+        np.save(out_file, out_sr)
+    else:
+        return out_sr
 
 
 if __name__ == "__main__":
-- 
GitLab