MaybeRichard commited on
Commit
8e78773
·
verified ·
1 Parent(s): 96efc76

report: paper-style layout (transposed methods×datasets, sig-bold, ranking, per-class)

Browse files
code/framework/report/aggregate.py CHANGED
@@ -1,8 +1,11 @@
1
- """Aggregate per-seed metrics.json files into mean +- SD tables (over seeds).
2
 
3
- Scans results/<exp_name>/**/seed*/metrics.json, groups by (dataset, protocol,
4
- arch), and reports mean +- SD across seeds for every metric. Emits CSV, Markdown,
5
- LaTeX. Overlap/clf metrics shown as percentages; HD95/ASSD as raw distances.
 
 
 
6
 
7
  python framework/report/aggregate.py --exp_name baselines [--out_root results]
8
  """
@@ -12,10 +15,15 @@ import os
12
  import json
13
  import glob
14
  import argparse
 
15
  from collections import defaultdict
16
 
17
  import numpy as np
18
 
 
 
 
 
19
  # (key, label, is_percent, higher_is_better)
20
  METRICS = [
21
  ("dice", "Dice", True, True),
@@ -39,19 +47,12 @@ def load_runs(out_root, exp_name):
39
  return runs
40
 
41
 
42
- # Display labels for split protocols (replaces opaque "fold01" with the real
43
- # reporting protocol). Datasets with an official split keep "official"/"holdout";
44
- # fold-1-of-k single splits are labelled "single-split"; PanNuke is reported as
45
- # its official k-fold cross-validation (handled in summarize via fold-merge).
46
  _PROTO_LABEL = {
47
- ("idridd_segmentation", "fold01"): "official", # official 54/27; train re-split for val
48
  ("busi", "fold01"): "single-split",
49
  ("medsegdb_kits19", "fold01"): "single-split",
50
- ("pannuke_semantic", "fold01"): "single-split", # until the other folds are added
51
  }
52
-
53
- # Datasets reported as official k-fold cross-validation (mean±SD OVER folds, not
54
- # over seeds): folds are merged into one row when >1 fold is present.
55
  _CV_DATASETS = {"pannuke_semantic"}
56
 
57
 
@@ -66,7 +67,6 @@ def _agg_over(items, key):
66
 
67
 
68
  def summarize(runs):
69
- # (dataset, arch) -> protocol -> [runs]
70
  by_da = defaultdict(lambda: defaultdict(list))
71
  for d in runs:
72
  by_da[(d.get("dataset"), d.get("arch"))][d.get("protocol")].append(d)
@@ -75,7 +75,6 @@ def summarize(runs):
75
  protos = sorted(p for p in proto_map if p is not None)
76
  row = {"dataset": dataset, "arch": arch}
77
  if dataset in _CV_DATASETS and len(protos) > 1:
78
- # k-fold CV: collapse seeds within each fold, then mean±SD OVER folds
79
  row["protocol"] = f"{len(protos)}-fold"
80
  row["n_seeds"] = len(protos)
81
  for key, _, _, _ in METRICS:
@@ -85,7 +84,6 @@ def summarize(runs):
85
  row[f"{key}_mean"] = float(fm.mean()) if fm.size else float("nan")
86
  row[f"{key}_sd"] = float(fm.std()) if fm.size else float("nan")
87
  else:
88
- # single fixed split: mean±SD over seeds
89
  proto = protos[0] if protos else None
90
  items = proto_map.get(proto, [])
91
  row["protocol"] = _proto_label(dataset, proto)
@@ -96,23 +94,107 @@ def summarize(runs):
96
  return rows
97
 
98
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
99
  def _fmt(row, key, pct):
100
  m, s = row[f"{key}_mean"], row[f"{key}_sd"]
101
- if np.isnan(m):
102
  return "—"
103
  return f"{m*100:.2f}±{s*100:.2f}" if pct else f"{m:.2f}±{s:.2f}"
104
 
105
 
106
- def to_markdown(rows):
107
- cols = ["dataset", "protocol", "arch", "seeds"] + [lbl for _, lbl, _, _ in METRICS]
108
- out = "| " + " | ".join(cols) + " |\n" + "|" + "---|" * len(cols) + "\n"
109
- for r in rows:
110
- cells = [r["dataset"], r["protocol"], r["arch"], str(r["n_seeds"])]
111
- cells += [_fmt(r, k, p) for k, _, p, _ in METRICS]
112
- out += "| " + " | ".join(cells) + " |\n"
 
 
 
 
 
 
 
 
 
 
 
 
113
  return out
114
 
115
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
  def to_csv(rows):
117
  cols = ["dataset", "protocol", "arch", "n_seeds"]
118
  for k, _, _, _ in METRICS:
@@ -123,23 +205,74 @@ def to_csv(rows):
123
  return out
124
 
125
 
126
- def to_latex(rows):
127
- spec = "lll c" + "c" * len(METRICS)
128
- out = "\\begin{tabular}{" + spec + "}\n\\toprule\n"
129
- out += "Dataset & Protocol & Method & Seeds & " + " & ".join(lbl for _, lbl, _, _ in METRICS) + " \\\\\n\\midrule\n"
130
- for r in rows:
131
- cells = [str(r["dataset"]), str(r["protocol"]), str(r["arch"]), str(r["n_seeds"])]
132
- cells += [_fmt(r, k, p).replace("±", "$\\pm$") for k, _, p, _ in METRICS]
133
- out += " & ".join(cells) + " \\\\\n"
134
- out += "\\bottomrule\n\\end{tabular}\n"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
135
  return out
136
 
137
 
138
- _ARCH_ORDER = ["unet", "unetpp", "deeplabv3plus", "attention_unet", "transunet", "swinunet",
139
- "nnunet", "umamba"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
140
 
141
 
142
- # (#, dataset, modality, target, classes, channels, image size, reported protocol, train/val/test)
143
  _DATASETS_INFO = [
144
  ("1", "CVC-ClinicDB", "Colonoscopy (endoscopy)", "Polyp", "2", "RGB", "384×288", "official", "490 / 61 / 61"),
145
  ("2", "Kvasir-SEG", "GI endoscopy", "Polyp", "2", "RGB", "~622×529 (var)", "official", "800 / 100 / 100"),
@@ -152,102 +285,25 @@ _DATASETS_INFO = [
152
  ("9", "ISIC2018", "Dermoscopy", "Skin lesion", "2", "RGB", "256×256", "holdout", "2582 / 369 / 737"),
153
  ("10", "KiTS19", "Kidney CT (2D slices)", "Kidney (binary)", "2", "grayscale¹", "256×256", "single-split²", "2832 / 479 / 705"),
154
  ]
155
-
156
  _METHODS_INFO = [
157
- ("UNet", "CNN encoder–decoder", "SMP, ResNet-50 encoder (ImageNet-pretrained)"),
158
  ("UNet++", "Nested UNet", "SMP, ResNet-50 (ImageNet)"),
159
  ("DeepLabV3+", "Atrous CNN", "SMP, ResNet-50 (ImageNet)"),
160
- ("Attention-UNet", "Attention-gated UNet", "Re-implemented, trained from scratch"),
161
- ("TransUNet", "CNN–Transformer hybrid", "R50-ViT-B/16 (ImageNet-pretrained)"),
162
- ("Swin-UNet", "Pure-Transformer UNet", "Swin-Tiny (ImageNet-pretrained)"),
163
  ("nnU-Net (v2)", "Self-configuring CNN", "2D config, 250 epochs"),
164
  ("U-Mamba", "State-space (Mamba) UNet", "U-Mamba_Bot, 100 epochs"),
165
  ]
166
-
167
- # (metric, formula/definition, direction, unit, chinese role)
168
  _METRICS_INFO = [
169
- ("Dice (DSC)", "2·|P∩G| / (|P|+|G|) = 2TP / (2TP+FP+FN)", "↑ higher", "%",
170
- "区域重叠度(分割主指标);对类别不平衡较鲁棒,综合反映分割整体准确度。"),
171
- ("IoU (Jaccard)", "|P∩G| / |P∪G| = TP / (TP+FP+FN)", "↑ higher", "%",
172
- "交并比,同样衡量区域重叠但更严格(对错误惩罚更重),常与 Dice 并列报告。"),
173
- ("Sensitivity / Recall", "TP / (TP+FN)", "↑ higher", "%",
174
- "召回率/敏感度:真值前景中被正确分出的比例,反映“漏检/漏分割”程度(越高漏得越少)。"),
175
- ("Specificity", "TN / (TN+FP) (pixel-level, one-vs-rest)", "↑ higher", "%",
176
- "特异度:真值背景中被正确判为背景的比例,反映对背景区域的误报控制能力。"),
177
- ("Precision", "TP / (TP+FP)", "↑ higher", "%",
178
- "精确率:预测为前景的像素中真正属于前景的比例,反映“过分割/误报”程度(越高误分越少)。"),
179
- ("HD95", "95th-percentile Hausdorff distance between predicted & GT boundaries", "↓ lower", "pixels",
180
- "边界距离:预测与真值轮廓间偏差的 95% 分位 Hausdorff 距离,衡量最大边界误差(取95%分位以抑制离群点),越小边界越贴合。"),
181
- ("ASSD", "Average symmetric surface distance between boundaries", "↓ lower", "pixels",
182
- "平均对称表面距离:两条轮廓间双向平均距离,衡量整体边界吻合度,越小边界越准。"),
183
  ]
184
-
185
-
186
- def _intro_html():
187
- h = ["<div class='ov'>"]
188
- h.append("<h2>Project overview</h2>")
189
- h.append("<p>A unified benchmark of <b>8 2D medical-image segmentation methods</b> across "
190
- "<b>10 public datasets</b> spanning <b>7 imaging modalities</b> (endoscopy, retinal fundus, "
191
- "ultrasound, cardiac MRI, dermoscopy, histopathology, abdominal CT). Every method runs through "
192
- "one pipeline with identical metrics. Reported as "
193
- "<b>mean±SD</b> over <b>3 seeds</b> for fixed-split datasets and over <b>folds</b> for "
194
- "cross-validation datasets (PanNuke: official 3-fold). Each (dataset,method) cell aggregates "
195
- "~tens–thousands of test images; the suite totals ≈20k images. Per-method efficiency "
196
- "(params / FLOPs / throughput) is in <code>efficiency.md</code>.</p>")
197
- h.append("<p style='background:#eef7f0;border-left:3px solid #0a6;padding:8px 12px'>"
198
- "<b>Resolution-fair evaluation (unified 512).</b> Convolutional methods are trained at "
199
- "512×512; the fixed-input transformers (Swin-UNet 224, TransUNet 256) run at their native "
200
- "size; nnU-Net / U-Mamba predict natively. <b>For scoring, every method's prediction and the "
201
- "ground truth are resized to a common 512×512</b> before computing all 7 metrics — so the "
202
- "boundary metrics (HD95 / ASSD), which are measured in pixels, are <b>directly comparable "
203
- "across methods</b> regardless of each method's native working resolution. (Earlier 256-px "
204
- "tables mixed pixel scales and were not boundary-comparable.)</p>")
205
-
206
- h.append("<h2>Datasets</h2>")
207
- h.append("<table><tr><th>#</th><th>Dataset</th><th>Modality</th><th>Target</th><th>Classes</th>"
208
- "<th>Channels</th><th>Image size</th><th>Reported protocol</th><th>Train / Val / Test</th></tr>")
209
- for r in _DATASETS_INFO:
210
- h.append("<tr><td>%s</td><td class='l'>%s</td><td class='l'>%s</td><td class='l'>%s</td>"
211
- "<td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>" % r)
212
- h.append("</table>")
213
- h.append("<div class='cap'>¹ BUSI/KiTS19 are grayscale in content but stored as 3-channel PNG — read as "
214
- "grayscale. ² BUSI/KiTS19 have no canonical split, so one fixed fold (of a 5-fold partition) is "
215
- "reported with 3 seeds; datasets with an official split use it. Mask labels are 0…C-1 "
216
- "(0=background); multi-class metrics are macro-averaged over foreground classes.</div>")
217
-
218
- h.append("<h2>Segmentation methods</h2>")
219
- h.append("<table><tr><th>Method</th><th>Family</th><th>Backbone / setup</th></tr>")
220
- for m in _METHODS_INFO:
221
- h.append("<tr><td class='l'>%s</td><td class='l'>%s</td><td class='l'>%s</td></tr>" % m)
222
- h.append("</table>")
223
-
224
- h.append("<h2>Evaluation metrics</h2>")
225
- h.append("<table><tr><th>Metric</th><th>Definition</th><th>Direction</th><th>Unit</th>"
226
- "<th>作用 / 含义(中文)</th></tr>")
227
- for m in _METRICS_INFO:
228
- h.append("<tr><td class='l'>%s</td><td class='l'>%s</td><td>%s</td><td>%s</td>"
229
- "<td class='l'>%s</td></tr>" % m)
230
- h.append("</table>")
231
- h.append("<p style='font-size:12.5px'>P = predicted foreground, G = ground-truth foreground; "
232
- "TP/FP/FN/TN are pixel counts. Overlap metrics (Dice/IoU/Sens/Spec/Prec) are exact pixel "
233
- "computations; boundary metrics (HD95/ASSD) are computed with MONAI on the mask edges.</p>")
234
-
235
- h.append("<h2>Evaluation protocol</h2>")
236
- h.append("<p>For each test image, every metric is computed <b>per foreground class</b> (background "
237
- "excluded) and macro-averaged over the classes present; classes absent in <i>both</i> "
238
- "prediction and ground truth are skipped so they do not dilute the score. Per-image values are "
239
- "averaged to one score per (dataset, method, run); we then report <b>mean±SD across runs</b> — "
240
- "3 random seeds for fixed-split datasets, or across folds for CV datasets. For surface metrics, "
241
- "an empty–empty (no foreground in either) pair scores 0, while empty-vs-non-empty is undefined "
242
- "(NaN) and excluded from the average. All methods share the same held-out test images per "
243
- "dataset, so comparisons are paired.</p>")
244
- h.append("<hr style='margin:18px 0;border:none;border-top:1px solid #ddd'>")
245
- h.append("</div>")
246
- return "\n".join(h)
247
-
248
-
249
- # ---- (3) per-class Dice tables for the multi-class datasets ----
250
- # Class names follow each dataset's standard foreground labelling (0=background excluded).
251
  _PERCLASS_NAMES = {
252
  "acdc_png": {"1": "RV", "2": "Myocardium", "3": "LV"},
253
  "refuge2": {"1": "Optic Disc", "2": "Optic Cup"},
@@ -257,7 +313,7 @@ _PERCLASS_NAMES = {
257
 
258
 
259
  def _collect_perclass(runs):
260
- acc = defaultdict(lambda: defaultdict(list)) # (dataset,arch)->class->[dice]
261
  for d in runs:
262
  key = (d.get("dataset"), d.get("arch"))
263
  for pi in d.get("per_image", []):
@@ -268,159 +324,189 @@ def _collect_perclass(runs):
268
  return {k: {c: float(np.mean(v)) for c, v in cd.items() if v} for k, cd in acc.items()}
269
 
270
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
271
  def _perclass_section(runs):
272
  pc = _collect_perclass(runs)
273
- h = ["<h1 style='font-size:18px'>Per-class Dice — multi-class datasets</h1>",
274
- "<div class='cap'>Mean per-class Dice (%) over all test images and all runs (0=background "
275
- "excluded). Reveals which structures/types drive a method's macro-Dice. Class names follow each "
276
- "dataset's standard labelling (IDRiD: MA=microaneurysm, exudates hard/soft, optic disc).</div>"]
277
  for ds, names in _PERCLASS_NAMES.items():
278
  methods = [a for a in _ARCH_ORDER if (ds, a) in pc and pc[(ds, a)]]
279
  if not methods:
280
  continue
281
  classes = sorted(names, key=int)
282
- h.append(f"<h2>{ds}</h2>")
283
- h.append("<table><tr><th>Method</th>" + "".join(f"<th>{names[c]}</th>" for c in classes)
284
- + "<th>macro</th></tr>")
285
- # best per class (column) for bolding
286
- colbest = {c: max((pc[(ds, a)].get(c, float('nan')) for a in methods),
287
- default=float('nan')) for c in classes}
288
  for a in methods:
289
- cd = pc[(ds, a)]
290
- cells = []
291
- present = []
292
  for c in classes:
293
- v = cd.get(c)
294
  if v is None:
295
- cells.append("<td>—</td>")
296
  else:
297
  present.append(v)
298
- txt = f"{v*100:.1f}"
299
- cells.append(f"<td>{'<b>'+txt+'</b>' if v == colbest[c] else txt}</td>")
300
  macro = (sum(present) / len(present) * 100) if present else float("nan")
301
- h.append(f"<tr><td class='l'>{a}</td>{''.join(cells)}<td>{macro:.1f}</td></tr>")
302
- h.append("</table>")
 
303
  return "\n".join(h)
304
 
305
 
306
- # ---- (4) paired Wilcoxon significance on per-image Dice ----
307
- def _per_image_dice_vec(runs_for_da):
308
- """Aligned per-image Dice for one (dataset,arch): mean over seeds within each
309
- protocol/fold, concatenated over sorted protocols. Length matches across methods."""
310
- by_proto = defaultdict(list)
311
- for d in runs_for_da:
312
- by_proto[d.get("protocol")].append(d)
313
- parts = []
314
- for proto in sorted(by_proto):
315
- arrs = [np.array([pi.get("dice", np.nan) for pi in d.get("per_image", [])], float)
316
- for d in by_proto[proto]]
317
- arrs = [a for a in arrs if a.size]
318
- if not arrs:
319
- continue
320
- L = min(a.size for a in arrs)
321
- parts.append(np.nanmean(np.stack([a[:L] for a in arrs]), axis=0))
322
- return np.concatenate(parts) if parts else np.array([])
323
-
324
-
325
- def _wilcoxon_section(runs):
326
- try:
327
- from scipy.stats import wilcoxon
328
- except Exception:
329
- return "<p>(scipy unavailable — significance section skipped)</p>"
330
- by_da = defaultdict(list)
331
- for d in runs:
332
- by_da[(d.get("dataset"), d.get("arch"))].append(d)
333
-
334
- def pval(a, b):
335
- L = min(a.size, b.size)
336
- if L < 6:
337
- return float("nan")
338
- x, y = a[:L], b[:L]
339
- m = ~(np.isnan(x) | np.isnan(y))
340
- if m.sum() < 6 or np.allclose(x[m], y[m]):
341
- return 1.0
342
- try:
343
- return float(wilcoxon(x[m], y[m]).pvalue)
344
- except Exception:
345
- return 1.0
346
-
347
- h = ["<h1 style='font-size:18px'>Statistical significance — paired Wilcoxon (per-image Dice)</h1>",
348
- "<div class='cap'>Per dataset, the best method by mean Dice is marked ★; a paired Wilcoxon "
349
- "signed-rank test on per-image Dice (paired by image) compares it against every other method. "
350
- "Methods <u>not</u> significantly worse than the best (p≥0.05) are <u>underlined</u> = statistically "
351
- "tied for best. The last column is the best-vs-2nd-best p-value. Pairing is exact for the in-framework "
352
- "methods (shared dataloader order); nnU-Net/U-Mamba use cached predictions paired by index where "
353
- "image counts match.</div>"]
354
- h.append("<table><tr><th>Dataset</th><th>Best ��� and tied-for-best (underlined)</th>"
355
- "<th>best vs 2nd p</th></tr>")
356
- for ds in sorted({k[0] for k in by_da}):
357
- vecs = {a: _per_image_dice_vec(by_da[(ds, a)]) for a in _ARCH_ORDER if (ds, a) in by_da}
358
- vecs = {a: v for a, v in vecs.items() if v.size}
359
- if len(vecs) < 2:
360
- continue
361
- means = {a: float(np.nanmean(v)) for a, v in vecs.items()}
362
- ranked = sorted(means, key=means.get, reverse=True)
363
- best = ranked[0]
364
- tied = [a for a in ranked[1:] if not (pval(vecs[best], vecs[a]) < 0.05)]
365
- p2 = pval(vecs[best], vecs[ranked[1]])
366
- marks = f"<b>★ {best} ({means[best]*100:.1f})</b>"
367
- if tied:
368
- marks += " &nbsp;·&nbsp; tied: " + ", ".join(f"<u>{a}</u>" for a in tied)
369
- h.append(f"<tr><td class='l'>{ds}</td><td class='l'>{marks}</td>"
370
- f"<td>{('%.2g' % p2) if p2 == p2 else '—'}</td></tr>")
371
  h.append("</table>")
372
  return "\n".join(h)
373
 
374
 
375
- def to_html(rows, runs=None, title="SegGen baselines"):
376
- cell, dslist = {}, []
377
- for r in rows:
378
- ds = f"{r['dataset']}/{r['protocol']}"
379
- if ds not in dslist:
380
- dslist.append(ds)
381
- cell[(ds, r["arch"])] = r
382
- archs = [a for a in _ARCH_ORDER if any(r["arch"] == a for r in rows)] or \
383
- sorted({r["arch"] for r in rows})
384
- h = ["<!doctype html><html><head><meta charset='utf-8'><title>%s</title><style>" % title,
385
- "body{font-family:Arial,Helvetica,sans-serif;margin:24px;color:#222}",
386
- "h1{font-size:20px}h2{margin-top:28px;font-size:16px;color:#0a5}",
387
- "table{border-collapse:collapse;margin:6px 0 18px}",
388
- "th,td{border:1px solid #ccc;padding:5px 9px;text-align:center;font-size:12.5px}",
389
- "th{background:#f3f3f3}td.ds{text-align:left;font-weight:bold;background:#fafafa}",
390
- "td.l{text-align:left}.ov{font-size:12.5px;line-height:1.5;max-width:1100px}",
391
- "b{color:#0a6}.cap{color:#777;font-size:12px;margin:2px 0 14px}</style></head><body>"]
392
- nseeds = {f"{r['dataset']}/{r['protocol']}": r["n_seeds"] for r in rows}
393
- h.append(f"<h1>{title} — mean±SD</h1>")
394
- h.append("<div class='cap'>Higher is better for Dice/IoU/Sens/Spec/Prec (%); "
395
- "lower for HD95/ASSD. <b>Bold</b>=best (highest/lowest mean) per dataset. "
396
- "Variance is over seeds for single-split datasets and over folds for k-fold (CV) datasets. "
397
- "'seeds' column = #seeds (single-split) or #folds (CV).</div>")
398
- h.append(_intro_html())
399
- h.append("<h1 style='font-size:18px'>Results</h1>")
400
- for key, label, pct, hib in METRICS:
401
- h.append(f"<h2>{label}{' (%)' if pct else ' (lower=better)'}</h2>")
402
- h.append("<table><tr><th>Dataset</th>" + "".join(f"<th>{a}</th>" for a in archs)
403
- + "<th>seeds</th></tr>")
404
- for ds in dslist:
405
- vals = {a: cell[(ds, a)][f"{key}_mean"] for a in archs
406
- if (ds, a) in cell and cell[(ds, a)][f"{key}_mean"] == cell[(ds, a)][f"{key}_mean"]}
407
- best = (max if hib else min)(vals, key=vals.get) if vals else None
408
- bold = {best} if best is not None else set()
409
- tds = [f"<td class='ds'>{ds}</td>"]
410
- for a in archs:
411
- if (ds, a) in cell:
412
- txt = _fmt(cell[(ds, a)], key, pct)
413
- tds.append(f"<td>{'<b>'+txt+'</b>' if a in bold else txt}</td>")
414
- else:
415
- tds.append("<td>—</td>")
416
- tds.append(f"<td>{nseeds.get(ds,'')}</td>")
417
- h.append("<tr>" + "".join(tds) + "</tr>")
418
- h.append("</table>")
419
  if runs:
420
- h.append("<hr style='margin:22px 0;border:none;border-top:2px solid #0a6'>")
421
- h.append(_perclass_section(runs))
422
- h.append("<hr style='margin:22px 0;border:none;border-top:2px solid #0a6'>")
423
- h.append(_wilcoxon_section(runs))
 
 
 
 
 
 
 
424
  h.append("</body></html>")
425
  return "\n".join(h)
426
 
@@ -436,12 +522,14 @@ def main():
436
  print(f"no metrics.json under {args.out_root}/{args.exp_name}")
437
  return
438
  rows = summarize(runs)
 
439
  base = os.path.join(args.out_root, args.exp_name)
440
  open(os.path.join(base, "summary.csv"), "w").write(to_csv(rows))
441
- open(os.path.join(base, "summary.md"), "w").write(to_markdown(rows))
442
- open(os.path.join(base, "summary.tex"), "w").write(to_latex(rows))
443
- open(os.path.join(base, "summary.html"), "w").write(to_html(rows, runs, title=f"SegGen baselines ({args.exp_name})"))
444
- print(to_markdown(rows))
 
445
  print(f"{len(runs)} runs -> {len(rows)} (dataset,arch) cells; written {base}/summary.{{csv,md,tex,html}}")
446
 
447
 
 
1
+ """Aggregate per-seed metrics.json into paper-style result tables (mean±SD).
2
 
3
+ Scans results/<exp_name>/**/seed*/metrics.json, groups by (dataset, protocol, arch),
4
+ reports mean±SD over seeds (over folds for CV datasets). Emits:
5
+ - summary.csv : full per-(dataset,method) detail, every metric (raw data export)
6
+ - summary.md : the main Dice table, methods×datasets (quick read)
7
+ - summary.tex : the main Dice table as booktabs LaTeX (paper-ready)
8
+ - summary.html : full paper-style report (main tables, per-class, significance, setup)
9
 
10
  python framework/report/aggregate.py --exp_name baselines [--out_root results]
11
  """
 
15
  import json
16
  import glob
17
  import argparse
18
+ import warnings
19
  from collections import defaultdict
20
 
21
  import numpy as np
22
 
23
+ # per-image Dice vectors can have all-NaN positions (empty masks across seeds);
24
+ # np.nanmean warns harmlessly on those — silence it for clean console/report runs.
25
+ warnings.filterwarnings("ignore", message="Mean of empty slice")
26
+
27
  # (key, label, is_percent, higher_is_better)
28
  METRICS = [
29
  ("dice", "Dice", True, True),
 
47
  return runs
48
 
49
 
 
 
 
 
50
  _PROTO_LABEL = {
51
+ ("idridd_segmentation", "fold01"): "official",
52
  ("busi", "fold01"): "single-split",
53
  ("medsegdb_kits19", "fold01"): "single-split",
54
+ ("pannuke_semantic", "fold01"): "single-split",
55
  }
 
 
 
56
  _CV_DATASETS = {"pannuke_semantic"}
57
 
58
 
 
67
 
68
 
69
  def summarize(runs):
 
70
  by_da = defaultdict(lambda: defaultdict(list))
71
  for d in runs:
72
  by_da[(d.get("dataset"), d.get("arch"))][d.get("protocol")].append(d)
 
75
  protos = sorted(p for p in proto_map if p is not None)
76
  row = {"dataset": dataset, "arch": arch}
77
  if dataset in _CV_DATASETS and len(protos) > 1:
 
78
  row["protocol"] = f"{len(protos)}-fold"
79
  row["n_seeds"] = len(protos)
80
  for key, _, _, _ in METRICS:
 
84
  row[f"{key}_mean"] = float(fm.mean()) if fm.size else float("nan")
85
  row[f"{key}_sd"] = float(fm.std()) if fm.size else float("nan")
86
  else:
 
87
  proto = protos[0] if protos else None
88
  items = proto_map.get(proto, [])
89
  row["protocol"] = _proto_label(dataset, proto)
 
94
  return rows
95
 
96
 
97
+ # ----------------------------------------------------------------------------- display
98
+ _ARCH_ORDER = ["unet", "unetpp", "deeplabv3plus", "attention_unet", "transunet", "swinunet",
99
+ "nnunet", "umamba"]
100
+ _ARCH_DISP = {"unet": "UNet", "unetpp": "UNet++", "deeplabv3plus": "DeepLabV3+",
101
+ "attention_unet": "Attention-UNet", "transunet": "TransUNet",
102
+ "swinunet": "Swin-UNet", "nnunet": "nnU-Net", "umamba": "U-Mamba"}
103
+ _DS_ORDER = ["cvc_clinicdb", "kvasir_seg", "fives", "busi", "refuge2", "acdc_png",
104
+ "idridd_segmentation", "pannuke_semantic", "medsegdb_isic2018", "medsegdb_kits19"]
105
+ _DS_DISP = {"cvc_clinicdb": "CVC-ClinicDB", "kvasir_seg": "Kvasir-SEG", "fives": "FIVES",
106
+ "busi": "BUSI", "refuge2": "REFUGE2", "acdc_png": "ACDC",
107
+ "idridd_segmentation": "IDRiD", "pannuke_semantic": "PanNuke",
108
+ "medsegdb_isic2018": "ISIC2018", "medsegdb_kits19": "KiTS19"}
109
+
110
+
111
  def _fmt(row, key, pct):
112
  m, s = row[f"{key}_mean"], row[f"{key}_sd"]
113
+ if m != m:
114
  return "—"
115
  return f"{m*100:.2f}±{s*100:.2f}" if pct else f"{m:.2f}±{s:.2f}"
116
 
117
 
118
+ def _grid(rows):
119
+ cell = {(r["dataset"], r["arch"]): r for r in rows}
120
+ methods = [a for a in _ARCH_ORDER if any(r["arch"] == a for r in rows)] or \
121
+ sorted({r["arch"] for r in rows})
122
+ seen = [d for d in _DS_ORDER if any(r["dataset"] == d for r in rows)]
123
+ extra = [r["dataset"] for r in rows if r["dataset"] not in _DS_ORDER]
124
+ datasets = list(dict.fromkeys(seen + extra))
125
+ return cell, datasets, methods
126
+
127
+
128
+ def _col_means(cell, datasets, methods):
129
+ """method -> {key: macro-mean over datasets}"""
130
+ out = {}
131
+ for a in methods:
132
+ out[a] = {}
133
+ for key, _, _, _ in METRICS:
134
+ vs = [cell[(d, a)][f"{key}_mean"] for d in datasets
135
+ if (d, a) in cell and cell[(d, a)][f"{key}_mean"] == cell[(d, a)][f"{key}_mean"]]
136
+ out[a][key] = float(np.mean(vs)) if vs else float("nan")
137
  return out
138
 
139
 
140
+ # ----------------------------------------------------------------------------- significance
141
+ def _per_image_dice_vec(runs_for_da):
142
+ by_proto = defaultdict(list)
143
+ for d in runs_for_da:
144
+ by_proto[d.get("protocol")].append(d)
145
+ parts = []
146
+ for proto in sorted(by_proto):
147
+ arrs = [np.array([pi.get("dice", np.nan) for pi in d.get("per_image", [])], float)
148
+ for d in by_proto[proto]]
149
+ arrs = [a for a in arrs if a.size]
150
+ if not arrs:
151
+ continue
152
+ L = min(a.size for a in arrs)
153
+ parts.append(np.nanmean(np.stack([a[:L] for a in arrs]), axis=0))
154
+ return np.concatenate(parts) if parts else np.array([])
155
+
156
+
157
+ def _sig_tied_sets(runs):
158
+ """{dataset: set(archs whose per-image Dice is NOT significantly worse than the best,
159
+ paired Wilcoxon p>=0.05)} — the 'statistically best' set, used to bold the Dice table."""
160
+ try:
161
+ from scipy.stats import wilcoxon
162
+ except Exception:
163
+ return {}
164
+ by_da = defaultdict(list)
165
+ for d in runs:
166
+ by_da[(d.get("dataset"), d.get("arch"))].append(d)
167
+
168
+ def pval(a, b):
169
+ L = min(a.size, b.size)
170
+ if L < 6:
171
+ return float("nan")
172
+ x, y = a[:L], b[:L]
173
+ m = ~(np.isnan(x) | np.isnan(y))
174
+ if m.sum() < 6 or np.allclose(x[m], y[m]):
175
+ return 1.0
176
+ try:
177
+ return float(wilcoxon(x[m], y[m]).pvalue)
178
+ except Exception:
179
+ return 1.0
180
+
181
+ out = {}
182
+ for ds in {k[0] for k in by_da}:
183
+ vecs = {a: _per_image_dice_vec(by_da[(ds, a)]) for a in _ARCH_ORDER if (ds, a) in by_da}
184
+ vecs = {a: v for a, v in vecs.items() if v.size}
185
+ if not vecs:
186
+ continue
187
+ means = {a: float(np.nanmean(v)) for a, v in vecs.items()}
188
+ best = max(means, key=means.get)
189
+ tied = {best}
190
+ for a, v in vecs.items():
191
+ if a != best and not (pval(vecs[best], v) < 0.05):
192
+ tied.add(a)
193
+ out[ds] = tied
194
+ return out
195
+
196
+
197
+ # ----------------------------------------------------------------------------- text exports
198
  def to_csv(rows):
199
  cols = ["dataset", "protocol", "arch", "n_seeds"]
200
  for k, _, _, _ in METRICS:
 
205
  return out
206
 
207
 
208
+ def _dice_matrix(rows):
209
+ """(methods, datasets, cell, avg) for the main Dice table."""
210
+ cell, datasets, methods = _grid(rows)
211
+ avg = {a: np.nanmean([cell[(d, a)]["dice_mean"] for d in datasets if (d, a) in cell] or [np.nan])
212
+ for a in methods}
213
+ return cell, datasets, methods, avg
214
+
215
+
216
+ def _dice_bold(a, d, cell, best, sig):
217
+ """Whether (dataset d, arch a)'s Dice cell should be bold: in the significance
218
+ 'tied-for-best' set when available, else the single best per dataset."""
219
+ if (d, a) not in cell:
220
+ return False
221
+ if sig is not None:
222
+ return a in sig.get(d, set())
223
+ return cell[(d, a)]["dice_mean"] == best[d]
224
+
225
+
226
+ def to_markdown(rows, sig=None):
227
+ cell, datasets, methods, avg = _dice_matrix(rows)
228
+ head = ["Method"] + [_DS_DISP.get(d, d) for d in datasets] + ["Avg"]
229
+ out = "## Main results — Dice (mean±SD %, ↑)\n\n"
230
+ out += ("_**Bold** = best or not significantly worse than best per dataset "
231
+ "(paired Wilcoxon on per-image Dice, p≥0.05)._\n\n")
232
+ out += "| " + " | ".join(head) + " |\n|" + "---|" * len(head) + "\n"
233
+ best = {d: max((cell[(d, a)]["dice_mean"] for a in methods if (d, a) in cell), default=np.nan)
234
+ for d in datasets}
235
+ for a in methods:
236
+ cells = [_ARCH_DISP.get(a, a)]
237
+ for d in datasets:
238
+ if (d, a) in cell:
239
+ t = _fmt(cell[(d, a)], "dice", True)
240
+ cells.append(f"**{t}**" if _dice_bold(a, d, cell, best, sig) else t)
241
+ else:
242
+ cells.append("–")
243
+ cells.append(f"{avg[a]*100:.1f}")
244
+ out += "| " + " | ".join(cells) + " |\n"
245
  return out
246
 
247
 
248
+ def to_latex(rows, sig=None):
249
+ cell, datasets, methods, avg = _dice_matrix(rows)
250
+ spec = "l" + "c" * (len(datasets) + 1)
251
+ out = ("% Main results: Dice (mean over seeds, %). Bold = best or not significantly\n"
252
+ "% worse than best per dataset (paired Wilcoxon on per-image Dice, p>=0.05).\n")
253
+ out += "\\begin{tabular}{" + spec + "}\n\\toprule\n"
254
+ out += "Method & " + " & ".join(_DS_DISP.get(d, d) for d in datasets) + " & Avg \\\\\n\\midrule\n"
255
+ best = {d: max((cell[(d, a)]["dice_mean"] for a in methods if (d, a) in cell), default=np.nan)
256
+ for d in datasets}
257
+ abest = max(methods, key=lambda a: avg[a])
258
+ for a in methods:
259
+ cells = [_ARCH_DISP.get(a, a)]
260
+ for d in datasets:
261
+ if (d, a) in cell:
262
+ t = f"{cell[(d, a)]['dice_mean'] * 100:.1f}"
263
+ cells.append(f"\\textbf{{{t}}}" if _dice_bold(a, d, cell, best, sig) else t)
264
+ else:
265
+ cells.append("--")
266
+ at = f"{avg[a]*100:.1f}"
267
+ cells.append(f"\\textbf{{{at}}}" if a == abest else at)
268
+ out += " & ".join(cells) + " \\\\\n"
269
+ if a == "attention_unet":
270
+ out += "\\midrule\n" # separate CNNs from transformers/foundation
271
+ out += "\\bottomrule\n\\end{tabular}\n"
272
+ return out
273
 
274
 
275
+ # ----------------------------------------------------------------------------- HTML report
276
  _DATASETS_INFO = [
277
  ("1", "CVC-ClinicDB", "Colonoscopy (endoscopy)", "Polyp", "2", "RGB", "384×288", "official", "490 / 61 / 61"),
278
  ("2", "Kvasir-SEG", "GI endoscopy", "Polyp", "2", "RGB", "~622×529 (var)", "official", "800 / 100 / 100"),
 
285
  ("9", "ISIC2018", "Dermoscopy", "Skin lesion", "2", "RGB", "256×256", "holdout", "2582 / 369 / 737"),
286
  ("10", "KiTS19", "Kidney CT (2D slices)", "Kidney (binary)", "2", "grayscale¹", "256×256", "single-split²", "2832 / 479 / 705"),
287
  ]
 
288
  _METHODS_INFO = [
289
+ ("UNet", "CNN encoder–decoder", "SMP, ResNet-50 encoder (ImageNet)"),
290
  ("UNet++", "Nested UNet", "SMP, ResNet-50 (ImageNet)"),
291
  ("DeepLabV3+", "Atrous CNN", "SMP, ResNet-50 (ImageNet)"),
292
+ ("Attention-UNet", "Attention-gated UNet", "Re-implemented, from scratch"),
293
+ ("TransUNet", "CNN–Transformer hybrid", "R50-ViT-B/16 (ImageNet), input 256"),
294
+ ("Swin-UNet", "Pure-Transformer UNet", "Swin-Tiny (ImageNet), input 224"),
295
  ("nnU-Net (v2)", "Self-configuring CNN", "2D config, 250 epochs"),
296
  ("U-Mamba", "State-space (Mamba) UNet", "U-Mamba_Bot, 100 epochs"),
297
  ]
 
 
298
  _METRICS_INFO = [
299
+ ("Dice (DSC)", "2TP / (2TP+FP+FN)", "↑", "%", "区��重叠度(主指标),对类别不平衡较鲁棒。"),
300
+ ("IoU (Jaccard)", "TP / (TP+FP+FN)", "↑", "%", "交并比,更严格的重叠度,常与 Dice 并列。"),
301
+ ("HD95", "95% Hausdorff distance (boundaries)", "↓", "px", "边界最大误差的95%分位,越小边界越贴合。"),
302
+ ("ASSD", "average symmetric surface distance", "↓", "px", "平均对称表面距离,整体边界吻合度。"),
303
+ ("Sensitivity", "TP / (TP+FN)", "↑", "%", "召回/敏感度,反映漏分割程度。"),
304
+ ("Specificity", "TN / (TN+FP)", "↑", "%", "特异度,背景误报控制。"),
305
+ ("Precision", "TP / (TP+FP)", "↑", "%", "精确率,反映过分割/误报程度。"),
 
 
 
 
 
 
 
306
  ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
307
  _PERCLASS_NAMES = {
308
  "acdc_png": {"1": "RV", "2": "Myocardium", "3": "LV"},
309
  "refuge2": {"1": "Optic Disc", "2": "Optic Cup"},
 
313
 
314
 
315
  def _collect_perclass(runs):
316
+ acc = defaultdict(lambda: defaultdict(list))
317
  for d in runs:
318
  key = (d.get("dataset"), d.get("arch"))
319
  for pi in d.get("per_image", []):
 
324
  return {k: {c: float(np.mean(v)) for c, v in cd.items() if v} for k, cd in acc.items()}
325
 
326
 
327
+ _CSS = """
328
+ body{font-family:'Helvetica Neue',Arial,sans-serif;margin:30px auto;max-width:1180px;color:#1a1a1a;line-height:1.5}
329
+ h1{font-size:21px;margin:0 0 4px}h2{font-size:15px;color:#0a5a33;margin:30px 0 4px;border-bottom:1px solid #e3e3e3;padding-bottom:3px}
330
+ h3{font-size:13px;margin:16px 0 4px;color:#333}
331
+ p,li{font-size:13px}code{background:#f2f2f2;padding:1px 4px;border-radius:3px}
332
+ .cap{color:#666;font-size:11.5px;margin:3px 0 6px}
333
+ .tw{overflow-x:auto}
334
+ table.rt{border-collapse:collapse;margin:6px 0 8px;font-size:11.5px}
335
+ table.rt th,table.rt td{padding:4px 9px;text-align:center;white-space:nowrap}
336
+ table.rt thead th{border-top:2px solid #222;border-bottom:1.2px solid #222;font-weight:600}
337
+ table.rt tbody tr:last-child td{border-bottom:2px solid #222}
338
+ table.rt td.m,table.rt th.m{text-align:left;font-weight:600}
339
+ table.rt td.avg,table.rt th.avg{border-left:1px solid #c8c8c8;background:#f7f9f8}
340
+ table.rt tbody tr.grp td{border-top:1px solid #cfcfcf}
341
+ table.rt b{color:#08402a}
342
+ table.info{border-collapse:collapse;margin:6px 0 14px;font-size:12px}
343
+ table.info th,table.info td{border:1px solid #ddd;padding:4px 8px;text-align:center}
344
+ table.info th{background:#f3f3f3}table.info td.l{text-align:left}
345
+ .note{background:#eef7f0;border-left:3px solid #0a6;padding:8px 12px;font-size:12.5px;margin:8px 0}
346
+ hr{border:none;border-top:1px solid #e3e3e3;margin:24px 0}
347
+ """
348
+
349
+
350
+ def _metric_table(cell, datasets, methods, key, pct, hib, bold_sets=None):
351
+ """Transposed table: methods (rows) × datasets (cols) + Avg. bold_sets[ds] (set of archs)
352
+ if given (Dice significance), else bold the single best per column."""
353
+ best = {}
354
+ for d in datasets:
355
+ vals = {a: cell[(d, a)][f"{key}_mean"] for a in methods
356
+ if (d, a) in cell and cell[(d, a)][f"{key}_mean"] == cell[(d, a)][f"{key}_mean"]}
357
+ best[d] = ((max if hib else min)(vals, key=vals.get) if vals else None)
358
+ avg = {a: np.nanmean([cell[(d, a)][f"{key}_mean"] for d in datasets if (d, a) in cell] or [np.nan])
359
+ for a in methods}
360
+ avg = {a: (v if v == v else np.nan) for a, v in avg.items()}
361
+ finite = {a: v for a, v in avg.items() if v == v}
362
+ abest = ((max if hib else min)(finite, key=finite.get) if finite else None)
363
+ h = ["<div class='tw'><table class='rt'><thead><tr><th class='m'>Method</th>"
364
+ + "".join(f"<th>{_DS_DISP.get(d, d)}</th>" for d in datasets)
365
+ + "<th class='avg'>Avg</th></tr></thead><tbody>"]
366
+ for a in methods:
367
+ grp = " class='grp'" if a == "transunet" else ""
368
+ tds = [f"<td class='m'>{_ARCH_DISP.get(a, a)}</td>"]
369
+ for d in datasets:
370
+ if (d, a) in cell and cell[(d, a)][f"{key}_mean"] == cell[(d, a)][f"{key}_mean"]:
371
+ t = _fmt(cell[(d, a)], key, pct)
372
+ b = (a in bold_sets.get(d, set())) if bold_sets is not None else (a == best[d])
373
+ tds.append(f"<td>{'<b>'+t+'</b>' if b else t}</td>")
374
+ else:
375
+ tds.append("<td>–</td>")
376
+ av = avg[a]
377
+ at = ("–" if av != av else (f"{av*100:.1f}" if pct else f"{av:.2f}"))
378
+ tds.append(f"<td class='avg'>{'<b>'+at+'</b>' if a == abest else at}</td>")
379
+ h.append(f"<tr{grp}>" + "".join(tds) + "</tr>")
380
+ h.append("</tbody></table></div>")
381
+ return "\n".join(h)
382
+
383
+
384
+ def _overall_table(cell, datasets, methods):
385
+ cm = _col_means(cell, datasets, methods)
386
+ best = {}
387
+ for key, _, _, hib in METRICS:
388
+ vals = {a: cm[a][key] for a in methods if cm[a][key] == cm[a][key]}
389
+ best[key] = ((max if hib else min)(vals, key=vals.get) if vals else None)
390
+ h = ["<div class='tw'><table class='rt'><thead><tr><th class='m'>Method</th>"
391
+ + "".join(f"<th>{lbl}{'↑' if hib else '↓'}</th>" for _, lbl, _, hib in METRICS)
392
+ + "</tr></thead><tbody>"]
393
+ for a in methods:
394
+ grp = " class='grp'" if a == "transunet" else ""
395
+ tds = [f"<td class='m'>{_ARCH_DISP.get(a, a)}</td>"]
396
+ for key, _, pct, _ in METRICS:
397
+ v = cm[a][key]
398
+ t = ("–" if v != v else (f"{v*100:.1f}" if pct else f"{v:.2f}"))
399
+ tds.append(f"<td>{'<b>'+t+'</b>' if a == best[key] else t}</td>")
400
+ h.append(f"<tr{grp}>" + "".join(tds) + "</tr>")
401
+ h.append("</tbody></table></div>")
402
+ return "\n".join(h)
403
+
404
+
405
  def _perclass_section(runs):
406
  pc = _collect_perclass(runs)
407
+ h = []
 
 
 
408
  for ds, names in _PERCLASS_NAMES.items():
409
  methods = [a for a in _ARCH_ORDER if (ds, a) in pc and pc[(ds, a)]]
410
  if not methods:
411
  continue
412
  classes = sorted(names, key=int)
413
+ colbest = {c: max((pc[(ds, a)].get(c, float('nan')) for a in methods), default=float('nan'))
414
+ for c in classes}
415
+ h.append(f"<h3>{_DS_DISP.get(ds, ds)}</h3>")
416
+ h.append("<div class='tw'><table class='rt'><thead><tr><th class='m'>Method</th>"
417
+ + "".join(f"<th>{names[c]}</th>" for c in classes) + "<th class='avg'>macro</th></tr></thead><tbody>")
 
418
  for a in methods:
419
+ grp = " class='grp'" if a == "transunet" else ""
420
+ cells, present = [], []
 
421
  for c in classes:
422
+ v = pc[(ds, a)].get(c)
423
  if v is None:
424
+ cells.append("<td>–</td>")
425
  else:
426
  present.append(v)
427
+ t = f"{v*100:.1f}"
428
+ cells.append(f"<td>{'<b>'+t+'</b>' if v == colbest[c] else t}</td>")
429
  macro = (sum(present) / len(present) * 100) if present else float("nan")
430
+ h.append(f"<tr{grp}><td class='m'>{_ARCH_DISP.get(a, a)}</td>{''.join(cells)}"
431
+ f"<td class='avg'>{macro:.1f}</td></tr>")
432
+ h.append("</tbody></table></div>")
433
  return "\n".join(h)
434
 
435
 
436
+ def _setup_html():
437
+ h = ["<h2>A. Datasets</h2>",
438
+ "<table class='info'><tr><th>#</th><th>Dataset</th><th>Modality</th><th>Target</th><th>Cls</th>"
439
+ "<th>Ch</th><th>Native size</th><th>Protocol</th><th>Train/Val/Test</th></tr>"]
440
+ for r in _DATASETS_INFO:
441
+ h.append("<tr><td>%s</td><td class='l'>%s</td><td class='l'>%s</td><td class='l'>%s</td><td>%s</td>"
442
+ "<td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>" % r)
443
+ h.append("</table>")
444
+ h.append("<div class='cap'>¹ BUSI/KiTS19 grayscale stored as 3-ch PNG (read as grayscale). "
445
+ "² no canonical split → one fixed fold (of 5) with 3 seeds; others use the official split. "
446
+ "Labels 0…C-1 (0=bg); multi-class metrics macro-averaged over foreground classes.</div>")
447
+ h.append("<h2>B. Methods</h2>")
448
+ h.append("<table class='info'><tr><th>Method</th><th>Family</th><th>Backbone / setup</th></tr>")
449
+ for m in _METHODS_INFO:
450
+ h.append("<tr><td class='l'>%s</td><td class='l'>%s</td><td class='l'>%s</td></tr>" % m)
451
+ h.append("</table>")
452
+ h.append("<h2>C. Metrics</h2>")
453
+ h.append("<table class='info'><tr><th>Metric</th><th>Definition</th><th>Dir</th><th>Unit</th>"
454
+ "<th>作用 / 含义(中文)</th></tr>")
455
+ for m in _METRICS_INFO:
456
+ h.append("<tr><td class='l'>%s</td><td class='l'>%s</td><td>%s</td><td>%s</td><td class='l'>%s</td></tr>" % m)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
457
  h.append("</table>")
458
  return "\n".join(h)
459
 
460
 
461
+ def to_html(rows, runs=None, title="SegGen benchmark", sig=None):
462
+ cell, datasets, methods = _grid(rows)
463
+ if sig is None:
464
+ sig = _sig_tied_sets(runs) if runs else None
465
+ nseeds = {r["dataset"]: r["n_seeds"] for r in rows}
466
+ h = [f"<!doctype html><html><head><meta charset='utf-8'><title>{title}</title><style>{_CSS}</style>"
467
+ "</head><body>"]
468
+ h.append(f"<h1>{title}: 8 methods × 10 datasets (unified 512, resolution-fair)</h1>")
469
+ h.append("<p>Eight 2D medical-image segmentation methods on ten public datasets (seven modalities). "
470
+ "Values are <b>mean±SD</b> over 3 seeds (over the 3 folds for PanNuke). "
471
+ "Each (dataset,method) cell aggregates tens–thousands of test images.</p>")
472
+ h.append("<div class='note'><b>Resolution-fair protocol.</b> Convolutional nets train at 512; the fixed-input "
473
+ "transformers (Swin-UNet 224, TransUNet 256) and nnU-Net/U-Mamba run at their native size; "
474
+ "<b>every prediction and ground truth is then resized to a common 512×512 before scoring</b>, so "
475
+ "boundary metrics (HD95/ASSD, in pixels) are directly comparable across methods.</div>")
476
+
477
+ h.append("<h2>1. Main results — Dice (%) ↑</h2>")
478
+ h.append("<div class='cap'><b>Bold</b> = best, or not significantly different from the best per dataset "
479
+ "(paired Wilcoxon on per-image Dice, p≥0.05). Last column = mean over the 10 datasets. "
480
+ "Horizontal rule separates CNNs (top) from Transformer / foundation models (bottom).</div>")
481
+ h.append(_metric_table(cell, datasets, methods, "dice", True, True, bold_sets=sig))
482
+
483
+ h.append("<h2>2. Boundary accuracy — HD95 (px) ↓</h2>")
484
+ h.append("<div class='cap'>95% Hausdorff distance at the common 512 resolution (lower = better; "
485
+ "<b>bold</b> = best per dataset). Now comparable across methods.</div>")
486
+ h.append(_metric_table(cell, datasets, methods, "hd95", False, False))
487
+
488
+ h.append("<h2>3. Overlap — IoU (%) ↑</h2>")
489
+ h.append("<div class='cap'>Jaccard index, the stricter overlap measure (<b>bold</b> = best per dataset). "
490
+ "Last column = mean over the 10 datasets.</div>")
491
+ h.append(_metric_table(cell, datasets, methods, "iou", True, True))
492
+
493
+ h.append("<h2>4. Overall ranking — mean over the 10 datasets</h2>")
494
+ h.append("<div class='cap'>Each method's macro-average of every metric across all datasets "
495
+ "(<b>bold</b> = best column). ↑ higher better, ↓ lower better.</div>")
496
+ h.append(_overall_table(cell, datasets, methods))
497
+
 
 
 
 
 
 
 
498
  if runs:
499
+ pcs = _perclass_section(runs)
500
+ if pcs.strip():
501
+ h.append("<h2>5. Per-class Dice (%) — multi-class datasets</h2>")
502
+ h.append("<div class='cap'>Mean per-class Dice over all test images/runs (0=background excluded; "
503
+ "<b>bold</b>=best per class). Shows which structures drive each method's macro-Dice.</div>")
504
+ h.append(pcs)
505
+
506
+ h.append("<hr><h2>Appendix — Experimental setup</h2>")
507
+ h.append("<p class='cap'>Full per-(dataset,method) values for every metric are in "
508
+ "<code>summary.csv</code>; the main Dice table as LaTeX is in <code>summary.tex</code>.</p>")
509
+ h.append(_setup_html())
510
  h.append("</body></html>")
511
  return "\n".join(h)
512
 
 
522
  print(f"no metrics.json under {args.out_root}/{args.exp_name}")
523
  return
524
  rows = summarize(runs)
525
+ sig = _sig_tied_sets(runs)
526
  base = os.path.join(args.out_root, args.exp_name)
527
  open(os.path.join(base, "summary.csv"), "w").write(to_csv(rows))
528
+ open(os.path.join(base, "summary.md"), "w").write(to_markdown(rows, sig))
529
+ open(os.path.join(base, "summary.tex"), "w").write(to_latex(rows, sig))
530
+ open(os.path.join(base, "summary.html"), "w").write(
531
+ to_html(rows, runs, title=f"SegGen benchmark ({args.exp_name})", sig=sig))
532
+ print(to_markdown(rows, sig))
533
  print(f"{len(runs)} runs -> {len(rows)} (dataset,arch) cells; written {base}/summary.{{csv,md,tex,html}}")
534
 
535
 
results/summary.html CHANGED
@@ -1,19 +1,125 @@
1
- <!doctype html><html><head><meta charset='utf-8'><title>SegGen baselines (unified512)</title><style>
2
- body{font-family:Arial,Helvetica,sans-serif;margin:24px;color:#222}
3
- h1{font-size:20px}h2{margin-top:28px;font-size:16px;color:#0a5}
4
- table{border-collapse:collapse;margin:6px 0 18px}
5
- th,td{border:1px solid #ccc;padding:5px 9px;text-align:center;font-size:12.5px}
6
- th{background:#f3f3f3}td.ds{text-align:left;font-weight:bold;background:#fafafa}
7
- td.l{text-align:left}.ov{font-size:12.5px;line-height:1.5;max-width:1100px}
8
- b{color:#0a6}.cap{color:#777;font-size:12px;margin:2px 0 14px}</style></head><body>
9
- <h1>SegGen baselines (unified512) — mean±SD</h1>
10
- <div class='cap'>Higher is better for Dice/IoU/Sens/Spec/Prec (%); lower for HD95/ASSD. <b>Bold</b>=best (highest/lowest mean) per dataset. Variance is over seeds for single-split datasets and over folds for k-fold (CV) datasets. 'seeds' column = #seeds (single-split) or #folds (CV).</div>
11
- <div class='ov'>
12
- <h2>Project overview</h2>
13
- <p>A unified benchmark of <b>8 2D medical-image segmentation methods</b> across <b>10 public datasets</b> spanning <b>7 imaging modalities</b> (endoscopy, retinal fundus, ultrasound, cardiac MRI, dermoscopy, histopathology, abdominal CT). Every method runs through one pipeline with identical metrics. Reported as <b>mean±SD</b> over <b>3 seeds</b> for fixed-split datasets and over <b>folds</b> for cross-validation datasets (PanNuke: official 3-fold). Each (dataset,method) cell aggregates ~tens–thousands of test images; the suite totals ≈20k images. Per-method efficiency (params / FLOPs / throughput) is in <code>efficiency.md</code>.</p>
14
- <p style='background:#eef7f0;border-left:3px solid #0a6;padding:8px 12px'><b>Resolution-fair evaluation (unified 512).</b> Convolutional methods are trained at 512×512; the fixed-input transformers (Swin-UNet 224, TransUNet 256) run at their native size; nnU-Net / U-Mamba predict natively. <b>For scoring, every method's prediction and the ground truth are resized to a common 512×512</b> before computing all 7 metrics — so the boundary metrics (HD95 / ASSD), which are measured in pixels, are <b>directly comparable across methods</b> regardless of each method's native working resolution. (Earlier 256-px tables mixed pixel scales and were not boundary-comparable.)</p>
15
- <h2>Datasets</h2>
16
- <table><tr><th>#</th><th>Dataset</th><th>Modality</th><th>Target</th><th>Classes</th><th>Channels</th><th>Image size</th><th>Reported protocol</th><th>Train / Val / Test</th></tr>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  <tr><td>1</td><td class='l'>CVC-ClinicDB</td><td class='l'>Colonoscopy (endoscopy)</td><td class='l'>Polyp</td><td>2</td><td>RGB</td><td>384×288</td><td>official</td><td>490 / 61 / 61</td></tr>
18
  <tr><td>2</td><td class='l'>Kvasir-SEG</td><td class='l'>GI endoscopy</td><td class='l'>Polyp</td><td>2</td><td>RGB</td><td>~622×529 (var)</td><td>official</td><td>800 / 100 / 100</td></tr>
19
  <tr><td>3</td><td class='l'>FIVES</td><td class='l'>Retinal fundus</td><td class='l'>Vessel</td><td>2</td><td>RGB</td><td>2048×2048</td><td>official</td><td>480 / 120 / 200</td></tr>
@@ -25,185 +131,26 @@ b{color:#0a6}.cap{color:#777;font-size:12px;margin:2px 0 14px}</style></head><bo
25
  <tr><td>9</td><td class='l'>ISIC2018</td><td class='l'>Dermoscopy</td><td class='l'>Skin lesion</td><td>2</td><td>RGB</td><td>256×256</td><td>holdout</td><td>2582 / 369 / 737</td></tr>
26
  <tr><td>10</td><td class='l'>KiTS19</td><td class='l'>Kidney CT (2D slices)</td><td class='l'>Kidney (binary)</td><td>2</td><td>grayscale¹</td><td>256×256</td><td>single-split²</td><td>2832 / 479 / 705</td></tr>
27
  </table>
28
- <div class='cap'>¹ BUSI/KiTS19 are grayscale in content but stored as 3-channel PNG — read as grayscale. ² BUSI/KiTS19 have no canonical split, so one fixed fold (of a 5-fold partition) is reported with 3 seeds; datasets with an official split use it. Mask labels are 0…C-1 (0=background); multi-class metrics are macro-averaged over foreground classes.</div>
29
- <h2>Segmentation methods</h2>
30
- <table><tr><th>Method</th><th>Family</th><th>Backbone / setup</th></tr>
31
- <tr><td class='l'>UNet</td><td class='l'>CNN encoder–decoder</td><td class='l'>SMP, ResNet-50 encoder (ImageNet-pretrained)</td></tr>
32
  <tr><td class='l'>UNet++</td><td class='l'>Nested UNet</td><td class='l'>SMP, ResNet-50 (ImageNet)</td></tr>
33
  <tr><td class='l'>DeepLabV3+</td><td class='l'>Atrous CNN</td><td class='l'>SMP, ResNet-50 (ImageNet)</td></tr>
34
- <tr><td class='l'>Attention-UNet</td><td class='l'>Attention-gated UNet</td><td class='l'>Re-implemented, trained from scratch</td></tr>
35
- <tr><td class='l'>TransUNet</td><td class='l'>CNN–Transformer hybrid</td><td class='l'>R50-ViT-B/16 (ImageNet-pretrained)</td></tr>
36
- <tr><td class='l'>Swin-UNet</td><td class='l'>Pure-Transformer UNet</td><td class='l'>Swin-Tiny (ImageNet-pretrained)</td></tr>
37
  <tr><td class='l'>nnU-Net (v2)</td><td class='l'>Self-configuring CNN</td><td class='l'>2D config, 250 epochs</td></tr>
38
  <tr><td class='l'>U-Mamba</td><td class='l'>State-space (Mamba) UNet</td><td class='l'>U-Mamba_Bot, 100 epochs</td></tr>
39
  </table>
40
- <h2>Evaluation metrics</h2>
41
- <table><tr><th>Metric</th><th>Definition</th><th>Direction</th><th>Unit</th><th>作用 / 含义(中文)</th></tr>
42
- <tr><td class='l'>Dice (DSC)</td><td class='l'>2·|P∩G| / (|P|+|G|) = 2TP / (2TP+FP+FN)</td><td>↑ higher</td><td>%</td><td class='l'>区域重叠度(分割主指标);对类别不平衡较鲁棒,综合反映分割整体准确度。</td></tr>
43
- <tr><td class='l'>IoU (Jaccard)</td><td class='l'>|P∩G| / |P∪G| = TP / (TP+FP+FN)</td><td>↑ higher</td><td>%</td><td class='l'>交并比,同样衡量区域重叠但更严格(对错误惩罚更重),常与 Dice 并列报告。</td></tr>
44
- <tr><td class='l'>Sensitivity / Recall</td><td class='l'>TP / (TP+FN)</td><td>↑ higher</td><td>%</td><td class='l'>召回率/敏感度:真值前景中被正确分出的比例,反映“漏检/漏分割”程度(越高漏得越少)。</td></tr>
45
- <tr><td class='l'>Specificity</td><td class='l'>TN / (TN+FP) (pixel-level, one-vs-rest)</td><td>↑ higher</td><td>%</td><td class='l'>特异度:真值背景中被正确判为背景的比例,反映对背景区域的误报控制能力。</td></tr>
46
- <tr><td class='l'>Precision</td><td class='l'>TP / (TP+FP)</td><td>↑ higher</td><td>%</td><td class='l'>精确率:预测为前景的像素中真正属于前景的比例,反映“过分割/误报”程度(越高误分越少)。</td></tr>
47
- <tr><td class='l'>HD95</td><td class='l'>95th-percentile Hausdorff distance between predicted & GT boundaries</td><td>↓ lower</td><td>pixels</td><td class='l'>边界距离:预测与真值轮廓间偏差的 95% 分位 Hausdorff 距离,衡量最大边界误差(取95%分位以抑制离群点),越小边界越贴合。</td></tr>
48
- <tr><td class='l'>ASSD</td><td class='l'>Average symmetric surface distance between boundaries</td><td>↓ lower</td><td>pixels</td><td class='l'>平均对称表面距离:两条轮廓间双向平均距离,衡量整体边界吻合度,越小边界越准。</td></tr>
49
- </table>
50
- <p style='font-size:12.5px'>P = predicted foreground, G = ground-truth foreground; TP/FP/FN/TN are pixel counts. Overlap metrics (Dice/IoU/Sens/Spec/Prec) are exact pixel computations; boundary metrics (HD95/ASSD) are computed with MONAI on the mask edges.</p>
51
- <h2>Evaluation protocol</h2>
52
- <p>For each test image, every metric is computed <b>per foreground class</b> (background excluded) and macro-averaged over the classes present; classes absent in <i>both</i> prediction and ground truth are skipped so they do not dilute the score. Per-image values are averaged to one score per (dataset, method, run); we then report <b>mean±SD across runs</b> — 3 random seeds for fixed-split datasets, or across folds for CV datasets. For surface metrics, an empty–empty (no foreground in either) pair scores 0, while empty-vs-non-empty is undefined (NaN) and excluded from the average. All methods share the same held-out test images per dataset, so comparisons are paired.</p>
53
- <hr style='margin:18px 0;border:none;border-top:1px solid #ddd'>
54
- </div>
55
- <h1 style='font-size:18px'>Results</h1>
56
- <h2>Dice (%)</h2>
57
- <table><tr><th>Dataset</th><th>unet</th><th>unetpp</th><th>deeplabv3plus</th><th>attention_unet</th><th>transunet</th><th>swinunet</th><th>nnunet</th><th>umamba</th><th>seeds</th></tr>
58
- <tr><td class='ds'>acdc_png/official</td><td>77.78±0.39</td><td><b>79.75±0.57</b></td><td>78.33±0.49</td><td>74.57±0.15</td><td>79.46±0.44</td><td>71.26±1.36</td><td>73.81±0.38</td><td>68.68±0.89</td><td>3</td></tr>
59
- <tr><td class='ds'>busi/single-split</td><td>72.76±2.47</td><td>74.67±0.68</td><td>76.12±1.20</td><td>65.98±1.11</td><td><b>76.53±1.65</b></td><td>76.00±0.94</td><td>75.39±1.35</td><td>73.73±0.35</td><td>3</td></tr>
60
- <tr><td class='ds'>cvc_clinicdb/official</td><td><b>94.49±0.14</b></td><td>93.92±0.51</td><td>93.83±0.42</td><td>91.73±0.33</td><td>94.29±0.31</td><td>92.72±0.33</td><td>94.24±0.64</td><td>92.98±0.55</td><td>3</td></tr>
61
- <tr><td class='ds'>fives/official</td><td>86.81±0.08</td><td>86.77±0.80</td><td>80.97±0.30</td><td>85.64±0.20</td><td>73.10±0.84</td><td>68.78±0.18</td><td><b>89.00±0.35</b></td><td>82.68±1.21</td><td>3</td></tr>
62
- <tr><td class='ds'>idridd_segmentation/official</td><td>49.75±0.65</td><td>50.52±2.11</td><td>49.34±0.48</td><td>44.65±0.61</td><td>25.66±3.11</td><td>20.95±15.57</td><td>64.64±0.11</td><td><b>64.64±0.10</b></td><td>3</td></tr>
63
- <tr><td class='ds'>kvasir_seg/official</td><td>88.41±0.54</td><td>87.88±0.19</td><td>90.39±0.47</td><td>87.58±0.11</td><td>90.76±0.37</td><td>90.15±0.62</td><td>90.44±0.88</td><td><b>91.23±0.14</b></td><td>3</td></tr>
64
- <tr><td class='ds'>medsegdb_isic2018/holdout</td><td>90.08±0.12</td><td>89.92±0.06</td><td>90.68±0.10</td><td>88.57±0.25</td><td>90.83±0.27</td><td><b>91.04±0.14</b></td><td>90.20±0.14</td><td>90.22±0.21</td><td>3</td></tr>
65
- <tr><td class='ds'>medsegdb_kits19/single-split</td><td>74.59±5.62</td><td>72.19±3.00</td><td><b>78.70±1.34</b></td><td>64.74±1.44</td><td>76.82±0.93</td><td>63.42±2.92</td><td>70.44±1.93</td><td>72.41±1.03</td><td>3</td></tr>
66
- <tr><td class='ds'>pannuke_semantic/3-fold</td><td>49.85±0.33</td><td>50.01±0.13</td><td>52.35±0.35</td><td>45.87±0.39</td><td>53.60±0.35</td><td><b>54.34±0.42</b></td><td>47.82±0.55</td><td>49.40±0.51</td><td>3</td></tr>
67
- <tr><td class='ds'>refuge2/official</td><td>84.76±0.89</td><td><b>86.66±1.10</b></td><td>84.26±0.94</td><td>75.49±4.01</td><td>76.90±1.37</td><td>80.95±4.15</td><td>85.55±0.23</td><td>82.42±1.25</td><td>3</td></tr>
68
- </table>
69
- <h2>IoU (%)</h2>
70
- <table><tr><th>Dataset</th><th>unet</th><th>unetpp</th><th>deeplabv3plus</th><th>attention_unet</th><th>transunet</th><th>swinunet</th><th>nnunet</th><th>umamba</th><th>seeds</th></tr>
71
- <tr><td class='ds'>acdc_png/official</td><td>70.36±0.40</td><td><b>72.56±0.81</b></td><td>70.80±0.43</td><td>66.90±0.47</td><td>71.08±0.70</td><td>62.36±1.35</td><td>66.98±0.35</td><td>61.82±0.88</td><td>3</td></tr>
72
- <tr><td class='ds'>busi/single-split</td><td>64.44±2.32</td><td>66.19±0.61</td><td>67.48±1.21</td><td>57.34±0.92</td><td><b>68.44±1.56</b></td><td>67.46±0.68</td><td>67.68±1.22</td><td>65.57±0.50</td><td>3</td></tr>
73
- <tr><td class='ds'>cvc_clinicdb/official</td><td><b>89.91±0.20</b></td><td>89.42±0.61</td><td>89.12±0.42</td><td>86.04±0.51</td><td>89.62±0.41</td><td>87.03±0.35</td><td>89.69±0.75</td><td>87.93±0.81</td><td>3</td></tr>
74
- <tr><td class='ds'>fives/official</td><td>78.13±0.07</td><td>77.97±1.27</td><td>69.44±0.34</td><td>76.20±0.22</td><td>58.44±1.10</td><td>53.20±0.10</td><td><b>82.66±0.21</b></td><td>74.13±1.87</td><td>3</td></tr>
75
- <tr><td class='ds'>idridd_segmentation/official</td><td>41.31±0.60</td><td>41.58±1.32</td><td>39.78±0.37</td><td>36.58±0.44</td><td>22.79±2.25</td><td>17.08±12.51</td><td>52.93±0.04</td><td><b>53.04±0.09</b></td><td>3</td></tr>
76
- <tr><td class='ds'>kvasir_seg/official</td><td>82.98±0.38</td><td>82.32±0.25</td><td>84.62±0.60</td><td>80.22±0.22</td><td>85.28±0.29</td><td>84.10±0.69</td><td>84.42±1.19</td><td><b>85.29±0.14</b></td><td>3</td></tr>
77
- <tr><td class='ds'>medsegdb_isic2018/holdout</td><td>83.65±0.10</td><td>83.46±0.03</td><td>84.40±0.15</td><td>81.64±0.30</td><td>84.53±0.37</td><td><b>84.89±0.21</b></td><td>83.97±0.18</td><td>83.98±0.22</td><td>3</td></tr>
78
- <tr><td class='ds'>medsegdb_kits19/single-split</td><td>67.10±5.84</td><td>64.12±3.25</td><td><b>70.91±1.74</b></td><td>56.30±2.10</td><td>69.11±1.04</td><td>55.87±2.86</td><td>63.29±1.50</td><td>65.00±1.11</td><td>3</td></tr>
79
- <tr><td class='ds'>pannuke_semantic/3-fold</td><td>40.50±0.35</td><td>40.65±0.20</td><td>42.54±0.38</td><td>36.95±0.34</td><td>43.82±0.20</td><td><b>44.11±0.34</b></td><td>38.39±0.50</td><td>40.01±0.51</td><td>3</td></tr>
80
- <tr><td class='ds'>refuge2/official</td><td>74.31±1.24</td><td><b>77.11±1.72</b></td><td>73.60±1.40</td><td>63.91±3.95</td><td>64.73±1.36</td><td>68.98±5.52</td><td>75.57±0.31</td><td>71.20±1.97</td><td>3</td></tr>
81
- </table>
82
- <h2>HD95 (lower=better)</h2>
83
- <table><tr><th>Dataset</th><th>unet</th><th>unetpp</th><th>deeplabv3plus</th><th>attention_unet</th><th>transunet</th><th>swinunet</th><th>nnunet</th><th>umamba</th><th>seeds</th></tr>
84
- <tr><td class='ds'>acdc_png/official</td><td>17.91±1.55</td><td>16.63±3.75</td><td>15.79±0.90</td><td>27.13±2.50</td><td><b>15.64±1.75</b></td><td>15.85±0.56</td><td>16.93±0.70</td><td>21.79±1.16</td><td>3</td></tr>
85
- <tr><td class='ds'>busi/single-split</td><td>70.02±7.49</td><td>62.67±0.86</td><td>53.29±0.90</td><td>98.10±5.07</td><td><b>43.79±1.43</b></td><td>51.91±2.96</td><td>49.83±1.37</td><td>60.19±3.74</td><td>3</td></tr>
86
- <tr><td class='ds'>cvc_clinicdb/official</td><td>19.46±0.53</td><td><b>19.28±3.15</b></td><td>21.19±0.33</td><td>45.21±6.77</td><td>19.53±0.69</td><td>22.70±1.25</td><td>22.37±1.75</td><td>22.80±2.25</td><td>3</td></tr>
87
- <tr><td class='ds'>fives/official</td><td>12.21±0.68</td><td><b>11.60±0.43</b></td><td>17.02±0.93</td><td>13.82±2.13</td><td>22.64±0.42</td><td>29.64±2.19</td><td>14.76±1.05</td><td>28.66±1.08</td><td>3</td></tr>
88
- <tr><td class='ds'>idridd_segmentation/official</td><td>68.00±0.38</td><td>77.61±8.63</td><td>87.84±3.82</td><td>75.44±4.17</td><td>86.98±29.21</td><td>89.66±13.40</td><td>67.25±2.79</td><td><b>64.19±1.12</b></td><td>3</td></tr>
89
- <tr><td class='ds'>kvasir_seg/official</td><td>39.96±3.32</td><td>41.23±2.76</td><td>38.27±3.50</td><td>63.80±1.73</td><td><b>31.81±1.27</b></td><td>34.84±0.81</td><td>38.85±5.15</td><td>37.78±1.17</td><td>3</td></tr>
90
- <tr><td class='ds'>medsegdb_isic2018/holdout</td><td>34.82±1.57</td><td>34.66±0.03</td><td>30.76±0.28</td><td>46.32±2.81</td><td>28.21±0.86</td><td><b>26.72±0.58</b></td><td>30.38±0.42</td><td>29.95±0.87</td><td>3</td></tr>
91
- <tr><td class='ds'>medsegdb_kits19/single-split</td><td>39.79±6.37</td><td>46.19±1.36</td><td><b>36.29±1.75</b></td><td>50.10±0.65</td><td>41.37±2.53</td><td>52.42±1.11</td><td>39.19±0.93</td><td>38.55±2.43</td><td>3</td></tr>
92
- <tr><td class='ds'>pannuke_semantic/3-fold</td><td>140.39±1.84</td><td>140.91±2.40</td><td>136.89±1.88</td><td>146.04±3.87</td><td>134.40±1.48</td><td><b>132.62±0.94</b></td><td>147.16±1.97</td><td>142.36±1.82</td><td>3</td></tr>
93
- <tr><td class='ds'>refuge2/official</td><td>17.13±1.77</td><td>16.78±8.92</td><td>8.93±0.64</td><td>23.03±10.16</td><td>9.24±0.48</td><td>17.42±4.99</td><td><b>6.36±1.11</b></td><td>7.23±0.47</td><td>3</td></tr>
94
- </table>
95
- <h2>ASSD (lower=better)</h2>
96
- <table><tr><th>Dataset</th><th>unet</th><th>unetpp</th><th>deeplabv3plus</th><th>attention_unet</th><th>transunet</th><th>swinunet</th><th>nnunet</th><th>umamba</th><th>seeds</th></tr>
97
- <tr><td class='ds'>acdc_png/official</td><td>4.29±0.19</td><td><b>3.89±0.42</b></td><td>3.96±0.20</td><td>6.64±0.60</td><td>4.29±0.25</td><td>5.25±0.23</td><td>6.73±0.40</td><td>11.22±1.22</td><td>3</td></tr>
98
- <tr><td class='ds'>busi/single-split</td><td>24.70±4.36</td><td>18.90±1.26</td><td>17.36±0.79</td><td>34.20±1.08</td><td><b>14.88±0.85</b></td><td>17.56±0.21</td><td>15.63±0.67</td><td>20.37±1.68</td><td>3</td></tr>
99
- <tr><td class='ds'>cvc_clinicdb/official</td><td><b>4.05±0.04</b></td><td>4.23±0.76</td><td>4.42±0.11</td><td>9.76±1.90</td><td>4.26±0.23</td><td>4.99±0.22</td><td>5.23±0.60</td><td>4.99±0.30</td><td>3</td></tr>
100
- <tr><td class='ds'>fives/official</td><td>2.79±0.35</td><td><b>2.61±0.10</b></td><td>3.82±0.33</td><td>2.84±0.27</td><td>4.07±0.22</td><td>5.26±0.71</td><td>3.31±0.11</td><td>5.12±0.23</td><td>3</td></tr>
101
- <tr><td class='ds'>idridd_segmentation/official</td><td>14.87±0.84</td><td>18.99±2.70</td><td>24.05±2.07</td><td>18.07±1.24</td><td>31.60±9.41</td><td>27.12±4.24</td><td>14.39±0.41</td><td><b>11.88±0.76</b></td><td>3</td></tr>
102
- <tr><td class='ds'>kvasir_seg/official</td><td>10.44±1.04</td><td>10.75±0.76</td><td>9.24±0.59</td><td>13.54±0.38</td><td><b>8.13±0.45</b></td><td>9.03±0.74</td><td>9.34±1.11</td><td>8.85±0.16</td><td>3</td></tr>
103
- <tr><td class='ds'>medsegdb_isic2018/holdout</td><td>11.64±0.26</td><td>11.58±0.09</td><td>10.54±0.16</td><td>15.07±0.79</td><td>10.36±0.30</td><td><b>9.85±0.16</b></td><td>11.62±0.16</td><td>11.51±0.48</td><td>3</td></tr>
104
- <tr><td class='ds'>medsegdb_kits19/single-split</td><td><b>12.45±2.46</b></td><td>13.69±0.81</td><td>14.49±0.75</td><td>16.36±0.51</td><td>17.79±1.51</td><td>27.15±1.89</td><td>18.90±1.27</td><td>20.21±2.64</td><td>3</td></tr>
105
- <tr><td class='ds'>pannuke_semantic/3-fold</td><td>40.59±0.81</td><td>40.58±0.36</td><td>38.90±0.80</td><td>41.79±1.35</td><td><b>37.35±0.11</b></td><td>37.48±0.61</td><td>44.45±0.13</td><td>42.08±0.67</td><td>3</td></tr>
106
- <tr><td class='ds'>refuge2/official</td><td>4.72±0.76</td><td>3.64±0.97</td><td>3.34±0.18</td><td>8.58±5.22</td><td>3.61±0.10</td><td>4.47±1.14</td><td><b>2.51±0.08</b></td><td>3.09±0.23</td><td>3</td></tr>
107
- </table>
108
- <h2>Sens (%)</h2>
109
- <table><tr><th>Dataset</th><th>unet</th><th>unetpp</th><th>deeplabv3plus</th><th>attention_unet</th><th>transunet</th><th>swinunet</th><th>nnunet</th><th>umamba</th><th>seeds</th></tr>
110
- <tr><td class='ds'>acdc_png/official</td><td>78.65±0.41</td><td><b>80.79±0.63</b></td><td>78.56±0.34</td><td>75.24±0.28</td><td>80.68±1.27</td><td>71.35±1.76</td><td>73.28±0.55</td><td>67.83±0.65</td><td>3</td></tr>
111
- <tr><td class='ds'>busi/single-split</td><td>77.53±1.43</td><td>76.45±1.52</td><td>77.79±1.07</td><td>68.44±1.30</td><td>76.77±2.13</td><td><b>79.00±0.64</b></td><td>77.32±1.17</td><td>76.05±0.47</td><td>3</td></tr>
112
- <tr><td class='ds'>cvc_clinicdb/official</td><td>93.84±0.18</td><td>93.42±0.62</td><td>93.24±0.49</td><td>91.61±0.58</td><td><b>94.74±0.75</b></td><td>93.13±1.08</td><td>93.83±0.55</td><td>91.93±0.53</td><td>3</td></tr>
113
- <tr><td class='ds'>fives/official</td><td>85.48±0.10</td><td>85.32±0.79</td><td>81.56±0.18</td><td>84.98±0.29</td><td>71.89±0.77</td><td>70.22±0.92</td><td><b>89.65±0.59</b></td><td>89.24±0.19</td><td>3</td></tr>
114
- <tr><td class='ds'>idridd_segmentation/official</td><td>48.47±1.40</td><td>48.91±1.24</td><td>46.76±0.52</td><td>45.22±0.63</td><td>26.27±2.73</td><td>21.93±16.29</td><td>65.23±0.50</td><td><b>65.39±0.15</b></td><td>3</td></tr>
115
- <tr><td class='ds'>kvasir_seg/official</td><td>87.96±0.61</td><td>87.27±0.34</td><td>90.26±0.31</td><td>87.79±0.30</td><td>90.93±0.58</td><td>89.69±0.38</td><td>91.23±0.65</td><td><b>91.53±0.04</b></td><td>3</td></tr>
116
- <tr><td class='ds'>medsegdb_isic2018/holdout</td><td>91.23±0.39</td><td>90.87±0.27</td><td>91.46±0.47</td><td>89.45±0.32</td><td>91.87±1.33</td><td>91.60±0.25</td><td><b>92.34±0.12</b></td><td>92.32±0.15</td><td>3</td></tr>
117
- <tr><td class='ds'>medsegdb_kits19/single-split</td><td>76.36±4.84</td><td>73.91±3.85</td><td>79.33±1.99</td><td>64.87±2.73</td><td><b>79.55±1.61</b></td><td>65.11±4.13</td><td>68.80±1.89</td><td>70.16±1.49</td><td>3</td></tr>
118
- <tr><td class='ds'>pannuke_semantic/3-fold</td><td>50.72±0.24</td><td>50.79±0.46</td><td>53.30±0.34</td><td>47.19±0.83</td><td>55.87±0.22</td><td><b>56.75±0.60</b></td><td>48.82±0.48</td><td>50.81±0.59</td><td>3</td></tr>
119
- <tr><td class='ds'>refuge2/official</td><td><b>91.06±0.81</b></td><td>88.88±0.23</td><td>87.53±1.41</td><td>78.22±6.52</td><td>72.98±2.95</td><td>87.62±1.11</td><td>90.46±0.32</td><td>88.34±0.75</td><td>3</td></tr>
120
- </table>
121
- <h2>Spec (%)</h2>
122
- <table><tr><th>Dataset</th><th>unet</th><th>unetpp</th><th>deeplabv3plus</th><th>attention_unet</th><th>transunet</th><th>swinunet</th><th>nnunet</th><th>umamba</th><th>seeds</th></tr>
123
- <tr><td class='ds'>acdc_png/official</td><td>99.85±0.02</td><td>99.86±0.02</td><td>99.87±0.01</td><td>99.85±0.01</td><td>99.84±0.01</td><td>99.81±0.01</td><td><b>99.88±0.01</b></td><td>99.85±0.02</td><td>3</td></tr>
124
- <tr><td class='ds'>busi/single-split</td><td>97.64±0.70</td><td>98.25±0.25</td><td><b>98.29±0.19</b></td><td>98.12±0.24</td><td>98.25±0.20</td><td>97.89±0.41</td><td>98.11±0.15</td><td>97.89±0.08</td><td>3</td></tr>
125
- <tr><td class='ds'>cvc_clinicdb/official</td><td>99.46±0.02</td><td>99.44±0.02</td><td>99.45±0.04</td><td>99.30±0.07</td><td>99.41±0.08</td><td>99.28±0.12</td><td><b>99.53±0.02</b></td><td>99.52±0.03</td><td>3</td></tr>
126
- <tr><td class='ds'>fives/official</td><td><b>98.29±0.01</b></td><td>98.28±0.08</td><td>96.91±0.45</td><td>98.14±0.04</td><td>97.09±0.32</td><td>96.24±0.42</td><td>97.81±0.43</td><td>97.12±0.19</td><td>3</td></tr>
127
- <tr><td class='ds'>idridd_segmentation/official</td><td>99.86±0.01</td><td>99.87±0.01</td><td>99.84±0.00</td><td>99.76±0.01</td><td><b>99.89±0.02</b></td><td>99.83±0.13</td><td>99.87±0.01</td><td>99.86±0.00</td><td>3</td></tr>
128
- <tr><td class='ds'>kvasir_seg/official</td><td>99.02±0.15</td><td><b>99.07±0.14</b></td><td>99.04±0.17</td><td>98.43±0.06</td><td>98.93±0.06</td><td>98.92±0.12</td><td>98.42±0.46</td><td>98.76±0.10</td><td>3</td></tr>
129
- <tr><td class='ds'>medsegdb_isic2018/holdout</td><td>97.11±0.12</td><td>97.20±0.11</td><td>97.22±0.10</td><td>97.23±0.22</td><td><b>97.30±0.72</b></td><td>97.26±0.17</td><td>95.92±0.14</td><td>96.16±0.24</td><td>3</td></tr>
130
- <tr><td class='ds'>medsegdb_kits19/single-split</td><td>99.84±0.01</td><td>99.85±0.02</td><td>99.86±0.01</td><td>99.86±0.02</td><td>99.85±0.03</td><td>99.83±0.03</td><td><b>99.91±0.00</b></td><td>99.90±0.03</td><td>3</td></tr>
131
- <tr><td class='ds'>pannuke_semantic/3-fold</td><td><b>98.00±0.02</b></td><td>97.98±0.04</td><td>97.88±0.07</td><td>97.97±0.08</td><td>97.63±0.02</td><td>97.55±0.11</td><td>97.77±0.03</td><td>97.74±0.08</td><td>3</td></tr>
132
- <tr><td class='ds'>refuge2/official</td><td>99.84±0.04</td><td>99.89±0.00</td><td>99.88±0.01</td><td>99.87±0.04</td><td><b>99.92±0.01</b></td><td>99.80±0.08</td><td>99.87±0.00</td><td>99.85±0.02</td><td>3</td></tr>
133
- </table>
134
- <h2>Prec (%)</h2>
135
- <table><tr><th>Dataset</th><th>unet</th><th>unetpp</th><th>deeplabv3plus</th><th>attention_unet</th><th>transunet</th><th>swinunet</th><th>nnunet</th><th>umamba</th><th>seeds</th></tr>
136
- <tr><td class='ds'>acdc_png/official</td><td>79.84±0.63</td><td><b>81.01±1.05</b></td><td>80.77±0.91</td><td>77.92±0.36</td><td>80.96±0.52</td><td>75.09±0.66</td><td>78.40±0.17</td><td>73.46±0.58</td><td>3</td></tr>
137
- <tr><td class='ds'>busi/single-split</td><td>74.59±5.01</td><td>78.73±0.53</td><td>80.23±2.16</td><td>71.35±2.12</td><td><b>81.18±0.95</b></td><td>78.71±2.19</td><td>77.75±1.08</td><td>76.75±0.65</td><td>3</td></tr>
138
- <tr><td class='ds'>cvc_clinicdb/official</td><td><b>95.75±0.01</b></td><td>95.12±0.55</td><td>95.45±0.18</td><td>93.39±0.29</td><td>94.49±1.09</td><td>93.09±0.66</td><td>95.29±0.44</td><td>95.30±0.38</td><td>3</td></tr>
139
- <tr><td class='ds'>fives/official</td><td>89.69±0.27</td><td>89.89±0.67</td><td>82.82±0.47</td><td>88.02±0.39</td><td>76.28±2.66</td><td>69.31±1.44</td><td><b>90.81±0.72</b></td><td>80.56±2.18</td><td>3</td></tr>
140
- <tr><td class='ds'>idridd_segmentation/official</td><td>53.82±0.67</td><td>55.73±3.66</td><td>56.89±0.64</td><td>47.45±1.40</td><td>27.52±4.62</td><td>22.02±16.14</td><td><b>67.53±0.18</b></td><td>67.37±0.02</td><td>3</td></tr>
141
- <tr><td class='ds'>kvasir_seg/official</td><td>91.95±1.48</td><td>92.14±0.90</td><td><b>93.38±0.91</b></td><td>90.60±0.12</td><td>92.63±0.36</td><td>93.15±0.43</td><td>92.06±1.07</td><td>92.84±0.24</td><td>3</td></tr>
142
- <tr><td class='ds'>medsegdb_isic2018/holdout</td><td>91.72±0.28</td><td>91.90±0.41</td><td>92.47±0.40</td><td>90.98±0.63</td><td>92.34±1.62</td><td><b>92.94±0.21</b></td><td>91.29±0.29</td><td>91.27±0.17</td><td>3</td></tr>
143
- <tr><td class='ds'>medsegdb_kits19/single-split</td><td>78.34±4.37</td><td>77.43±1.77</td><td><b>82.33±0.20</b></td><td>74.88±1.60</td><td>77.89±1.41</td><td>66.14±1.56</td><td>75.57±1.49</td><td>78.36±0.33</td><td>3</td></tr>
144
- <tr><td class='ds'>pannuke_semantic/3-fold</td><td>53.64±0.56</td><td>54.27±0.67</td><td>56.62±0.74</td><td>50.02±0.28</td><td>56.60±0.56</td><td><b>56.94±0.64</b></td><td>52.25±0.56</td><td>53.87±0.41</td><td>3</td></tr>
145
- <tr><td class='ds'>refuge2/official</td><td>80.96±1.86</td><td>86.19±1.66</td><td>83.72±1.73</td><td>79.57±0.70</td><td><b>86.82±1.00</b></td><td>77.35±6.97</td><td>82.64±0.20</td><td>79.69±2.64</td><td>3</td></tr>
146
- </table>
147
- <hr style='margin:22px 0;border:none;border-top:2px solid #0a6'>
148
- <h1 style='font-size:18px'>Per-class Dice — multi-class datasets</h1>
149
- <div class='cap'>Mean per-class Dice (%) over all test images and all runs (0=background excluded). Reveals which structures/types drive a method's macro-Dice. Class names follow each dataset's standard labelling (IDRiD: MA=microaneurysm, exudates hard/soft, optic disc).</div>
150
- <h2>acdc_png</h2>
151
- <table><tr><th>Method</th><th>RV</th><th>Myocardium</th><th>LV</th><th>macro</th></tr>
152
- <tr><td class='l'>unet</td><td>75.3</td><td>78.3</td><td>83.9</td><td>79.2</td></tr>
153
- <tr><td class='l'>unetpp</td><td><b>78.3</b></td><td><b>79.7</b></td><td><b>86.0</b></td><td>81.3</td></tr>
154
- <tr><td class='l'>deeplabv3plus</td><td>75.8</td><td>78.6</td><td>84.7</td><td>79.7</td></tr>
155
- <tr><td class='l'>attention_unet</td><td>70.6</td><td>75.1</td><td>82.0</td><td>75.9</td></tr>
156
- <tr><td class='l'>transunet</td><td>75.7</td><td>79.2</td><td>85.6</td><td>80.2</td></tr>
157
- <tr><td class='l'>swinunet</td><td>64.8</td><td>71.5</td><td>80.6</td><td>72.3</td></tr>
158
- <tr><td class='l'>nnunet</td><td>65.0</td><td>77.5</td><td>82.4</td><td>75.0</td></tr>
159
- <tr><td class='l'>umamba</td><td>56.4</td><td>72.9</td><td>78.8</td><td>69.4</td></tr>
160
- </table>
161
- <h2>refuge2</h2>
162
- <table><tr><th>Method</th><th>Optic Disc</th><th>Optic Cup</th><th>macro</th></tr>
163
- <tr><td class='l'>unet</td><td>85.5</td><td>84.0</td><td>84.8</td></tr>
164
- <tr><td class='l'>unetpp</td><td><b>87.0</b></td><td><b>86.4</b></td><td>86.7</td></tr>
165
- <tr><td class='l'>deeplabv3plus</td><td>84.4</td><td>84.2</td><td>84.3</td></tr>
166
- <tr><td class='l'>attention_unet</td><td>74.5</td><td>76.4</td><td>75.5</td></tr>
167
- <tr><td class='l'>transunet</td><td>75.7</td><td>78.1</td><td>76.9</td></tr>
168
- <tr><td class='l'>swinunet</td><td>81.1</td><td>80.8</td><td>80.9</td></tr>
169
- <tr><td class='l'>nnunet</td><td>86.8</td><td>84.3</td><td>85.5</td></tr>
170
- <tr><td class='l'>umamba</td><td>83.7</td><td>81.2</td><td>82.4</td></tr>
171
- </table>
172
- <h2>idridd_segmentation</h2>
173
- <table><tr><th>Method</th><th>MA</th><th>Haemorrhage</th><th>Hard Exudate</th><th>Soft Exudate</th><th>Optic Disc</th><th>macro</th></tr>
174
- <tr><td class='l'>unet</td><td>0.0</td><td>49.9</td><td>56.6</td><td><b>45.3</b></td><td>96.1</td><td>49.6</td></tr>
175
- <tr><td class='l'>unetpp</td><td>6.5</td><td>51.2</td><td>57.2</td><td>39.5</td><td><b>96.2</b></td><td>50.1</td></tr>
176
- <tr><td class='l'>deeplabv3plus</td><td>10.9</td><td>48.3</td><td>50.0</td><td>39.8</td><td>95.2</td><td>48.8</td></tr>
177
- <tr><td class='l'>attention_unet</td><td>0.0</td><td>43.2</td><td>54.8</td><td>29.6</td><td>94.2</td><td>44.4</td></tr>
178
- <tr><td class='l'>transunet</td><td>0.0</td><td>21.2</td><td>0.0</td><td>2.2</td><td>93.6</td><td>23.4</td></tr>
179
- <tr><td class='l'>swinunet</td><td>0.0</td><td>9.8</td><td>20.9</td><td>11.1</td><td>60.2</td><td>20.4</td></tr>
180
- <tr><td class='l'>nnunet</td><td>50.5</td><td>60.6</td><td>70.6</td><td>39.4</td><td>95.8</td><td>63.4</td></tr>
181
- <tr><td class='l'>umamba</td><td><b>50.6</b></td><td><b>61.7</b></td><td><b>71.6</b></td><td>36.7</td><td>95.9</td><td>63.3</td></tr>
182
- </table>
183
- <h2>pannuke_semantic</h2>
184
- <table><tr><th>Method</th><th>Neoplastic</th><th>Inflammatory</th><th>Connective</th><th>Dead</th><th>Epithelial</th><th>macro</th></tr>
185
- <tr><td class='l'>unet</td><td>57.5</td><td>38.2</td><td>45.9</td><td>11.9</td><td>44.2</td><td>39.6</td></tr>
186
- <tr><td class='l'>unetpp</td><td>56.2</td><td>38.4</td><td>46.1</td><td>9.9</td><td>47.6</td><td>39.6</td></tr>
187
- <tr><td class='l'>deeplabv3plus</td><td>64.3</td><td>38.0</td><td>45.8</td><td>14.5</td><td>57.1</td><td>44.0</td></tr>
188
- <tr><td class='l'>attention_unet</td><td>52.0</td><td>38.0</td><td>44.9</td><td>6.9</td><td>30.8</td><td>34.5</td></tr>
189
- <tr><td class='l'>transunet</td><td>65.6</td><td>38.8</td><td>47.0</td><td>11.9</td><td>59.4</td><td>44.5</td></tr>
190
- <tr><td class='l'>swinunet</td><td><b>66.5</b></td><td><b>39.5</b></td><td><b>47.5</b></td><td><b>17.1</b></td><td><b>62.4</b></td><td>46.6</td></tr>
191
- <tr><td class='l'>nnunet</td><td>59.8</td><td>33.8</td><td>42.5</td><td>12.3</td><td>50.8</td><td>39.9</td></tr>
192
- <tr><td class='l'>umamba</td><td>61.5</td><td>35.6</td><td>43.4</td><td>14.0</td><td>52.5</td><td>41.4</td></tr>
193
- </table>
194
- <hr style='margin:22px 0;border:none;border-top:2px solid #0a6'>
195
- <h1 style='font-size:18px'>Statistical significance — paired Wilcoxon (per-image Dice)</h1>
196
- <div class='cap'>Per dataset, the best method by mean Dice is marked ★; a paired Wilcoxon signed-rank test on per-image Dice (paired by image) compares it against every other method. Methods <u>not</u> significantly worse than the best (p≥0.05) are <u>underlined</u> = statistically tied for best. The last column is the best-vs-2nd-best p-value. Pairing is exact for the in-framework methods (shared dataloader order); nnU-Net/U-Mamba use cached predictions paired by index where image counts match.</div>
197
- <table><tr><th>Dataset</th><th>Best ★ and tied-for-best (underlined)</th><th>best vs 2nd p</th></tr>
198
- <tr><td class='l'>acdc_png</td><td class='l'><b>★ unetpp (79.7)</b></td><td>6e-09</td></tr>
199
- <tr><td class='l'>busi</td><td class='l'><b>★ nnunet (74.7)</b> &nbsp;·&nbsp; tied: <u>transunet</u>, <u>swinunet</u>, <u>deeplabv3plus</u></td><td>0.8</td></tr>
200
- <tr><td class='l'>cvc_clinicdb</td><td class='l'><b>★ unet (94.5)</b> &nbsp;·&nbsp; tied: <u>transunet</u>, <u>nnunet</u>, <u>unetpp</u></td><td>0.2</td></tr>
201
- <tr><td class='l'>fives</td><td class='l'><b>★ nnunet (89.0)</b></td><td>5.4e-24</td></tr>
202
- <tr><td class='l'>idridd_segmentation</td><td class='l'><b>★ umamba (64.6)</b> &nbsp;·&nbsp; tied: <u>nnunet</u></td><td>0.86</td></tr>
203
- <tr><td class='l'>kvasir_seg</td><td class='l'><b>★ umamba (91.2)</b> &nbsp;·&nbsp; tied: <u>transunet</u>, <u>nnunet</u>, <u>deeplabv3plus</u>, <u>swinunet</u>, <u>unet</u>, <u>unetpp</u></td><td>0.46</td></tr>
204
- <tr><td class='l'>medsegdb_isic2018</td><td class='l'><b>★ swinunet (91.0)</b> &nbsp;·&nbsp; tied: <u>deeplabv3plus</u>, <u>umamba</u>, <u>nnunet</u></td><td>0.046</td></tr>
205
- <tr><td class='l'>medsegdb_kits19</td><td class='l'><b>★ deeplabv3plus (78.7)</b></td><td>0.0015</td></tr>
206
- <tr><td class='l'>pannuke_semantic</td><td class='l'><b>★ swinunet (54.3)</b> &nbsp;·&nbsp; tied: <u>transunet</u></td><td>0.61</td></tr>
207
- <tr><td class='l'>refuge2</td><td class='l'><b>★ unetpp (86.7)</b></td><td>7.1e-05</td></tr>
208
  </table>
209
  </body></html>
 
1
+ <!doctype html><html><head><meta charset='utf-8'><title>SegGen benchmark (unified512)</title><style>
2
+ body{font-family:'Helvetica Neue',Arial,sans-serif;margin:30px auto;max-width:1180px;color:#1a1a1a;line-height:1.5}
3
+ h1{font-size:21px;margin:0 0 4px}h2{font-size:15px;color:#0a5a33;margin:30px 0 4px;border-bottom:1px solid #e3e3e3;padding-bottom:3px}
4
+ h3{font-size:13px;margin:16px 0 4px;color:#333}
5
+ p,li{font-size:13px}code{background:#f2f2f2;padding:1px 4px;border-radius:3px}
6
+ .cap{color:#666;font-size:11.5px;margin:3px 0 6px}
7
+ .tw{overflow-x:auto}
8
+ table.rt{border-collapse:collapse;margin:6px 0 8px;font-size:11.5px}
9
+ table.rt th,table.rt td{padding:4px 9px;text-align:center;white-space:nowrap}
10
+ table.rt thead th{border-top:2px solid #222;border-bottom:1.2px solid #222;font-weight:600}
11
+ table.rt tbody tr:last-child td{border-bottom:2px solid #222}
12
+ table.rt td.m,table.rt th.m{text-align:left;font-weight:600}
13
+ table.rt td.avg,table.rt th.avg{border-left:1px solid #c8c8c8;background:#f7f9f8}
14
+ table.rt tbody tr.grp td{border-top:1px solid #cfcfcf}
15
+ table.rt b{color:#08402a}
16
+ table.info{border-collapse:collapse;margin:6px 0 14px;font-size:12px}
17
+ table.info th,table.info td{border:1px solid #ddd;padding:4px 8px;text-align:center}
18
+ table.info th{background:#f3f3f3}table.info td.l{text-align:left}
19
+ .note{background:#eef7f0;border-left:3px solid #0a6;padding:8px 12px;font-size:12.5px;margin:8px 0}
20
+ hr{border:none;border-top:1px solid #e3e3e3;margin:24px 0}
21
+ </style></head><body>
22
+ <h1>SegGen benchmark (unified512): 8 methods × 10 datasets (unified 512, resolution-fair)</h1>
23
+ <p>Eight 2D medical-image segmentation methods on ten public datasets (seven modalities). Values are <b>mean±SD</b> over 3 seeds (over the 3 folds for PanNuke). Each (dataset,method) cell aggregates tens–thousands of test images.</p>
24
+ <div class='note'><b>Resolution-fair protocol.</b> Convolutional nets train at 512; the fixed-input transformers (Swin-UNet 224, TransUNet 256) and nnU-Net/U-Mamba run at their native size; <b>every prediction and ground truth is then resized to a common 512×512 before scoring</b>, so boundary metrics (HD95/ASSD, in pixels) are directly comparable across methods.</div>
25
+ <h2>1. Main results — Dice (%) ↑</h2>
26
+ <div class='cap'><b>Bold</b> = best, or not significantly different from the best per dataset (paired Wilcoxon on per-image Dice, p≥0.05). Last column = mean over the 10 datasets. Horizontal rule separates CNNs (top) from Transformer / foundation models (bottom).</div>
27
+ <div class='tw'><table class='rt'><thead><tr><th class='m'>Method</th><th>CVC-ClinicDB</th><th>Kvasir-SEG</th><th>FIVES</th><th>BUSI</th><th>REFUGE2</th><th>ACDC</th><th>IDRiD</th><th>PanNuke</th><th>ISIC2018</th><th>KiTS19</th><th class='avg'>Avg</th></tr></thead><tbody>
28
+ <tr><td class='m'>UNet</td><td><b>94.49±0.14</b></td><td><b>88.41±0.54</b></td><td>86.81±0.08</td><td>72.76±2.47</td><td>84.76±0.89</td><td>77.78±0.39</td><td>49.75±0.65</td><td>49.85±0.33</td><td>90.08±0.12</td><td>74.59±5.62</td><td class='avg'>76.9</td></tr>
29
+ <tr><td class='m'>UNet++</td><td><b>93.92±0.51</b></td><td><b>87.88±0.19</b></td><td>86.77±0.80</td><td>74.67±0.68</td><td><b>86.66±1.10</b></td><td><b>79.75±0.57</b></td><td>50.52±2.11</td><td>50.01±0.13</td><td>89.92±0.06</td><td>72.19±3.00</td><td class='avg'>77.2</td></tr>
30
+ <tr><td class='m'>DeepLabV3+</td><td>93.83±0.42</td><td><b>90.39±0.47</b></td><td>80.97±0.30</td><td><b>76.12±1.20</b></td><td>84.26±0.94</td><td>78.33±0.49</td><td>49.34±0.48</td><td>52.35±0.35</td><td><b>90.68±0.10</b></td><td><b>78.70±1.34</b></td><td class='avg'>77.5</td></tr>
31
+ <tr><td class='m'>Attention-UNet</td><td>91.73±0.33</td><td>87.58±0.11</td><td>85.64±0.20</td><td>65.98±1.11</td><td>75.49±4.01</td><td>74.57±0.15</td><td>44.65±0.61</td><td>45.87±0.39</td><td>88.57±0.25</td><td>64.74±1.44</td><td class='avg'>72.5</td></tr>
32
+ <tr class='grp'><td class='m'>TransUNet</td><td><b>94.29±0.31</b></td><td><b>90.76±0.37</b></td><td>73.10±0.84</td><td><b>76.53±1.65</b></td><td>76.90±1.37</td><td>79.46±0.44</td><td>25.66±3.11</td><td><b>53.60±0.35</b></td><td>90.83±0.27</td><td>76.82±0.93</td><td class='avg'>73.8</td></tr>
33
+ <tr><td class='m'>Swin-UNet</td><td>92.72±0.33</td><td><b>90.15±0.62</b></td><td>68.78±0.18</td><td><b>76.00±0.94</b></td><td>80.95±4.15</td><td>71.26±1.36</td><td>20.95±15.57</td><td><b>54.34±0.42</b></td><td><b>91.04±0.14</b></td><td>63.42±2.92</td><td class='avg'>71.0</td></tr>
34
+ <tr><td class='m'>nnU-Net</td><td><b>94.24±0.64</b></td><td><b>90.44±0.88</b></td><td><b>89.00±0.35</b></td><td><b>75.39±1.35</b></td><td>85.55±0.23</td><td>73.81±0.38</td><td><b>64.64±0.11</b></td><td>47.82±0.55</td><td><b>90.20±0.14</b></td><td>70.44±1.93</td><td class='avg'><b>78.2</b></td></tr>
35
+ <tr><td class='m'>U-Mamba</td><td>92.98±0.55</td><td><b>91.23±0.14</b></td><td>82.68±1.21</td><td>73.73±0.35</td><td>82.42±1.25</td><td>68.68±0.89</td><td><b>64.64±0.10</b></td><td>49.40±0.51</td><td><b>90.22±0.21</b></td><td>72.41±1.03</td><td class='avg'>76.8</td></tr>
36
+ </tbody></table></div>
37
+ <h2>2. Boundary accuracy — HD95 (px) ↓</h2>
38
+ <div class='cap'>95% Hausdorff distance at the common 512 resolution (lower = better; <b>bold</b> = best per dataset). Now comparable across methods.</div>
39
+ <div class='tw'><table class='rt'><thead><tr><th class='m'>Method</th><th>CVC-ClinicDB</th><th>Kvasir-SEG</th><th>FIVES</th><th>BUSI</th><th>REFUGE2</th><th>ACDC</th><th>IDRiD</th><th>PanNuke</th><th>ISIC2018</th><th>KiTS19</th><th class='avg'>Avg</th></tr></thead><tbody>
40
+ <tr><td class='m'>UNet</td><td>19.46±0.53</td><td>39.96±3.32</td><td>12.21±0.68</td><td>70.02±7.49</td><td>17.13±1.77</td><td>17.91±1.55</td><td>68.00±0.38</td><td>140.39±1.84</td><td>34.82±1.57</td><td>39.79±6.37</td><td class='avg'>45.97</td></tr>
41
+ <tr><td class='m'>UNet++</td><td><b>19.28±3.15</b></td><td>41.23±2.76</td><td><b>11.60±0.43</b></td><td>62.67±0.86</td><td>16.78±8.92</td><td>16.63±3.75</td><td>77.61±8.63</td><td>140.91±2.40</td><td>34.66±0.03</td><td>46.19±1.36</td><td class='avg'>46.75</td></tr>
42
+ <tr><td class='m'>DeepLabV3+</td><td>21.19±0.33</td><td>38.27±3.50</td><td>17.02±0.93</td><td>53.29±0.90</td><td>8.93±0.64</td><td>15.79±0.90</td><td>87.84±3.82</td><td>136.89±1.88</td><td>30.76±0.28</td><td><b>36.29±1.75</b></td><td class='avg'>44.63</td></tr>
43
+ <tr><td class='m'>Attention-UNet</td><td>45.21±6.77</td><td>63.80±1.73</td><td>13.82±2.13</td><td>98.10±5.07</td><td>23.03±10.16</td><td>27.13±2.50</td><td>75.44±4.17</td><td>146.04±3.87</td><td>46.32±2.81</td><td>50.10±0.65</td><td class='avg'>58.90</td></tr>
44
+ <tr class='grp'><td class='m'>TransUNet</td><td>19.53±0.69</td><td><b>31.81±1.27</b></td><td>22.64±0.42</td><td><b>43.79±1.43</b></td><td>9.24±0.48</td><td><b>15.64±1.75</b></td><td>86.98±29.21</td><td>134.40±1.48</td><td>28.21±0.86</td><td>41.37±2.53</td><td class='avg'>43.36</td></tr>
45
+ <tr><td class='m'>Swin-UNet</td><td>22.70±1.25</td><td>34.84±0.81</td><td>29.64±2.19</td><td>51.91±2.96</td><td>17.42±4.99</td><td>15.85±0.56</td><td>89.66±13.40</td><td><b>132.62±0.94</b></td><td><b>26.72±0.58</b></td><td>52.42±1.11</td><td class='avg'>47.38</td></tr>
46
+ <tr><td class='m'>nnU-Net</td><td>22.37±1.75</td><td>38.85±5.15</td><td>14.76±1.05</td><td>49.83±1.37</td><td><b>6.36±1.11</b></td><td>16.93±0.70</td><td>67.25±2.79</td><td>147.16±1.97</td><td>30.38±0.42</td><td>39.19±0.93</td><td class='avg'><b>43.31</b></td></tr>
47
+ <tr><td class='m'>U-Mamba</td><td>22.80±2.25</td><td>37.78±1.17</td><td>28.66±1.08</td><td>60.19±3.74</td><td>7.23±0.47</td><td>21.79±1.16</td><td><b>64.19±1.12</b></td><td>142.36±1.82</td><td>29.95±0.87</td><td>38.55±2.43</td><td class='avg'>45.35</td></tr>
48
+ </tbody></table></div>
49
+ <h2>3. Overlap — IoU (%) ↑</h2>
50
+ <div class='cap'>Jaccard index, the stricter overlap measure (<b>bold</b> = best per dataset). Last column = mean over the 10 datasets.</div>
51
+ <div class='tw'><table class='rt'><thead><tr><th class='m'>Method</th><th>CVC-ClinicDB</th><th>Kvasir-SEG</th><th>FIVES</th><th>BUSI</th><th>REFUGE2</th><th>ACDC</th><th>IDRiD</th><th>PanNuke</th><th>ISIC2018</th><th>KiTS19</th><th class='avg'>Avg</th></tr></thead><tbody>
52
+ <tr><td class='m'>UNet</td><td><b>89.91±0.20</b></td><td>82.98±0.38</td><td>78.13±0.07</td><td>64.44±2.32</td><td>74.31±1.24</td><td>70.36±0.40</td><td>41.31±0.60</td><td>40.50±0.35</td><td>83.65±0.10</td><td>67.10±5.84</td><td class='avg'>69.3</td></tr>
53
+ <tr><td class='m'>UNet++</td><td>89.42±0.61</td><td>82.32±0.25</td><td>77.97±1.27</td><td>66.19±0.61</td><td><b>77.11±1.72</b></td><td><b>72.56±0.81</b></td><td>41.58±1.32</td><td>40.65±0.20</td><td>83.46±0.03</td><td>64.12±3.25</td><td class='avg'>69.5</td></tr>
54
+ <tr><td class='m'>DeepLabV3+</td><td>89.12±0.42</td><td>84.62±0.60</td><td>69.44±0.34</td><td>67.48±1.21</td><td>73.60±1.40</td><td>70.80±0.43</td><td>39.78±0.37</td><td>42.54±0.38</td><td>84.40±0.15</td><td><b>70.91±1.74</b></td><td class='avg'>69.3</td></tr>
55
+ <tr><td class='m'>Attention-UNet</td><td>86.04±0.51</td><td>80.22±0.22</td><td>76.20±0.22</td><td>57.34±0.92</td><td>63.91±3.95</td><td>66.90±0.47</td><td>36.58±0.44</td><td>36.95±0.34</td><td>81.64±0.30</td><td>56.30±2.10</td><td class='avg'>64.2</td></tr>
56
+ <tr class='grp'><td class='m'>TransUNet</td><td>89.62±0.41</td><td>85.28±0.29</td><td>58.44±1.10</td><td><b>68.44±1.56</b></td><td>64.73±1.36</td><td>71.08±0.70</td><td>22.79±2.25</td><td>43.82±0.20</td><td>84.53±0.37</td><td>69.11±1.04</td><td class='avg'>65.8</td></tr>
57
+ <tr><td class='m'>Swin-UNet</td><td>87.03±0.35</td><td>84.10±0.69</td><td>53.20±0.10</td><td>67.46±0.68</td><td>68.98±5.52</td><td>62.36±1.35</td><td>17.08±12.51</td><td><b>44.11±0.34</b></td><td><b>84.89±0.21</b></td><td>55.87±2.86</td><td class='avg'>62.5</td></tr>
58
+ <tr><td class='m'>nnU-Net</td><td>89.69±0.75</td><td>84.42±1.19</td><td><b>82.66±0.21</b></td><td>67.68±1.22</td><td>75.57±0.31</td><td>66.98±0.35</td><td>52.93±0.04</td><td>38.39±0.50</td><td>83.97±0.18</td><td>63.29±1.50</td><td class='avg'><b>70.6</b></td></tr>
59
+ <tr><td class='m'>U-Mamba</td><td>87.93±0.81</td><td><b>85.29±0.14</b></td><td>74.13±1.87</td><td>65.57±0.50</td><td>71.20±1.97</td><td>61.82±0.88</td><td><b>53.04±0.09</b></td><td>40.01±0.51</td><td>83.98±0.22</td><td>65.00±1.11</td><td class='avg'>68.8</td></tr>
60
+ </tbody></table></div>
61
+ <h2>4. Overall ranking — mean over the 10 datasets</h2>
62
+ <div class='cap'>Each method's macro-average of every metric across all datasets (<b>bold</b> = best column). ↑ higher better, ↓ lower better.</div>
63
+ <div class='tw'><table class='rt'><thead><tr><th class='m'>Method</th><th>Dice↑</th><th>IoU↑</th><th>HD95↓</th><th>ASSD↓</th><th>Sens↑</th><th>Spec↑</th><th>Prec↑</th></tr></thead><tbody>
64
+ <tr><td class='m'>UNet</td><td>76.9</td><td>69.3</td><td>45.97</td><td>13.05</td><td>78.1</td><td>98.9</td><td>79.0</td></tr>
65
+ <tr><td class='m'>UNet++</td><td>77.2</td><td>69.5</td><td>46.75</td><td><b>12.89</b></td><td>77.7</td><td><b>99.0</b></td><td>80.2</td></tr>
66
+ <tr><td class='m'>DeepLabV3+</td><td>77.5</td><td>69.3</td><td>44.63</td><td>13.01</td><td>78.0</td><td>98.8</td><td><b>80.5</b></td></tr>
67
+ <tr><td class='m'>Attention-UNet</td><td>72.5</td><td>64.2</td><td>58.90</td><td>16.69</td><td>73.3</td><td>98.9</td><td>76.4</td></tr>
68
+ <tr class='grp'><td class='m'>TransUNet</td><td>73.8</td><td>65.8</td><td>43.36</td><td>13.63</td><td>74.2</td><td>98.8</td><td>76.7</td></tr>
69
+ <tr><td class='m'>Swin-UNet</td><td>71.0</td><td>62.5</td><td>47.38</td><td>14.82</td><td>72.6</td><td>98.6</td><td>72.5</td></tr>
70
+ <tr><td class='m'>nnU-Net</td><td><b>78.2</b></td><td><b>70.6</b></td><td><b>43.31</b></td><td>13.21</td><td><b>79.1</b></td><td>98.7</td><td>80.4</td></tr>
71
+ <tr><td class='m'>U-Mamba</td><td>76.8</td><td>68.8</td><td>45.35</td><td>13.93</td><td>78.4</td><td>98.7</td><td>78.9</td></tr>
72
+ </tbody></table></div>
73
+ <h2>5. Per-class Dice (%) — multi-class datasets</h2>
74
+ <div class='cap'>Mean per-class Dice over all test images/runs (0=background excluded; <b>bold</b>=best per class). Shows which structures drive each method's macro-Dice.</div>
75
+ <h3>ACDC</h3>
76
+ <div class='tw'><table class='rt'><thead><tr><th class='m'>Method</th><th>RV</th><th>Myocardium</th><th>LV</th><th class='avg'>macro</th></tr></thead><tbody>
77
+ <tr><td class='m'>UNet</td><td>75.3</td><td>78.3</td><td>83.9</td><td class='avg'>79.2</td></tr>
78
+ <tr><td class='m'>UNet++</td><td><b>78.3</b></td><td><b>79.7</b></td><td><b>86.0</b></td><td class='avg'>81.3</td></tr>
79
+ <tr><td class='m'>DeepLabV3+</td><td>75.8</td><td>78.6</td><td>84.7</td><td class='avg'>79.7</td></tr>
80
+ <tr><td class='m'>Attention-UNet</td><td>70.6</td><td>75.1</td><td>82.0</td><td class='avg'>75.9</td></tr>
81
+ <tr class='grp'><td class='m'>TransUNet</td><td>75.7</td><td>79.2</td><td>85.6</td><td class='avg'>80.2</td></tr>
82
+ <tr><td class='m'>Swin-UNet</td><td>64.8</td><td>71.5</td><td>80.6</td><td class='avg'>72.3</td></tr>
83
+ <tr><td class='m'>nnU-Net</td><td>65.0</td><td>77.5</td><td>82.4</td><td class='avg'>75.0</td></tr>
84
+ <tr><td class='m'>U-Mamba</td><td>56.4</td><td>72.9</td><td>78.8</td><td class='avg'>69.4</td></tr>
85
+ </tbody></table></div>
86
+ <h3>REFUGE2</h3>
87
+ <div class='tw'><table class='rt'><thead><tr><th class='m'>Method</th><th>Optic Disc</th><th>Optic Cup</th><th class='avg'>macro</th></tr></thead><tbody>
88
+ <tr><td class='m'>UNet</td><td>85.5</td><td>84.0</td><td class='avg'>84.8</td></tr>
89
+ <tr><td class='m'>UNet++</td><td><b>87.0</b></td><td><b>86.4</b></td><td class='avg'>86.7</td></tr>
90
+ <tr><td class='m'>DeepLabV3+</td><td>84.4</td><td>84.2</td><td class='avg'>84.3</td></tr>
91
+ <tr><td class='m'>Attention-UNet</td><td>74.5</td><td>76.4</td><td class='avg'>75.5</td></tr>
92
+ <tr class='grp'><td class='m'>TransUNet</td><td>75.7</td><td>78.1</td><td class='avg'>76.9</td></tr>
93
+ <tr><td class='m'>Swin-UNet</td><td>81.1</td><td>80.8</td><td class='avg'>80.9</td></tr>
94
+ <tr><td class='m'>nnU-Net</td><td>86.8</td><td>84.3</td><td class='avg'>85.5</td></tr>
95
+ <tr><td class='m'>U-Mamba</td><td>83.7</td><td>81.2</td><td class='avg'>82.4</td></tr>
96
+ </tbody></table></div>
97
+ <h3>IDRiD</h3>
98
+ <div class='tw'><table class='rt'><thead><tr><th class='m'>Method</th><th>MA</th><th>Haemorrhage</th><th>Hard Exudate</th><th>Soft Exudate</th><th>Optic Disc</th><th class='avg'>macro</th></tr></thead><tbody>
99
+ <tr><td class='m'>UNet</td><td>0.0</td><td>49.9</td><td>56.6</td><td><b>45.3</b></td><td>96.1</td><td class='avg'>49.6</td></tr>
100
+ <tr><td class='m'>UNet++</td><td>6.5</td><td>51.2</td><td>57.2</td><td>39.5</td><td><b>96.2</b></td><td class='avg'>50.1</td></tr>
101
+ <tr><td class='m'>DeepLabV3+</td><td>10.9</td><td>48.3</td><td>50.0</td><td>39.8</td><td>95.2</td><td class='avg'>48.8</td></tr>
102
+ <tr><td class='m'>Attention-UNet</td><td>0.0</td><td>43.2</td><td>54.8</td><td>29.6</td><td>94.2</td><td class='avg'>44.4</td></tr>
103
+ <tr class='grp'><td class='m'>TransUNet</td><td>0.0</td><td>21.2</td><td>0.0</td><td>2.2</td><td>93.6</td><td class='avg'>23.4</td></tr>
104
+ <tr><td class='m'>Swin-UNet</td><td>0.0</td><td>9.8</td><td>20.9</td><td>11.1</td><td>60.2</td><td class='avg'>20.4</td></tr>
105
+ <tr><td class='m'>nnU-Net</td><td>50.5</td><td>60.6</td><td>70.6</td><td>39.4</td><td>95.8</td><td class='avg'>63.4</td></tr>
106
+ <tr><td class='m'>U-Mamba</td><td><b>50.6</b></td><td><b>61.7</b></td><td><b>71.6</b></td><td>36.7</td><td>95.9</td><td class='avg'>63.3</td></tr>
107
+ </tbody></table></div>
108
+ <h3>PanNuke</h3>
109
+ <div class='tw'><table class='rt'><thead><tr><th class='m'>Method</th><th>Neoplastic</th><th>Inflammatory</th><th>Connective</th><th>Dead</th><th>Epithelial</th><th class='avg'>macro</th></tr></thead><tbody>
110
+ <tr><td class='m'>UNet</td><td>57.5</td><td>38.2</td><td>45.9</td><td>11.9</td><td>44.2</td><td class='avg'>39.6</td></tr>
111
+ <tr><td class='m'>UNet++</td><td>56.2</td><td>38.4</td><td>46.1</td><td>9.9</td><td>47.6</td><td class='avg'>39.6</td></tr>
112
+ <tr><td class='m'>DeepLabV3+</td><td>64.3</td><td>38.0</td><td>45.8</td><td>14.5</td><td>57.1</td><td class='avg'>44.0</td></tr>
113
+ <tr><td class='m'>Attention-UNet</td><td>52.0</td><td>38.0</td><td>44.9</td><td>6.9</td><td>30.8</td><td class='avg'>34.5</td></tr>
114
+ <tr class='grp'><td class='m'>TransUNet</td><td>65.6</td><td>38.8</td><td>47.0</td><td>11.9</td><td>59.4</td><td class='avg'>44.5</td></tr>
115
+ <tr><td class='m'>Swin-UNet</td><td><b>66.5</b></td><td><b>39.5</b></td><td><b>47.5</b></td><td><b>17.1</b></td><td><b>62.4</b></td><td class='avg'>46.6</td></tr>
116
+ <tr><td class='m'>nnU-Net</td><td>59.8</td><td>33.8</td><td>42.5</td><td>12.3</td><td>50.8</td><td class='avg'>39.9</td></tr>
117
+ <tr><td class='m'>U-Mamba</td><td>61.5</td><td>35.6</td><td>43.4</td><td>14.0</td><td>52.5</td><td class='avg'>41.4</td></tr>
118
+ </tbody></table></div>
119
+ <hr><h2>Appendix — Experimental setup</h2>
120
+ <p class='cap'>Full per-(dataset,method) values for every metric are in <code>summary.csv</code>; the main Dice table as LaTeX is in <code>summary.tex</code>.</p>
121
+ <h2>A. Datasets</h2>
122
+ <table class='info'><tr><th>#</th><th>Dataset</th><th>Modality</th><th>Target</th><th>Cls</th><th>Ch</th><th>Native size</th><th>Protocol</th><th>Train/Val/Test</th></tr>
123
  <tr><td>1</td><td class='l'>CVC-ClinicDB</td><td class='l'>Colonoscopy (endoscopy)</td><td class='l'>Polyp</td><td>2</td><td>RGB</td><td>384×288</td><td>official</td><td>490 / 61 / 61</td></tr>
124
  <tr><td>2</td><td class='l'>Kvasir-SEG</td><td class='l'>GI endoscopy</td><td class='l'>Polyp</td><td>2</td><td>RGB</td><td>~622×529 (var)</td><td>official</td><td>800 / 100 / 100</td></tr>
125
  <tr><td>3</td><td class='l'>FIVES</td><td class='l'>Retinal fundus</td><td class='l'>Vessel</td><td>2</td><td>RGB</td><td>2048×2048</td><td>official</td><td>480 / 120 / 200</td></tr>
 
131
  <tr><td>9</td><td class='l'>ISIC2018</td><td class='l'>Dermoscopy</td><td class='l'>Skin lesion</td><td>2</td><td>RGB</td><td>256×256</td><td>holdout</td><td>2582 / 369 / 737</td></tr>
132
  <tr><td>10</td><td class='l'>KiTS19</td><td class='l'>Kidney CT (2D slices)</td><td class='l'>Kidney (binary)</td><td>2</td><td>grayscale¹</td><td>256×256</td><td>single-split²</td><td>2832 / 479 / 705</td></tr>
133
  </table>
134
+ <div class='cap'>¹ BUSI/KiTS19 grayscale stored as 3-ch PNG (read as grayscale). ² no canonical split → one fixed fold (of 5) with 3 seeds; others use the official split. Labels 0…C-1 (0=bg); multi-class metrics macro-averaged over foreground classes.</div>
135
+ <h2>B. Methods</h2>
136
+ <table class='info'><tr><th>Method</th><th>Family</th><th>Backbone / setup</th></tr>
137
+ <tr><td class='l'>UNet</td><td class='l'>CNN encoder–decoder</td><td class='l'>SMP, ResNet-50 encoder (ImageNet)</td></tr>
138
  <tr><td class='l'>UNet++</td><td class='l'>Nested UNet</td><td class='l'>SMP, ResNet-50 (ImageNet)</td></tr>
139
  <tr><td class='l'>DeepLabV3+</td><td class='l'>Atrous CNN</td><td class='l'>SMP, ResNet-50 (ImageNet)</td></tr>
140
+ <tr><td class='l'>Attention-UNet</td><td class='l'>Attention-gated UNet</td><td class='l'>Re-implemented, from scratch</td></tr>
141
+ <tr><td class='l'>TransUNet</td><td class='l'>CNN–Transformer hybrid</td><td class='l'>R50-ViT-B/16 (ImageNet), input 256</td></tr>
142
+ <tr><td class='l'>Swin-UNet</td><td class='l'>Pure-Transformer UNet</td><td class='l'>Swin-Tiny (ImageNet), input 224</td></tr>
143
  <tr><td class='l'>nnU-Net (v2)</td><td class='l'>Self-configuring CNN</td><td class='l'>2D config, 250 epochs</td></tr>
144
  <tr><td class='l'>U-Mamba</td><td class='l'>State-space (Mamba) UNet</td><td class='l'>U-Mamba_Bot, 100 epochs</td></tr>
145
  </table>
146
+ <h2>C. Metrics</h2>
147
+ <table class='info'><tr><th>Metric</th><th>Definition</th><th>Dir</th><th>Unit</th><th>作用 / 含义(中文)</th></tr>
148
+ <tr><td class='l'>Dice (DSC)</td><td class='l'>2TP / (2TP+FP+FN)</td><td>↑</td><td>%</td><td class='l'>区域重叠度(主指标),对类别不平衡较鲁棒。</td></tr>
149
+ <tr><td class='l'>IoU (Jaccard)</td><td class='l'>TP / (TP+FP+FN)</td><td>↑</td><td>%</td><td class='l'>交并比,更严格的重叠度,常与 Dice 并列。</td></tr>
150
+ <tr><td class='l'>HD95</td><td class='l'>95% Hausdorff distance (boundaries)</td><td>↓</td><td>px</td><td class='l'>边界最大误差的95%分位,越小边界越贴合。</td></tr>
151
+ <tr><td class='l'>ASSD</td><td class='l'>average symmetric surface distance</td><td>↓</td><td>px</td><td class='l'>平均对称表面距离,整体边界吻合度。</td></tr>
152
+ <tr><td class='l'>Sensitivity</td><td class='l'>TP / (TP+FN)</td><td>↑</td><td>%</td><td class='l'>召回/敏感度,反映漏分割程度。</td></tr>
153
+ <tr><td class='l'>Specificity</td><td class='l'>TN / (TN+FP)</td><td>↑</td><td>%</td><td class='l'>特异度,背景误报控制。</td></tr>
154
+ <tr><td class='l'>Precision</td><td class='l'>TP / (TP+FP)</td><td>↑</td><td>%</td><td class='l'>精确率,反映过分割/误报程度。</td></tr>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
155
  </table>
156
  </body></html>
results/summary.md CHANGED
@@ -1,82 +1,14 @@
1
- | dataset | protocol | arch | seeds | Dice | IoU | HD95 | ASSD | Sens | Spec | Prec |
2
- |---|---|---|---|---|---|---|---|---|---|---|
3
- | acdc_png | official | attention_unet | 3 | 74.57±0.15 | 66.90±0.47 | 27.13±2.50 | 6.64±0.60 | 75.24±0.28 | 99.85±0.01 | 77.92±0.36 |
4
- | acdc_png | official | deeplabv3plus | 3 | 78.33±0.49 | 70.80±0.43 | 15.79±0.90 | 3.96±0.20 | 78.56±0.34 | 99.87±0.01 | 80.77±0.91 |
5
- | acdc_png | official | nnunet | 3 | 73.81±0.38 | 66.98±0.35 | 16.93±0.70 | 6.73±0.40 | 73.28±0.55 | 99.88±0.01 | 78.40±0.17 |
6
- | acdc_png | official | swinunet | 3 | 71.26±1.36 | 62.36±1.35 | 15.85±0.56 | 5.25±0.23 | 71.35±1.76 | 99.81±0.01 | 75.09±0.66 |
7
- | acdc_png | official | transunet | 3 | 79.46±0.44 | 71.08±0.70 | 15.64±1.75 | 4.29±0.25 | 80.68±1.27 | 99.84±0.01 | 80.96±0.52 |
8
- | acdc_png | official | umamba | 3 | 68.68±0.89 | 61.82±0.88 | 21.79±1.16 | 11.22±1.22 | 67.83±0.65 | 99.85±0.02 | 73.46±0.58 |
9
- | acdc_png | official | unet | 3 | 77.78±0.39 | 70.36±0.40 | 17.91±1.55 | 4.29±0.19 | 78.65±0.41 | 99.85±0.02 | 79.84±0.63 |
10
- | acdc_png | official | unetpp | 3 | 79.75±0.57 | 72.56±0.81 | 16.63±3.75 | 3.89±0.42 | 80.79±0.63 | 99.86±0.02 | 81.01±1.05 |
11
- | busi | single-split | attention_unet | 3 | 65.98±1.11 | 57.34±0.92 | 98.10±5.07 | 34.20±1.08 | 68.44±1.30 | 98.12±0.24 | 71.35±2.12 |
12
- | busi | single-split | deeplabv3plus | 3 | 76.12±1.20 | 67.48±1.21 | 53.29±0.90 | 17.36±0.79 | 77.79±1.07 | 98.29±0.19 | 80.23±2.16 |
13
- | busi | single-split | nnunet | 3 | 75.39±1.35 | 67.68±1.22 | 49.83±1.37 | 15.63±0.67 | 77.32±1.17 | 98.11±0.15 | 77.75±1.08 |
14
- | busi | single-split | swinunet | 3 | 76.00±0.94 | 67.46±0.68 | 51.91±2.96 | 17.56±0.21 | 79.00±0.64 | 97.89±0.41 | 78.71±2.19 |
15
- | busi | single-split | transunet | 3 | 76.53±1.65 | 68.44±1.56 | 43.79±1.43 | 14.88±0.85 | 76.77±2.13 | 98.25±0.20 | 81.18±0.95 |
16
- | busi | single-split | umamba | 3 | 73.73±0.35 | 65.57±0.50 | 60.19±3.74 | 20.37±1.68 | 76.05±0.47 | 97.89±0.08 | 76.75±0.65 |
17
- | busi | single-split | unet | 3 | 72.76±2.47 | 64.44±2.32 | 70.02±7.49 | 24.70±4.36 | 77.53±1.43 | 97.64±0.70 | 74.59±5.01 |
18
- | busi | single-split | unetpp | 3 | 74.67±0.68 | 66.19±0.61 | 62.67±0.86 | 18.90±1.26 | 76.45±1.52 | 98.25±0.25 | 78.73±0.53 |
19
- | cvc_clinicdb | official | attention_unet | 3 | 91.73±0.33 | 86.04±0.51 | 45.21±6.77 | 9.76±1.90 | 91.61±0.58 | 99.30±0.07 | 93.39±0.29 |
20
- | cvc_clinicdb | official | deeplabv3plus | 3 | 93.83±0.42 | 89.12±0.42 | 21.19±0.33 | 4.42±0.11 | 93.24±0.49 | 99.45±0.04 | 95.45±0.18 |
21
- | cvc_clinicdb | official | nnunet | 3 | 94.24±0.64 | 89.69±0.75 | 22.37±1.75 | 5.23±0.60 | 93.83±0.55 | 99.53±0.02 | 95.29±0.44 |
22
- | cvc_clinicdb | official | swinunet | 3 | 92.72±0.33 | 87.03±0.35 | 22.70±1.25 | 4.99±0.22 | 93.13±1.08 | 99.28±0.12 | 93.09±0.66 |
23
- | cvc_clinicdb | official | transunet | 3 | 94.29±0.31 | 89.62±0.41 | 19.53±0.69 | 4.26±0.23 | 94.74±0.75 | 99.41±0.08 | 94.49±1.09 |
24
- | cvc_clinicdb | official | umamba | 3 | 92.98±0.55 | 87.93±0.81 | 22.80±2.25 | 4.99±0.30 | 91.93±0.53 | 99.52±0.03 | 95.30±0.38 |
25
- | cvc_clinicdb | official | unet | 3 | 94.49±0.14 | 89.91±0.20 | 19.46±0.53 | 4.05±0.04 | 93.84±0.18 | 99.46±0.02 | 95.75±0.01 |
26
- | cvc_clinicdb | official | unetpp | 3 | 93.92±0.51 | 89.42±0.61 | 19.28±3.15 | 4.23±0.76 | 93.42±0.62 | 99.44±0.02 | 95.12±0.55 |
27
- | fives | official | attention_unet | 3 | 85.64±0.20 | 76.20±0.22 | 13.82±2.13 | 2.84±0.27 | 84.98±0.29 | 98.14±0.04 | 88.02±0.39 |
28
- | fives | official | deeplabv3plus | 3 | 80.97±0.30 | 69.44±0.34 | 17.02±0.93 | 3.82±0.33 | 81.56±0.18 | 96.91±0.45 | 82.82±0.47 |
29
- | fives | official | nnunet | 3 | 89.00±0.35 | 82.66±0.21 | 14.76±1.05 | 3.31±0.11 | 89.65±0.59 | 97.81±0.43 | 90.81±0.72 |
30
- | fives | official | swinunet | 3 | 68.78±0.18 | 53.20±0.10 | 29.64±2.19 | 5.26±0.71 | 70.22±0.92 | 96.24±0.42 | 69.31±1.44 |
31
- | fives | official | transunet | 3 | 73.10±0.84 | 58.44±1.10 | 22.64±0.42 | 4.07±0.22 | 71.89±0.77 | 97.09±0.32 | 76.28±2.66 |
32
- | fives | official | umamba | 3 | 82.68±1.21 | 74.13±1.87 | 28.66±1.08 | 5.12±0.23 | 89.24±0.19 | 97.12±0.19 | 80.56±2.18 |
33
- | fives | official | unet | 3 | 86.81±0.08 | 78.13±0.07 | 12.21±0.68 | 2.79±0.35 | 85.48±0.10 | 98.29±0.01 | 89.69±0.27 |
34
- | fives | official | unetpp | 3 | 86.77±0.80 | 77.97±1.27 | 11.60±0.43 | 2.61±0.10 | 85.32±0.79 | 98.28±0.08 | 89.89±0.67 |
35
- | idridd_segmentation | official | attention_unet | 3 | 44.65±0.61 | 36.58±0.44 | 75.44±4.17 | 18.07±1.24 | 45.22±0.63 | 99.76±0.01 | 47.45±1.40 |
36
- | idridd_segmentation | official | deeplabv3plus | 3 | 49.34±0.48 | 39.78±0.37 | 87.84±3.82 | 24.05±2.07 | 46.76±0.52 | 99.84±0.00 | 56.89±0.64 |
37
- | idridd_segmentation | official | nnunet | 3 | 64.64±0.11 | 52.93±0.04 | 67.25±2.79 | 14.39±0.41 | 65.23±0.50 | 99.87±0.01 | 67.53±0.18 |
38
- | idridd_segmentation | official | swinunet | 3 | 20.95±15.57 | 17.08±12.51 | 89.66±13.40 | 27.12±4.24 | 21.93±16.29 | 99.83±0.13 | 22.02±16.14 |
39
- | idridd_segmentation | official | transunet | 3 | 25.66±3.11 | 22.79±2.25 | 86.98±29.21 | 31.60±9.41 | 26.27±2.73 | 99.89±0.02 | 27.52±4.62 |
40
- | idridd_segmentation | official | umamba | 3 | 64.64±0.10 | 53.04±0.09 | 64.19±1.12 | 11.88±0.76 | 65.39±0.15 | 99.86±0.00 | 67.37±0.02 |
41
- | idridd_segmentation | official | unet | 3 | 49.75±0.65 | 41.31±0.60 | 68.00±0.38 | 14.87±0.84 | 48.47±1.40 | 99.86±0.01 | 53.82±0.67 |
42
- | idridd_segmentation | official | unetpp | 3 | 50.52±2.11 | 41.58±1.32 | 77.61±8.63 | 18.99±2.70 | 48.91±1.24 | 99.87±0.01 | 55.73±3.66 |
43
- | kvasir_seg | official | attention_unet | 3 | 87.58±0.11 | 80.22±0.22 | 63.80±1.73 | 13.54±0.38 | 87.79±0.30 | 98.43±0.06 | 90.60±0.12 |
44
- | kvasir_seg | official | deeplabv3plus | 3 | 90.39±0.47 | 84.62±0.60 | 38.27±3.50 | 9.24±0.59 | 90.26±0.31 | 99.04±0.17 | 93.38±0.91 |
45
- | kvasir_seg | official | nnunet | 3 | 90.44±0.88 | 84.42±1.19 | 38.85±5.15 | 9.34±1.11 | 91.23±0.65 | 98.42±0.46 | 92.06±1.07 |
46
- | kvasir_seg | official | swinunet | 3 | 90.15±0.62 | 84.10±0.69 | 34.84±0.81 | 9.03±0.74 | 89.69±0.38 | 98.92±0.12 | 93.15±0.43 |
47
- | kvasir_seg | official | transunet | 3 | 90.76±0.37 | 85.28±0.29 | 31.81±1.27 | 8.13±0.45 | 90.93±0.58 | 98.93±0.06 | 92.63±0.36 |
48
- | kvasir_seg | official | umamba | 3 | 91.23±0.14 | 85.29±0.14 | 37.78±1.17 | 8.85±0.16 | 91.53±0.04 | 98.76±0.10 | 92.84±0.24 |
49
- | kvasir_seg | official | unet | 3 | 88.41±0.54 | 82.98±0.38 | 39.96±3.32 | 10.44±1.04 | 87.96±0.61 | 99.02±0.15 | 91.95±1.48 |
50
- | kvasir_seg | official | unetpp | 3 | 87.88±0.19 | 82.32±0.25 | 41.23±2.76 | 10.75±0.76 | 87.27±0.34 | 99.07±0.14 | 92.14±0.90 |
51
- | medsegdb_isic2018 | holdout | attention_unet | 3 | 88.57±0.25 | 81.64±0.30 | 46.32±2.81 | 15.07±0.79 | 89.45±0.32 | 97.23±0.22 | 90.98±0.63 |
52
- | medsegdb_isic2018 | holdout | deeplabv3plus | 3 | 90.68±0.10 | 84.40±0.15 | 30.76±0.28 | 10.54±0.16 | 91.46±0.47 | 97.22±0.10 | 92.47±0.40 |
53
- | medsegdb_isic2018 | holdout | nnunet | 3 | 90.20±0.14 | 83.97±0.18 | 30.38±0.42 | 11.62±0.16 | 92.34±0.12 | 95.92±0.14 | 91.29±0.29 |
54
- | medsegdb_isic2018 | holdout | swinunet | 3 | 91.04±0.14 | 84.89±0.21 | 26.72±0.58 | 9.85±0.16 | 91.60±0.25 | 97.26±0.17 | 92.94±0.21 |
55
- | medsegdb_isic2018 | holdout | transunet | 3 | 90.83±0.27 | 84.53±0.37 | 28.21±0.86 | 10.36±0.30 | 91.87±1.33 | 97.30±0.72 | 92.34±1.62 |
56
- | medsegdb_isic2018 | holdout | umamba | 3 | 90.22±0.21 | 83.98±0.22 | 29.95±0.87 | 11.51±0.48 | 92.32±0.15 | 96.16±0.24 | 91.27±0.17 |
57
- | medsegdb_isic2018 | holdout | unet | 3 | 90.08±0.12 | 83.65±0.10 | 34.82±1.57 | 11.64±0.26 | 91.23±0.39 | 97.11±0.12 | 91.72±0.28 |
58
- | medsegdb_isic2018 | holdout | unetpp | 3 | 89.92±0.06 | 83.46±0.03 | 34.66±0.03 | 11.58±0.09 | 90.87±0.27 | 97.20±0.11 | 91.90±0.41 |
59
- | medsegdb_kits19 | single-split | attention_unet | 3 | 64.74±1.44 | 56.30±2.10 | 50.10±0.65 | 16.36±0.51 | 64.87±2.73 | 99.86±0.02 | 74.88±1.60 |
60
- | medsegdb_kits19 | single-split | deeplabv3plus | 3 | 78.70±1.34 | 70.91±1.74 | 36.29±1.75 | 14.49±0.75 | 79.33±1.99 | 99.86±0.01 | 82.33±0.20 |
61
- | medsegdb_kits19 | single-split | nnunet | 3 | 70.44±1.93 | 63.29±1.50 | 39.19±0.93 | 18.90±1.27 | 68.80±1.89 | 99.91±0.00 | 75.57±1.49 |
62
- | medsegdb_kits19 | single-split | swinunet | 3 | 63.42±2.92 | 55.87±2.86 | 52.42±1.11 | 27.15±1.89 | 65.11±4.13 | 99.83±0.03 | 66.14±1.56 |
63
- | medsegdb_kits19 | single-split | transunet | 3 | 76.82±0.93 | 69.11±1.04 | 41.37±2.53 | 17.79±1.51 | 79.55±1.61 | 99.85±0.03 | 77.89±1.41 |
64
- | medsegdb_kits19 | single-split | umamba | 3 | 72.41±1.03 | 65.00±1.11 | 38.55±2.43 | 20.21±2.64 | 70.16±1.49 | 99.90±0.03 | 78.36±0.33 |
65
- | medsegdb_kits19 | single-split | unet | 3 | 74.59±5.62 | 67.10±5.84 | 39.79±6.37 | 12.45±2.46 | 76.36±4.84 | 99.84±0.01 | 78.34±4.37 |
66
- | medsegdb_kits19 | single-split | unetpp | 3 | 72.19±3.00 | 64.12±3.25 | 46.19±1.36 | 13.69±0.81 | 73.91±3.85 | 99.85±0.02 | 77.43±1.77 |
67
- | pannuke_semantic | 3-fold | attention_unet | 3 | 45.87±0.39 | 36.95±0.34 | 146.04±3.87 | 41.79±1.35 | 47.19±0.83 | 97.97±0.08 | 50.02±0.28 |
68
- | pannuke_semantic | 3-fold | deeplabv3plus | 3 | 52.35±0.35 | 42.54±0.38 | 136.89±1.88 | 38.90±0.80 | 53.30±0.34 | 97.88±0.07 | 56.62±0.74 |
69
- | pannuke_semantic | 3-fold | nnunet | 3 | 47.82±0.55 | 38.39±0.50 | 147.16±1.97 | 44.45±0.13 | 48.82±0.48 | 97.77±0.03 | 52.25±0.56 |
70
- | pannuke_semantic | 3-fold | swinunet | 3 | 54.34±0.42 | 44.11±0.34 | 132.62±0.94 | 37.48±0.61 | 56.75±0.60 | 97.55±0.11 | 56.94±0.64 |
71
- | pannuke_semantic | 3-fold | transunet | 3 | 53.60±0.35 | 43.82±0.20 | 134.40±1.48 | 37.35±0.11 | 55.87±0.22 | 97.63±0.02 | 56.60±0.56 |
72
- | pannuke_semantic | 3-fold | umamba | 3 | 49.40±0.51 | 40.01±0.51 | 142.36±1.82 | 42.08±0.67 | 50.81±0.59 | 97.74±0.08 | 53.87±0.41 |
73
- | pannuke_semantic | 3-fold | unet | 3 | 49.85±0.33 | 40.50±0.35 | 140.39±1.84 | 40.59±0.81 | 50.72±0.24 | 98.00±0.02 | 53.64±0.56 |
74
- | pannuke_semantic | 3-fold | unetpp | 3 | 50.01±0.13 | 40.65±0.20 | 140.91±2.40 | 40.58±0.36 | 50.79±0.46 | 97.98±0.04 | 54.27±0.67 |
75
- | refuge2 | official | attention_unet | 3 | 75.49±4.01 | 63.91±3.95 | 23.03±10.16 | 8.58±5.22 | 78.22±6.52 | 99.87±0.04 | 79.57±0.70 |
76
- | refuge2 | official | deeplabv3plus | 3 | 84.26±0.94 | 73.60±1.40 | 8.93±0.64 | 3.34±0.18 | 87.53±1.41 | 99.88±0.01 | 83.72±1.73 |
77
- | refuge2 | official | nnunet | 3 | 85.55±0.23 | 75.57±0.31 | 6.36±1.11 | 2.51±0.08 | 90.46±0.32 | 99.87±0.00 | 82.64±0.20 |
78
- | refuge2 | official | swinunet | 3 | 80.95±4.15 | 68.98±5.52 | 17.42±4.99 | 4.47±1.14 | 87.62±1.11 | 99.80±0.08 | 77.35±6.97 |
79
- | refuge2 | official | transunet | 3 | 76.90±1.37 | 64.73±1.36 | 9.24±0.48 | 3.61±0.10 | 72.98±2.95 | 99.92±0.01 | 86.82±1.00 |
80
- | refuge2 | official | umamba | 3 | 82.42±1.25 | 71.20±1.97 | 7.23±0.47 | 3.09±0.23 | 88.34±0.75 | 99.85±0.02 | 79.69±2.64 |
81
- | refuge2 | official | unet | 3 | 84.76±0.89 | 74.31±1.24 | 17.13±1.77 | 4.72±0.76 | 91.06±0.81 | 99.84±0.04 | 80.96±1.86 |
82
- | refuge2 | official | unetpp | 3 | 86.66±1.10 | 77.11±1.72 | 16.78±8.92 | 3.64±0.97 | 88.88±0.23 | 99.89±0.00 | 86.19±1.66 |
 
1
+ ## Main results — Dice (mean±SD %, ↑)
2
+
3
+ _**Bold** = best or not significantly worse than best per dataset (paired Wilcoxon on per-image Dice, p≥0.05)._
4
+
5
+ | Method | CVC-ClinicDB | Kvasir-SEG | FIVES | BUSI | REFUGE2 | ACDC | IDRiD | PanNuke | ISIC2018 | KiTS19 | Avg |
6
+ |---|---|---|---|---|---|---|---|---|---|---|---|
7
+ | UNet | **94.49±0.14** | **88.41±0.54** | 86.81±0.08 | 72.76±2.47 | 84.76±0.89 | 77.78±0.39 | 49.75±0.65 | 49.85±0.33 | 90.08±0.12 | 74.59±5.62 | 76.9 |
8
+ | UNet++ | **93.92±0.51** | **87.88±0.19** | 86.77±0.80 | 74.67±0.68 | **86.66±1.10** | **79.75±0.57** | 50.52±2.11 | 50.01±0.13 | 89.92±0.06 | 72.19±3.00 | 77.2 |
9
+ | DeepLabV3+ | 93.83±0.42 | **90.39±0.47** | 80.97±0.30 | **76.12±1.20** | 84.26±0.94 | 78.33±0.49 | 49.34±0.48 | 52.35±0.35 | **90.68±0.10** | **78.70±1.34** | 77.5 |
10
+ | Attention-UNet | 91.73±0.33 | 87.58±0.11 | 85.64±0.20 | 65.98±1.11 | 75.49±4.01 | 74.57±0.15 | 44.65±0.61 | 45.87±0.39 | 88.57±0.25 | 64.74±1.44 | 72.5 |
11
+ | TransUNet | **94.29±0.31** | **90.76±0.37** | 73.10±0.84 | **76.53±1.65** | 76.90±1.37 | 79.46±0.44 | 25.66±3.11 | **53.60±0.35** | 90.83±0.27 | 76.82±0.93 | 73.8 |
12
+ | Swin-UNet | 92.72±0.33 | **90.15±0.62** | 68.78±0.18 | **76.00±0.94** | 80.95±4.15 | 71.26±1.36 | 20.95±15.57 | **54.34±0.42** | **91.04±0.14** | 63.42±2.92 | 71.0 |
13
+ | nnU-Net | **94.24±0.64** | **90.44±0.88** | **89.00±0.35** | **75.39±1.35** | 85.55±0.23 | 73.81±0.38 | **64.64±0.11** | 47.82±0.55 | **90.20±0.14** | 70.44±1.93 | 78.2 |
14
+ | U-Mamba | 92.98±0.55 | **91.23±0.14** | 82.68±1.21 | 73.73±0.35 | 82.42±1.25 | 68.68±0.89 | **64.64±0.10** | 49.40±0.51 | **90.22±0.21** | 72.41±1.03 | 76.8 |
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
results/summary.tex CHANGED
@@ -1,86 +1,17 @@
1
- \begin{tabular}{lll cccccccc}
 
 
2
  \toprule
3
- Dataset & Protocol & Method & Seeds & Dice & IoU & HD95 & ASSD & Sens & Spec & Prec \\
4
  \midrule
5
- acdc_png & official & attention_unet & 3 & 74.57$\pm$0.15 & 66.90$\pm$0.47 & 27.13$\pm$2.50 & 6.64$\pm$0.60 & 75.24$\pm$0.28 & 99.85$\pm$0.01 & 77.92$\pm$0.36 \\
6
- acdc_png & official & deeplabv3plus & 3 & 78.33$\pm$0.49 & 70.80$\pm$0.43 & 15.79$\pm$0.90 & 3.96$\pm$0.20 & 78.56$\pm$0.34 & 99.87$\pm$0.01 & 80.77$\pm$0.91 \\
7
- acdc_png & official & nnunet & 3 & 73.81$\pm$0.38 & 66.98$\pm$0.35 & 16.93$\pm$0.70 & 6.73$\pm$0.40 & 73.28$\pm$0.55 & 99.88$\pm$0.01 & 78.40$\pm$0.17 \\
8
- acdc_png & official & swinunet & 3 & 71.26$\pm$1.36 & 62.36$\pm$1.35 & 15.85$\pm$0.56 & 5.25$\pm$0.23 & 71.35$\pm$1.76 & 99.81$\pm$0.01 & 75.09$\pm$0.66 \\
9
- acdc_png & official & transunet & 3 & 79.46$\pm$0.44 & 71.08$\pm$0.70 & 15.64$\pm$1.75 & 4.29$\pm$0.25 & 80.68$\pm$1.27 & 99.84$\pm$0.01 & 80.96$\pm$0.52 \\
10
- acdc_png & official & umamba & 3 & 68.68$\pm$0.89 & 61.82$\pm$0.88 & 21.79$\pm$1.16 & 11.22$\pm$1.22 & 67.83$\pm$0.65 & 99.85$\pm$0.02 & 73.46$\pm$0.58 \\
11
- acdc_png & official & unet & 3 & 77.78$\pm$0.39 & 70.36$\pm$0.40 & 17.91$\pm$1.55 & 4.29$\pm$0.19 & 78.65$\pm$0.41 & 99.85$\pm$0.02 & 79.84$\pm$0.63 \\
12
- acdc_png & official & unetpp & 3 & 79.75$\pm$0.57 & 72.56$\pm$0.81 & 16.63$\pm$3.75 & 3.89$\pm$0.42 & 80.79$\pm$0.63 & 99.86$\pm$0.02 & 81.01$\pm$1.05 \\
13
- busi & single-split & attention_unet & 3 & 65.98$\pm$1.11 & 57.34$\pm$0.92 & 98.10$\pm$5.07 & 34.20$\pm$1.08 & 68.44$\pm$1.30 & 98.12$\pm$0.24 & 71.35$\pm$2.12 \\
14
- busi & single-split & deeplabv3plus & 3 & 76.12$\pm$1.20 & 67.48$\pm$1.21 & 53.29$\pm$0.90 & 17.36$\pm$0.79 & 77.79$\pm$1.07 & 98.29$\pm$0.19 & 80.23$\pm$2.16 \\
15
- busi & single-split & nnunet & 3 & 75.39$\pm$1.35 & 67.68$\pm$1.22 & 49.83$\pm$1.37 & 15.63$\pm$0.67 & 77.32$\pm$1.17 & 98.11$\pm$0.15 & 77.75$\pm$1.08 \\
16
- busi & single-split & swinunet & 3 & 76.00$\pm$0.94 & 67.46$\pm$0.68 & 51.91$\pm$2.96 & 17.56$\pm$0.21 & 79.00$\pm$0.64 & 97.89$\pm$0.41 & 78.71$\pm$2.19 \\
17
- busi & single-split & transunet & 3 & 76.53$\pm$1.65 & 68.44$\pm$1.56 & 43.79$\pm$1.43 & 14.88$\pm$0.85 & 76.77$\pm$2.13 & 98.25$\pm$0.20 & 81.18$\pm$0.95 \\
18
- busi & single-split & umamba & 3 & 73.73$\pm$0.35 & 65.57$\pm$0.50 & 60.19$\pm$3.74 & 20.37$\pm$1.68 & 76.05$\pm$0.47 & 97.89$\pm$0.08 & 76.75$\pm$0.65 \\
19
- busi & single-split & unet & 3 & 72.76$\pm$2.47 & 64.44$\pm$2.32 & 70.02$\pm$7.49 & 24.70$\pm$4.36 & 77.53$\pm$1.43 & 97.64$\pm$0.70 & 74.59$\pm$5.01 \\
20
- busi & single-split & unetpp & 3 & 74.67$\pm$0.68 & 66.19$\pm$0.61 & 62.67$\pm$0.86 & 18.90$\pm$1.26 & 76.45$\pm$1.52 & 98.25$\pm$0.25 & 78.73$\pm$0.53 \\
21
- cvc_clinicdb & official & attention_unet & 3 & 91.73$\pm$0.33 & 86.04$\pm$0.51 & 45.21$\pm$6.77 & 9.76$\pm$1.90 & 91.61$\pm$0.58 & 99.30$\pm$0.07 & 93.39$\pm$0.29 \\
22
- cvc_clinicdb & official & deeplabv3plus & 3 & 93.83$\pm$0.42 & 89.12$\pm$0.42 & 21.19$\pm$0.33 & 4.42$\pm$0.11 & 93.24$\pm$0.49 & 99.45$\pm$0.04 & 95.45$\pm$0.18 \\
23
- cvc_clinicdb & official & nnunet & 3 & 94.24$\pm$0.64 & 89.69$\pm$0.75 & 22.37$\pm$1.75 & 5.23$\pm$0.60 & 93.83$\pm$0.55 & 99.53$\pm$0.02 & 95.29$\pm$0.44 \\
24
- cvc_clinicdb & official & swinunet & 3 & 92.72$\pm$0.33 & 87.03$\pm$0.35 & 22.70$\pm$1.25 & 4.99$\pm$0.22 & 93.13$\pm$1.08 & 99.28$\pm$0.12 & 93.09$\pm$0.66 \\
25
- cvc_clinicdb & official & transunet & 3 & 94.29$\pm$0.31 & 89.62$\pm$0.41 & 19.53$\pm$0.69 & 4.26$\pm$0.23 & 94.74$\pm$0.75 & 99.41$\pm$0.08 & 94.49$\pm$1.09 \\
26
- cvc_clinicdb & official & umamba & 3 & 92.98$\pm$0.55 & 87.93$\pm$0.81 & 22.80$\pm$2.25 & 4.99$\pm$0.30 & 91.93$\pm$0.53 & 99.52$\pm$0.03 & 95.30$\pm$0.38 \\
27
- cvc_clinicdb & official & unet & 3 & 94.49$\pm$0.14 & 89.91$\pm$0.20 & 19.46$\pm$0.53 & 4.05$\pm$0.04 & 93.84$\pm$0.18 & 99.46$\pm$0.02 & 95.75$\pm$0.01 \\
28
- cvc_clinicdb & official & unetpp & 3 & 93.92$\pm$0.51 & 89.42$\pm$0.61 & 19.28$\pm$3.15 & 4.23$\pm$0.76 & 93.42$\pm$0.62 & 99.44$\pm$0.02 & 95.12$\pm$0.55 \\
29
- fives & official & attention_unet & 3 & 85.64$\pm$0.20 & 76.20$\pm$0.22 & 13.82$\pm$2.13 & 2.84$\pm$0.27 & 84.98$\pm$0.29 & 98.14$\pm$0.04 & 88.02$\pm$0.39 \\
30
- fives & official & deeplabv3plus & 3 & 80.97$\pm$0.30 & 69.44$\pm$0.34 & 17.02$\pm$0.93 & 3.82$\pm$0.33 & 81.56$\pm$0.18 & 96.91$\pm$0.45 & 82.82$\pm$0.47 \\
31
- fives & official & nnunet & 3 & 89.00$\pm$0.35 & 82.66$\pm$0.21 & 14.76$\pm$1.05 & 3.31$\pm$0.11 & 89.65$\pm$0.59 & 97.81$\pm$0.43 & 90.81$\pm$0.72 \\
32
- fives & official & swinunet & 3 & 68.78$\pm$0.18 & 53.20$\pm$0.10 & 29.64$\pm$2.19 & 5.26$\pm$0.71 & 70.22$\pm$0.92 & 96.24$\pm$0.42 & 69.31$\pm$1.44 \\
33
- fives & official & transunet & 3 & 73.10$\pm$0.84 & 58.44$\pm$1.10 & 22.64$\pm$0.42 & 4.07$\pm$0.22 & 71.89$\pm$0.77 & 97.09$\pm$0.32 & 76.28$\pm$2.66 \\
34
- fives & official & umamba & 3 & 82.68$\pm$1.21 & 74.13$\pm$1.87 & 28.66$\pm$1.08 & 5.12$\pm$0.23 & 89.24$\pm$0.19 & 97.12$\pm$0.19 & 80.56$\pm$2.18 \\
35
- fives & official & unet & 3 & 86.81$\pm$0.08 & 78.13$\pm$0.07 & 12.21$\pm$0.68 & 2.79$\pm$0.35 & 85.48$\pm$0.10 & 98.29$\pm$0.01 & 89.69$\pm$0.27 \\
36
- fives & official & unetpp & 3 & 86.77$\pm$0.80 & 77.97$\pm$1.27 & 11.60$\pm$0.43 & 2.61$\pm$0.10 & 85.32$\pm$0.79 & 98.28$\pm$0.08 & 89.89$\pm$0.67 \\
37
- idridd_segmentation & official & attention_unet & 3 & 44.65$\pm$0.61 & 36.58$\pm$0.44 & 75.44$\pm$4.17 & 18.07$\pm$1.24 & 45.22$\pm$0.63 & 99.76$\pm$0.01 & 47.45$\pm$1.40 \\
38
- idridd_segmentation & official & deeplabv3plus & 3 & 49.34$\pm$0.48 & 39.78$\pm$0.37 & 87.84$\pm$3.82 & 24.05$\pm$2.07 & 46.76$\pm$0.52 & 99.84$\pm$0.00 & 56.89$\pm$0.64 \\
39
- idridd_segmentation & official & nnunet & 3 & 64.64$\pm$0.11 & 52.93$\pm$0.04 & 67.25$\pm$2.79 & 14.39$\pm$0.41 & 65.23$\pm$0.50 & 99.87$\pm$0.01 & 67.53$\pm$0.18 \\
40
- idridd_segmentation & official & swinunet & 3 & 20.95$\pm$15.57 & 17.08$\pm$12.51 & 89.66$\pm$13.40 & 27.12$\pm$4.24 & 21.93$\pm$16.29 & 99.83$\pm$0.13 & 22.02$\pm$16.14 \\
41
- idridd_segmentation & official & transunet & 3 & 25.66$\pm$3.11 & 22.79$\pm$2.25 & 86.98$\pm$29.21 & 31.60$\pm$9.41 & 26.27$\pm$2.73 & 99.89$\pm$0.02 & 27.52$\pm$4.62 \\
42
- idridd_segmentation & official & umamba & 3 & 64.64$\pm$0.10 & 53.04$\pm$0.09 & 64.19$\pm$1.12 & 11.88$\pm$0.76 & 65.39$\pm$0.15 & 99.86$\pm$0.00 & 67.37$\pm$0.02 \\
43
- idridd_segmentation & official & unet & 3 & 49.75$\pm$0.65 & 41.31$\pm$0.60 & 68.00$\pm$0.38 & 14.87$\pm$0.84 & 48.47$\pm$1.40 & 99.86$\pm$0.01 & 53.82$\pm$0.67 \\
44
- idridd_segmentation & official & unetpp & 3 & 50.52$\pm$2.11 & 41.58$\pm$1.32 & 77.61$\pm$8.63 & 18.99$\pm$2.70 & 48.91$\pm$1.24 & 99.87$\pm$0.01 & 55.73$\pm$3.66 \\
45
- kvasir_seg & official & attention_unet & 3 & 87.58$\pm$0.11 & 80.22$\pm$0.22 & 63.80$\pm$1.73 & 13.54$\pm$0.38 & 87.79$\pm$0.30 & 98.43$\pm$0.06 & 90.60$\pm$0.12 \\
46
- kvasir_seg & official & deeplabv3plus & 3 & 90.39$\pm$0.47 & 84.62$\pm$0.60 & 38.27$\pm$3.50 & 9.24$\pm$0.59 & 90.26$\pm$0.31 & 99.04$\pm$0.17 & 93.38$\pm$0.91 \\
47
- kvasir_seg & official & nnunet & 3 & 90.44$\pm$0.88 & 84.42$\pm$1.19 & 38.85$\pm$5.15 & 9.34$\pm$1.11 & 91.23$\pm$0.65 & 98.42$\pm$0.46 & 92.06$\pm$1.07 \\
48
- kvasir_seg & official & swinunet & 3 & 90.15$\pm$0.62 & 84.10$\pm$0.69 & 34.84$\pm$0.81 & 9.03$\pm$0.74 & 89.69$\pm$0.38 & 98.92$\pm$0.12 & 93.15$\pm$0.43 \\
49
- kvasir_seg & official & transunet & 3 & 90.76$\pm$0.37 & 85.28$\pm$0.29 & 31.81$\pm$1.27 & 8.13$\pm$0.45 & 90.93$\pm$0.58 & 98.93$\pm$0.06 & 92.63$\pm$0.36 \\
50
- kvasir_seg & official & umamba & 3 & 91.23$\pm$0.14 & 85.29$\pm$0.14 & 37.78$\pm$1.17 & 8.85$\pm$0.16 & 91.53$\pm$0.04 & 98.76$\pm$0.10 & 92.84$\pm$0.24 \\
51
- kvasir_seg & official & unet & 3 & 88.41$\pm$0.54 & 82.98$\pm$0.38 & 39.96$\pm$3.32 & 10.44$\pm$1.04 & 87.96$\pm$0.61 & 99.02$\pm$0.15 & 91.95$\pm$1.48 \\
52
- kvasir_seg & official & unetpp & 3 & 87.88$\pm$0.19 & 82.32$\pm$0.25 & 41.23$\pm$2.76 & 10.75$\pm$0.76 & 87.27$\pm$0.34 & 99.07$\pm$0.14 & 92.14$\pm$0.90 \\
53
- medsegdb_isic2018 & holdout & attention_unet & 3 & 88.57$\pm$0.25 & 81.64$\pm$0.30 & 46.32$\pm$2.81 & 15.07$\pm$0.79 & 89.45$\pm$0.32 & 97.23$\pm$0.22 & 90.98$\pm$0.63 \\
54
- medsegdb_isic2018 & holdout & deeplabv3plus & 3 & 90.68$\pm$0.10 & 84.40$\pm$0.15 & 30.76$\pm$0.28 & 10.54$\pm$0.16 & 91.46$\pm$0.47 & 97.22$\pm$0.10 & 92.47$\pm$0.40 \\
55
- medsegdb_isic2018 & holdout & nnunet & 3 & 90.20$\pm$0.14 & 83.97$\pm$0.18 & 30.38$\pm$0.42 & 11.62$\pm$0.16 & 92.34$\pm$0.12 & 95.92$\pm$0.14 & 91.29$\pm$0.29 \\
56
- medsegdb_isic2018 & holdout & swinunet & 3 & 91.04$\pm$0.14 & 84.89$\pm$0.21 & 26.72$\pm$0.58 & 9.85$\pm$0.16 & 91.60$\pm$0.25 & 97.26$\pm$0.17 & 92.94$\pm$0.21 \\
57
- medsegdb_isic2018 & holdout & transunet & 3 & 90.83$\pm$0.27 & 84.53$\pm$0.37 & 28.21$\pm$0.86 & 10.36$\pm$0.30 & 91.87$\pm$1.33 & 97.30$\pm$0.72 & 92.34$\pm$1.62 \\
58
- medsegdb_isic2018 & holdout & umamba & 3 & 90.22$\pm$0.21 & 83.98$\pm$0.22 & 29.95$\pm$0.87 & 11.51$\pm$0.48 & 92.32$\pm$0.15 & 96.16$\pm$0.24 & 91.27$\pm$0.17 \\
59
- medsegdb_isic2018 & holdout & unet & 3 & 90.08$\pm$0.12 & 83.65$\pm$0.10 & 34.82$\pm$1.57 & 11.64$\pm$0.26 & 91.23$\pm$0.39 & 97.11$\pm$0.12 & 91.72$\pm$0.28 \\
60
- medsegdb_isic2018 & holdout & unetpp & 3 & 89.92$\pm$0.06 & 83.46$\pm$0.03 & 34.66$\pm$0.03 & 11.58$\pm$0.09 & 90.87$\pm$0.27 & 97.20$\pm$0.11 & 91.90$\pm$0.41 \\
61
- medsegdb_kits19 & single-split & attention_unet & 3 & 64.74$\pm$1.44 & 56.30$\pm$2.10 & 50.10$\pm$0.65 & 16.36$\pm$0.51 & 64.87$\pm$2.73 & 99.86$\pm$0.02 & 74.88$\pm$1.60 \\
62
- medsegdb_kits19 & single-split & deeplabv3plus & 3 & 78.70$\pm$1.34 & 70.91$\pm$1.74 & 36.29$\pm$1.75 & 14.49$\pm$0.75 & 79.33$\pm$1.99 & 99.86$\pm$0.01 & 82.33$\pm$0.20 \\
63
- medsegdb_kits19 & single-split & nnunet & 3 & 70.44$\pm$1.93 & 63.29$\pm$1.50 & 39.19$\pm$0.93 & 18.90$\pm$1.27 & 68.80$\pm$1.89 & 99.91$\pm$0.00 & 75.57$\pm$1.49 \\
64
- medsegdb_kits19 & single-split & swinunet & 3 & 63.42$\pm$2.92 & 55.87$\pm$2.86 & 52.42$\pm$1.11 & 27.15$\pm$1.89 & 65.11$\pm$4.13 & 99.83$\pm$0.03 & 66.14$\pm$1.56 \\
65
- medsegdb_kits19 & single-split & transunet & 3 & 76.82$\pm$0.93 & 69.11$\pm$1.04 & 41.37$\pm$2.53 & 17.79$\pm$1.51 & 79.55$\pm$1.61 & 99.85$\pm$0.03 & 77.89$\pm$1.41 \\
66
- medsegdb_kits19 & single-split & umamba & 3 & 72.41$\pm$1.03 & 65.00$\pm$1.11 & 38.55$\pm$2.43 & 20.21$\pm$2.64 & 70.16$\pm$1.49 & 99.90$\pm$0.03 & 78.36$\pm$0.33 \\
67
- medsegdb_kits19 & single-split & unet & 3 & 74.59$\pm$5.62 & 67.10$\pm$5.84 & 39.79$\pm$6.37 & 12.45$\pm$2.46 & 76.36$\pm$4.84 & 99.84$\pm$0.01 & 78.34$\pm$4.37 \\
68
- medsegdb_kits19 & single-split & unetpp & 3 & 72.19$\pm$3.00 & 64.12$\pm$3.25 & 46.19$\pm$1.36 & 13.69$\pm$0.81 & 73.91$\pm$3.85 & 99.85$\pm$0.02 & 77.43$\pm$1.77 \\
69
- pannuke_semantic & 3-fold & attention_unet & 3 & 45.87$\pm$0.39 & 36.95$\pm$0.34 & 146.04$\pm$3.87 & 41.79$\pm$1.35 & 47.19$\pm$0.83 & 97.97$\pm$0.08 & 50.02$\pm$0.28 \\
70
- pannuke_semantic & 3-fold & deeplabv3plus & 3 & 52.35$\pm$0.35 & 42.54$\pm$0.38 & 136.89$\pm$1.88 & 38.90$\pm$0.80 & 53.30$\pm$0.34 & 97.88$\pm$0.07 & 56.62$\pm$0.74 \\
71
- pannuke_semantic & 3-fold & nnunet & 3 & 47.82$\pm$0.55 & 38.39$\pm$0.50 & 147.16$\pm$1.97 & 44.45$\pm$0.13 & 48.82$\pm$0.48 & 97.77$\pm$0.03 & 52.25$\pm$0.56 \\
72
- pannuke_semantic & 3-fold & swinunet & 3 & 54.34$\pm$0.42 & 44.11$\pm$0.34 & 132.62$\pm$0.94 & 37.48$\pm$0.61 & 56.75$\pm$0.60 & 97.55$\pm$0.11 & 56.94$\pm$0.64 \\
73
- pannuke_semantic & 3-fold & transunet & 3 & 53.60$\pm$0.35 & 43.82$\pm$0.20 & 134.40$\pm$1.48 & 37.35$\pm$0.11 & 55.87$\pm$0.22 & 97.63$\pm$0.02 & 56.60$\pm$0.56 \\
74
- pannuke_semantic & 3-fold & umamba & 3 & 49.40$\pm$0.51 & 40.01$\pm$0.51 & 142.36$\pm$1.82 & 42.08$\pm$0.67 & 50.81$\pm$0.59 & 97.74$\pm$0.08 & 53.87$\pm$0.41 \\
75
- pannuke_semantic & 3-fold & unet & 3 & 49.85$\pm$0.33 & 40.50$\pm$0.35 & 140.39$\pm$1.84 & 40.59$\pm$0.81 & 50.72$\pm$0.24 & 98.00$\pm$0.02 & 53.64$\pm$0.56 \\
76
- pannuke_semantic & 3-fold & unetpp & 3 & 50.01$\pm$0.13 & 40.65$\pm$0.20 & 140.91$\pm$2.40 & 40.58$\pm$0.36 & 50.79$\pm$0.46 & 97.98$\pm$0.04 & 54.27$\pm$0.67 \\
77
- refuge2 & official & attention_unet & 3 & 75.49$\pm$4.01 & 63.91$\pm$3.95 & 23.03$\pm$10.16 & 8.58$\pm$5.22 & 78.22$\pm$6.52 & 99.87$\pm$0.04 & 79.57$\pm$0.70 \\
78
- refuge2 & official & deeplabv3plus & 3 & 84.26$\pm$0.94 & 73.60$\pm$1.40 & 8.93$\pm$0.64 & 3.34$\pm$0.18 & 87.53$\pm$1.41 & 99.88$\pm$0.01 & 83.72$\pm$1.73 \\
79
- refuge2 & official & nnunet & 3 & 85.55$\pm$0.23 & 75.57$\pm$0.31 & 6.36$\pm$1.11 & 2.51$\pm$0.08 & 90.46$\pm$0.32 & 99.87$\pm$0.00 & 82.64$\pm$0.20 \\
80
- refuge2 & official & swinunet & 3 & 80.95$\pm$4.15 & 68.98$\pm$5.52 & 17.42$\pm$4.99 & 4.47$\pm$1.14 & 87.62$\pm$1.11 & 99.80$\pm$0.08 & 77.35$\pm$6.97 \\
81
- refuge2 & official & transunet & 3 & 76.90$\pm$1.37 & 64.73$\pm$1.36 & 9.24$\pm$0.48 & 3.61$\pm$0.10 & 72.98$\pm$2.95 & 99.92$\pm$0.01 & 86.82$\pm$1.00 \\
82
- refuge2 & official & umamba & 3 & 82.42$\pm$1.25 & 71.20$\pm$1.97 & 7.23$\pm$0.47 & 3.09$\pm$0.23 & 88.34$\pm$0.75 & 99.85$\pm$0.02 & 79.69$\pm$2.64 \\
83
- refuge2 & official & unet & 3 & 84.76$\pm$0.89 & 74.31$\pm$1.24 & 17.13$\pm$1.77 & 4.72$\pm$0.76 & 91.06$\pm$0.81 & 99.84$\pm$0.04 & 80.96$\pm$1.86 \\
84
- refuge2 & official & unetpp & 3 & 86.66$\pm$1.10 & 77.11$\pm$1.72 & 16.78$\pm$8.92 & 3.64$\pm$0.97 & 88.88$\pm$0.23 & 99.89$\pm$0.00 & 86.19$\pm$1.66 \\
85
  \bottomrule
86
  \end{tabular}
 
1
+ % Main results: Dice (mean over seeds, %). Bold = best or not significantly
2
+ % worse than best per dataset (paired Wilcoxon on per-image Dice, p>=0.05).
3
+ \begin{tabular}{lccccccccccc}
4
  \toprule
5
+ Method & CVC-ClinicDB & Kvasir-SEG & FIVES & BUSI & REFUGE2 & ACDC & IDRiD & PanNuke & ISIC2018 & KiTS19 & Avg \\
6
  \midrule
7
+ UNet & \textbf{94.5} & \textbf{88.4} & 86.8 & 72.8 & 84.8 & 77.8 & 49.7 & 49.8 & 90.1 & 74.6 & 76.9 \\
8
+ UNet++ & \textbf{93.9} & \textbf{87.9} & 86.8 & 74.7 & \textbf{86.7} & \textbf{79.7} & 50.5 & 50.0 & 89.9 & 72.2 & 77.2 \\
9
+ DeepLabV3+ & 93.8 & \textbf{90.4} & 81.0 & \textbf{76.1} & 84.3 & 78.3 & 49.3 & 52.4 & \textbf{90.7} & \textbf{78.7} & 77.5 \\
10
+ Attention-UNet & 91.7 & 87.6 & 85.6 & 66.0 & 75.5 & 74.6 & 44.6 & 45.9 & 88.6 & 64.7 & 72.5 \\
11
+ \midrule
12
+ TransUNet & \textbf{94.3} & \textbf{90.8} & 73.1 & \textbf{76.5} & 76.9 & 79.5 & 25.7 & \textbf{53.6} & 90.8 & 76.8 & 73.8 \\
13
+ Swin-UNet & 92.7 & \textbf{90.1} & 68.8 & \textbf{76.0} & 80.9 & 71.3 & 21.0 & \textbf{54.3} & \textbf{91.0} & 63.4 & 71.0 \\
14
+ nnU-Net & \textbf{94.2} & \textbf{90.4} & \textbf{89.0} & \textbf{75.4} & 85.5 & 73.8 & \textbf{64.6} & 47.8 & \textbf{90.2} & 70.4 & \textbf{78.2} \\
15
+ U-Mamba & 93.0 & \textbf{91.2} & 82.7 & 73.7 & 82.4 & 68.7 & \textbf{64.6} & 49.4 & \textbf{90.2} & 72.4 & 76.8 \\
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  \bottomrule
17
  \end{tabular}