""" To visualize the difference between guided-backprop and occlusion maps. Tony Fu, Sep 27, 2022 """ import os import sys import numpy as np import pandas as pd import matplotlib.pyplot as plt from matplotlib.backends.backend_pdf import PdfPages sys.path.append('../../..') import src.rf_mapping.constants as c from src.rf_mapping.result_txt_format import (RfmpHotSpot as HS, GtGaussian as GTG) # Please specify the model num_layers_dict = {'alexnet' : 5, 'vgg16': 13, 'resnet18': 20} this_is_a_test_run = False map1_name = 'gt' # ['gt', 'occlude'] map2_name = 'rfmp4c7o' # ['rfmp4a', 'rfmp4c7o', 'rfmp_sin1', 'pasu'] fxvar_thres = 0.8 sigma_rf_ratio = 1/30 ######################### LOAD MAP CORRELATIONS ############################# map_corr_dict = {} for model_name in num_layers_dict.keys(): max_map_corr_path = os.path.join(c.REPO_DIR, 'results', 'compare', 'map_correlations', model_name, f"max_map_r_{sigma_rf_ratio:.4f}.txt") max_map_corr_df = pd.read_csv(max_map_corr_path, sep=" ", header=0) map_corr_dict[model_name] =\ max_map_corr_df[['LAYER', 'UNIT', f'{map1_name}_vs_{map2_name}']].copy() ########################### LOAD HOT SPOT DATA ############################## err_dist_dict = {} for model_name in num_layers_dict.keys(): gt_df_path = os.path.join(c.REPO_DIR, 'results', 'ground_truth', 'gaussian_fit', model_name, 'abs', f"{model_name}_{map1_name}_hot_spot.txt") rfmp_df_path = os.path.join(c.REPO_DIR, 'results', map2_name, 'gaussian_fit', model_name, f"{model_name}_{map2_name}_hot_spot.txt") gt_df = pd.read_csv(gt_df_path, sep=" ", header=0) rfmp_df = pd.read_csv(rfmp_df_path, sep=" ", header=0) gt_df.columns = [e.name for e in HS] rfmp_df.columns = [e.name for e in HS] err_dist_df = gt_df[['LAYER', 'UNIT']].copy() err_dist_df['HOT_SPOT_ERR_DIST'] = np.sqrt( np.square(gt_df.loc[:,'TOP_X'] - rfmp_df.loc[:,'TOP_X']) + np.square(gt_df.loc[:,'TOP_Y'] - rfmp_df.loc[:,'TOP_Y'])) err_dist_dict[model_name] = err_dist_df ########################### LOAD HOT SPOT DATA ############################## for model_name, err_dist_df in err_dist_dict.items(): gt_df_path = os.path.join(c.REPO_DIR, 'results', 'ground_truth', 'gaussian_fit', model_name, 'abs', f"{model_name}_{map1_name}_gaussian_top.txt") rfmp_df_path = os.path.join(c.REPO_DIR, 'results', map2_name, 'gaussian_fit', model_name, f"{model_name}_{map2_name}_gaussian_top.txt") gt_df = pd.read_csv(gt_df_path, sep=" ", header=0) rfmp_df = pd.read_csv(rfmp_df_path, sep=" ", header=0) gt_df.columns = [e.name for e in GTG] rfmp_df.columns = [e.name for e in GTG] err_dist_df['GAUSSIAN_ERR_DIST'] = np.sqrt( np.square(gt_df.loc[:,'MUX'] - rfmp_df.loc[:,'MUX']) + np.square(gt_df.loc[:,'MUY'] - rfmp_df.loc[:,'MUY'])) ################################ MAKE PDF ################################### pdf_path = os.path.join(c.REPO_DIR, 'results', 'compare', f'{map1_name}_vs_{map2_name}', f"{map1_name}_vs_{map2_name}_summary.pdf") with PdfPages(pdf_path) as pdf: plt.figure(figsize=(12, 6)) for model_name, num_layers in num_layers_dict.items(): avg_corr_data = [] for conv_i in range(num_layers): # if conv_i == 0: continue df = map_corr_dict[model_name] corr_mean = df.loc[df.LAYER == f'conv{conv_i+1}', f'{map1_name}_vs_{map2_name}'].dropna().to_numpy().mean() avg_corr_data.append(corr_mean) plt.plot(avg_corr_data, '.-', markersize=20) plt.ylim([0.2, 1.1]) plt.ylabel('Direct map correlation', fontsize=16) plt.title(f"{map1_name} vs. {map2_name}", fontsize=18) max_num_layers = max(num_layers_dict.values()) plt.xticks(np.arange(max_num_layers), np.arange(1, max_num_layers+1), fontsize=16) plt.xlabel('conv_i', fontsize=20) plt.legend(num_layers_dict.keys(), fontsize=16) pdf.savefig() plt.show() plt.close() plt.figure(figsize=(12, 6)) for model_name, num_layers in num_layers_dict.items(): avg_err_dist_data = [] for conv_i in range(num_layers): # if conv_i == 0: continue df = err_dist_dict[model_name] dist_mean = df.loc[df.LAYER == f'conv{conv_i+1}', 'HOT_SPOT_ERR_DIST'].to_numpy().mean() avg_err_dist_data.append(dist_mean) plt.plot(avg_err_dist_data, '.-', markersize=20) # plt.ylim([0, 10]) plt.ylabel('Avg hot spot error distance (pix)', fontsize=16) plt.title(f"{map1_name} vs. {map2_name}", fontsize=18) max_num_layers = max(num_layers_dict.values()) plt.xticks(np.arange(max_num_layers), np.arange(1, max_num_layers+1), fontsize=16) plt.xlabel('conv_i', fontsize=20) plt.legend(num_layers_dict.keys(), fontsize=16) pdf.savefig() plt.show() plt.close() plt.figure(figsize=(12, 6)) for model_name, num_layers in num_layers_dict.items(): avg_err_dist_data = [] for conv_i in range(num_layers): # if conv_i == 0: continue df = err_dist_dict[model_name] dist_mean = df.loc[df.LAYER == f'conv{conv_i+1}', 'GAUSSIAN_ERR_DIST'].to_numpy().mean() avg_err_dist_data.append(dist_mean) plt.plot(avg_err_dist_data, '.-', markersize=20) # plt.ylim([0, 10]) plt.ylabel('Avg Gaussian error distance (pix)', fontsize=16) plt.title(f"{map1_name} vs. {map2_name}", fontsize=18) max_num_layers = max(num_layers_dict.values()) plt.xticks(np.arange(max_num_layers), np.arange(1, max_num_layers+1), fontsize=16) plt.xlabel('conv_i', fontsize=20) plt.legend(num_layers_dict.keys(), fontsize=16) pdf.savefig() plt.show() plt.close()