From 4fb4d92de95f15e3ceb258103cc8532d7d368e27 Mon Sep 17 00:00:00 2001
From: tomrink <rink@ssec.wisc.edu>
Date: Tue, 28 Mar 2023 11:39:43 -0500
Subject: [PATCH] snapshot...

---
 modules/deeplearning/cloud_fraction_fcn.py | 256 +++++++++++++++++----
 1 file changed, 207 insertions(+), 49 deletions(-)

diff --git a/modules/deeplearning/cloud_fraction_fcn.py b/modules/deeplearning/cloud_fraction_fcn.py
index 8dc7cc0e..bcd94297 100644
--- a/modules/deeplearning/cloud_fraction_fcn.py
+++ b/modules/deeplearning/cloud_fraction_fcn.py
@@ -1,7 +1,7 @@
 import glob
 import tensorflow as tf
 
-import util.util
+from util.plot_cm import confusion_matrix_values
 from util.setup import logdir, modeldir, now, ancillary_path
 from util.util import EarlyStop, normalize, denormalize, get_grid_values_all
 import os, datetime
@@ -811,74 +811,232 @@ def run_evaluate_static(in_file, out_file, ckpt_dir):
         return cld_frac_out, bt, refl_avg, cp
 
 
-def analyze2(nda_m, nda_i):
-    n_imgs = nda_m.shape[0]
-    nda_m = np.where(nda_m < 0.5, 0, 1)
-    nda_i = np.where(nda_i < 0.5, 0, 1)
+def analyze_3cat(file):
 
-    cf_m = np.zeros((n_imgs, 64, 64))
-    cf_i = np.zeros((n_imgs, 64, 64))
+    tup = np.load(file, allow_pickle=True)
+    lbls = tup[0]
+    pred = tup[1]
+    prob_0 = tup[2]
+    prob_1 = tup[3]
+    prob_2 = tup[4]
 
-    for k in range(n_imgs):
-        for j in range(1, 65):
-            for i in range(1, 65):
-                sub_3x3 = nda_m[k, j-1:j+2, i-1:i+2]
-                cf_m[k, j-1, i-1] = np.sum(sub_3x3)
+    lbls = lbls.flatten()
+    pred = pred.flatten()
+    print(np.sum(lbls == 0), np.sum(lbls == 1), np.sum(lbls == 2))
 
-                sub_4x4 = nda_i[k, j*2-1:j*2+3, i*2-1:i*2+3]
-                cf_i[k, j-1, i-1] = np.sum(sub_4x4)
+    msk_0_1 = lbls != 2
+    msk_1_2 = lbls != 0
+    msk_0_2 = lbls != 1
 
-    for k in range(n_imgs):
-        cat_0 = (cf_m[k, ] == 0)
-        cat_1 = (cf_m[k, ] > 0) & (cf_m[k, ] < 9)
-        cat_2 = cf_m[k, ] == 9
+    lbls_0_1 = lbls[msk_0_1]
 
-        cf_m[k, cat_0] = 0
-        cf_m[k, cat_1] = 1
-        cf_m[k, cat_2] = 2
+    pred_0_1 = pred[msk_0_1]
+    pred_0_1 = np.where(pred_0_1 == 2, 1, pred_0_1)
 
-        cat_0 = (cf_i[k, ] == 0)
-        cat_1 = (cf_i[k, ] > 0) & (cf_i[k, ] < 16)
-        cat_2 = cf_i[k, ] == 16
+    # ----
+    lbls_1_2 = lbls[msk_1_2]
+    lbls_1_2 = np.where(lbls_1_2 == 1, 0, lbls_1_2)
+    lbls_1_2 = np.where(lbls_1_2 == 2, 1, lbls_1_2)
 
-        cf_i[k, cat_0] = 0
-        cf_i[k, cat_1] = 1
-        cf_i[k, cat_2] = 2
+    pred_1_2 = pred[msk_1_2]
+    pred_1_2 = np.where(pred_1_2 == 0, -9, pred_1_2)
+    pred_1_2 = np.where(pred_1_2 == 1, 0, pred_1_2)
+    pred_1_2 = np.where(pred_1_2 == 2, 1, pred_1_2)
+    pred_1_2 = np.where(pred_1_2 == -9, 1, pred_1_2)
 
-    return cf_m, cf_i
+    # ----
+    lbls_0_2 = lbls[msk_0_2]
+    lbls_0_2 = np.where(lbls_0_2 == 2, 1, lbls_0_2)
 
+    pred_0_2 = pred[msk_0_2]
+    pred_0_2 = np.where(pred_0_2 == 2, 1, pred_0_2)
 
-def helper(lbls, pred, file='/Users/tomrink/clavrx_surfrad_viirs_cld_prob_valid.npy'):
-    nda = np.load(file, allow_pickle=True)
+    cm_0_1 = confusion_matrix_values(lbls_0_1, pred_0_1)
+    cm_1_2 = confusion_matrix_values(lbls_1_2, pred_1_2)
+    cm_0_2 = confusion_matrix_values(lbls_0_2, pred_0_2)
 
-    bt = nda[:, 0, :, :]
-    refl = nda[:, 1, :, :]
-    cp = nda[:, 2, :, :]
+    true_0_1 = (lbls_0_1 == 0) & (pred_0_1 == 0)
+    false_0_1 = (lbls_0_1 == 1) & (pred_0_1 == 0)
 
-    bt = get_grid_cell_mean(bt)
-    bt = bt[:, 0:66, 0:66]
+    true_no_0_1 = (lbls_0_1 == 1) & (pred_0_1 == 1)
+    false_no_0_1 = (lbls_0_1 == 0) & (pred_0_1 == 1)
 
-    lo, hi, std, avg = get_min_max_std(refl)
+    true_0_2 = (lbls_0_2 == 0) & (pred_0_2 == 0)
+    false_0_2 = (lbls_0_2 == 1) & (pred_0_2 == 0)
 
-    cp = np.where(np.isnan(cp), 0, cp)
-    cp = get_grid_cell_mean(cp)
-    cp = np.where(np.isnan(cp), 0, cp)
-    cp = cp[:, 1:65, 1:65]
-    cp = cp.flatten()
+    true_no_0_2 = (lbls_0_2 == 1) & (pred_0_2 == 1)
+    false_no_0_2 = (lbls_0_2 == 0) & (pred_0_2 == 1)
+
+    true_1_2 = (lbls_1_2 == 0) & (pred_1_2 == 0)
+    false_1_2 = (lbls_1_2 == 1) & (pred_1_2 == 0)
+
+    true_no_1_2 = (lbls_1_2 == 1) & (pred_1_2 == 1)
+    false_no_1_2 = (lbls_1_2 == 0) & (pred_1_2 == 1)
+
+    tp_0 = np.sum(true_0_1).astype(np.float64)
+    tp_1 = np.sum(true_1_2).astype(np.float64)
+    tp_2 = np.sum(true_0_2).astype(np.float64)
+
+    tn_0 = np.sum(true_no_0_1).astype(np.float64)
+    tn_1 = np.sum(true_no_1_2).astype(np.float64)
+    tn_2 = np.sum(true_no_0_2).astype(np.float64)
+
+    fp_0 = np.sum(false_0_1).astype(np.float64)
+    fp_1 = np.sum(false_1_2).astype(np.float64)
+    fp_2 = np.sum(false_0_2).astype(np.float64)
+
+    fn_0 = np.sum(false_no_0_1).astype(np.float64)
+    fn_1 = np.sum(false_no_1_2).astype(np.float64)
+    fn_2 = np.sum(false_no_0_2).astype(np.float64)
+
+    recall_0 = tp_0 / (tp_0 + fn_0)
+    recall_1 = tp_1 / (tp_1 + fn_1)
+    recall_2 = tp_2 / (tp_2 + fn_2)
+
+    precision_0 = tp_0 / (tp_0 + fp_0)
+    precision_1 = tp_1 / (tp_1 + fp_1)
+    precision_2 = tp_2 / (tp_2 + fp_2)
+
+    mcc_0 = ((tp_0 * tn_0) - (fp_0 * fn_0)) / np.sqrt((tp_0 + fp_0) * (tp_0 + fn_0) * (tn_0 + fp_0) * (tn_0 + fn_0))
+    mcc_1 = ((tp_1 * tn_1) - (fp_1 * fn_1)) / np.sqrt((tp_1 + fp_1) * (tp_1 + fn_1) * (tn_1 + fp_1) * (tn_1 + fn_1))
+    mcc_2 = ((tp_2 * tn_2) - (fp_2 * fn_2)) / np.sqrt((tp_2 + fp_2) * (tp_2 + fn_2) * (tn_2 + fp_2) * (tn_2 + fn_2))
+
+    acc_0 = np.sum(lbls_0_1 == pred_0_1)/pred_0_1.size
+    acc_1 = np.sum(lbls_1_2 == pred_1_2)/pred_1_2.size
+    acc_2 = np.sum(lbls_0_2 == pred_0_2)/pred_0_2.size
+
+    print(acc_0, recall_0, precision_0, mcc_0)
+    print(acc_1, recall_1, precision_1, mcc_1)
+    print(acc_2, recall_2, precision_2, mcc_2)
+
+    return cm_0_1, cm_1_2, cm_0_2, [acc_0, acc_1, acc_2], [recall_0, recall_1, recall_2],\
+        [precision_0, precision_1, precision_2], [mcc_0, mcc_1, mcc_2]
+
+
+def analyze_5cat(file='/Users/tomrink/cld_opd_frac.npy'):
+
+    tup = np.load(file, allow_pickle=True)
+    lbls = tup[0]
+    pred = tup[1]
+    # prob_0 = tup[2]
+    # prob_1 = tup[3]
+    # prob_2 = tup[4]
 
     lbls = lbls.flatten()
     pred = pred.flatten()
-    print(lbls.shape, pred.shape, cp.shape)
+    np.histogram(lbls, bins=5)
+    np.histogram(pred, bins=5)
+
+    new_lbls = np.zeros(lbls.size, dtype=np.int32)
+    new_pred = np.zeros(pred.size, dtype=np.int32)
+
+    new_lbls[lbls == 0] = 0
+    new_lbls[lbls == 1] = 1
+    new_lbls[lbls == 2] = 1
+    new_lbls[lbls == 3] = 1
+    new_lbls[lbls == 4] = 2
+
+    new_pred[pred == 0] = 0
+    new_pred[pred == 1] = 1
+    new_pred[pred == 2] = 1
+    new_pred[pred == 3] = 1
+    new_pred[pred == 4] = 2
+
+    np.histogram(new_lbls, bins=3)
+    np.histogram(new_pred, bins=3)
+
+    lbls = new_lbls
+    pred = new_pred
+
+    print(np.sum(lbls == 0), np.sum(lbls == 1), np.sum(lbls == 2))
+
+    msk_0_1 = lbls != 2
+    msk_1_2 = lbls != 0
+    msk_0_2 = lbls != 1
+
+    lbls_0_1 = lbls[msk_0_1]
+
+    pred_0_1 = pred[msk_0_1]
+    pred_0_1 = np.where(pred_0_1 == 2, 1, pred_0_1)
+
+    # ----
+    lbls_1_2 = lbls[msk_1_2]
+    lbls_1_2 = np.where(lbls_1_2 == 1, 0, lbls_1_2)
+    lbls_1_2 = np.where(lbls_1_2 == 2, 1, lbls_1_2)
+
+    pred_1_2 = pred[msk_1_2]
+    pred_1_2 = np.where(pred_1_2 == 0, -9, pred_1_2)
+    pred_1_2 = np.where(pred_1_2 == 1, 0, pred_1_2)
+    pred_1_2 = np.where(pred_1_2 == 2, 1, pred_1_2)
+    pred_1_2 = np.where(pred_1_2 == -9, 1, pred_1_2)
+
+    # ----
+    lbls_0_2 = lbls[msk_0_2]
+    lbls_0_2 = np.where(lbls_0_2 == 2, 1, lbls_0_2)
+
+    pred_0_2 = pred[msk_0_2]
+    pred_0_2 = np.where(pred_0_2 == 2, 1, pred_0_2)
+
+    cm_0_1 = confusion_matrix_values(lbls_0_1, pred_0_1)
+    cm_1_2 = confusion_matrix_values(lbls_1_2, pred_1_2)
+    cm_0_2 = confusion_matrix_values(lbls_0_2, pred_0_2)
+
+    true_0_1 = (lbls_0_1 == 0) & (pred_0_1 == 0)
+    false_0_1 = (lbls_0_1 == 1) & (pred_0_1 == 0)
+
+    true_no_0_1 = (lbls_0_1 == 1) & (pred_0_1 == 1)
+    false_no_0_1 = (lbls_0_1 == 0) & (pred_0_1 == 1)
+
+    true_0_2 = (lbls_0_2 == 0) & (pred_0_2 == 0)
+    false_0_2 = (lbls_0_2 == 1) & (pred_0_2 == 0)
+
+    true_no_0_2 = (lbls_0_2 == 1) & (pred_0_2 == 1)
+    false_no_0_2 = (lbls_0_2 == 0) & (pred_0_2 == 1)
+
+    true_1_2 = (lbls_1_2 == 0) & (pred_1_2 == 0)
+    false_1_2 = (lbls_1_2 == 1) & (pred_1_2 == 0)
+
+    true_no_1_2 = (lbls_1_2 == 1) & (pred_1_2 == 1)
+    false_no_1_2 = (lbls_1_2 == 0) & (pred_1_2 == 1)
+
+    tp_0 = np.sum(true_0_1).astype(np.float64)
+    tp_1 = np.sum(true_1_2).astype(np.float64)
+    tp_2 = np.sum(true_0_2).astype(np.float64)
+
+    tn_0 = np.sum(true_no_0_1).astype(np.float64)
+    tn_1 = np.sum(true_no_1_2).astype(np.float64)
+    tn_2 = np.sum(true_no_0_2).astype(np.float64)
+
+    fp_0 = np.sum(false_0_1).astype(np.float64)
+    fp_1 = np.sum(false_1_2).astype(np.float64)
+    fp_2 = np.sum(false_0_2).astype(np.float64)
+
+    fn_0 = np.sum(false_no_0_1).astype(np.float64)
+    fn_1 = np.sum(false_no_1_2).astype(np.float64)
+    fn_2 = np.sum(false_no_0_2).astype(np.float64)
+
+    recall_0 = tp_0 / (tp_0 + fn_0)
+    recall_1 = tp_1 / (tp_1 + fn_1)
+    recall_2 = tp_2 / (tp_2 + fn_2)
+
+    precision_0 = tp_0 / (tp_0 + fp_0)
+    precision_1 = tp_1 / (tp_1 + fp_1)
+    precision_2 = tp_2 / (tp_2 + fp_2)
+
+    mcc_0 = ((tp_0 * tn_0) - (fp_0 * fn_0)) / np.sqrt((tp_0 + fp_0) * (tp_0 + fn_0) * (tn_0 + fp_0) * (tn_0 + fn_0))
+    mcc_1 = ((tp_1 * tn_1) - (fp_1 * fn_1)) / np.sqrt((tp_1 + fp_1) * (tp_1 + fn_1) * (tn_1 + fp_1) * (tn_1 + fn_1))
+    mcc_2 = ((tp_2 * tn_2) - (fp_2 * fn_2)) / np.sqrt((tp_2 + fp_2) * (tp_2 + fn_2) * (tn_2 + fp_2) * (tn_2 + fn_2))
 
-    cp_cm = np.zeros((5, 5))
+    acc_0 = np.sum(lbls_0_1 == pred_0_1)/pred_0_1.size
+    acc_1 = np.sum(lbls_1_2 == pred_1_2)/pred_1_2.size
+    acc_2 = np.sum(lbls_0_2 == pred_0_2)/pred_0_2.size
 
-    for j in range(5):
-        for i in range(5):
-            keep = (lbls == j) & (pred == i)
-            cp_avg = np.sum(cp[keep])/ np.sum(keep)
-            cp_cm[j, i] = cp_avg
+    print(acc_0, recall_0, precision_0, mcc_0)
+    print(acc_1, recall_1, precision_1, mcc_1)
+    print(acc_2, recall_2, precision_2, mcc_2)
 
-    return cp_cm
+    return cm_0_1, cm_1_2, cm_0_2, [acc_0, acc_1, acc_2], [recall_0, recall_1, recall_2],\
+        [precision_0, precision_1, precision_2], [mcc_0, mcc_1, mcc_2], lbls, pred
 
 
 if __name__ == "__main__":
-- 
GitLab