--- a +++ b/fetal/evaluate.py @@ -0,0 +1,63 @@ +import numpy as np +import nibabel as nib +import os +import glob +import pandas as pd +import matplotlib + +matplotlib.use('agg') +import matplotlib.pyplot as plt + + +def get_fetal_envelope_mask(data): + return data > 0 + + +def dice_coefficient(truth, prediction): + return 2 * np.sum(truth * prediction) / (np.sum(truth) + np.sum(prediction)) + + +def main(): + header = ("FetalEnvelope",) + masking_functions = (get_fetal_envelope_mask,) + rows = list() + subject_ids = list() + for case_folder in glob.glob("prediction/*"): + if not os.path.isdir(case_folder): + continue + subject_ids.append(os.path.basename(case_folder)) + truth_file = os.path.join(case_folder, "truth.nii.gz") + truth_image = nib.load(truth_file) + truth = truth_image.get_data() + prediction_file = os.path.join(case_folder, "prediction.nii.gz") + prediction_image = nib.load(prediction_file) + prediction = prediction_image.get_data() + rows.append([dice_coefficient(func(truth), func(prediction)) for func in masking_functions]) + + df = pd.DataFrame.from_records(rows, columns=header, index=subject_ids) + df.to_csv("./prediction/brats_scores.csv") + + scores = dict() + for index, score in enumerate(df.columns): + values = df.values.T[index] + scores[score] = values[np.isnan(values) == False] + + plt.boxplot(list(scores.values()), labels=list(scores.keys())) + plt.ylabel("Dice Coefficient") + plt.savefig("validation_scores_boxplot.png") + plt.close() + + if os.path.exists("./training.log"): + training_df = pd.read_csv("./training.log").set_index('epoch') + + plt.plot(training_df['loss'].values, label='training loss') + plt.plot(training_df['val_loss'].values, label='validation loss') + plt.ylabel('Loss') + plt.xlabel('Epoch') + plt.xlim((0, len(training_df.index))) + plt.legend(loc='upper right') + plt.savefig('loss_graph.png') + + +if __name__ == "__main__": + main()