diff --git a/libs/util.py b/libs/util.py index f94d49c..c8b0bc0 100644 --- a/libs/util.py +++ b/libs/util.py @@ -49,3 +49,18 @@ def convert_vector_to_mat( x, y = (rx_locs[i, :] + offset) / block_size result[int(x), int(y)] = rx_rsses[i] return result + + +def stats(data): + ''' + ''' + data = data.reshape(-1,) + return { + "5perc": np.percentile(data, 5), + "25perc": np.percentile(data, 25), + "median": np.median(data), + "75perc": np.percentile(data, 75), + "95perc": np.percentile(data, 95), + "mean": np.mean(data), + "std": np.std(data), + } diff --git a/localization_from_gan.py b/localization_from_gan.py index 3b8b94c..d24c106 100644 --- a/localization_from_gan.py +++ b/localization_from_gan.py @@ -66,7 +66,7 @@ def main(args): filepaths.extend(["{}/{}".format(args.folderpath, file) for file in files if '.pickle' in file]) # prepare - if args.outputfile: + if args.outputfile and not os.path.isfile(args.outputfile): with open(args.outputfile, 'w') as f: f.write("filename,tx_x,tx_y,tx_pwr,env_gamma\n") diff --git a/localization_log_gamma_model.py b/localization_log_gamma_model.py index 52a0708..705e0b6 100644 --- a/localization_log_gamma_model.py +++ b/localization_log_gamma_model.py @@ -6,6 +6,7 @@ import pickle import argparse from libs.util import touch +from libs.util import stats from libs.util import convert_mat_to_vector from libs.util import convert_vector_to_mat from libs.fitting import modelfit_log_gamma @@ -34,7 +35,7 @@ def fittingSingle(filepath, args): rx_locs, rx_rsses = convert_mat_to_vector(data, block_size=0.1) # start fitting - min_pmse = float('inf') + min_fit_mse = float('inf') best_tx_loc = None best_tx_pwr = None best_env_gamma = None @@ -51,20 +52,27 @@ def fittingSingle(filepath, args): monte_carlo_sampling_rate=0.8 ) # unpack - pmse, est_tx_loc, est_tx_pwr, est_env_gamma, est_rsses = result - if pmse < min_pmse: - print("|----- found better:", pmse, est_tx_loc, est_tx_pwr, est_env_gamma) - min_pmse = pmse + fit_mse, est_tx_loc, est_tx_pwr, est_env_gamma, est_rsses = result + if fit_mse < min_fit_mse: + print("|----- found better:", fit_mse, est_tx_loc, est_tx_pwr, est_env_gamma) + min_fit_mse = fit_mse best_tx_loc = est_tx_loc best_tx_pwr = est_tx_pwr best_env_gamma = est_env_gamma best_rsses = est_rsses + + # calculate diff + data_best_est = convert_vector_to_mat(rx_locs, best_rsses, data.shape, block_size=0.1) + data_diff = data - data_best_est + stat = stats(data_diff) + print("|- final:") print("|--- tx loc: {:.3f}, {:.3f}".format(best_tx_loc[0], best_tx_loc[1])) print("|--- tx pwr: {:.2f}".format(best_tx_pwr)) print("|--- env gamma: {:.2f}".format(best_env_gamma)) - print("|--- fitting mse: {:.6f}".format(min_pmse)) - data_best_est = convert_vector_to_mat(rx_locs, best_rsses, data.shape, block_size=0.1) + print("|--- fitting mse: {:.6f}".format(min_fit_mse)) + print("|--- rss diff: 5perc/95perc/median/mean: {:.4f}/{:.4f}/{:.4f}/{:.4f} m" + .format(stat['5perc'], stat['95perc'], stat['median'], stat['mean'])) if args.outputfile: filename = os.path.basename(args.outputfile) @@ -73,7 +81,8 @@ def fittingSingle(filepath, args): "{},".format(filename) + "{:.3f},{:.3f},".format(best_tx_loc[0], best_tx_loc[1]) + "{:.2f},{:.2f}".format(best_tx_pwr, best_env_gamma) + - "{:.6f}".format(min_pmse) + + "{:.6f},".format(min_fit_mse) + + "{:.4f},{:.4f},{:.4f},{:.4f}".format(stat['5perc'], stat['95perc'], stat['median'], stat['mean']) + "\n" ) @@ -96,9 +105,9 @@ def main(args): filepaths.extend(["{}/{}".format(args.folderpath, file) for file in files if '.pickle' in file]) # prepare - if args.outputfile: + if args.outputfile and not os.path.isfile(args.outputfile): with open(args.outputfile, 'w') as f: - f.write("filename,tx_x,tx_y,tx_pwr,env_gamma,fit_mse\n") + f.write("filename,tx_x,tx_y,tx_pwr,env_gamma,fit_mse,rss_diff_5perc,rss_diff_95perc,rss_diff_med,rss_diff_avg\n") # loop through and fit diff --git a/visualize.py b/visualize.py new file mode 100644 index 0000000..d445ac1 --- /dev/null +++ b/visualize.py @@ -0,0 +1,77 @@ +#!/usr/bin/python + +import os +import pickle +import argparse + +from libs.plotting import plotRSS + + +def loadData(filepath): + try: + return pickle.load(open(filepath, "rb")) + except BaseException as e: + print("err: {}".format(e)) + pass + return None + + +def plotSingle(filepath, args): + ''' + ''' + # load data from file + data = loadData(filepath) + if data is None: + print("err: failed to load file {}".format(filepath)) + return + + plotRSS(data) + + +def main(args): + + # finding files + filepaths = [] + if args.filepath: + filepaths.append(args.filepath) + if args.folderpath: + files = os.listdir(args.folderpath) + filepaths.extend(["{}/{}".format(args.folderpath, file) for file in files if '.pickle' in file]) + + # loop through and plot + for i in range(len(filepaths)): + print("- plotting file {}".format(filepaths[i])) + plotSingle(filepaths[i], args) + + +if __name__ == '__main__': + p = argparse.ArgumentParser(description='Visualization') + p.add_argument( + '--filepath', '-f', + dest='filepath', + default=None, + help='input filepath for a pickle' + ) + p.add_argument( + '--folderpath', '-fd', + dest='folderpath', + default=None, + help='input folderpath for many pickles' + ) + try: + args = p.parse_args() + except BaseException as e: + print(e) + sys.exit() + + if args.filepath is None and args.folderpath is None: + print("at least specify file `-f` or folder `-fd`") + sys.exit() + elif args.filepath is None and not os.path.isdir(args.folderpath): + print("folder {} not exit".format(args.folderpath)) + sys.exit() + elif args.folderpath is None and not os.path.isfile(args.filepath): + print("file {} not exit".format(args.filepath)) + sys.exit() + + main(args)