ABMIL / src /utils /plotter.py
deboraJ23's picture
init
a639402 verified
Raw
History Blame Contribute Delete
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"]