{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"# ANHIR: Evaluation Board\n",
"\n",
"This notebook serves as visualisation for challenge results in several forms - standard tables and charts. First, all submissions have to be recomputed, so they also contain the detail about each image registration pair. One of the perspective to validate is the difference between training and testing.\n",
"\n",
"The ANHIR challenge is hosted on https://anhir.grand-challenge.org.\n",
"\n",
"These particular results are for ANHIR workshop hosted at ISBI 2019 in Venice, Italy.\n",
"In case you want to get some further evaluation related to new submission, you may contact one of the ANHIR administrators because the full submission is required, see https://anhir.grand-challenge.org/Organizers."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"%load_ext autoreload\n",
"%autoreload 2\n",
"\n",
"import os, sys\n",
"import glob, json\n",
"import shutil\n",
"\n",
"import tqdm\n",
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"\n",
"sys.path += [os.path.abspath('.'), os.path.abspath('..')] # Add path to root\n",
"from birl.utilities.data_io import update_path\n",
"from birl.utilities.evaluate import compute_ranking, grouping_cumulative\n",
"from birl.utilities.drawing import RadarChart, draw_matrix_user_ranking, draw_scatter_double_scale\n",
"from bm_ANHIR.generate_regist_pairs import VAL_STATUS_TRAIN, VAL_STATUS_TEST\n",
"from bm_ANHIR.evaluate_submission import COL_TISSUE"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This notebook serves for computing extended statistics (e.g. metrics inliding ranks) and visualie some more statistics."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# folder with all participants submissions\n",
"PATH_SUBMISSIONS = os.path.join(update_path('bm_ANHIR'), 'submissions_paper')\n",
"# temporary folder for unzipping submissions\n",
"PATH_TEMP = os.path.abspath(os.path.expanduser('~/Desktop/ANHIR_submissions'))\n",
"# configuration needed for recomputing detail metrics\n",
"PATH_DATASET = os.path.join(update_path('bm_ANHIR'), 'dataset_ANHIR')\n",
"PATH_TABLE = os.path.join(PATH_DATASET, 'dataset_medium.csv')\n",
"# landmarks provided to participants, in early ANHIR stage we provided only 20% points per image pair\n",
"PATH_LNDS_PROVIDED = os.path.join(PATH_DATASET, 'landmarks_all')\n",
"# complete landmarks dataset\n",
"PATH_LNDS_COMPLATE = os.path.join(PATH_DATASET, 'landmarks_all')\n",
"# baseline for normalization of computing time\n",
"PATH_COMP_BM = os.path.join(PATH_DATASET, 'computer-performances_cmpgrid-71.json')\n",
"FIELD_TISSUE = 'type-tissue'\n",
"FIELD_STATUS = 'Status'\n",
"\n",
"# configuration for Pandas tables\n",
"pd.set_option(\"display.max_columns\", 25)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Some initial replacement and name adjustments"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Look-Up-Table for upadting plot names from original (dataset) names\n",
"TISSUE_LUT = {\n",
" 'COAD': 'COAD', 'gastric': 'gastric',\n",
" 'breast': 'human-breast', 'kidney': 'human-kidney',\n",
" 'lung-lesion': 'lung-lesion', 'lung-lobes': 'lung-lobes',\n",
" 'mammary-gland': 'mammary-gland', 'mice-kidney': 'mouse-kidney'\n",
"}\n",
"# simplify the metrics names according paper\n",
"METRIC_LUT = {\n",
" 'Average-': 'A', \n",
" 'Rank-': 'R',\n",
" 'Median-': 'M',\n",
" 'Max-': 'Mx',\n",
"}\n",
"\n",
"def col_metric_rename(col):\n",
" for m in METRIC_LUT:\n",
" col = col.replace(m, METRIC_LUT[m])\n",
" return col\n",
"\n",
"def col_tissue_remane(col):\n",
" k = col.split('_')[-1]\n",
" if k in TISSUE_LUT:\n",
" col = col.replace(k, TISSUE_LUT[k])\n",
" return col"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Parse and load submissions"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Extract metrics from particular submissions\n",
"\n",
"All submissions are expected to be as a zip archives in single folder. The archive name is the author name."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# Find all archives and unzip them to the same folder.\n",
"archive_paths = sorted(glob.glob(os.path.join(PATH_SUBMISSIONS, '*.zip')))\n",
"submission_dirs = []\n",
"\n",
"for path_zip in tqdm.tqdm(archive_paths, desc='unzipping'):\n",
" sub = os.path.join(PATH_TEMP, os.path.splitext(os.path.basename(path_zip))[0])\n",
" os.system('unzip -o \"%s\" -d \"%s\"' % (path_zip, sub))\n",
" sub_ins = glob.glob(os.path.join(sub, '*'))\n",
" # if the zip subfolder contain only one folder move it up\n",
" if len(sub_ins) == 1:\n",
" [shutil.move(p, sub) for p in glob.glob(os.path.join(sub_ins[0], '*'))]\n",
" submission_dirs.append(sub)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Parse submissions and compute the final metrics. This can be computed just once.\n",
"\n",
"**NOTE:** you can skip this step if you have already computed metrics in JSON files"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"import bm_ANHIR.evaluate_submission\n",
"\n",
"bm_ANHIR.evaluate_submission.REQUIRE_OVERLAP_INIT_TARGET = False\n",
"\n",
"tqdm_bar = tqdm.tqdm(total=len(submission_dirs))\n",
"for path_sub in submission_dirs:\n",
" tqdm_bar.set_description(path_sub)\n",
" # run the evaluation with details\n",
" path_json = bm_ANHIR.evaluate_submission.main(\n",
" path_experiment=path_sub,\n",
" path_table=PATH_TABLE,\n",
" path_dataset=PATH_LNDS_PROVIDED,\n",
" path_reference=PATH_LNDS_COMPLATE,\n",
" path_comp_bm=PATH_COMP_BM,\n",
" path_output=path_sub,\n",
" min_landmarks=1.,\n",
" details=True,\n",
" allow_inverse=True)\n",
" # rename the metrics by the participant\n",
" shutil.copy(os.path.join(path_sub, 'metrics.json'),\n",
" os.path.join(PATH_SUBMISSIONS, os.path.basename(path_sub) + '.json'))\n",
" tqdm_bar.update()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Load parsed measures from each submission/experiment/participant"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Users: dict_keys(['AGH', 'ANTs', 'CKVST', 'DROP', 'Elastix', 'MEVIS', 'NiftyReg', 'RVSS', 'TUB', 'TUNI', 'UA', 'UPENN', 'bUnwarpJ'])\n"
]
}
],
"source": [
"submission_paths = sorted(glob.glob(os.path.join(PATH_SUBMISSIONS, '*.json')))\n",
"submissions = {}\n",
"# loading all participants metrics\n",
"for path_sub in tqdm.tqdm(submission_paths, desc='loading'):\n",
" with open(path_sub, 'r') as fp:\n",
" metrics = json.load(fp)\n",
" # rename tissue types accoding new LUT\n",
" for case in metrics['cases']:\n",
" metrics['cases'][case][FIELD_TISSUE] = TISSUE_LUT[metrics['cases'][case][FIELD_TISSUE]]\n",
" m_agg = {stat: metrics['aggregates'][stat] for stat in metrics['aggregates']}\n",
" metrics['aggregates'] = m_agg\n",
" submissions[os.path.splitext(os.path.basename(path_sub))[0]] = metrics\n",
"\n",
"print ('Users: %r' % submissions.keys())"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fields: dict_keys(['aggregates', 'cases', 'computer', 'submission-time', 'required-landmarks'])\n",
"required-landmarks: [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]\n",
"found tissues: ['COAD', 'gastric', 'human-breast', 'human-kidney', 'lung-lesion', 'lung-lobes', 'mammary-gland', 'mouse-kidney']\n"
]
}
],
"source": [
"# split the particular fields inside the measured items\n",
"users = list(submissions.keys())\n",
"print ('Fields: %r' % submissions[users[0]].keys())\n",
"user_aggreg = {u: submissions[u]['aggregates'] for u in users}\n",
"user_computer = {u: submissions[u]['computer'] for u in users}\n",
"user_cases = {u: submissions[u]['cases'] for u in users}\n",
"print ('required-landmarks: %r' % [submissions[u]['required-landmarks'] for u in users])\n",
"tissues = set(user_cases[users[0]][cs][FIELD_TISSUE] for cs in user_cases[users[0]])\n",
"print ('found tissues: %r' % sorted(tissues))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Results overview\n",
"\n",
"Present simple statistic about ratios of train/test image pairs per dataset..."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" type-tissue | \n",
" COAD | \n",
" gastric | \n",
" human-breast | \n",
" human-kidney | \n",
" lung-lesion | \n",
" lung-lobes | \n",
" mammary-gland | \n",
" mouse-kidney | \n",
"
\n",
" \n",
" \n",
" \n",
" evaluation | \n",
" 153.0 | \n",
" 40.0 | \n",
" 20.0 | \n",
" 20.0 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" 18.0 | \n",
"
\n",
" \n",
" training | \n",
" 84.0 | \n",
" 13.0 | \n",
" 5.0 | \n",
" 5.0 | \n",
" 30.0 | \n",
" 40.0 | \n",
" 38.0 | \n",
" 15.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
"type-tissue COAD gastric human-breast human-kidney lung-lesion lung-lobes mammary-gland mouse-kidney\n",
"evaluation 153.0 40.0 20.0 20.0 NaN NaN NaN 18.0\n",
"training 84.0 13.0 5.0 5.0 30.0 40.0 38.0 15.0"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAARwAAAD5CAYAAAD1CoplAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi40LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcv7US4rQAAIABJREFUeJztnXmYXVWVvt+vEiQiCAEUaFEICCRASCAQ0GA7YCIiRuZJWsIkgzh0t7T4UwmTLW3obsEWFCSgCEKYI6IyCCKEKRUCSZAYZoEgM0YgkVDf7499bnJTqeEmnH2q6tZ6n6ee1Nln+Pa9N7Xu2nuvvZZsEwRBUAUtPd2BIAj6D2FwgiCojDA4QRBURhicIAgqIwxOEASVEQYnCILKGNjTHegrtLa2btjS0nJDW1vbUEA93Z8gaBC3tLQ81NbWNm7UqFFP9XRnwuA0SEtLyw3rr7/+Zuutt55aWsIxDPoGbW1tevbZZzd/+umnbxs/fvzQqVOn/qMn+xN/OQ3S1tY2dL311hsYxiboS7S0tLD++usPkDQEOHr8+PGr9Gh/elK8jxGeTdAnaWlpQRLAdsCQHu1LT4oHPcPGG2/MCy+8sFL3XnPNNTz44INLjk888URuuummsrrWp3jllVc4++yzV/i+3XbbjVdeeaXLazK9r4uBd5b90BUh5nBWkku0RanPO8hzS31eLq655hp23313ttxySwBOOeWUHu7RUnTMTqU+z+fc1eX5msE59thjl2lfvHgxAwd2/qd1/fXXd6ud6X3t8cWO8HD6GL/4xS8YPXo0I0eO5KijjuJHP/oRxx9//JLzF154IccddxwAe+yxB6NGjWKrrbbi3HPPXe5Zjz/+OFtvvfWS4zPOOIOTTjoJgPPOO48ddtiBESNGsPfee/P6668zbdo0pk6dyvHHH8/IkSN55JFHmDBhAldccQUAN998M9tuuy3Dhw/nsMMOY9GiRUDyqCZOnMh2223H8OHDeeihh3K9PZVywgkn8MgjjzBy5Eh22GEHPvKRjzB+/Pglxriz97/mYT7++OMMGzaMI488kq222opx48bxxhtvACzzvnb2/j3//POMHTuWrbbaiiOOOIKNNtpopT3XqgiD04f405/+xGWXXcYdd9zBzJkzGTBgAKuvvjpXX331kmsuu+wyDjjgAAAmT55Ma2sr06dP56yzzuLFF19sWGuvvfbi3nvv5f7772fYsGGcf/75fPjDH2b8+PFMmjSJmTNnsummmy65fuHChUyYMIHLLruMWbNmsXjxYs4555wl59ddd11mzJjBMcccwxlnnFHCu9HznH766Wy66abMnDmTSZMmMWPGDM4880z+/Oc/A429//PmzeNLX/oSc+bMYa211uLKK6/sUKuj9+/kk0/mE5/4BHPmzGGfffbhySefzPdiSyIMTh/i5ptvprW1lR122IGRI0dy880389hjj7HJJptw11138eKLL/LQQw8xZswYAM466yxGjBjBTjvtxF/+8hfmzZvXsNbs2bP5yEc+wvDhw7n44ouZM2dOl9fPnTuXIUOGsPnmmwNwyCGHcNttty05v9deewEwatQoHn/88RV85X2D0aNHM2TI0jnZRt7/IUOGMHLkSKDr96aj9+/2229f8uWy6667Mnjw4BJfTR5iDqcPYZtDDjmE733ve8u0T548mSlTpjB06FD23HNPJHHrrbdy0003ceedd7LaaqvxsY99jIULFy5z38CBA2lra1tyXH9+woQJXHPNNYwYMYILL7yQW2+99W31fdVVVwVgwIABLF68+G09q7fyrne9a8nvjbz/sPR9gfTe1IZUnV3X19+/8HD6ELvssgtXXHEFzz33HAAvvfQSTzzxBHvuuSfXXnstv/zlL5d847366qsMHjyY1VZbjYceeoi77lp+AnS99dbjueee48UXX2TRokVcd911S84tWLCADTbYgDfffJOLL754Sfsaa6zBggULlnvWFltsweOPP87DDz8MwEUXXcRHP/rRUl9/b6Oz9wIae//fLmPGjGHKlCkA3HDDDbz88sula5RNGJw+xJZbbslpp53GuHHj2GabbRg7dizz589n8ODBDBs2jCeeeILRo0cDycVevHgxw4YN44QTTmCnnZZfwVlllVU48cQTGT16NGPHjmXo0KFLzp166qnsuOOOjBkzZpn2Aw44gEmTJrHtttvyyCOPLGkfNGgQF1xwAfvuuy/Dhw+npaWFo48+OuO70fOss846jBkzhq233nqZiXto7P1/u0ycOJEbbriBrbfemssvv5z111+fNdZYo3SdMlGkGG2M1tZWjxo1qqe7EQRLWLRoEQMGDGDgwIHceeedHHPMMcycObPDa1tbWzn55JMnA2dNnTr1/mp7upSY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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# add stat of train/test for tissie\n",
"df_tissue_stat = pd.DataFrame([(cs['name-tissue'], cs[FIELD_TISSUE], cs[FIELD_STATUS])\n",
" for cs in user_cases[users[0]].values()],\n",
" columns=['name', FIELD_TISSUE, FIELD_STATUS])\n",
"df_tissue_stat.set_index('name', inplace=True)\n",
"\n",
"# compute cumulative stat\n",
"dfx = grouping_cumulative(df_tissue_stat, col_index=FIELD_TISSUE, col_column=FIELD_STATUS)\n",
"display(dfx.T)\n",
"\n",
"# show results\n",
"# ax = dfx.plot(kind='bar', stacked=True, figsize=(len(dfx) / 2, 3), grid=True, cmap='RdYlGn')\n",
"# _= plt.ylabel('# regist. pairs')\n",
"# ax.get_figure().savefig(os.path.join(PATH_TEMP, 'bars_tissue-status_abs.pdf'))\n",
"\n",
"# normalize over the sum of all cases\n",
"dfx = (dfx.T / dfx.T.sum().astype(float)).T\n",
"ax = dfx.plot(kind='bar', stacked=True, figsize=(len(dfx) / 2, 2), grid=True, cmap='RdYlGn')\n",
"_= plt.ylabel('% regist. pairs')\n",
"ax.legend(loc='upper center', bbox_to_anchor=(0.5, 1.25), ncol=2, fancybox=True, shadow=True)\n",
"ax.get_figure().savefig(os.path.join(PATH_TEMP, 'bars_tissue-status_rltv.pdf'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Define colors and markers later used in charts"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" 0 | \n",
" 1 | \n",
"
\n",
" \n",
" \n",
" \n",
" AGH | \n",
" (0.0, 0.0, 0.0, 1.0) | \n",
" . | \n",
"
\n",
" \n",
" ANTs | \n",
" (0.5111, 0.0, 0.577766666667, 1.0) | \n",
" * | \n",
"
\n",
" \n",
" CKVST | \n",
" (0.0, 0.0, 0.733366666667, 1.0) | \n",
" ^ | \n",
"
\n",
" \n",
" DROP | \n",
" (0.0, 0.4667, 0.8667, 1.0) | \n",
" v | \n",
"
\n",
" \n",
" Elastix | \n",
" (0.0, 0.644466666667, 0.733366666667, 1.0) | \n",
" < | \n",
"
\n",
" \n",
" MEVIS | \n",
" (0.0, 0.644466666667, 0.355533333333, 1.0) | \n",
" > | \n",
"
\n",
" \n",
" NiftyReg | \n",
" (0.0, 0.7333, 0.0, 1.0) | \n",
" p | \n",
"
\n",
" \n",
" RVSS | \n",
" (0.0, 0.955566666667, 0.0, 1.0) | \n",
" P | \n",
"
\n",
" \n",
" TUB | \n",
" (0.799966666667, 0.977766666667, 0.0, 1.0) | \n",
" h | \n",
"
\n",
" \n",
" TUNI | \n",
" (1.0, 0.8, 0.0, 1.0) | \n",
" H | \n",
"
\n",
" \n",
" UA | \n",
" (1.0, 0.2, 0.0, 1.0) | \n",
" X | \n",
"
\n",
" \n",
" UPENN | \n",
" (0.844466666667, 0.0, 0.0, 1.0) | \n",
" d | \n",
"
\n",
" \n",
" bUnwarpJ | \n",
" (0.8, 0.8, 0.8, 1.0) | \n",
" D | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 0 1\n",
"AGH (0.0, 0.0, 0.0, 1.0) .\n",
"ANTs (0.5111, 0.0, 0.577766666667, 1.0) *\n",
"CKVST (0.0, 0.0, 0.733366666667, 1.0) ^\n",
"DROP (0.0, 0.4667, 0.8667, 1.0) v\n",
"Elastix (0.0, 0.644466666667, 0.733366666667, 1.0) <\n",
"MEVIS (0.0, 0.644466666667, 0.355533333333, 1.0) >\n",
"NiftyReg (0.0, 0.7333, 0.0, 1.0) p\n",
"RVSS (0.0, 0.955566666667, 0.0, 1.0) P\n",
"TUB (0.799966666667, 0.977766666667, 0.0, 1.0) h\n",
"TUNI (1.0, 0.8, 0.0, 1.0) H\n",
"UA (1.0, 0.2, 0.0, 1.0) X\n",
"UPENN (0.844466666667, 0.0, 0.0, 1.0) d\n",
"bUnwarpJ (0.8, 0.8, 0.8, 1.0) D"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"METHODS = sorted(submissions.keys())\n",
"METHOD_CMAP = plt.get_cmap('nipy_spectral', len(submissions))\n",
"METHOD_COLORS = {m: METHOD_CMAP(i) for i, m in enumerate(METHODS)}\n",
"\n",
"def list_methods_colors(methods):\n",
" return [METHOD_COLORS[m] for m in methods]\n",
"\n",
"def cmap_methods(method):\n",
" return METHOD_COLORS[m]\n",
"\n",
"# define cyclic buffer of markers for methods\n",
"# https://matplotlib.org/3.1.1/api/markers_api.html\n",
"METHOD_MARKERS = dict(zip(submissions.keys(), list('.*^v<>pPhHXdD')))\n",
"# METHOD_MARKERS = dict(zip(submissions.keys(), list('.1234+xosD^v<>')))\n",
"\n",
"def list_methods_markers(methods):\n",
" return [METHOD_MARKERS[m] for m in methods]\n",
"\n",
"display(pd.DataFrame([METHOD_COLORS, METHOD_MARKERS]).T)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Compute ranked measures"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Extend the aggregated statistic by Rank measures such as compute ranking over all cases for each selected field and average it"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"for field, field_agg in [('rTRE-Median', 'Median-rTRE'),\n",
" ('rTRE-Max', 'Max-rTRE')]:\n",
" # Compute ranking per user in selected metric `field` over all dataset\n",
" user_cases = compute_ranking(user_cases, field)\n",
" for user in users:\n",
" # iterate over Robust or all cases\n",
" for robust in [True, False]:\n",
" # chose inly robyst if it is required\n",
" vals = [user_cases[user][cs][field + '_rank'] for cs in user_cases[user]\n",
" if (robust and user_cases[user][cs]['Robustness']) or (not robust)]\n",
" s_robust = '-Robust' if robust else ''\n",
" user_aggreg[user]['Average-Rank-' + field_agg + s_robust] = np.mean(vals)\n",
" user_aggreg[user]['STD-Rank-' + field_agg + s_robust] = np.std(vals)\n",
" # iterate over all tissue kinds\n",
" for tissue in tissues:\n",
" vals = [user_cases[user][cs][field + '_rank'] for cs in user_cases[user]\n",
" if user_cases[user][cs][FIELD_TISSUE] == tissue]\n",
" user_aggreg[user]['Average-Rank-' + field_agg + '_tissue_' + tissue] = np.mean(vals)\n",
" user_aggreg[user]['STD-Rank-' + field_agg + '_tissue_' + tissue] = np.std(vals)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Presenting visual results\n",
"\n",
"Show the raw table with **global** statistic (joint training and testing/evaluation)."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Average-Average-rTRE | \n",
" Average-Max-rTRE | \n",
" Average-Median-rTRE | \n",
" Average-Norm-Time | \n",
" Average-Rank-Max-rTRE | \n",
" Average-Rank-Median-rTRE | \n",
" Average-Robustness | \n",
" Average-used-landmarks | \n",
" Median-Average-rTRE | \n",
" Median-Max-rTRE | \n",
" Median-Median-rTRE | \n",
" Median-Norm-Time | \n",
" Median-Robustness | \n",
"
\n",
" \n",
" \n",
" \n",
" UPENN | \n",
" 0.004057 | \n",
" 0.023043 | \n",
" 0.002790 | \n",
" 1.451193 | \n",
" 4.234927 | \n",
" 3.403326 | \n",
" 0.988797 | \n",
" 1.0 | \n",
" 0.003009 | \n",
" 0.017465 | \n",
" 0.001918 | \n",
" 1.374846 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" AGH | \n",
" 0.005636 | \n",
" 0.030005 | \n",
" 0.003804 | \n",
" 6.863679 | \n",
" 6.226611 | \n",
" 3.567568 | \n",
" 0.977013 | \n",
" 1.0 | \n",
" 0.003395 | \n",
" 0.023059 | \n",
" 0.001973 | \n",
" 5.791019 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" MEVIS | \n",
" 0.005191 | \n",
" 0.026069 | \n",
" 0.003852 | \n",
" 0.145392 | \n",
" 4.825364 | \n",
" 2.979210 | \n",
" 0.984455 | \n",
" 1.0 | \n",
" 0.002889 | \n",
" 0.018566 | \n",
" 0.001815 | \n",
" 0.141754 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" TUB | \n",
" 0.004731 | \n",
" 0.014927 | \n",
" 0.004099 | \n",
" 0.000705 | \n",
" 2.465696 | \n",
" 2.844075 | \n",
" 0.991911 | \n",
" 1.0 | \n",
" 0.001203 | \n",
" 0.004634 | \n",
" 0.001021 | \n",
" 0.000510 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" CKVST | \n",
" 0.006044 | \n",
" 0.026128 | \n",
" 0.004609 | \n",
" 7.127142 | \n",
" 5.825364 | \n",
" 6.280665 | \n",
" 0.973015 | \n",
" 1.0 | \n",
" 0.004652 | \n",
" 0.020775 | \n",
" 0.003314 | \n",
" 7.488842 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" TUNI | \n",
" 0.010363 | \n",
" 0.038723 | \n",
" 0.008724 | \n",
" 10.320549 | \n",
" 6.370062 | \n",
" 5.993763 | \n",
" 0.889920 | \n",
" 1.0 | \n",
" 0.003719 | \n",
" 0.023399 | \n",
" 0.002501 | \n",
" 8.977965 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" RVSS | \n",
" 0.047089 | \n",
" 0.103180 | \n",
" 0.045024 | \n",
" 4.723187 | \n",
" 8.523909 | \n",
" 9.640333 | \n",
" 0.795752 | \n",
" 1.0 | \n",
" 0.007098 | \n",
" 0.029411 | \n",
" 0.005490 | \n",
" 4.881740 | \n",
" 0.987500 | \n",
"
\n",
" \n",
" UA | \n",
" 0.056887 | \n",
" 0.119045 | \n",
" 0.054878 | \n",
" 1.470925 | \n",
" 8.912682 | \n",
" 10.137214 | \n",
" 0.807619 | \n",
" 1.0 | \n",
" 0.010979 | \n",
" 0.035972 | \n",
" 0.009043 | \n",
" 1.367489 | \n",
" 0.973684 | \n",
"
\n",
" \n",
" DROP | \n",
" 0.061602 | \n",
" 0.122958 | \n",
" 0.061336 | \n",
" 3.406355 | \n",
" 7.288981 | \n",
" 6.869023 | \n",
" 0.886052 | \n",
" 1.0 | \n",
" 0.004340 | \n",
" 0.026460 | \n",
" 0.002796 | \n",
" 3.388050 | \n",
" 0.990654 | \n",
"
\n",
" \n",
" Elastix | \n",
" 0.069476 | \n",
" 0.137054 | \n",
" 0.068433 | \n",
" 2.962337 | \n",
" 8.798337 | \n",
" 9.831601 | \n",
" 0.766790 | \n",
" 1.0 | \n",
" 0.007977 | \n",
" 0.038993 | \n",
" 0.005409 | \n",
" 2.682059 | \n",
" 0.970588 | \n",
"
\n",
" \n",
" ANTs | \n",
" 0.069322 | \n",
" 0.134296 | \n",
" 0.068621 | \n",
" 43.092353 | \n",
" 7.839917 | \n",
" 9.037422 | \n",
" 0.813717 | \n",
" 1.0 | \n",
" 0.008654 | \n",
" 0.035855 | \n",
" 0.006747 | \n",
" 41.008271 | \n",
" 0.971831 | \n",
"
\n",
" \n",
" bUnwarpJ | \n",
" 0.079704 | \n",
" 0.149613 | \n",
" 0.079557 | \n",
" 9.151172 | \n",
" 9.571726 | \n",
" 9.648649 | \n",
" 0.793992 | \n",
" 1.0 | \n",
" 0.025579 | \n",
" 0.065169 | \n",
" 0.024590 | \n",
" 7.469397 | \n",
" 0.931034 | \n",
"
\n",
" \n",
" NiftyReg | \n",
" 0.082488 | \n",
" 0.151446 | \n",
" 0.082781 | \n",
" 0.151164 | \n",
" 10.116424 | \n",
" 10.767152 | \n",
" 0.749487 | \n",
" 1.0 | \n",
" 0.034631 | \n",
" 0.067933 | \n",
" 0.032717 | \n",
" 0.052888 | \n",
" 0.851852 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Average-Average-rTRE Average-Max-rTRE Average-Median-rTRE Average-Norm-Time Average-Rank-Max-rTRE Average-Rank-Median-rTRE Average-Robustness Average-used-landmarks Median-Average-rTRE Median-Max-rTRE Median-Median-rTRE Median-Norm-Time Median-Robustness\n",
"UPENN 0.004057 0.023043 0.002790 1.451193 4.234927 3.403326 0.988797 1.0 0.003009 0.017465 0.001918 1.374846 1.000000\n",
"AGH 0.005636 0.030005 0.003804 6.863679 6.226611 3.567568 0.977013 1.0 0.003395 0.023059 0.001973 5.791019 1.000000\n",
"MEVIS 0.005191 0.026069 0.003852 0.145392 4.825364 2.979210 0.984455 1.0 0.002889 0.018566 0.001815 0.141754 1.000000\n",
"TUB 0.004731 0.014927 0.004099 0.000705 2.465696 2.844075 0.991911 1.0 0.001203 0.004634 0.001021 0.000510 1.000000\n",
"CKVST 0.006044 0.026128 0.004609 7.127142 5.825364 6.280665 0.973015 1.0 0.004652 0.020775 0.003314 7.488842 1.000000\n",
"TUNI 0.010363 0.038723 0.008724 10.320549 6.370062 5.993763 0.889920 1.0 0.003719 0.023399 0.002501 8.977965 1.000000\n",
"RVSS 0.047089 0.103180 0.045024 4.723187 8.523909 9.640333 0.795752 1.0 0.007098 0.029411 0.005490 4.881740 0.987500\n",
"UA 0.056887 0.119045 0.054878 1.470925 8.912682 10.137214 0.807619 1.0 0.010979 0.035972 0.009043 1.367489 0.973684\n",
"DROP 0.061602 0.122958 0.061336 3.406355 7.288981 6.869023 0.886052 1.0 0.004340 0.026460 0.002796 3.388050 0.990654\n",
"Elastix 0.069476 0.137054 0.068433 2.962337 8.798337 9.831601 0.766790 1.0 0.007977 0.038993 0.005409 2.682059 0.970588\n",
"ANTs 0.069322 0.134296 0.068621 43.092353 7.839917 9.037422 0.813717 1.0 0.008654 0.035855 0.006747 41.008271 0.971831\n",
"bUnwarpJ 0.079704 0.149613 0.079557 9.151172 9.571726 9.648649 0.793992 1.0 0.025579 0.065169 0.024590 7.469397 0.931034\n",
"NiftyReg 0.082488 0.151446 0.082781 0.151164 10.116424 10.767152 0.749487 1.0 0.034631 0.067933 0.032717 0.052888 0.851852"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"cols_all = [col for col in pd.DataFrame(user_aggreg).T.columns \n",
" if not any(n in col for n in [VAL_STATUS_TRAIN, VAL_STATUS_TEST, '_tissue_'])]\n",
"cols_general = list(filter(lambda c: not c.endswith('-Robust'), cols_all))\n",
"dfx = pd.DataFrame(user_aggreg).T.sort_values('Average-Median-rTRE')[cols_general]\n",
"display(dfx)\n",
"# Exporting results to CSV\n",
"dfx.sort_values('Average-Median-rTRE').to_csv(os.path.join(PATH_TEMP, 'results_overall.csv'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Only **robust** metrics (computed over images pairs with robustness higher then a threshold)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Average-Average-rTRE | \n",
" Average-Max-rTRE | \n",
" Average-Median-rTRE | \n",
" Average-Norm-Time | \n",
" Average-Rank-Max-rTRE | \n",
" Average-Rank-Median-rTRE | \n",
" Median-Average-rTRE | \n",
" Median-Max-rTRE | \n",
" Median-Median-rTRE | \n",
" Median-Norm-Time | \n",
"
\n",
" \n",
" \n",
" \n",
" UPENN | \n",
" 0.004057 | \n",
" 0.023043 | \n",
" 0.002790 | \n",
" 1.451193 | \n",
" 4.234927 | \n",
" 3.403326 | \n",
" 0.003009 | \n",
" 0.017465 | \n",
" 0.001918 | \n",
" 1.374846 | \n",
"
\n",
" \n",
" AGH | \n",
" 0.005610 | \n",
" 0.029932 | \n",
" 0.003777 | \n",
" 6.860032 | \n",
" 6.226611 | \n",
" 3.567568 | \n",
" 0.003381 | \n",
" 0.023048 | \n",
" 0.001968 | \n",
" 5.787261 | \n",
"
\n",
" \n",
" MEVIS | \n",
" 0.004320 | \n",
" 0.024423 | \n",
" 0.002923 | \n",
" 0.145501 | \n",
" 4.825364 | \n",
" 2.979210 | \n",
" 0.002888 | \n",
" 0.018537 | \n",
" 0.001811 | \n",
" 0.141826 | \n",
"
\n",
" \n",
" TUB | \n",
" 0.003539 | \n",
" 0.013330 | \n",
" 0.002890 | \n",
" 0.000706 | \n",
" 2.445833 | \n",
" 2.822917 | \n",
" 0.001169 | \n",
" 0.004472 | \n",
" 0.001016 | \n",
" 0.000510 | \n",
"
\n",
" \n",
" CKVST | \n",
" 0.005891 | \n",
" 0.025866 | \n",
" 0.004451 | \n",
" 7.146332 | \n",
" 5.825364 | \n",
" 6.280665 | \n",
" 0.004634 | \n",
" 0.020768 | \n",
" 0.003313 | \n",
" 7.503305 | \n",
"
\n",
" \n",
" TUNI | \n",
" 0.007183 | \n",
" 0.033379 | \n",
" 0.005647 | \n",
" 9.131541 | \n",
" 5.810069 | \n",
" 5.395881 | \n",
" 0.003350 | \n",
" 0.020732 | \n",
" 0.002225 | \n",
" 8.767961 | \n",
"
\n",
" \n",
" RVSS | \n",
" 0.012546 | \n",
" 0.042371 | \n",
" 0.010725 | \n",
" 5.072646 | \n",
" 8.033254 | \n",
" 9.289786 | \n",
" 0.005474 | \n",
" 0.024088 | \n",
" 0.004165 | \n",
" 5.169940 | \n",
"
\n",
" \n",
" UA | \n",
" 0.016040 | \n",
" 0.045178 | \n",
" 0.014523 | \n",
" 1.464565 | \n",
" 8.721133 | \n",
" 10.002179 | \n",
" 0.008984 | \n",
" 0.031842 | \n",
" 0.007342 | \n",
" 1.372182 | \n",
"
\n",
" \n",
" DROP | \n",
" 0.032903 | \n",
" 0.076700 | \n",
" 0.032100 | \n",
" 3.465610 | \n",
" 7.172340 | \n",
" 6.748936 | \n",
" 0.003880 | \n",
" 0.023597 | \n",
" 0.002558 | \n",
" 3.415281 | \n",
"
\n",
" \n",
" Elastix | \n",
" 0.042368 | \n",
" 0.098012 | \n",
" 0.040490 | \n",
" 3.239014 | \n",
" 8.704741 | \n",
" 9.778017 | \n",
" 0.005424 | \n",
" 0.028498 | \n",
" 0.004064 | \n",
" 2.919051 | \n",
"
\n",
" \n",
" ANTs | \n",
" 0.046432 | \n",
" 0.098135 | \n",
" 0.045789 | \n",
" 40.351943 | \n",
" 7.583519 | \n",
" 8.868597 | \n",
" 0.006468 | \n",
" 0.029296 | \n",
" 0.005023 | \n",
" 39.914611 | \n",
"
\n",
" \n",
" bUnwarpJ | \n",
" 0.056684 | \n",
" 0.115475 | \n",
" 0.055782 | \n",
" 9.269456 | \n",
" 9.560669 | \n",
" 9.640167 | \n",
" 0.017620 | \n",
" 0.050233 | \n",
" 0.016497 | \n",
" 7.501626 | \n",
"
\n",
" \n",
" NiftyReg | \n",
" 0.065827 | \n",
" 0.126228 | \n",
" 0.065719 | \n",
" 0.158154 | \n",
" 10.076433 | \n",
" 10.736730 | \n",
" 0.027914 | \n",
" 0.058758 | \n",
" 0.027238 | \n",
" 0.051688 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Average-Average-rTRE Average-Max-rTRE Average-Median-rTRE Average-Norm-Time Average-Rank-Max-rTRE Average-Rank-Median-rTRE Median-Average-rTRE Median-Max-rTRE Median-Median-rTRE Median-Norm-Time\n",
"UPENN 0.004057 0.023043 0.002790 1.451193 4.234927 3.403326 0.003009 0.017465 0.001918 1.374846\n",
"AGH 0.005610 0.029932 0.003777 6.860032 6.226611 3.567568 0.003381 0.023048 0.001968 5.787261\n",
"MEVIS 0.004320 0.024423 0.002923 0.145501 4.825364 2.979210 0.002888 0.018537 0.001811 0.141826\n",
"TUB 0.003539 0.013330 0.002890 0.000706 2.445833 2.822917 0.001169 0.004472 0.001016 0.000510\n",
"CKVST 0.005891 0.025866 0.004451 7.146332 5.825364 6.280665 0.004634 0.020768 0.003313 7.503305\n",
"TUNI 0.007183 0.033379 0.005647 9.131541 5.810069 5.395881 0.003350 0.020732 0.002225 8.767961\n",
"RVSS 0.012546 0.042371 0.010725 5.072646 8.033254 9.289786 0.005474 0.024088 0.004165 5.169940\n",
"UA 0.016040 0.045178 0.014523 1.464565 8.721133 10.002179 0.008984 0.031842 0.007342 1.372182\n",
"DROP 0.032903 0.076700 0.032100 3.465610 7.172340 6.748936 0.003880 0.023597 0.002558 3.415281\n",
"Elastix 0.042368 0.098012 0.040490 3.239014 8.704741 9.778017 0.005424 0.028498 0.004064 2.919051\n",
"ANTs 0.046432 0.098135 0.045789 40.351943 7.583519 8.868597 0.006468 0.029296 0.005023 39.914611\n",
"bUnwarpJ 0.056684 0.115475 0.055782 9.269456 9.560669 9.640167 0.017620 0.050233 0.016497 7.501626\n",
"NiftyReg 0.065827 0.126228 0.065719 0.158154 10.076433 10.736730 0.027914 0.058758 0.027238 0.051688"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"cols_robust = list(filter(lambda c: c.endswith('-Robust'), cols_all))\n",
"dfx = pd.DataFrame(user_aggreg).T.sort_values('Average-Median-rTRE')[cols_robust]\n",
"dfx.columns = list(map(lambda c: c.replace('-Robust', ''), dfx.columns))\n",
"display(dfx)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Define coloer and markers per method which shall be used later..."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Odered methods by \"Average-Rank-Median-rTRE\": ['TUB', 'MEVIS', 'UPENN', 'AGH', 'TUNI', 'CKVST', 'DROP', 'ANTs', 'RVSS', 'bUnwarpJ', 'Elastix', 'UA', 'NiftyReg']\n"
]
}
],
"source": [
"col_ranking = 'Average-Rank-Median-rTRE'\n",
"dfx = pd.DataFrame(user_aggreg).T.sort_values(col_ranking)\n",
"# display(dfx[[col_ranking]])\n",
"users_ranked = dfx.index\n",
"print('Odered methods by \"%s\": %s' % (col_ranking, list(users_ranked)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Show general results in a chart..."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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K69Qv359Tj31VC6++GIWLlwY2j4nJ4dhw4axZ88eioqKqFevHgC1a9embdu20Q3IB0f6LgI0aNCAH/3oR/z1r3+t9L6mT59Ohw4dyMjIKNVqnGiKioq45ppraN++PYMHD2b//v3H3P6+++5j5MiRZGdn07Jly1Cr4pQpU0KP77jjDnr18i4ALF26lGuuuQaAm2++maysLNLS0kIXkMBribrrrrvo3Lkz//znP8nOzubnP/85mZmZdOzYkXfffTcSoce0OXPm8POf/5yzzz6bt99+2+/iiMgxKBmShBFs5SksLGT16tWcf/75pdY/++yzpbrJfffdd6Snp1OtWjU++OAD4PDJaFljx45l1KhR9OzZk0mTJrF9+/aoxBQN//73v+nbty/nnHMO9erVIzc3lzVr1tC5c+djvq7s55nsXeQ++ugjunTpcsR1H3/8MbfeeiuvvPIKjRs3Di0fNmxY6KR/+/bt/O9//6NXr16cccYZDBgwgGbNmjFs2DCeeeYZiouLoxKHn470XQy66667mDp1KocOHarUvh5++GHy8vJYvXp1uRbhRLJhwwZuueUW1q1bx6mnnsrMmTMrfM369et5+eWXeffdd7n//vs5ePAg3bt354033gBg1apV7N27l4MHD/LGG2+EWoMnTZrEqlWrWL16Na+//nqpFvJ69erx/vvvM3ToUMC7eWVeXh4zZ85k5MiREYg8dhUWFrJ48WL69+/PsGHDmDNnjt9FEpFjUDIkCSMjI4P8/HzmzJlzxDE9Q4YMIS8vL/SvTp06wOET0qKiIubPn89PfvKTcq/t06cPW7Zs4aabbmL9+vV06tSJL7/8MuIxRcOcOXNCJzBDhw494g/3wIED6dixI1dddVVoWdnPMysrK2pljjcNGjTg7LPPZu7cuaWWX3HFFaxYsYJvv/2WuXPnMmjQoFAXo7/85S8sWbKE8847j6lTpybFCeWxvostW7bk/PPP5x//+Eel9pWWlsa1117LM888Q82aNSNS3lhw1llnceGFFwJw7bXX8uabbx6xS1bJZVdccQW1a9emfv36NGzYkJ07d9KlSxdyc3P59ttvqV27Nt26dWPVqlW88cYbdO/eHfBaNzt37kynTp1Ys2YNa9euDe1zyJAhpd4veFGpR48efPvtt3zzzTdhj91PR+v2ZmYsWrSInj17UqdOHQYNGsT8+fMrncSLSPRpzJAklAEDBjBu3DiWLVvGV199VanXDB06lEsvvZSLL76YjIwMGjU68hilM844g+HDhzN8+HD69evH8uXLGTRoUDiLH3Vff/01S5cu5cMPP8TMOHToEGbGxIkTQ5MlADz//POsWrWKcePG+Vja2JaWlnbUgfsnn3wyL774It27d6dhw4ahbkd16tShb9++PP/88+Tk5PD73/++1OvS09NJT0/nuuuuo0WLFjz11FORDsM3R/sujh17eKzRL3/5SwYPHszFF19c4f5efvllXn/9dRYsWMADDzzA6tWroz6WJRrKnpSbGfXq1WP37t3Ur18f8D7b4GPwul0GVa9enaKiImrWrBn6jl1wwQVkZGTw2muvsWnTJtq3b8/WrVuZOnUq7733HqeffjojRoygsLAwtJ+6detWWK5EEvyMS/r6669p0aIFc+bM4c0336R58+YAfPXVVyxdupTevXv7UFIRqYhahiShjBw5kokTJ5Kenl7p17Rq1Yr69eszYcKEo44zWrp0aagv/p49e9i8eTNnn312WMrsp3nz5nHdddfx8ccfk5+fz6effkqLFi1o3bo1K1asYMGCBaFtKxqLkOx69erFgQMHmDVrVmjZ6tWr+fTTTwFvEoD//Oc//PKXv+Tll18ObTNs2DB+//vfs3PnTrp16wZ4Y2eWLVsW2iYvL6/cOLZEc7TvYvDzA2jXrh0dOnQoNc7qSA4dOsS2bdvo1asXDz/8MLt27UrY7+8nn3wSGpPyj3/8g4suuojs7Gz+9re/Ad5n8fe//52ePXtWuK/u3bszdepUevToQffu3Xnsscfo1KkTZsa3335L3bp1SU1NZefOnbz00kvH3FdwLOabb75JamoqqampVYw0tqSkpPCDH/yApUu9yVq+/vpr/vOf/5CZmckbb7zBJ598Qn5+Pvn5+cyYMUNd5URimJIhSShNmzbltttuO+K6smNc3nrrrdC6YcOGsX79+lLdwErKzc0lKyuLjIwMunXrxk9/+lN++MMfRiSGaJozZw4DBw4stWzQoEHk5OSwaNEiHnvsMVq2bEm3bt343e9+x7333utTSWOfmfH888+zePFiWrVqRVpaGnfffXepMUItWrRgwYIFjBw5MjSovHfv3mzfvp0hQ4aErp4753j44Ydp27YtmZmZTJw4MaFbheDo38XJkyeXWnbPPfewbdu2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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"dfx = pd.DataFrame(user_aggreg)[users_ranked].T[list(filter(lambda c: not c.startswith('STD-'), cols_general))]\n",
"ax = dfx.T.plot.bar(figsize=(len(cols_general) * 0.9, 6), grid=True, logy=True, rot=75, cmap=plt.cm.tab20)\n",
"ax.legend(loc='upper center', bbox_to_anchor=(0.5, 1.25),\n",
" ncol=int(len(users) / 1.8), fancybox=True, shadow=True)\n",
"ax.get_figure().tight_layout()\n",
"ax.get_figure().savefig(os.path.join(PATH_TEMP, 'bars_teams-scores.pdf'))\n",
"# plt.savefig(os.path.join(PATH_TEMP, 'fig_teams-scores.pdf'), constrained_layout=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Compare statistic \"train\" vs \"test\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Compute statistics on training and testing case also foor newly add rank measures."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"for field, field_agg in [# ('rTRE-Median', 'Median-rTRE'),\n",
" ('rTRE-Median_rank', 'Rank-Median-rTRE'),\n",
" # ('rTRE-Max', 'Max-rTRE'),\n",
" ('rTRE-Max_rank', 'Rank-Max-rTRE'),\n",
" # ('Norm-Time_minutes', 'Norm-Time'),\n",
" ]:\n",
" for user in users:\n",
" for state in [VAL_STATUS_TRAIN, VAL_STATUS_TEST]:\n",
" # filter values per user, metric and state\n",
" vals = [user_cases[user][cs][field] for cs in user_cases[user]\n",
" if user_cases[user][cs]['Status'] == state]\n",
" user_aggreg[user]['Average-' + field_agg + '_' + state] = np.nanmean(vals)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"With given methods order them by particular criterion... Test ARMrTRE"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Odered methods by \"Average-Rank-Median-rTRE_evaluation\": \n",
"['MEVIS', 'AGH', 'UPENN', 'CKVST', 'TUB', 'TUNI', 'DROP', 'ANTs', 'RVSS', 'bUnwarpJ', 'Elastix', 'UA', 'NiftyReg']\n"
]
}
],
"source": [
"col_ranking = 'Average-Rank-Median-rTRE_' + VAL_STATUS_TEST\n",
"dfx = pd.DataFrame(user_aggreg).T.sort_values(col_ranking)\n",
"# display(dfx[[col_ranking]])\n",
"users_ranked = dfx.index\n",
"print('Odered methods by \"%s\": \\n%s' % (col_ranking, list(users_ranked)))"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['Average-Average-rTRE_evaluation', 'Average-Average-rTRE_training', 'Average-Max-rTRE_evaluation', 'Average-Max-rTRE_training', 'Average-Median-rTRE_evaluation', 'Average-Median-rTRE_training', 'Average-Rank-Max-rTRE_evaluation', 'Average-Rank-Max-rTRE_training', 'Average-Rank-Median-rTRE_evaluation', 'Average-Rank-Median-rTRE_training', 'Average-Robustness_evaluation', 'Average-Robustness_training', 'Median-Average-rTRE_evaluation', 'Median-Average-rTRE_training', 'Median-Max-rTRE_evaluation', 'Median-Max-rTRE_training', 'Median-Median-rTRE_evaluation', 'Median-Median-rTRE_training', 'Median-Robustness_evaluation', 'Median-Robustness_training']\n"
]
}
],
"source": [
"df = pd.DataFrame(user_aggreg).T\n",
"cols_train_test = [col for col in df.columns \n",
" if any(st in col for st in [VAL_STATUS_TRAIN, VAL_STATUS_TEST]) and '_tissue_' not in col]\n",
"print (cols_train_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Show separatly raw table with statistic for train and test cases separatly."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" | \n",
" Average-Average-rTRE | \n",
" Average-Max-rTRE | \n",
" Average-Median-rTRE | \n",
" Average-Rank-Max-rTRE | \n",
" Average-Rank-Median-rTRE | \n",
" Average-Robustness | \n",
" Median-Average-rTRE | \n",
" Median-Max-rTRE | \n",
" Median-Median-rTRE | \n",
" Median-Robustness | \n",
"
\n",
" \n",
" method | \n",
" state | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" AGH | \n",
" evaluation | \n",
" 0.005283 | \n",
" 0.028339 | \n",
" 0.003587 | \n",
" 6.000000 | \n",
" 3.422311 | \n",
" 0.982096 | \n",
" 0.003220 | \n",
" 0.022489 | \n",
" 0.001913 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" training | \n",
" 0.006021 | \n",
" 0.031823 | \n",
" 0.004042 | \n",
" 6.473913 | \n",
" 3.726087 | \n",
" 0.971467 | \n",
" 0.003656 | \n",
" 0.023500 | \n",
" 0.002023 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" ANTs | \n",
" evaluation | \n",
" 0.099126 | \n",
" 0.186060 | \n",
" 0.099164 | \n",
" 7.788845 | \n",
" 9.231076 | \n",
" 0.788870 | \n",
" 0.007222 | \n",
" 0.035078 | \n",
" 0.005799 | \n",
" 0.971429 | \n",
"
\n",
" \n",
" training | \n",
" 0.036797 | \n",
" 0.077806 | \n",
" 0.035289 | \n",
" 7.895652 | \n",
" 8.826087 | \n",
" 0.840831 | \n",
" 0.009663 | \n",
" 0.037072 | \n",
" 0.007837 | \n",
" 0.974192 | \n",
"
\n",
" \n",
" CKVST | \n",
" evaluation | \n",
" 0.004294 | \n",
" 0.023934 | \n",
" 0.002693 | \n",
" 5.274900 | \n",
" 4.406375 | \n",
" 0.988340 | \n",
" 0.003234 | \n",
" 0.018857 | \n",
" 0.002258 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" training | \n",
" 0.007955 | \n",
" 0.028522 | \n",
" 0.006701 | \n",
" 6.426087 | \n",
" 8.326087 | \n",
" 0.956290 | \n",
" 0.006027 | \n",
" 0.022732 | \n",
" 0.005048 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" DROP | \n",
" evaluation | \n",
" 0.086123 | \n",
" 0.164415 | \n",
" 0.086654 | \n",
" 7.430279 | \n",
" 7.055777 | \n",
" 0.882477 | \n",
" 0.004216 | \n",
" 0.027342 | \n",
" 0.002780 | \n",
" 0.989247 | \n",
"
\n",
" \n",
" training | \n",
" 0.034842 | \n",
" 0.077716 | \n",
" 0.033706 | \n",
" 7.134783 | \n",
" 6.665217 | \n",
" 0.889953 | \n",
" 0.004641 | \n",
" 0.025512 | \n",
" 0.002800 | \n",
" 0.996403 | \n",
"
\n",
" \n",
" Elastix | \n",
" evaluation | \n",
" 0.096407 | \n",
" 0.185674 | \n",
" 0.095648 | \n",
" 8.876494 | \n",
" 10.043825 | \n",
" 0.847687 | \n",
" 0.007354 | \n",
" 0.035312 | \n",
" 0.005397 | \n",
" 0.972222 | \n",
"
\n",
" \n",
" training | \n",
" 0.040086 | \n",
" 0.083994 | \n",
" 0.038734 | \n",
" 8.713043 | \n",
" 9.600000 | \n",
" 0.678507 | \n",
" 0.008457 | \n",
" 0.041956 | \n",
" 0.005506 | \n",
" 0.959184 | \n",
"
\n",
" \n",
" MEVIS | \n",
" evaluation | \n",
" 0.004361 | \n",
" 0.025107 | \n",
" 0.002870 | \n",
" 5.035857 | \n",
" 2.840637 | \n",
" 0.988025 | \n",
" 0.002740 | \n",
" 0.018827 | \n",
" 0.001790 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" training | \n",
" 0.006096 | \n",
" 0.027120 | \n",
" 0.004924 | \n",
" 4.595652 | \n",
" 3.130435 | \n",
" 0.980559 | \n",
" 0.002964 | \n",
" 0.018286 | \n",
" 0.001857 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" NiftyReg | \n",
" evaluation | \n",
" 0.111982 | \n",
" 0.201039 | \n",
" 0.113601 | \n",
" 10.083665 | \n",
" 11.075697 | \n",
" 0.742689 | \n",
" 0.037248 | \n",
" 0.071369 | \n",
" 0.035508 | \n",
" 0.851852 | \n",
"
\n",
" \n",
" training | \n",
" 0.050301 | \n",
" 0.097324 | \n",
" 0.049148 | \n",
" 10.152174 | \n",
" 10.430435 | \n",
" 0.756907 | \n",
" 0.033469 | \n",
" 0.067267 | \n",
" 0.031194 | \n",
" 0.850657 | \n",
"
\n",
" \n",
" RVSS | \n",
" evaluation | \n",
" 0.047214 | \n",
" 0.104800 | \n",
" 0.044767 | \n",
" 8.418327 | \n",
" 9.649402 | \n",
" 0.815460 | \n",
" 0.006302 | \n",
" 0.027516 | \n",
" 0.004587 | \n",
" 0.992806 | \n",
"
\n",
" \n",
" training | \n",
" 0.046953 | \n",
" 0.101412 | \n",
" 0.045304 | \n",
" 8.639130 | \n",
" 9.630435 | \n",
" 0.774246 | \n",
" 0.008092 | \n",
" 0.031966 | \n",
" 0.006542 | \n",
" 0.985612 | \n",
"
\n",
" \n",
" TUB | \n",
" evaluation | \n",
" 0.008945 | \n",
" 0.028027 | \n",
" 0.007753 | \n",
" 3.808765 | \n",
" 4.533865 | \n",
" 0.984536 | \n",
" 0.002887 | \n",
" 0.017783 | \n",
" 0.002070 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" training | \n",
" 0.000132 | \n",
" 0.000630 | \n",
" 0.000111 | \n",
" 1.000000 | \n",
" 1.000000 | \n",
" 0.999959 | \n",
" 0.000124 | \n",
" 0.000450 | \n",
" 0.000106 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" TUNI | \n",
" evaluation | \n",
" 0.006395 | \n",
" 0.028668 | \n",
" 0.004779 | \n",
" 5.796813 | \n",
" 5.322709 | \n",
" 0.982278 | \n",
" 0.003128 | \n",
" 0.020421 | \n",
" 0.002059 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" training | \n",
" 0.014693 | \n",
" 0.049695 | \n",
" 0.013028 | \n",
" 6.995652 | \n",
" 6.726087 | \n",
" 0.789128 | \n",
" 0.005126 | \n",
" 0.027064 | \n",
" 0.003106 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" UA | \n",
" evaluation | \n",
" 0.053601 | \n",
" 0.112441 | \n",
" 0.050650 | \n",
" 8.828685 | \n",
" 10.278884 | \n",
" 0.820945 | \n",
" 0.010020 | \n",
" 0.035309 | \n",
" 0.008247 | \n",
" 0.985294 | \n",
"
\n",
" \n",
" training | \n",
" 0.060474 | \n",
" 0.126252 | \n",
" 0.059492 | \n",
" 9.004348 | \n",
" 9.982609 | \n",
" 0.793076 | \n",
" 0.011664 | \n",
" 0.037880 | \n",
" 0.009985 | \n",
" 0.956695 | \n",
"
\n",
" \n",
" UPENN | \n",
" evaluation | \n",
" 0.004198 | \n",
" 0.023865 | \n",
" 0.002858 | \n",
" 4.290837 | \n",
" 3.466135 | \n",
" 0.989808 | \n",
" 0.002897 | \n",
" 0.019016 | \n",
" 0.001899 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" training | \n",
" 0.003902 | \n",
" 0.022146 | \n",
" 0.002717 | \n",
" 4.173913 | \n",
" 3.334783 | \n",
" 0.987693 | \n",
" 0.003058 | \n",
" 0.016792 | \n",
" 0.001948 | \n",
" 1.000000 | \n",
"
\n",
" \n",
" bUnwarpJ | \n",
" evaluation | \n",
" 0.109715 | \n",
" 0.199536 | \n",
" 0.110519 | \n",
" 9.366534 | \n",
" 9.673307 | \n",
" 0.789940 | \n",
" 0.028998 | \n",
" 0.072711 | \n",
" 0.025988 | \n",
" 0.931034 | \n",
"
\n",
" \n",
" training | \n",
" 0.046954 | \n",
" 0.095131 | \n",
" 0.045769 | \n",
" 9.795652 | \n",
" 9.621739 | \n",
" 0.798414 | \n",
" 0.024586 | \n",
" 0.060100 | \n",
" 0.023791 | \n",
" 0.928930 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Average-Average-rTRE Average-Max-rTRE Average-Median-rTRE Average-Rank-Max-rTRE Average-Rank-Median-rTRE Average-Robustness Median-Average-rTRE Median-Max-rTRE Median-Median-rTRE Median-Robustness\n",
"method state \n",
"AGH evaluation 0.005283 0.028339 0.003587 6.000000 3.422311 0.982096 0.003220 0.022489 0.001913 1.000000\n",
" training 0.006021 0.031823 0.004042 6.473913 3.726087 0.971467 0.003656 0.023500 0.002023 1.000000\n",
"ANTs evaluation 0.099126 0.186060 0.099164 7.788845 9.231076 0.788870 0.007222 0.035078 0.005799 0.971429\n",
" training 0.036797 0.077806 0.035289 7.895652 8.826087 0.840831 0.009663 0.037072 0.007837 0.974192\n",
"CKVST evaluation 0.004294 0.023934 0.002693 5.274900 4.406375 0.988340 0.003234 0.018857 0.002258 1.000000\n",
" training 0.007955 0.028522 0.006701 6.426087 8.326087 0.956290 0.006027 0.022732 0.005048 1.000000\n",
"DROP evaluation 0.086123 0.164415 0.086654 7.430279 7.055777 0.882477 0.004216 0.027342 0.002780 0.989247\n",
" training 0.034842 0.077716 0.033706 7.134783 6.665217 0.889953 0.004641 0.025512 0.002800 0.996403\n",
"Elastix evaluation 0.096407 0.185674 0.095648 8.876494 10.043825 0.847687 0.007354 0.035312 0.005397 0.972222\n",
" training 0.040086 0.083994 0.038734 8.713043 9.600000 0.678507 0.008457 0.041956 0.005506 0.959184\n",
"MEVIS evaluation 0.004361 0.025107 0.002870 5.035857 2.840637 0.988025 0.002740 0.018827 0.001790 1.000000\n",
" training 0.006096 0.027120 0.004924 4.595652 3.130435 0.980559 0.002964 0.018286 0.001857 1.000000\n",
"NiftyReg evaluation 0.111982 0.201039 0.113601 10.083665 11.075697 0.742689 0.037248 0.071369 0.035508 0.851852\n",
" training 0.050301 0.097324 0.049148 10.152174 10.430435 0.756907 0.033469 0.067267 0.031194 0.850657\n",
"RVSS evaluation 0.047214 0.104800 0.044767 8.418327 9.649402 0.815460 0.006302 0.027516 0.004587 0.992806\n",
" training 0.046953 0.101412 0.045304 8.639130 9.630435 0.774246 0.008092 0.031966 0.006542 0.985612\n",
"TUB evaluation 0.008945 0.028027 0.007753 3.808765 4.533865 0.984536 0.002887 0.017783 0.002070 1.000000\n",
" training 0.000132 0.000630 0.000111 1.000000 1.000000 0.999959 0.000124 0.000450 0.000106 1.000000\n",
"TUNI evaluation 0.006395 0.028668 0.004779 5.796813 5.322709 0.982278 0.003128 0.020421 0.002059 1.000000\n",
" training 0.014693 0.049695 0.013028 6.995652 6.726087 0.789128 0.005126 0.027064 0.003106 1.000000\n",
"UA evaluation 0.053601 0.112441 0.050650 8.828685 10.278884 0.820945 0.010020 0.035309 0.008247 0.985294\n",
" training 0.060474 0.126252 0.059492 9.004348 9.982609 0.793076 0.011664 0.037880 0.009985 0.956695\n",
"UPENN evaluation 0.004198 0.023865 0.002858 4.290837 3.466135 0.989808 0.002897 0.019016 0.001899 1.000000\n",
" training 0.003902 0.022146 0.002717 4.173913 3.334783 0.987693 0.003058 0.016792 0.001948 1.000000\n",
"bUnwarpJ evaluation 0.109715 0.199536 0.110519 9.366534 9.673307 0.789940 0.028998 0.072711 0.025988 0.931034\n",
" training 0.046954 0.095131 0.045769 9.795652 9.621739 0.798414 0.024586 0.060100 0.023791 0.928930"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from IPython.display import display\n",
"\n",
"df_train_eval = pd.DataFrame()\n",
"\n",
"for state in [VAL_STATUS_TRAIN, VAL_STATUS_TEST]:\n",
" cols = [col for col in cols_train_test if state in col]\n",
" df = pd.DataFrame(user_aggreg).T[cols]\n",
" df.columns = list(map(lambda c: c.replace('_' + state, ''), df.columns))\n",
" df['state'] = state\n",
" df_train_eval = pd.concat([df_train_eval, df])\n",
"\n",
"# df = pd.DataFrame(user_aggreg).T[cols]\n",
"# cols = [c for c in df_all_train_eval.columns if 'state' not in c and c in df.columns]\n",
"# df = df[cols]\n",
"# df['state'] = 'all'\n",
"# df_all_train_eval = pd.concat([df_all_train_eval, df])\n",
"\n",
"df_train_eval['method'] = df_train_eval.index\n",
"df_train_eval = df_train_eval.set_index(['method', 'state']).sort_index()\n",
"df_train_eval.to_csv(os.path.join(PATH_TEMP, 'results-methods_tran-test.csv'))\n",
"display(df_train_eval)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"