{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Mikan-tutorial\n",
"\n",
"欢迎使用 mikan 🍊! \n",
"\n",
"mikan 是一个医学图像分割指标计算工具。此文档介绍了 mikan 的使用方法,简单对比了其与 medpy 的性能和结果。\n",
"\n",
"mikan 的主要特点:\n",
"- rust 驱动,高度并行化,非常快,比现有工具 (medpy 等) 快 10 ~ 100x\n",
"- 几乎支持全部的分割指标的计算,和 medpy 结果完全一致\n",
"- 精心设计的简单、灵活、符合直觉的接口,你一分钟就可以精通 mikan 并喜欢上它!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 太长不看\n",
"\n",
"立刻运行 mikan 获得全部分割标签的全部指标:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[{'accuracy': 0.99887297469187, 'adjust_rand_score': 0.9864214165654426, 'amcc': 0.9864367567296637, 'assd': 0.4627411239979557, 'auc': 0.9907127577891529, 'balanced_accuracy': 0.9907127577891529, 'dice': 0.9870104666571462, 'f_score': 0.9870104666571462, 'fn': 136914.0, 'fnr': 0.018227270960283256, 'fp': 57192.0, 'fpr': 0.00034721346141101695, 'hausdorff_distance': 23.23409712643984, 'hausdorff_distance_95': 1.161103780937166, 'jaccard_score': 0.9743540620800129, 'kappa': 0.9864214165654426, 'label': 1.0, 'masd': 0.4570258359112762, 'mcc': 0.9864367567296637, 'nmcc': 0.9932183783648318, 'precision': 0.9923043904749475, 'senstivity': 0.9817727290397168, 'specificity': 0.999652786538589, 'tn': 164659924.0, 'tp': 7374578.0, 'volume_similarity': 0.9946650202613058}, {'accuracy': 0.9994664649440818, 'adjust_rand_score': 0.9635612411025513, 'amcc': 0.963574881429292, 'assd': 0.6030765488980315, 'auc': 0.9843198140671667, 'balanced_accuracy': 0.9843198140671667, 'dice': 0.9638299832080431, 'f_score': 0.9638299832080431, 'fn': 39236.0, 'fnr': 0.031052390818825177, 'fp': 52654.0, 'fpr': 0.0003079810468414641, 'hausdorff_distance': 41.9914108016965, 'hausdorff_distance_95': 1.5640728820017198, 'jaccard_score': 0.9301851699898799, 'kappa': 0.9635612411025514, 'label': 2.0, 'masd': 0.5948439308029991, 'mcc': 0.963574881429292, 'nmcc': 0.9817874407146461, 'precision': 0.9587661320636511, 'senstivity': 0.9689476091811748, 'specificity': 0.9996920189531585, 'tn': 170912412.0, 'tp': 1224306.0, 'volume_similarity': 0.9947183666850095}, {'accuracy': 0.9989030974459249, 'adjust_rand_score': 0.9783230290414697, 'amcc': 0.9783234576595446, 'assd': 0.5355268541078531, 'auc': 0.9887278191513104, 'balanced_accuracy': 0.9887278191513105, 'dice': 0.9788861062581474, 'f_score': 0.9788861062581474, 'fn': 98538.0, 'fnr': 0.022005586146784748, 'fp': 90380.0, 'fpr': 0.0005387755505944251, 'hausdorff_distance': 30.292223674415226, 'hausdorff_distance_95': 1.5, 'jaccard_score': 0.9586453697844007, 'kappa': 0.9783230290414697, 'label': 3.0, 'masd': 0.5363377412762627, 'mcc': 0.9783234576595446, 'nmcc': 0.9891617288297723, 'precision': 0.979779426158997, 'senstivity': 0.9779944138532153, 'specificity': 0.9994612244494055, 'tn': 167660365.0, 'tp': 4379325.0, 'volume_similarity': 0.9990882438669368}, {'accuracy': 0.998878386104125, 'adjust_rand_score': 0.9841329240151302, 'amcc': 0.9841361524052074, 'assd': 0.5081565786837277, 'auc': 0.9909015555714827, 'balanced_accuracy': 0.9909015555714826, 'dice': 0.9847150871159485, 'f_score': 0.9847150871159485, 'fn': 112179.0, 'fnr': 0.017708655138941883, 'fp': 80995.0, 'fpr': 0.00048823371809268777, 'hausdorff_distance': 110.12802692242559, 'hausdorff_distance_95': 1.161103780937166, 'jaccard_score': 0.9698903968923704, 'kappa': 0.9841329240151302, 'label': 4.0, 'masd': 0.5001558675593856, 'mcc': 0.9841361524052074, 'nmcc': 0.9920680762026037, 'precision': 0.9871508198203701, 'senstivity': 0.9822913448610581, 'specificity': 0.9995117662819073, 'tn': 165812914.0, 'tp': 6222520.0, 'volume_similarity': 0.9975325627497683}, {'accuracy': 0.9989219444890364, 'adjust_rand_score': 0.9794127045736161, 'amcc': 0.9794150931247586, 'assd': 0.5361406267949071, 'auc': 0.9886852910988095, 'balanced_accuracy': 0.9886852910988094, 'dice': 0.9799666340747192, 'f_score': 0.9799666340747192, 'fn': 102795.0, 'fnr': 0.022134879462397727, 'fp': 82877.0, 'fpr': 0.0004945383399833087, 'hausdorff_distance': 92.80790962184942, 'hausdorff_distance_95': 1.4819999933242798, 'jaccard_score': 0.9607201752520941, 'kappa': 0.9794127045736161, 'label': 5.0, 'masd': 0.5312467623638308, 'mcc': 0.9794150931247586, 'nmcc': 0.9897075465623792, 'precision': 0.9820771997205949, 'senstivity': 0.9778651205376022, 'specificity': 0.9995054616600166, 'tn': 167501703.0, 'tp': 4541233.0, 'volume_similarity': 0.9978509167645109}]\n"
]
}
],
"source": [
"from mikan import all\n",
"\n",
"all_metrics = all(rf\"..\\data\\patients_26_ground_truth.nii.gz\", rf\"..\\data\\patients_26_segmentation.nii.gz\")\n",
"print(all_metrics)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 使用"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import mikan\n",
"import SimpleITK as sitk\n",
"import time\n",
"from rich import print"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"mikan 目前只支持 uint8 的数据,通常这是足够的"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"gt = sitk.ReadImage(rf\"..\\data\\patients_26_ground_truth.nii.gz\", sitk.sitkUInt8)\n",
"pred = sitk.ReadImage(rf\"..\\data\\patients_26_segmentation.nii.gz\", sitk.sitkUInt8)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"使用只需要两步:\n",
"\n",
"1. 初始化一个评估器:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"e = mikan.Evaluator(gt, pred)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"2. 获得指标:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.9870104666571462"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"e.labels(1).metrics(\"dice\") # label 1 的 Dice"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[0.9870104666571462, 0.9638299832080431, 0.9788861062581474]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"e.labels([1,2,3]).metrics(\"Dice\") # 多个 label 的 Dice"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[0.9870104666571462, 7374578.0]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"e.labels(1).metrics([\"Dice\", \"TP\"]) # label 1 的多个 metrics"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'1': {'Dice': 0.9870104666571462, 'TP': 7374578.0},\n",
" '2': {'Dice': 0.9638299832080431, 'TP': 1224306.0}}"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"e.labels([1, 2]).metrics([\"Dice\", \"TP\"]) # 多个 label 的多个 metrics"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'1': {'Dice': 0.9870104666571462, 'TP': 7374578.0},\n",
" '2': {'Dice': 0.9638299832080431, 'TP': 1224306.0},\n",
" '3': {'Dice': 0.9788861062581474, 'TP': 4379325.0},\n",
" '4': {'Dice': 0.9847150871159485, 'TP': 6222520.0},\n",
" '5': {'Dice': 0.9799666340747192, 'TP': 4541233.0}}"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"e.labels(\"all\").metrics([\"Dice\", \"TP\"]) # 全部 label 的多个 metrics"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'1': {'mcc': 0.9864367567296637,\n",
" 'assd': 0.4627411239979557,\n",
" 'accuracy': 0.99887297469187,\n",
" 'tn': 164659924.0,\n",
" 'senstivity': 0.9817727290397168,\n",
" 'volume_similarity': 0.9946650202613058,\n",
" 'fnr': 0.018227270960283256,\n",
" 'fn': 136914.0,\n",
" 'adjust_rand_score': 0.9864214165654426,\n",
" 'fpr': 0.00034721346141101695,\n",
" 'dice': 0.9870104666571462,\n",
" 'hausdorff_distance': 23.23409712643984,\n",
" 'auc': 0.9907127577891529,\n",
" 'hausdorff_distance_95': 1.161103780937166,\n",
" 'nmcc': 0.9932183783648318,\n",
" 'tp': 7374578.0,\n",
" 'specificity': 0.999652786538589,\n",
" 'masd': 0.4570258359112762,\n",
" 'f_score': 0.9870104666571462,\n",
" 'precision': 0.9923043904749475,\n",
" 'fp': 57192.0,\n",
" 'jaccard_score': 0.9743540620800129,\n",
" 'balanced_accuracy': 0.9907127577891529,\n",
" 'amcc': 0.9864367567296637,\n",
" 'kappa': 0.9864214165654426},\n",
" '2': {'mcc': 0.963574881429292,\n",
" 'assd': 0.6030765488980315,\n",
" 'accuracy': 0.9994664649440818,\n",
" 'tn': 170912412.0,\n",
" 'senstivity': 0.9689476091811748,\n",
" 'volume_similarity': 0.9947183666850095,\n",
" 'fnr': 0.031052390818825177,\n",
" 'fn': 39236.0,\n",
" 'adjust_rand_score': 0.9635612411025513,\n",
" 'fpr': 0.0003079810468414641,\n",
" 'dice': 0.9638299832080431,\n",
" 'hausdorff_distance': 41.9914108016965,\n",
" 'auc': 0.9843198140671667,\n",
" 'hausdorff_distance_95': 1.5640728820017198,\n",
" 'nmcc': 0.9817874407146461,\n",
" 'tp': 1224306.0,\n",
" 'specificity': 0.9996920189531585,\n",
" 'masd': 0.5948439308029991,\n",
" 'f_score': 0.9638299832080431,\n",
" 'precision': 0.9587661320636511,\n",
" 'fp': 52654.0,\n",
" 'jaccard_score': 0.9301851699898799,\n",
" 'balanced_accuracy': 0.9843198140671667,\n",
" 'amcc': 0.963574881429292,\n",
" 'kappa': 0.9635612411025514},\n",
" '3': {'mcc': 0.9783234576595446,\n",
" 'assd': 0.5355268541078531,\n",
" 'accuracy': 0.9989030974459249,\n",
" 'tn': 167660365.0,\n",
" 'senstivity': 0.9779944138532153,\n",
" 'volume_similarity': 0.9990882438669368,\n",
" 'fnr': 0.022005586146784748,\n",
" 'fn': 98538.0,\n",
" 'adjust_rand_score': 0.9783230290414697,\n",
" 'fpr': 0.0005387755505944251,\n",
" 'dice': 0.9788861062581474,\n",
" 'hausdorff_distance': 30.292223674415226,\n",
" 'auc': 0.9887278191513104,\n",
" 'hausdorff_distance_95': 1.5,\n",
" 'nmcc': 0.9891617288297723,\n",
" 'tp': 4379325.0,\n",
" 'specificity': 0.9994612244494055,\n",
" 'masd': 0.5363377412762627,\n",
" 'f_score': 0.9788861062581474,\n",
" 'precision': 0.979779426158997,\n",
" 'fp': 90380.0,\n",
" 'jaccard_score': 0.9586453697844007,\n",
" 'balanced_accuracy': 0.9887278191513105,\n",
" 'amcc': 0.9783234576595446,\n",
" 'kappa': 0.9783230290414697},\n",
" '4': {'mcc': 0.9841361524052074,\n",
" 'assd': 0.5081565786837277,\n",
" 'accuracy': 0.998878386104125,\n",
" 'tn': 165812914.0,\n",
" 'senstivity': 0.9822913448610581,\n",
" 'volume_similarity': 0.9975325627497683,\n",
" 'fnr': 0.017708655138941883,\n",
" 'fn': 112179.0,\n",
" 'adjust_rand_score': 0.9841329240151302,\n",
" 'fpr': 0.00048823371809268777,\n",
" 'dice': 0.9847150871159485,\n",
" 'hausdorff_distance': 110.12802692242559,\n",
" 'auc': 0.9909015555714827,\n",
" 'hausdorff_distance_95': 1.161103780937166,\n",
" 'nmcc': 0.9920680762026037,\n",
" 'tp': 6222520.0,\n",
" 'specificity': 0.9995117662819073,\n",
" 'masd': 0.5001558675593856,\n",
" 'f_score': 0.9847150871159485,\n",
" 'precision': 0.9871508198203701,\n",
" 'fp': 80995.0,\n",
" 'jaccard_score': 0.9698903968923704,\n",
" 'balanced_accuracy': 0.9909015555714826,\n",
" 'amcc': 0.9841361524052074,\n",
" 'kappa': 0.9841329240151302},\n",
" '5': {'mcc': 0.9794150931247586,\n",
" 'assd': 0.5361406267949071,\n",
" 'accuracy': 0.9989219444890364,\n",
" 'tn': 167501703.0,\n",
" 'senstivity': 0.9778651205376022,\n",
" 'volume_similarity': 0.9978509167645109,\n",
" 'fnr': 0.022134879462397727,\n",
" 'fn': 102795.0,\n",
" 'adjust_rand_score': 0.9794127045736161,\n",
" 'fpr': 0.0004945383399833087,\n",
" 'dice': 0.9799666340747192,\n",
" 'hausdorff_distance': 92.80790962184942,\n",
" 'auc': 0.9886852910988095,\n",
" 'hausdorff_distance_95': 1.4819999933242798,\n",
" 'nmcc': 0.9897075465623792,\n",
" 'tp': 4541233.0,\n",
" 'specificity': 0.9995054616600166,\n",
" 'masd': 0.5312467623638308,\n",
" 'f_score': 0.9799666340747192,\n",
" 'precision': 0.9820771997205949,\n",
" 'fp': 82877.0,\n",
" 'jaccard_score': 0.9607201752520941,\n",
" 'balanced_accuracy': 0.9886852910988094,\n",
" 'amcc': 0.9794150931247586,\n",
" 'kappa': 0.9794127045736161}}"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"e.labels(\"all\").metrics(\"all\") # 全部 label 的全部 metrics"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 高效\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"尽管计算 Dice 很简单,mikan 也进行了高度优化,使得计算 Dice 特别快,比如:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">mikan DSC: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">8.</span>03x faster\n",
"</pre>\n"
],
"text/plain": [
"mikan DSC: \u001b[1;36m8.\u001b[0m03x faster\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">mikan DSC: <span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.9870104666571462</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.9638299832080431</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.9788861062581474</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.9847150871159485</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.9799666340747192</span><span style=\"font-weight: bold\">]</span>\n",
"</pre>\n"
],
"text/plain": [
"mikan DSC: \u001b[1m[\u001b[0m\u001b[1;36m0.9870104666571462\u001b[0m, \u001b[1;36m0.9638299832080431\u001b[0m, \u001b[1;36m0.9788861062581474\u001b[0m, \u001b[1;36m0.9847150871159485\u001b[0m, \u001b[1;36m0.9799666340747192\u001b[0m\u001b[1m]\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">medpy DSC: <span style=\"font-weight: bold\">[</span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.9870104666571462</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.9638299832080431</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.9788861062581474</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.9847150871159485</span>, <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.9799666340747192</span><span style=\"font-weight: bold\">]</span>\n",
"</pre>\n"
],
"text/plain": [
"medpy DSC: \u001b[1m[\u001b[0m\u001b[1;36m0.9870104666571462\u001b[0m, \u001b[1;36m0.9638299832080431\u001b[0m, \u001b[1;36m0.9788861062581474\u001b[0m, \u001b[1;36m0.9847150871159485\u001b[0m, \u001b[1;36m0.9799666340747192\u001b[0m\u001b[1m]\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from medpy.metric import dc\n",
"\n",
"e = mikan.Evaluator(gt, pred)\n",
"\n",
"# mikan: DSC\n",
"t = time.time()\n",
"mikan_dscs = e.labels([1,2,3,4,5]).metrics(\"dsc\")\n",
"mikan_costs = time.time() - t\n",
"\n",
"# medpy: DSC\n",
"t = time.time()\n",
"\n",
"pred_arr = sitk.GetArrayFromImage(pred)\n",
"gt_arr = sitk.GetArrayFromImage(gt)\n",
"\n",
"dscs = []\n",
"for i in (1,2,3,4,5):\n",
" dscs.append(dc(pred_arr == i, gt_arr == i))\n",
"medpy_costs = time.time() - t\n",
"\n",
"print(f\"mikan DSC: {medpy_costs / mikan_costs :.2f}x faster\")\n",
"print(f\"mikan DSC: {mikan_dscs}\")\n",
"print(f\"medpy DSC: {dscs}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"mikan 有超快的 Hausdorff 距离计算:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">Mikan cost <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">4.35</span> s, HD = <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">23.2341</span> mm\n",
"</pre>\n"
],
"text/plain": [
"Mikan cost \u001b[1;36m4.35\u001b[0m s, HD = \u001b[1;36m23.2341\u001b[0m mm\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"t = time.time()\n",
"mikan_hd = e.labels(1).metrics(\"hd\")\n",
"print(f\"Mikan cost {time.time() - t:.2f} s, HD = {mikan_hd:.4f} mm\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"对比 medpy:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">medpy cost <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">130.6421</span> s, HD = <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">23.2341</span> mm\n",
"</pre>\n"
],
"text/plain": [
"medpy cost \u001b[1;36m130.6421\u001b[0m s, HD = \u001b[1;36m23.2341\u001b[0m mm\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from medpy.metric import hd\n",
"t = time.time()\n",
"medpy_hd = hd(pred_arr == 1, gt_arr == 1, voxelspacing=gt.GetSpacing()[::-1]) # z, y, x\n",
"print(f\"medpy cost {time.time() - t:.4f} s, HD = {medpy_hd:.4f} mm\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 超级缓存"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"在计算 HD 时,ASSD、HD95 等指标也被 mikan 计算过了。不需要再计算!"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">Mikan cost <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.0000</span> s, ASSD = <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.4627</span> mm\n",
"</pre>\n"
],
"text/plain": [
"Mikan cost \u001b[1;36m0.0000\u001b[0m s, ASSD = \u001b[1;36m0.4627\u001b[0m mm\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"t = time.time()\n",
"mikan_hd = e.labels(1).metrics(\"assd\")\n",
"print(f\"Mikan cost {time.time() - t:.4f} s, ASSD = {mikan_hd:.4f} mm\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"而 medpy 计算 assd 要从头再来,非常慢:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">medpy cost <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">127.19</span> s, ASSD = <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.4627</span> mm\n",
"</pre>\n"
],
"text/plain": [
"medpy cost \u001b[1;36m127.19\u001b[0m s, ASSD = \u001b[1;36m0.4627\u001b[0m mm\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from medpy.metric import assd\n",
"t = time.time()\n",
"medpy_hd = assd(pred_arr == 1, gt_arr == 1, voxelspacing=gt.GetSpacing()[::-1]) # z, y, x\n",
"print(f\"medpy cost {time.time() - t:.2f} s, ASSD = {medpy_hd:.4f} mm\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"再举一个刚刚计算过的 Dice 的例子:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">mikan DSC: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">18841872215.</span>27x faster\n",
"</pre>\n"
],
"text/plain": [
"mikan DSC: \u001b[1;36m18841872215.\u001b[0m27x faster\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from medpy.metric import dc\n",
"\n",
"# mikan: DSC\n",
"t = time.time()\n",
"mikan_dscs = e.labels([1,2,3,4,5]).metrics(\"dsc\")\n",
"mikan_costs = time.time() - t + 1e-10 # sometimes zero\n",
"\n",
"# medpy: DSC\n",
"t = time.time()\n",
"dscs = []\n",
"for i in (1,2,3,4,5):\n",
" dscs.append(dc(pred_arr == i, gt_arr == i))\n",
"medpy_costs = time.time() - t\n",
"\n",
"print(f\"mikan DSC: {medpy_costs / mikan_costs :.2f}x faster\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"mikan 不会重复计算已经计算过的数据。这就是 mikan 的超级缓存!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 别名\n",
"\n",
"mikan 也支持别名。你可以把 \"Dice\" 称为 \"dsc\": "
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.9870104666571462"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"e.labels(1).metrics(\"dsc\") # dsc 也是 Dice!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"我们维护了一个别名字典,你可以任意使用左边的名字,他们都会被视为右边进行计算。"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">{</span>\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'accuracy'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'accuracy'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'acc'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'accuracy'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'Acc'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'accuracy'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'ACC'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'accuracy'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'Accuracy'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'accuracy'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'RI'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'accuracy'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'RandIndex'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'accuracy'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'adjust_rand_score'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'adjust_rand_score'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'auc'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'auc'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'AUC'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'auc'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'AUC_trapezoid'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'auc'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'balanced_accuracy'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'balanced_accuracy'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'bacc'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'balanced_accuracy'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'BACC'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'balanced_accuracy'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'BalancedAccuracy'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'balanced_accuracy'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'dice'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'dice'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'Dice'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'dice'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'dsc'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'dice'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'DSC'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'dice'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'f_score'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'f_score'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'jaccard_score'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'jaccard_score'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'iou'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'jaccard_score'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'IoU'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'jaccard_score'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'jaccard'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'jaccard_score'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'Jaccard'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'jaccard_score'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'IntersectionOverUnion'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'jaccard_score'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'kappa'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'kappa'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'KAP'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'kappa'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'Kappa'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'kappa'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'CohensKappa'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'kappa'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'mcc'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'mcc'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'MCC'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'mcc'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'MatthewsCorrelationCoefficient'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'mcc'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'nmcc'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'nmcc'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'NMCC'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'nmcc'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'nMCC'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'nmcc'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'MCC_normalized'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'nmcc'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'amcc'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'amcc'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'AMCC'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'amcc'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'aMCC'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'amcc'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'MCC_absolute'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'amcc'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'precision'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'precision'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'prec'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'precision'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'PREC'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'precision'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'Precision'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'precision'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'senstivity'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'senstivity'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'sens'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'senstivity'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'SENS'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'senstivity'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'Sensitivity'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'senstivity'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'Recall'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'senstivity'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'recall'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'senstivity'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'TPR'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'senstivity'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'tpr'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'senstivity'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'true_positive_rate'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'senstivity'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'specificity'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'specificity'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'Specificity'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'specificity'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'spec'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'specificity'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'Spec'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'specificity'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'SPEC'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'specificity'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'TNR'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'specificity'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'tnr'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'specificity'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'true_negative_rate'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'specificity'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'tn'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'tn'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'TN'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'tn'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'TrueNegative'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'tn'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'tp'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'tp'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'TP'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'tp'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'TruePositive'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'tp'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'fn'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'fn'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'FN'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'fn'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'FalseNegative'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'fn'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'fp'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'fp'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'FP'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'fp'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'FalsePositive'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'fp'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'fnr'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'fnr'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'FNR'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'fnr'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'fpr'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'fpr'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'FPR'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'fpr'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'volume_similarity'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'volume_similarity'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'VolumetricSimilarity'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'volume_similarity'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'vs'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'volume_similarity'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'VS'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'volume_similarity'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'hausdorff_distance_95'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'hausdorff_distance_95'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'HD95'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'hausdorff_distance_95'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'hd95'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'hausdorff_distance_95'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'hausdorff_distance'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'hausdorff_distance'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'hd'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'hausdorff_distance'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'HD'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'hausdorff_distance'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'assd'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'assd'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'ASSD'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'assd'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'masd'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'masd'</span>,\n",
" <span style=\"color: #008000; text-decoration-color: #008000\">'MASD'</span>: <span style=\"color: #008000; text-decoration-color: #008000\">'masd'</span>\n",
"<span style=\"font-weight: bold\">}</span>\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1m{\u001b[0m\n",
" \u001b[32m'accuracy'\u001b[0m: \u001b[32m'accuracy'\u001b[0m,\n",
" \u001b[32m'acc'\u001b[0m: \u001b[32m'accuracy'\u001b[0m,\n",
" \u001b[32m'Acc'\u001b[0m: \u001b[32m'accuracy'\u001b[0m,\n",
" \u001b[32m'ACC'\u001b[0m: \u001b[32m'accuracy'\u001b[0m,\n",
" \u001b[32m'Accuracy'\u001b[0m: \u001b[32m'accuracy'\u001b[0m,\n",
" \u001b[32m'RI'\u001b[0m: \u001b[32m'accuracy'\u001b[0m,\n",
" \u001b[32m'RandIndex'\u001b[0m: \u001b[32m'accuracy'\u001b[0m,\n",
" \u001b[32m'adjust_rand_score'\u001b[0m: \u001b[32m'adjust_rand_score'\u001b[0m,\n",
" \u001b[32m'auc'\u001b[0m: \u001b[32m'auc'\u001b[0m,\n",
" \u001b[32m'AUC'\u001b[0m: \u001b[32m'auc'\u001b[0m,\n",
" \u001b[32m'AUC_trapezoid'\u001b[0m: \u001b[32m'auc'\u001b[0m,\n",
" \u001b[32m'balanced_accuracy'\u001b[0m: \u001b[32m'balanced_accuracy'\u001b[0m,\n",
" \u001b[32m'bacc'\u001b[0m: \u001b[32m'balanced_accuracy'\u001b[0m,\n",
" \u001b[32m'BACC'\u001b[0m: \u001b[32m'balanced_accuracy'\u001b[0m,\n",
" \u001b[32m'BalancedAccuracy'\u001b[0m: \u001b[32m'balanced_accuracy'\u001b[0m,\n",
" \u001b[32m'dice'\u001b[0m: \u001b[32m'dice'\u001b[0m,\n",
" \u001b[32m'Dice'\u001b[0m: \u001b[32m'dice'\u001b[0m,\n",
" \u001b[32m'dsc'\u001b[0m: \u001b[32m'dice'\u001b[0m,\n",
" \u001b[32m'DSC'\u001b[0m: \u001b[32m'dice'\u001b[0m,\n",
" \u001b[32m'f_score'\u001b[0m: \u001b[32m'f_score'\u001b[0m,\n",
" \u001b[32m'jaccard_score'\u001b[0m: \u001b[32m'jaccard_score'\u001b[0m,\n",
" \u001b[32m'iou'\u001b[0m: \u001b[32m'jaccard_score'\u001b[0m,\n",
" \u001b[32m'IoU'\u001b[0m: \u001b[32m'jaccard_score'\u001b[0m,\n",
" \u001b[32m'jaccard'\u001b[0m: \u001b[32m'jaccard_score'\u001b[0m,\n",
" \u001b[32m'Jaccard'\u001b[0m: \u001b[32m'jaccard_score'\u001b[0m,\n",
" \u001b[32m'IntersectionOverUnion'\u001b[0m: \u001b[32m'jaccard_score'\u001b[0m,\n",
" \u001b[32m'kappa'\u001b[0m: \u001b[32m'kappa'\u001b[0m,\n",
" \u001b[32m'KAP'\u001b[0m: \u001b[32m'kappa'\u001b[0m,\n",
" \u001b[32m'Kappa'\u001b[0m: \u001b[32m'kappa'\u001b[0m,\n",
" \u001b[32m'CohensKappa'\u001b[0m: \u001b[32m'kappa'\u001b[0m,\n",
" \u001b[32m'mcc'\u001b[0m: \u001b[32m'mcc'\u001b[0m,\n",
" \u001b[32m'MCC'\u001b[0m: \u001b[32m'mcc'\u001b[0m,\n",
" \u001b[32m'MatthewsCorrelationCoefficient'\u001b[0m: \u001b[32m'mcc'\u001b[0m,\n",
" \u001b[32m'nmcc'\u001b[0m: \u001b[32m'nmcc'\u001b[0m,\n",
" \u001b[32m'NMCC'\u001b[0m: \u001b[32m'nmcc'\u001b[0m,\n",
" \u001b[32m'nMCC'\u001b[0m: \u001b[32m'nmcc'\u001b[0m,\n",
" \u001b[32m'MCC_normalized'\u001b[0m: \u001b[32m'nmcc'\u001b[0m,\n",
" \u001b[32m'amcc'\u001b[0m: \u001b[32m'amcc'\u001b[0m,\n",
" \u001b[32m'AMCC'\u001b[0m: \u001b[32m'amcc'\u001b[0m,\n",
" \u001b[32m'aMCC'\u001b[0m: \u001b[32m'amcc'\u001b[0m,\n",
" \u001b[32m'MCC_absolute'\u001b[0m: \u001b[32m'amcc'\u001b[0m,\n",
" \u001b[32m'precision'\u001b[0m: \u001b[32m'precision'\u001b[0m,\n",
" \u001b[32m'prec'\u001b[0m: \u001b[32m'precision'\u001b[0m,\n",
" \u001b[32m'PREC'\u001b[0m: \u001b[32m'precision'\u001b[0m,\n",
" \u001b[32m'Precision'\u001b[0m: \u001b[32m'precision'\u001b[0m,\n",
" \u001b[32m'senstivity'\u001b[0m: \u001b[32m'senstivity'\u001b[0m,\n",
" \u001b[32m'sens'\u001b[0m: \u001b[32m'senstivity'\u001b[0m,\n",
" \u001b[32m'SENS'\u001b[0m: \u001b[32m'senstivity'\u001b[0m,\n",
" \u001b[32m'Sensitivity'\u001b[0m: \u001b[32m'senstivity'\u001b[0m,\n",
" \u001b[32m'Recall'\u001b[0m: \u001b[32m'senstivity'\u001b[0m,\n",
" \u001b[32m'recall'\u001b[0m: \u001b[32m'senstivity'\u001b[0m,\n",
" \u001b[32m'TPR'\u001b[0m: \u001b[32m'senstivity'\u001b[0m,\n",
" \u001b[32m'tpr'\u001b[0m: \u001b[32m'senstivity'\u001b[0m,\n",
" \u001b[32m'true_positive_rate'\u001b[0m: \u001b[32m'senstivity'\u001b[0m,\n",
" \u001b[32m'specificity'\u001b[0m: \u001b[32m'specificity'\u001b[0m,\n",
" \u001b[32m'Specificity'\u001b[0m: \u001b[32m'specificity'\u001b[0m,\n",
" \u001b[32m'spec'\u001b[0m: \u001b[32m'specificity'\u001b[0m,\n",
" \u001b[32m'Spec'\u001b[0m: \u001b[32m'specificity'\u001b[0m,\n",
" \u001b[32m'SPEC'\u001b[0m: \u001b[32m'specificity'\u001b[0m,\n",
" \u001b[32m'TNR'\u001b[0m: \u001b[32m'specificity'\u001b[0m,\n",
" \u001b[32m'tnr'\u001b[0m: \u001b[32m'specificity'\u001b[0m,\n",
" \u001b[32m'true_negative_rate'\u001b[0m: \u001b[32m'specificity'\u001b[0m,\n",
" \u001b[32m'tn'\u001b[0m: \u001b[32m'tn'\u001b[0m,\n",
" \u001b[32m'TN'\u001b[0m: \u001b[32m'tn'\u001b[0m,\n",
" \u001b[32m'TrueNegative'\u001b[0m: \u001b[32m'tn'\u001b[0m,\n",
" \u001b[32m'tp'\u001b[0m: \u001b[32m'tp'\u001b[0m,\n",
" \u001b[32m'TP'\u001b[0m: \u001b[32m'tp'\u001b[0m,\n",
" \u001b[32m'TruePositive'\u001b[0m: \u001b[32m'tp'\u001b[0m,\n",
" \u001b[32m'fn'\u001b[0m: \u001b[32m'fn'\u001b[0m,\n",
" \u001b[32m'FN'\u001b[0m: \u001b[32m'fn'\u001b[0m,\n",
" \u001b[32m'FalseNegative'\u001b[0m: \u001b[32m'fn'\u001b[0m,\n",
" \u001b[32m'fp'\u001b[0m: \u001b[32m'fp'\u001b[0m,\n",
" \u001b[32m'FP'\u001b[0m: \u001b[32m'fp'\u001b[0m,\n",
" \u001b[32m'FalsePositive'\u001b[0m: \u001b[32m'fp'\u001b[0m,\n",
" \u001b[32m'fnr'\u001b[0m: \u001b[32m'fnr'\u001b[0m,\n",
" \u001b[32m'FNR'\u001b[0m: \u001b[32m'fnr'\u001b[0m,\n",
" \u001b[32m'fpr'\u001b[0m: \u001b[32m'fpr'\u001b[0m,\n",
" \u001b[32m'FPR'\u001b[0m: \u001b[32m'fpr'\u001b[0m,\n",
" \u001b[32m'volume_similarity'\u001b[0m: \u001b[32m'volume_similarity'\u001b[0m,\n",
" \u001b[32m'VolumetricSimilarity'\u001b[0m: \u001b[32m'volume_similarity'\u001b[0m,\n",
" \u001b[32m'vs'\u001b[0m: \u001b[32m'volume_similarity'\u001b[0m,\n",
" \u001b[32m'VS'\u001b[0m: \u001b[32m'volume_similarity'\u001b[0m,\n",
" \u001b[32m'hausdorff_distance_95'\u001b[0m: \u001b[32m'hausdorff_distance_95'\u001b[0m,\n",
" \u001b[32m'HD95'\u001b[0m: \u001b[32m'hausdorff_distance_95'\u001b[0m,\n",
" \u001b[32m'hd95'\u001b[0m: \u001b[32m'hausdorff_distance_95'\u001b[0m,\n",
" \u001b[32m'hausdorff_distance'\u001b[0m: \u001b[32m'hausdorff_distance'\u001b[0m,\n",
" \u001b[32m'hd'\u001b[0m: \u001b[32m'hausdorff_distance'\u001b[0m,\n",
" \u001b[32m'HD'\u001b[0m: \u001b[32m'hausdorff_distance'\u001b[0m,\n",
" \u001b[32m'assd'\u001b[0m: \u001b[32m'assd'\u001b[0m,\n",
" \u001b[32m'ASSD'\u001b[0m: \u001b[32m'assd'\u001b[0m,\n",
" \u001b[32m'masd'\u001b[0m: \u001b[32m'masd'\u001b[0m,\n",
" \u001b[32m'MASD'\u001b[0m: \u001b[32m'masd'\u001b[0m\n",
"\u001b[1m}\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from mikan.alias import ALIAS_DICT\n",
"print(ALIAS_DICT)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 结果一致性\n",
"\n",
"和 medpy 完全一致。放心使用!\n",
"\n",
"\n",
"### 总结\n",
"\n",
"- mikan 能计算几乎全部的分割指标\n",
"- mikan 特别快\n",
"- mikan 使用特别简单\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}