Download src/utils/plotter.py from ODELIA-AI/ABMIL: direct link, hf CLI and curl.
- Browser
- Download file 19.9 kB
-
https://huggingface.co/ODELIA-AI/ABMIL/resolve/main/src/utils/plotter.py
- Command line
-
hf download hf://ODELIA-AI/ABMIL/src/utils/plotter.py
-
curl -L -o plotter.py https://huggingface.co/ODELIA-AI/ABMIL/resolve/main/src/utils/plotter.py
19.9 kB
| import seaborn as sns | |
| import pandas as pd | |
| import numpy as np | |
| import os | |
| import matplotlib.pyplot as plt | |
| from itertools import cycle | |
| from sklearn.preprocessing import label_binarize | |
| from sklearn.metrics import average_precision_score, confusion_matrix, ConfusionMatrixDisplay, precision_recall_curve, roc_curve, auc | |
| from src.utils.utils_functions import labels_for_classification, labels_for_classification2 | |
| from skimage import exposure | |
| def display_class_report(classification_report, folder_output, use_tta, label ): | |
| sns.heatmap(pd.DataFrame(classification_report).iloc[:-1, :].T, annot=True) | |
| if use_tta: | |
| if label == 'classification': | |
| filename = folder_output + label + '_class_report_tta.png' | |
| else: | |
| filename = folder_output + '_class_report_tta.png' | |
| else: | |
| if label == 'classification': | |
| filename = folder_output + label + '_class_report.png' | |
| else: | |
| filename = folder_output + 'class_report.png' | |
| plt.savefig(filename) | |
| #plt.close() | |
| def display_confusion_matrix(true, pred, display_labels, folder_output, use_tta, label, normalize=True): | |
| if normalize: | |
| cm = confusion_matrix(true, pred, normalize='true') | |
| if label == 'classification': | |
| filename = folder_output + str(use_tta) + label + '_normalized_confusion_matrix.png' | |
| else: | |
| filename = folder_output + str(use_tta) + '_normalized_confusion_matrix.png' | |
| else: | |
| cm = confusion_matrix(true, pred) | |
| if label == 'classification': | |
| filename = folder_output + str(use_tta) + label + '_confusion_matrix.png' | |
| else: | |
| filename = folder_output + str(use_tta) + '_confusion_matrix.png' | |
| plt.tight_layout() | |
| disp = ConfusionMatrixDisplay(cm)#, display_labels) | |
| disp.plot() | |
| plt.savefig(filename) | |
| plt.close('all') | |
| def plot_roc_curve(filename, scores, labels): | |
| """plot_roc_curve plots (saves) roc curve for a binary classification scenario | |
| Arguments: | |
| filename {str} -- destination filename | |
| scores {list} -- list of predicted probabilities for all images | |
| labels {list} -- list of target labels for all images | |
| """ | |
| lw = 1 | |
| fpr, tpr, _ = roc_curve(labels, scores) | |
| roc_auc = auc(fpr, tpr) | |
| plt.figure(1, figsize=(10, 10)) | |
| plt.plot( | |
| fpr, | |
| tpr, | |
| label="ROC curve (area = {0:0.2f})" "".format(roc_auc), | |
| color="green", | |
| linestyle="--", | |
| linewidth=2, | |
| ) | |
| plt.rcParams.update({'font.size': 18}) | |
| plt.plot([0, 1], [0, 1], "k--", lw=lw) | |
| plt.xlim([0.0, 1.0]) | |
| plt.ylim([0.0, 1.0]) | |
| plt.xlabel("False Positive Rate", fontsize=18) | |
| plt.ylabel("True Positive Rate",fontsize=18) | |
| #plt.title("Receiver Operating Characteristic") | |
| plt.tight_layout() | |
| lgd = plt.legend(loc="best") | |
| plt.savefig(filename + "_roc.png", bbox_extra_artists=(lgd,), bbox_inches="tight") | |
| plt.close('all') | |
| def plot_roc_curve_multiclass(filename, scores, labels, classes): | |
| """plot_roc_curve_multiclass plots (saves) roc curve for a multiclass classification scenario | |
| Code from : https://github.com/icrto/xML/blob/master/PyTorch/utils.py | |
| Arguments: | |
| filename {str} -- destination filename | |
| scores {list} -- list of predicted probabilities for all images | |
| labels {list} -- list of target labels for all images | |
| classes {list} -- list of class names | |
| """ | |
| line_width = 3 | |
| nr_classes = len(classes) | |
| labels = label_binarize(labels, classes=list(range(nr_classes))) | |
| fpr = dict() | |
| tpr = dict() | |
| roc_auc = dict() | |
| for i in range(nr_classes): | |
| fpr[i], tpr[i], _ = roc_curve(labels[:, i], scores[:, i]) | |
| roc_auc[i] = auc(fpr[i], tpr[i]) | |
| # Compute micro-average ROC curve and ROC area | |
| fpr["micro"], tpr["micro"], _ = roc_curve(labels.ravel(), scores.ravel()) | |
| roc_auc["micro"] = auc(fpr["micro"], tpr["micro"]) | |
| # Compute macro-average ROC curve and ROC area | |
| # First aggregate all false positive rates | |
| all_fpr = np.unique(np.concatenate([fpr[i] for i in range(nr_classes)])) | |
| # Then interpolate all ROC curves at these points | |
| mean_tpr = np.zeros_like(all_fpr) | |
| for i in range(nr_classes): | |
| mean_tpr += np.interp(all_fpr, fpr[i], tpr[i]) | |
| # Finally average it and compute AUC | |
| mean_tpr /= nr_classes | |
| fpr["macro"] = all_fpr | |
| tpr["macro"] = mean_tpr | |
| roc_auc["macro"] = auc(fpr["macro"], tpr["macro"]) | |
| colors = cycle( | |
| [ | |
| "coral", | |
| "mediumorchid", | |
| "aqua", | |
| "darkolivegreen", | |
| "cornflowerblue", | |
| "gold", | |
| "pink", | |
| "chocolate", | |
| "brown", | |
| "darkslategrey", | |
| "tab:cyan", | |
| "slateblue", | |
| "yellow", | |
| "palegreen", | |
| "tan", | |
| "silver", | |
| ] | |
| ) | |
| for i, color in zip(range(nr_classes), colors): | |
| plt.plot( | |
| fpr[i], | |
| tpr[i], | |
| color=color, | |
| lw=line_width, | |
| label="class {0} (AUC = {1:0.4f})" "".format(classes[i], roc_auc[i]), | |
| ) | |
| plt.plot([0, 1], [0, 1], "k--", lw=line_width) | |
| plt.xlim([0.0, 1.0]) | |
| plt.ylim([0.0, 1.05]) | |
| plt.xlabel("False Positive Rate") | |
| plt.ylabel("True Positive Rate") | |
| plt.title("Receiver Operating Characteristic") | |
| lgd = plt.legend(loc="best") | |
| plt.savefig( | |
| filename + "_roc_all.png", bbox_inches="tight" | |
| ) | |
| plt.close() | |
| plt.figure(2, figsize=(10, 10)) | |
| plt.plot( | |
| fpr["micro"], | |
| tpr["micro"], | |
| label="micro-average (AUC = {0:0.4f})" "".format(roc_auc["micro"]), | |
| color="green", | |
| linestyle="--", | |
| linewidth=2, | |
| ) | |
| plt.plot( | |
| fpr["macro"], | |
| tpr["macro"], | |
| label="macro-average (AUC = {0:0.4f})" "".format(roc_auc["macro"]), | |
| color="red", | |
| linestyle=":", | |
| linewidth=2, | |
| ) | |
| plt.plot([0, 1], [0, 1], "k--", lw=line_width) | |
| plt.xlim([0.0, 1.0]) | |
| plt.ylim([0.0, 1.05]) | |
| plt.xlabel("False Positive Rate") | |
| plt.ylabel("True Positive Rate") | |
| plt.title("Receiver Operating Characteristic") | |
| lgd = plt.legend(loc="best") | |
| plt.savefig(filename + "_roc.png", bbox_inches="tight") | |
| plt.close() | |
| return roc_auc["macro"], roc_auc["micro"] | |
| def plot_precision_recall_curve_multiclass(filename, scores, labels, classes): | |
| """plot_precision_recall_curve_multiclass plots (saves) precision vs recall curve for a multiclass classification scenario | |
| Code from : https://github.com/icrto/xML/blob/master/PyTorch/utils.py | |
| Arguments: | |
| filename {str} -- destination filename | |
| scores {list} -- list of predicted probabilities for all images | |
| labels {list} -- list of target labels for all images | |
| classes {list} -- list of class names | |
| """ | |
| line_width = 3 | |
| nr_classes = len(classes) | |
| labels = label_binarize(labels, classes=list(range(nr_classes))) | |
| precision = dict() | |
| recall = dict() | |
| auc_prec_recall = dict() | |
| average_precision = dict() | |
| for i in range(nr_classes): | |
| precision[i], recall[i], _ = precision_recall_curve(labels[:, i], scores[:, i]) | |
| auc_prec_recall[i] = auc(recall[i], precision[i]) | |
| average_precision[i] = average_precision_score(labels[:, i], scores[:, i]) | |
| # Compute micro-average | |
| precision["micro"], recall["micro"], _ = precision_recall_curve( | |
| labels.ravel(), scores.ravel() | |
| ) | |
| auc_prec_recall["micro"] = auc(recall["micro"], precision["micro"]) | |
| average_precision["micro"] = average_precision_score( | |
| labels, scores, average="micro" | |
| ) | |
| # Compute macro-average | |
| # First aggregate all recall | |
| all_recall = np.unique(np.concatenate([recall[i] for i in range(nr_classes)])) | |
| # Then interpolate all ROC curves at these points | |
| mean_precision = np.zeros_like(all_recall) | |
| for i in range(nr_classes): | |
| mean_precision += np.interp(all_recall, recall[i], precision[i]) | |
| # Finally average it and compute AUC | |
| mean_precision /= nr_classes | |
| recall["macro"] = all_recall | |
| precision["macro"] = mean_precision | |
| auc_prec_recall["macro"] = auc(recall["macro"], precision["macro"]) | |
| average_precision["macro"] = average_precision_score( | |
| labels, scores, average="macro" | |
| ) | |
| # Plot all ROC curves | |
| plt.figure(1, figsize=(10, 10)) | |
| plt.plot( | |
| recall["micro"], | |
| precision["micro"], | |
| label="micro-average (AP = {0:0.4f}; AUC = {0:0.4f})" | |
| "".format(average_precision["micro"], auc_prec_recall["micro"]), | |
| color="green", | |
| linestyle="--", | |
| linewidth=2, | |
| ) | |
| plt.plot( | |
| recall["macro"], | |
| precision["macro"], | |
| label="macro-average (AP = {0:0.4f}; AUC = {0:0.4f})" | |
| "".format(average_precision["macro"], auc_prec_recall["macro"]), | |
| color="red", | |
| linestyle=":", | |
| linewidth=2, | |
| ) | |
| colors = cycle( | |
| [ | |
| "coral", | |
| "mediumorchid", | |
| "aqua", | |
| "darkolivegreen", | |
| "cornflowerblue", | |
| "gold", | |
| "pink", | |
| "chocolate", | |
| "brown", | |
| "darkslategrey", | |
| "tab:cyan", | |
| "slateblue", | |
| "yellow", | |
| "palegreen", | |
| "tan", | |
| "silver", | |
| ] | |
| ) | |
| for i, color in zip(range(nr_classes), colors): | |
| plt.plot( | |
| recall[i], | |
| precision[i], | |
| color=color, | |
| line_width=line_width, | |
| label="class {0} (AP = {1:0.4f}; AUC = {1:0.4f})" | |
| "".format(classes[i], average_precision[i], auc_prec_recall[i]), | |
| ) | |
| plt.xlim([0.0, 1.0]) | |
| plt.ylim([0.0, 1.05]) | |
| plt.xlabel("Recall") | |
| plt.ylabel("Precision") | |
| plt.title("Precision Recall Curve") | |
| lgd = plt.legend(loc="best") | |
| plt.savefig( | |
| filename + "_prec_recall_all.png", | |
| bbox_extra_artists=(lgd,), | |
| bbox_inches="tight", | |
| ) | |
| plt.close() | |
| plt.figure(2, figsize=(10, 10)) | |
| plt.plot( | |
| recall["micro"], | |
| precision["micro"], | |
| label="micro-average (AP = {0:0.4f}; AUC = {0:0.4f})" | |
| "".format(average_precision["micro"], auc_prec_recall["micro"]), | |
| color="green", | |
| linestyle="--", | |
| linewidth=2, | |
| ) | |
| plt.plot( | |
| recall["macro"], | |
| precision["macro"], | |
| label="macro-average (AP = {0:0.4f}; AUC = {0:0.4f})" | |
| "".format(average_precision["macro"], auc_prec_recall["macro"]), | |
| color="red", | |
| linestyle=":", | |
| linewidth=2, | |
| ) | |
| plt.plot([0, 1], [0, 1], "k--", line_width=line_width) | |
| plt.xlim([0.0, 1.0]) | |
| plt.ylim([0.0, 1.05]) | |
| plt.xlabel("Recall") | |
| plt.ylabel("Precision") | |
| plt.title("Precision Recall Curve") | |
| lgd = plt.legend(loc="best") | |
| plt.savefig(filename + "_prec_recall.png", bbox_inches="tight") | |
| plt.close() | |
| def plot_grad_cam(images, grad_image, count, labels, predicted, save_out_folder): | |
| fig = plt.figure(figsize=(15, 15)) | |
| ax1 = fig.add_subplot(1, 2, 1) | |
| ax1.set_yticklabels([]) | |
| ax1.set_xticklabels([]) | |
| plt.gca().axes.get_yaxis().set_visible(False) | |
| plt.gca().axes.get_xaxis().set_visible(False) | |
| ax1.imshow(images[0][0].cpu().numpy(), cmap='gray') | |
| plt.title('True Label: ' + labels_for_classification(labels)) | |
| ax2 = fig.add_subplot(1, 2, 2) | |
| ax2.set_yticklabels([]) | |
| ax2.set_xticklabels([]) | |
| ax2.imshow(grad_image) | |
| plt.title('Predicted Label: ' + labels_for_classification(predicted)) | |
| plt.gca().axes.get_yaxis().set_visible(False) | |
| plt.gca().axes.get_xaxis().set_visible(False) | |
| plt.subplots_adjust(wspace=0, hspace=0) | |
| plt.savefig(save_out_folder+ labels_for_classification(labels)+'_'+ str(count) + '.png', dpi=600, bbox_inches='tight') | |
| #plt.savefig(save_out_folder+ labels_for_classification(labels)+'_'+ str(count) + '.eps', dpi=300, bbox_inches='tight') | |
| plt.close(fig) | |
| def plot_grad_cam_epoch(images, grad_image, count, i, labels, predicted, save_out_folder): | |
| plt.figure(figsize=(10, 10)) | |
| #plt.imshow(images[0][0].cpu().numpy(), cmap='gray') | |
| #plt.title('True Label: ' + labels_for_classification2(labels)) | |
| plt.imshow(grad_image) | |
| plt.title('Epoch: ' + str(i) ) | |
| #plt.title('Predicted Label: ' + labels_for_classification2(predicted)) | |
| plt.gca().axes.get_yaxis().set_visible(False) | |
| plt.gca().axes.get_xaxis().set_visible(False) | |
| plt.rcParams.update({'font.size': 26}) | |
| plt.savefig(save_out_folder+ 'GradCam_' + str(count)+'_'+ str(i+1)+ '.png', dpi=100) | |
| plt.close('all') | |
| def save_input_array_grad_array(images, grad_image, filename, save_out_folder): | |
| images = images[0][0].cpu().numpy() | |
| image_filename = os.path.join(save_out_folder,filename+'_image.npy') | |
| mask_filename = os.path.join(save_out_folder, filename+'_mask.npy') | |
| np.save(image_filename, images, allow_pickle=True, fix_imports=True) | |
| np.save(mask_filename, grad_image, allow_pickle=True, fix_imports=True) | |
| return image_filename, mask_filename | |
| def plot_grad_cam_histogram(images, grad_image, count, labels, predicted, save_out_folder): | |
| #fig = plt.figure(figsize=(10, 10)) | |
| fig = plt.figure() | |
| ax1 = fig.add_subplot(1, 3, 1) | |
| ax1.set_yticklabels([]) | |
| ax1.set_xticklabels([]) | |
| plt.gca().axes.get_yaxis().set_visible(False) | |
| plt.gca().axes.get_xaxis().set_visible(False) | |
| ax1.imshow(images[0][0].cpu().numpy(), cmap='gray') | |
| #plt.title('True Label: ' + labels_for_classification2(labels)) | |
| ax3 = fig.add_subplot(1, 3, 2) | |
| ax3.set_yticklabels([]) | |
| ax3.set_xticklabels([]) | |
| plt.gca().axes.get_yaxis().set_visible(False) | |
| plt.gca().axes.get_xaxis().set_visible(False) | |
| img = images[0][0].cpu().numpy() | |
| img_eq = exposure.equalize_hist(img) | |
| ax3.imshow(img_eq, cmap='gray') | |
| #plt.title('True Label: ' + labels_for_classification2(labels)) | |
| ax2 = fig.add_subplot(1, 3, 3) | |
| ax2.set_yticklabels([]) | |
| ax2.set_xticklabels([]) | |
| ax2.imshow(grad_image) | |
| #plt.title('Predicted Label: ' + labels_for_classification2(predicted)) | |
| plt.gca().axes.get_yaxis().set_visible(False) | |
| plt.gca().axes.get_xaxis().set_visible(False) | |
| plt.subplots_adjust(wspace=0, hspace=0) | |
| plt.savefig(save_out_folder+ labels_for_classification(labels)+'_'+labels_for_classification(predicted)+ str(count) + '.jpg', dpi=800, bbox_inches='tight') | |
| plt.savefig(save_out_folder+ labels_for_classification(labels)+'_'+labels_for_classification(predicted)+ str(count) + '.eps', dpi=800, bbox_inches='tight') | |
| plt.close(fig) | |
| def plot_grad_cam_single(images, grad_image, count, labels, predicted, save_out_folder): | |
| #fig = plt.figure(figsize=(10, 10)) | |
| fig = plt.figure() | |
| plt.gca().axes.get_yaxis().set_visible(False) | |
| plt.gca().axes.get_xaxis().set_visible(False) | |
| plt.imshow(grad_image) | |
| #plt.imshow(images[0][0].cpu().numpy(), cmap='gray') | |
| #img = images[0][0].cpu().numpy() | |
| #img_eq = exposure.equalize_hist(img) | |
| #plt.imshow(img_eq, cmap='gray') | |
| #plt.subplots_adjust(wspace=0, hspace=0) | |
| #plt.savefig(save_out_folder+ labels_for_classification2(labels)+'_'+labels_for_classification2(predicted)+ str(count) + '.jpg', dpi=300, bbox_inches='tight') | |
| #plt.savefig(save_out_folder+ labels_for_classification2(labels)+'_'+labels_for_classification2(predicted)+ str(count) + '.eps', dpi=300, bbox_inches='tight') | |
| plt.savefig(save_out_folder+ labels_for_classification(labels)+ str(count) + '.jpg', dpi=300, bbox_inches='tight') | |
| plt.savefig(save_out_folder+ labels_for_classification(labels)+ str(count) + '.eps', dpi=300, bbox_inches='tight') | |
| plt.close(fig) | |
| def plot_roc_curve_multiclass1(filename, scores, labels, classes): | |
| """plot_roc_curve_multiclass plots (saves) roc curve for a multiclass classification scenario | |
| Code from : https://github.com/icrto/xML/blob/master/PyTorch/utils.py | |
| Arguments: | |
| filename {str} -- destination filename | |
| scores {list} -- list of predicted probabilities for all images | |
| labels {list} -- list of target labels for all images | |
| classes {list} -- list of class names | |
| """ | |
| line_width = 3 | |
| nr_classes = len(classes) | |
| labels = label_binarize(labels, classes=list(range(nr_classes))) | |
| fpr = dict() | |
| tpr = dict() | |
| roc_auc = dict() | |
| for i in range(nr_classes): | |
| fpr[i], tpr[i], _ = roc_curve(labels[:, i], scores[:, i]) | |
| roc_auc[i] = auc(fpr[i], tpr[i]) | |
| # Compute micro-average ROC curve and ROC area | |
| fpr["micro"], tpr["micro"], _ = roc_curve(labels.ravel(), scores.ravel()) | |
| roc_auc["micro"] = auc(fpr["micro"], tpr["micro"]) | |
| # Compute macro-average ROC curve and ROC area | |
| # First aggregate all false positive rates | |
| all_fpr = np.unique(np.concatenate([fpr[i] for i in range(nr_classes)])) | |
| # Then interpolate all ROC curves at these points | |
| mean_tpr = np.zeros_like(all_fpr) | |
| for i in range(nr_classes): | |
| mean_tpr += np.interp(all_fpr, fpr[i], tpr[i]) | |
| # Finally average it and compute AUC | |
| mean_tpr /= nr_classes | |
| fpr["macro"] = all_fpr | |
| tpr["macro"] = mean_tpr | |
| roc_auc["macro"] = auc(fpr["macro"], tpr["macro"]) | |
| # colors = cycle( | |
| # [ | |
| # "coral", | |
| # "mediumorchid", | |
| # "aqua", | |
| # "darkolivegreen", | |
| # "cornflowerblue", | |
| # "gold", | |
| # "pink", | |
| # "chocolate", | |
| # "brown", | |
| # "darkslategrey", | |
| # "tab:cyan", | |
| # "slateblue", | |
| # "yellow", | |
| # "palegreen", | |
| # "tan", | |
| # "silver", | |
| # ] | |
| # ) | |
| # # for i, color in zip(range(nr_classes), colors): | |
| # # plt.plot( | |
| # # fpr[i], | |
| # # tpr[i], | |
| # color=color, | |
| # lw=line_width, | |
| # label="class {0} (AUC = {1:0.4f})" "".format(classes[i], roc_auc[i]), | |
| # ) | |
| # plt.plot([0, 1], [0, 1], "k--", lw=line_width) | |
| # plt.xlim([0.0, 1.0]) | |
| # plt.ylim([0.0, 1.05]) | |
| # plt.xlabel("False Positive Rate") | |
| # plt.ylabel("True Positive Rate") | |
| # plt.title("Receiver Operating Characteristic") | |
| # lgd = plt.legend(loc="best") | |
| # plt.savefig( | |
| # filename + "_roc_all.png", bbox_inches="tight" | |
| # ) | |
| # # plt.close() | |
| # plt.figure(2, figsize=(10, 10)) | |
| # plt.plot( | |
| # fpr["micro"], | |
| # tpr["micro"], | |
| # label="micro-average (AUC = {0:0.4f})" "".format(roc_auc["micro"]), | |
| # color="green", | |
| # linestyle="--", | |
| # linewidth=2, | |
| # ) | |
| # plt.plot( | |
| # fpr["macro"], | |
| # tpr["macro"], | |
| # label="macro-average (AUC = {0:0.4f})" "".format(roc_auc["macro"]), | |
| # color="red", | |
| # linestyle=":", | |
| # linewidth=2, | |
| # ) | |
| #plt.plot([0, 1], [0, 1], "k--", lw=line_width) | |
| #plt.xlim([0.0, 1.0]) | |
| #plt.ylim([0.0, 1.05]) | |
| #plt.xlabel("False Positive Rate") | |
| #plt.ylabel("True Positive Rate") | |
| #plt.title("Receiver Operating Characteristic") | |
| #lgd = plt.legend(loc="best") | |
| ##plt.close() | |
| return fpr["macro"],tpr["macro"],roc_auc["macro"] |