Parting v1 model file and card
Browse files- README.md +102 -0
- parting-v1.joblib +3 -0
README.md
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: cc-by-nc-4.0
|
| 3 |
+
library_name: scikit-learn
|
| 4 |
+
tags:
|
| 5 |
+
- vesuvius-challenge
|
| 6 |
+
- herculaneum-papyri
|
| 7 |
+
- x-ray-ct
|
| 8 |
+
- sheet-separation
|
| 9 |
+
---
|
| 10 |
+
|
| 11 |
+
# Parting v1: a contact judge for touching papyrus layers
|
| 12 |
+
|
| 13 |
+
## What it is
|
| 14 |
+
|
| 15 |
+
Where two papyrus layers in a CT scan of a Herculaneum scroll touch, a tracer can hop from one layer to the next.
|
| 16 |
+
Parting takes a point `a` on one layer, with its sheet normal, and a candidate point, and scores how likely the
|
| 17 |
+
candidate is to lie on `a`'s layer; a higher score means the same layer. This file is its classifier: a soft vote
|
| 18 |
+
(mean probability) of scikit-learn's `HistGradientBoostingClassifier` (600 iterations, 31 leaves) and a 64-unit MLP,
|
| 19 |
+
over 669 features of the two points. The features come from the Vesuvius Challenge's base dinovol encoder
|
| 20 |
+
(`scrollprize/dinovol_ps8_9.6um_101626`, `teacher_305k.pt`) at both points and along the line between them, CT
|
| 21 |
+
profiles along each point's normal and along that line, and base dinovol's own token cosine.
|
| 22 |
+
|
| 23 |
+
The code that makes the features, scores them and reruns the published test is `scripts/parting/` in
|
| 24 |
+
[ChaseHendrick/Scrolls](https://github.com/ChaseHendrick/Scrolls) (Apache-2.0), with its page
|
| 25 |
+
`docs/tools/parting.md`.
|
| 26 |
+
|
| 27 |
+
Parting reads model features of the scan; it does not read ink or text. Its scores are model output, not a reading.
|
| 28 |
+
|
| 29 |
+
## The file
|
| 30 |
+
|
| 31 |
+
| | |
|
| 32 |
+
| --- | --- |
|
| 33 |
+
| File | `parting-v1.joblib` |
|
| 34 |
+
| Size | 4,110,013 bytes |
|
| 35 |
+
| sha256 | `f0684ab2ec5725ad9050e08bcdf73df22983960ba906d222cb9c8068a0fdc601` |
|
| 36 |
+
| Format | a joblib pickle of a dict: `model` (the fitted `VotingClassifier`), `choice`, `features` (968), `columns` (a boolean mask with 669 true: the columns the model reads, in the order `scripts/parting/partmodel.py` makes them), `groups` and one more checkpoint hash. The last two record the feature layout of the run the model was fit on, which also held feature groups of another encoder; this model reads none of them |
|
| 37 |
+
| Needs | scikit-learn 1.9.1 and joblib (other scikit-learn versions may refuse or change the pickle) |
|
| 38 |
+
| Safety | loading a pickle runs code. Check the sha256 first; `parting.py score` refuses any other file unless given `--trust-model` |
|
| 39 |
+
|
| 40 |
+
It holds no site list, site ids, coordinates or training rows: only the fitted estimators (tree splits, bin edges,
|
| 41 |
+
scaler means and variances, MLP weights and their training curves).
|
| 42 |
+
|
| 43 |
+
## Use it
|
| 44 |
+
|
| 45 |
+
```bash
|
| 46 |
+
git clone https://github.com/ChaseHendrick/Scrolls && cd Scrolls
|
| 47 |
+
pip install numpy scipy scikit-learn==1.9.1 joblib torch timm einops huggingface_hub
|
| 48 |
+
python3 -c "from huggingface_hub import hf_hub_download as d; print(d('SharpMeow/parting-v1', 'parting-v1.joblib'))"
|
| 49 |
+
python3 scripts/parting/parting.py score --run RUN --model PATH_PRINTED_ABOVE --sites SITES.json --verdict --out READOUT.json
|
| 50 |
+
```
|
| 51 |
+
|
| 52 |
+
`RUN` is a feature run made by `parting.py features` on your own contact sites (`parting.py sites`); the tool page
|
| 53 |
+
lists every command.
|
| 54 |
+
|
| 55 |
+
## Training data
|
| 56 |
+
|
| 57 |
+
Contact sites built from the published hand-traced windings of PHerc0139 and PHerc0172 (Vesuvius Challenge open
|
| 58 |
+
data, CC BY-NC 4.0); touching sites only. Neither scroll is on the eligible lists of the 2027 Grand Prize or the
|
| 59 |
+
First Letters prize on [scrollprize.org/prizes](https://scrollprize.org/prizes) (read 30 October 2026; Sourced fact).
|
| 60 |
+
|
| 61 |
+
## Evaluation (Model output)
|
| 62 |
+
|
| 63 |
+
One test, fixed before any CT value of the object was read (frozen 29 October 2026 about 20:50 UTC, read once about
|
| 64 |
+
21:10 UTC), on PHercParis1Fr34 (Frag3 in the open data), a fragment of a scroll Parting never trained on, against
|
| 65 |
+
base dinovol's raw token cosine on the same sites
|
| 66 |
+
([record](https://github.com/ChaseHendrick/Scrolls/blob/main/docs/logs/2026-10-29-parting-fragment-contact.md)):
|
| 67 |
+
|
| 68 |
+
| | Value |
|
| 69 |
+
| --- | --- |
|
| 70 |
+
| Parting, touching AUC (2.5 % bound) | 0.8952 (0.8452) |
|
| 71 |
+
| Base dinovol token cosine, touching AUC | 0.8392 |
|
| 72 |
+
| Gain (2.5 % bound) | +0.0560 (+0.0368) |
|
| 73 |
+
| Touching sites, layer pairs | 150, 5 |
|
| 74 |
+
| Shuffled-label control, mean of 1,000 | 0.500 |
|
| 75 |
+
| Pipeline check, base dinovol on 75 apart sites | 0.944 |
|
| 76 |
+
| Verdict (bar: gain at least +0.05, bound above 0) | PASS |
|
| 77 |
+
|
| 78 |
+
The same file, rule and bar missed on two other fragments: PHerc1667Cr1Fr3 (Frag5), gain +0.045 (bound +0.020), and
|
| 79 |
+
PHercParis2Fr143 (Frag2), gain +0.010, where base dinovol alone scored 0.965. One pass in three fragments tried.
|
| 80 |
+
|
| 81 |
+
Rerun it from public data: `python3 scripts/parting/parting.py frag3 --model parting-v1.joblib --out OUT`
|
| 82 |
+
(add `--device cuda` on a GPU).
|
| 83 |
+
|
| 84 |
+
## Limits
|
| 85 |
+
|
| 86 |
+
- Fused layers (under 3 voxels apart) are not solved: 0.633 against 0.611 for base dinovol on 38 such sites.
|
| 87 |
+
- One pass in three fragments; five layer pairs is the floor the rule allows, so the bound is coarse.
|
| 88 |
+
- Built for 7.5 to 10 um voxels; Frag3 was a 3.24 um scan box-averaged to 7.91 um, not a native scan.
|
| 89 |
+
- Trained on two scrolls; scores on sites of PHerc0139 or PHerc0172 are not a test.
|
| 90 |
+
- The gain can only show where base dinovol leaves room for it.
|
| 91 |
+
|
| 92 |
+
## License
|
| 93 |
+
|
| 94 |
+
CC BY-NC 4.0 for the weights, like the scan data they were trained on; the code is Apache-2.0. Base dinovol, which makes the features at run time, states no
|
| 95 |
+
license on its Hugging Face page (checked 30 October 2026); it is not part of this file and is never copied, only
|
| 96 |
+
downloaded from its own host by the code.
|
| 97 |
+
|
| 98 |
+
## Credits
|
| 99 |
+
|
| 100 |
+
Scans and layer segments: Vesuvius Challenge open data (CC BY-NC 4.0). Base dinovol: the Vesuvius Challenge. The
|
| 101 |
+
dinovol backbone code: villa (MIT), in the copy vendored by jimmylomro/hercUNet (MIT). Training windings: the
|
| 102 |
+
published hand-traced windings of PHerc0139 and PHerc0172.
|
parting-v1.joblib
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:f0684ab2ec5725ad9050e08bcdf73df22983960ba906d222cb9c8068a0fdc601
|
| 3 |
+
size 4110013
|