Lasagnetta

Lasagnetta is a fast preview of villa's lasagna field. villa's lasagna net (ScrollPrize/villa, weights scrollprize/lasagna, MIT) predicts, for a CT scan of a Herculaneum scroll, a cos signal that repeats once per papyrus layer, its gradient size and the sheet normals. villa's surface fitting reads that field. Lasagnetta is a smaller 3D U-Net trained to copy villa's output, written on the same grids (cos at scaledown 2, grad_mag and the normal at 4) in villa's own layout, so anything that opens a villa lasagna field opens a preview.

  • Speed: 5.2 times faster than villa predict3d end to end, 6.6 times with --tile 320 576 576 (version 0.1.1 of the code, 27 Oct 2026).
  • Agreement: on five scans it never trained on, pooled peak F1 0.86, cos r 0.91 and a median normal angle of 3.1° against villa's field.
  • Self-check: before you trust a preview, it runs villa's net on 12 spots of your region and tells you where to use villa instead.

Its output is model output, a preview of another model's output, not a reading of any text. villa's own field stays the reference where exact values matter.

Files

File What it is
lasagnetta-l32n.pt Student 1 (config l32n, 100,000 steps)
lasagnetta-xl.pt Student 2 (config xl, 100,000 steps)
lasagnetta-w24.pt Student 3 (config w24, 100,000 steps and a 50,000-step polish)

The release is the average of the three students, each run once, followed by a 0.5 voxel Gaussian blur of cos and a 0.04 cos offset. The offset was fitted on training crops. Each file is a dict with config, steps and state_dict. It loads with torch.load(path, weights_only=True).

Run it

The code is in ChaseHendrick/Scrolls under scripts/lasagnetta/ (Apache-2.0). Its guide is docs/tools/lasagnetta.md.

git clone https://github.com/ChaseHendrick/Scrolls && cd Scrolls
pip install torch numpy numcodecs huggingface_hub
python scripts/lasagnetta/preview.py --checkpoint release \
    --ct s3://vesuvius-challenge-open-data/PHerc0139/volumes/20260102150214-2.399um-0.2m-78keV-masked.zarr/2 \
    --region 9472 9984 3072 3584 4096 4608 --input-level 2 --out out --name PHerc0139 --self-check

--checkpoint release downloads these files and sets the recipe. On a GPU, add --tile 320 576 576 for the fastest run. On a CPU it works at batch 1 (the default off CUDA): this 512³ region took 988 s on 4 cores with 5.4 GB peak memory. With --self-check, villa's net (it needs a villa checkout, LASAGNETTA_VILLA=/path/to/villa/lasagna) first runs on 12 spots of the region and the preview is scored against it. When the median peak F1 is under 0.82, the command writes no field and exits 3, so you can run villa's predict3d there instead.

Speed

One RTX Pro 6000, a 1024 × 2048 × 2048 region of PHerc0800 staged on local disk, 27 Oct 2026:

Run End to end Against villa predict3d (234.2 s)
Code 0.1.0 58.2 s 4.0x
Code 0.1.1 44.9 s 5.2x
Code 0.1.1, --tile 320 576 576 35.2 s 6.6x

0.1.1 streams the write and pools the coarser levels on the GPU. With the default tile it writes cos and grad_mag byte for byte as 0.1.0, so the agreement figures below hold for both.

How well it agrees with villa

Agreement was measured with villa's net as the reference, never against truth, on 256³ crops of scans no student had trained on, 30 crops per scan. The measures are cos r (Pearson), peak F1 (sheet crossings matched within one cos voxel), the median normal angle and grad_mag r.

Test (25 Oct 2026) Model Pooled cos r / peak F1 / normal / grad r Peak F1 per scan
Second l32n alone, blur 0.5 0.864 / 0.811 / 4.0° / 0.796 PHerc0175A 0.863, 0175B 0.759, 0306B 0.828, 0846A 0.824, 0846B 0.809
Third this release 0.910 / 0.855 / 3.1° / 0.877 PHerc0009B 0.849, 0172 0.852, 0500P2 0.861, MAN5 0.774, MANB 0.870

Both tests had a control, the maps shifted by 3 cos voxels, and it failed as it should (third test: cos r 0.07, peak F1 0.16). The bar set before each test was peak F1 0.80 on every scan; four of five scans met it in each test, so the release keeps the experimental label and its self-check.

For scale, villa's net does not reproduce itself exactly either: run on a mirrored copy of a scan and mirrored back, its field agrees with its own unmirrored field at pooled peak F1 0.79 to 0.83 (24 crops on four scans, 26 Oct 2026), and at 0.68 to 0.71 on PHerc0175B.

The self-check was run on 13 whole volumes, two seeds each. It kept Lasagnetta on PHerc0800, 1545, 0814, 0175A, 0306B, 0846A, 0009B and MANB, where the median peak F1 over its spots was 0.82 to 0.90, and pointed to villa on PHerc0175B, PHercMAN5, PHerc0846B and PHerc0172. Each check took about 50 s on that GPU. Two of the three students had trained on PHerc0175A, 0306B and 0846A, so those three volumes say little about unseen scans.

Training

The students were trained only on villa lasagna fields: the published fields in the Vesuvius Challenge open data, plus fields made with villa's own lasagna for scans that had none. They read level 0 of the 8 to 9.4 µm scans and level 2 of the 2.4 µm scans. l32n trained on 23 open-data scans. xl and w24 trained on 27, which included four of the second test's five scans; the fifth, PHerc0175B, was used for development. PHerc0800, 1545 and 0814 were also development scans, and PHercParis4 was left out. No student had seen any scan of its own test.

License and credit

The weights are CC BY-NC 4.0, the license of the scans they derive from. The teacher model and its code are villa's lasagna (MIT), and credit goes to its authors. The scans come from the Vesuvius Challenge open data. Released by Chase Hendrick.

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support