--- a +++ b/segmentation/plot_logs.py @@ -0,0 +1,74 @@ +''' +Copyright (c) Microsoft Corporation. All rights reserved. +Licensed under the MIT License. +''' +import pandas as pd +import matplotlib.pyplot as plt +import numpy as np +import os +import glob +import sys +config_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..") +sys.path.append(config_dir) +from config import RESULTS_FOLDER + +# %% +def plot_train_logs(train_fpaths, valid_fpaths, network_names): + train_dfs = [pd.read_csv(path) for path in train_fpaths] + valid_dfs = [pd.read_csv(path) for path in valid_fpaths] + + train_losses = [df['Loss'].values for df in train_dfs] + valid_metrics = [df['Metric'].values for df in valid_dfs] + train_epochs = [np.arange(len(train_loss))+1 for train_loss in train_losses] + valid_epochs = [2*(np.arange(len(valid_metric))+1) for valid_metric in valid_metrics] + min_losses = [np.min(train_loss) for train_loss in train_losses] + min_losses_epoch = [np.argmin(train_loss) + 1 for train_loss in train_losses] + max_dscs = [np.max(valid_metric) for valid_metric in valid_metrics] + max_dscs_epoch = [2*(np.argmax(valid_metric)+1) for valid_metric in valid_metrics] + fig, ax = plt.subplots(1,2, figsize=(20,10)) + fig.patch.set_facecolor('white') + fig.patch.set_alpha(1) + + for i in range(len(train_losses)): + ax[0].plot(train_epochs[i], train_losses[i]) + ax[1].plot(valid_epochs[i], valid_metrics[i]) + ax[0].plot(min_losses_epoch[i], min_losses[i], '-o', color='red') + ax[1].plot(max_dscs_epoch[i], max_dscs[i], '-o', color='red') + + ax[0].text(np.min(train_epochs[i]), np.min(train_losses[i]), f'Total epochs: {len(train_epochs[i])}', fontsize=15) + + legend_labels_trainloss = [f"{network_names[i]}; Min loss: {round(min_losses[i], 4)} ({len(train_epochs[i])})" for i in range(len(network_names))] + legend_labels_validdice = [f"{network_names[i]}; Max DSC: {round(max_dscs[i], 4)} ({len(valid_epochs[i])})" for i in range(len(network_names))] + + ax[0].legend(legend_labels_trainloss, fontsize=16) + ax[1].legend(legend_labels_validdice, fontsize=16) + ax[0].set_title('Train loss', fontsize=25) + ax[1].set_title('Valid DSC', fontsize=25) + ax[0].set_ylabel('Dice loss', fontsize=20) + ax[1].set_ylabel('Dice score', fontsize=20) + ax[0].grid(True) + ax[1].grid(True) + plt.show() + +#%% +fold = 0 +network = ['unet'] +inputsize = [192, 192, 160, 128] +p = 2 +inputsize_dict = { + 'unet': 192, + 'attentionunet': 192, + 'segresnet': 192, + 'dynunet': 160, + 'unetr': 160, + 'swinunetr': 128 +} + +experiment_code = [f"{network[i]}_fold{fold}_randcrop{inputsize[i]}" for i in range(len(network))] +save_logs_dir = os.path.join(RESULTS_FOLDER, 'logs') +save_logs_folders = [os.path.join(save_logs_dir, 'fold'+str(fold), network[i], experiment_code[i]) for i in range(len(experiment_code))] +train_fpaths = [os.path.join(save_logs_folders[i], 'trainlog_gpu0.csv') for i in range(len(save_logs_folders))] +valid_fpaths = [os.path.join(save_logs_folders[i], 'validlog_gpu0.csv') for i in range(len(save_logs_folders))] +legend_lbls = [f'{network[i]}, N = {inputsize[i]}' for i in range(len(network))] +plot_train_logs(train_fpaths, valid_fpaths, legend_lbls) +