Spaces:
Sleeping
Sleeping
| import numpy as np | |
| import shutil | |
| import pandas as pd | |
| import os | |
| from sklearn.metrics import confusion_matrix, classification_report, roc_auc_score | |
| def create_label_map(gt_file, pred_file): | |
| gt_df = pd.read_csv(gt_file) | |
| pred_df = pd.read_csv(pred_file) | |
| merged = gt_df.merge(pred_df, on='img_path', how='inner') | |
| mal_logits = merged['mal_score'].to_numpy() | |
| true_labels = merged['label'].to_numpy() | |
| return true_labels, mal_logits | |
| def create_label_map_2(gt_file, pred_file): | |
| gt_df = pd.read_csv(gt_file) | |
| pred_df = pd.read_csv(pred_file) | |
| merged = gt_df.merge(pred_df, on='img_path', how='inner') | |
| # import pdb; pdb.set_trace() | |
| mal_logits = merged['mal_score'].to_numpy() | |
| true_labels = merged['label'].to_numpy() | |
| img_paths = merged['img_path'].to_numpy() | |
| return img_paths, true_labels, mal_logits | |
| def calc_metrics(true_labels, mal_logits, threshold, filename): | |
| predictions = np.zeros_like(true_labels) | |
| for i in range(len(mal_logits)): | |
| if(mal_logits[i]>threshold): | |
| predictions[i]=1 | |
| # print(classification_report(true_labels, predictions, labels=[0, 1])) | |
| auc_score = roc_auc_score(true_labels, mal_logits) | |
| tn, fp, fn, tp = confusion_matrix(true_labels, predictions).ravel() | |
| npv = tn/(tn+fn) | |
| print(filename) | |
| print("tn, fp, fn, tp", tn, fp, fn, tp) | |
| print("AUC score", auc_score, "NPV score", npv) | |
| conf_mat = [str(item) for item in [tn, fp, fn, tp]] | |
| # file = open(filename, 'w') | |
| # file.write(classification_report(true_labels, predictions, labels=[0, 1])) | |
| # file.write(f'Confusion Matrix: tn, fp, fn, tp {" ".join(conf_mat)}\n') | |
| # file.write(f'AUC_Score: {auc_score:.4f}\n') | |
| # file.write(f'NPV_Score: {npv:.4f}\n') | |
| # file.close() | |
| return predictions | |
| def check_same(arr1, arr2): | |
| for i,val in enumerate(arr2): | |
| if(arr2[i]!=val): | |
| print("ERROR in image order") | |
| exit(0) | |
| return None | |
| return | |
| def save_fn(preds, true_labels, img_paths, data_folder): | |
| # import pdb; pdb.set_trace() | |
| preds_n = np.where(np.array(preds) == 0) | |
| true_n = np.where(np.array(true_labels) == 0) | |
| fn_idxs = np.setdiff1d(preds_n[0], true_n[0]) | |
| for i,fn_idx in enumerate(fn_idxs): | |
| img_path = os.path.join(data_folder, img_paths[fn_idx]) | |
| trgt_path = os.path.join("", img_paths[fn_idx]) | |
| shutil.copy(img_path, trgt_path) | |
| if __name__=='__main__': | |
| # Sensitivity 0.95 | |
| # threshold = 0.0410 #focalnet | |
| # threshold = 0.003 #smallmass | |
| # threshold = 0.128 #densemass | |
| # Sensitivity 0.90 | |
| # threshold = 0.087 #focalnet | |
| # threshold = 0.03 #smallmass | |
| # threshold = 0.3 #densemass | |
| # F1-score optimum (newly trained) | |
| # threshold = 0.028 # focalnet | |
| # threshold = 0.587 # cen | |
| # threshold = 0.567 # smallmass | |
| # threshold = 0.156 # history | |
| thresholds = { | |
| # "focalnet": 0.028, | |
| # "cen" : 0.587, | |
| # "smallmass": 0.567, | |
| # "history": 0.156, | |
| # "densemass": 0.55, | |
| # "dmaster_source": 0.250, | |
| # "dmaster_adapt_cross_domain": 0.219, | |
| "dmaster_adapt_best": 0.221, | |
| # "dmaster_adapt_best": 0.50, #Trying out higher confidences | |
| # "dmaster_adapt_tch": 0.240 | |
| } | |
| # F1-score optimum (previously trained) | |
| # threshold = 0.321 # focalnet | |
| # threshold = 0.632 # cen | |
| # threshold = 0.353 # smallmass | |
| # threshold = 0.030441519 # history | |
| # # F1-score optimum (previously trained) | |
| # threshold = 0.004754 # focalnet | |
| # threshold = 0.502059 # cen | |
| # threshold = 0.005219 # smallmass | |
| # threshold = 0.030441519 # history | |
| # thresholds = { | |
| # "focalnet": 0.004754, | |
| # "cen" : 0.502059, | |
| # "smallmass": 0.005219, | |
| # "history": 0.030441519 | |
| # } | |
| # gt_file = "./data/irch_gt.csv" | |
| # pred_file = f"./preds_new/smallmass_preds.csv" | |
| gt_file = "/home/kaustubh/scratch/Mammo_Datasets_negroni/Dmaster_Data/c_view_data/irch_gt.csv" | |
| # gt_file = "./data_cview/irch_subset_gt.csv" | |
| pred_file = f"/home/kaustubh/scratch/D-MASTER/outputs_krb/teaching/csv_preds_kaustubh/1_d_master_adap_cview_post_training_with_names.csv" | |
| img_paths_true, true_labels_true, img_paths= create_label_map_2(gt_file, pred_file) | |
| predictions = [] | |
| for i,(model_name, threshold) in enumerate(thresholds.items()): | |
| # pred_file = f"./cview_preds/{model_name}_preds.csv" | |
| print(pred_file) | |
| # pred_file = f"./preds_new/{model_name}_preds.csv" | |
| img_paths, true_labels, mal_logits = create_label_map_2(gt_file, pred_file) | |
| check_same(img_paths_true, img_paths) | |
| check_same(true_labels_true, true_labels) | |
| model_predictions = calc_metrics(true_labels, mal_logits, threshold, model_name+"_metrics.txt") | |
| predictions.append(model_predictions) | |
| # import pdb; pdb.set_trace() | |
| predictions = np.array(predictions) | |
| preds = np.max(predictions, axis=0) | |
| print(classification_report(true_labels_true, preds, labels=[0, 1])) | |
| tn, fp, fn, tp = confusion_matrix(true_labels_true, preds).ravel() | |
| npv = tn/(tn+fn) | |
| print("tn, fp, fn, tp", tn, fp, fn, tp) | |
| print("NPV score", npv) | |
| # save_fn(preds, true_labels_true, img_paths, "/home/kshitiz/scratch/FocalNet-DINO/MULTI_MODEL_DATA/IRCH_DATA/Mammo_PNG") | |
| # save_fn(preds, true_labels_true, img_paths, "/home/tajamul/scratch/DA/DATA/Dmaster_Data/c_view_data/common_cview") | |