| import os |
| import sys |
| import tqdm |
|
|
| import pandas as pd |
| import numpy as np |
|
|
| from PIL import Image |
|
|
| filepath = os.path.split(os.path.abspath(__file__))[0] |
| repopath = os.path.split(filepath)[0] |
| sys.path.append(repopath) |
|
|
| from utils.eval_functions import * |
| from utils.misc import * |
|
|
| BETA = 1.0 |
|
|
| def evaluate(opt, args): |
| if os.path.isdir(opt.Eval.result_path) is False: |
| os.makedirs(opt.Eval.result_path) |
| |
| method = os.path.split(opt.Eval.pred_root)[-1] |
|
|
| if args.verbose is True: |
| print('#' * 20, 'Start Evaluation', '#' * 20) |
| datasets = tqdm.tqdm(opt.Eval.datasets, desc='Expr - ' + method, total=len( |
| opt.Eval.datasets), position=0, bar_format='{desc:<30}{percentage:3.0f}%|{bar:50}{r_bar}') |
| else: |
| datasets = opt.Eval.datasets |
|
|
| results = [] |
|
|
| for dataset in datasets: |
| pred_root = os.path.join(opt.Eval.pred_root, dataset) |
| gt_root = os.path.join(opt.Eval.gt_root, dataset, 'masks') |
|
|
| preds = os.listdir(pred_root) |
| gts = os.listdir(gt_root) |
| |
| preds = sort(preds) |
| gts = sort(gts) |
| |
| preds = [i for i in preds if i in gts] |
| gts = [i for i in gts if i in preds] |
| |
| FM = Fmeasure() |
| WFM = WeightedFmeasure() |
| SM = Smeasure() |
| EM = Emeasure() |
| MAE = Mae() |
| MSE = Mse() |
| MBA = BoundaryAccuracy() |
| IOU = IoU() |
| BIOU = BIoU() |
| TIOU = TIoU() |
|
|
| if args.verbose is True: |
| samples = tqdm.tqdm(enumerate(zip(preds, gts)), desc=dataset + ' - Evaluation', total=len( |
| preds), position=1, leave=False, bar_format='{desc:<30}{percentage:3.0f}%|{bar:50}{r_bar}') |
| else: |
| samples = enumerate(zip(preds, gts)) |
|
|
| for i, sample in samples: |
| pred, gt = sample |
|
|
| pred_mask = np.array(Image.open(os.path.join(pred_root, pred)).convert('L')) |
| gt_mask = np.array(Image.open(os.path.join(gt_root, gt)).convert('L')) |
|
|
| if len(pred_mask.shape) != 2: |
| pred_mask = pred_mask[:, :, 0] |
| if len(gt_mask.shape) != 2: |
| gt_mask = gt_mask[:, :, 0] |
|
|
| assert pred_mask.shape == gt_mask.shape, print(pred, 'does not match the size of', gt) |
| |
|
|
| FM.step( pred=pred_mask, gt=gt_mask) |
| WFM.step(pred=pred_mask, gt=gt_mask) |
| SM.step( pred=pred_mask, gt=gt_mask) |
| EM.step( pred=pred_mask, gt=gt_mask) |
| MAE.step(pred=pred_mask, gt=gt_mask) |
| MSE.step(pred=pred_mask, gt=gt_mask) |
| MBA.step(pred=pred_mask, gt=gt_mask) |
| IOU.step(pred=pred_mask, gt=gt_mask) |
| BIOU.step(pred=pred_mask, gt=gt_mask) |
| TIOU.step(pred=pred_mask, gt=gt_mask) |
| |
| result = [] |
|
|
| Sm = SM.get_results()["sm"] |
| wFm = WFM.get_results()["wfm"] |
| mae = MAE.get_results()["mae"] |
| mse = MSE.get_results()["mse"] |
| mBA = MBA.get_results()["mba"] |
| |
| Fm = FM.get_results()["fm"] |
| Em = EM.get_results()["em"] |
| Iou = IOU.get_results()["iou"] |
| BIou = BIOU.get_results()["biou"] |
| TIou = TIOU.get_results()["tiou"] |
| |
| adpEm = Em["adp"] |
| avgEm = Em["curve"].mean() |
| maxEm = Em["curve"].max() |
| adpFm = Fm["adp"] |
| avgFm = Fm["curve"].mean() |
| maxFm = Fm["curve"].max() |
| avgIou = Iou["curve"].mean() |
| maxIou = Iou["curve"].max() |
| avgBIou = BIou["curve"].mean() |
| maxBIou = BIou["curve"].max() |
| avgTIou = TIou["curve"].mean() |
| maxTIou = TIou["curve"].max() |
| |
| out = dict() |
| for metric in opt.Eval.metrics: |
| out[metric] = eval(metric) |
|
|
| pkl = os.path.join(opt.Eval.result_path, 'result_' + dataset + '.pkl') |
| if os.path.isfile(pkl) is True: |
| result = pd.read_pickle(pkl) |
| result.loc[method] = out |
| result.to_pickle(pkl) |
| else: |
| result = pd.DataFrame(data=out, index=[method]) |
| result.to_pickle(pkl) |
| result.to_csv(os.path.join(opt.Eval.result_path, 'result_' + dataset + '.csv')) |
| results.append(result) |
| |
| if args.verbose is True: |
| for dataset, result in zip(datasets, results): |
| print('###', dataset, '###', '\n', result.sort_index(), '\n') |
| |
| if __name__ == "__main__": |
| args = parse_args() |
| opt = load_config(args.config) |
| evaluate(opt, args) |
|
|