grgngl's picture
Recto-surface 3D segmentation U-Net (ps256) — checkpoints + model card (arXiv:2606.29085)
8ce8a46
|
Raw
History Blame Contribute Delete
3.16 kB
---
license: mit
tags:
- arxiv:2606.29085
- vesuvius-challenge
- herculaneum
- papyrology
- computed-tomography
- surface-detection
- 3d-segmentation
- resenc-unet
- volumetric-imaging
pipeline_tag: image-segmentation
---
# Recto-surface 3D segmentation U-Net (`ps256`)
Volumetric **3D U-Net** that segments the **recto writing surface** of carbonized
Herculaneum papyri directly in micro-CT volumes. It is the recto-surface predictor
used in the pipeline behind *"Complete virtual unwrapping and reading of a rolled
Herculaneum papyrus"* (Angelotti et al., **arXiv:2606.29085**, 2026).
## Model details
| | |
|---|---|
| Architecture | nnU-Net-style **3D residual-encoder U-Net** with concurrent spatial+channel squeeze-and-excitation (scSE) |
| Instantiated via | `vesuvius` `NetworkFromConfig` (config bundled as `config.json`) |
| `model_name` | `ps256_bs2_msr_default` |
| Input | 1-channel CT, **256 × 256 × 256** patches, z-score normalised |
| Output | 2 channels (surface vs background), `ignore_label = 2` |
| Encoder | `features_per_stage` [32, 64, 128, 256, 320, 320, 320]; `n_blocks_per_stage` [1, 3, 4, 6, 6, 6, 6]; 3×3×3 kernels; stride-2 downsampling |
| Loss | Medial Surface Recall (Skeleton-Recall-style) + Dice/CE |
| Checkpoint | epoch 3504 · W&B run `d5jdo9n1` |
## Training data
Manually annotated recto surfaces (voxelised from surface meshes) of
**PHerc. 0139, 1667, 0343P, 0500P2, MAN Bp** (~116.5k training / ~2.4k validation
patches). Full training configuration is in **Supplementary Table 1** of the paper.
## Files
- `checkpoint_inference_ready.pth` — full checkpoint; network weights are under key `model` (808 tensors). The architecture config is embedded under `model_config` and mirrored in `config.json`.
- `config.json` — architecture config for `NetworkFromConfig`.
## How to load
```python
import torch
ck = torch.load("checkpoint_inference_ready.pth", map_location="cpu", weights_only=False)
state = ck["model"] # state_dict
cfg = ck["model_config"] # == config.json
# Build the network with the vesuvius package (NetworkFromConfig(cfg)), then:
# net.load_state_dict(state)
```
The `vesuvius` package and inference code are in <https://github.com/ScrollPrize/villa>.
## Links
- **Paper:** Angelotti et al., *Complete virtual unwrapping and reading of a rolled Herculaneum papyrus.* arXiv:2606.29085 (2026). <https://arxiv.org/abs/2606.29085>
- **Code:** <https://github.com/ScrollPrize/villa>
- **Data:** <https://scrollprize.org/data_browser> · ESRF: <https://cultural-heritage.esrf.fr/tomo>
- **Vesuvius Challenge:** <https://scrollprize.org>
## Citation
```bibtex
@misc{angelotti2026unwrapping,
title = {Complete virtual unwrapping and reading of a rolled Herculaneum papyrus},
author = {Angelotti, Giorgio and others},
year = {2026},
eprint = {2606.29085},
archivePrefix = {arXiv},
primaryClass = {eess.IV},
doi = {10.48550/arXiv.2606.29085}
}
```
## License
**MIT** — released by the Vesuvius Challenge. Note: the underlying tomographic data
are distributed under **CC BY-NC 4.0** (see the data links above).