leobk commited on
Commit
b64c182
·
verified ·
1 Parent(s): cf24457

Replace v2 with v3: membrane-first label priority

Browse files

Dataset503_MicroridgeMembraneFirst. Same 477 tiles, same architecture,
same 100 epochs; only which class wins a contested label pixel changed.

v2 trained on labels where microridges had erased 69.6% of the membrane,
so it predicted a broken membrane and called membrane pixels microridge.

Frozen test: cell_membrane Dice 0.471 -> 0.707, boundary F1 0.659 -> 0.874,
microridge Dice 0.877 -> 0.852.

README.md CHANGED
@@ -1,163 +1,170 @@
1
- ---
2
- license: cc-by-nc-sa-4.0
3
- library_name: nnunetv2
4
- pipeline_tag: image-segmentation
5
- tags:
6
- - biology
7
- - microscopy
8
- - cell-segmentation
9
- - microridge
10
- - nnunet
11
- - zebrafish
12
- ---
13
-
14
- # MicroridgeVectorAI — v2
15
-
16
- A 2D nnU-Net that segments **actin microridges**, **cell regions** and **cell
17
- membranes** in projected single-channel microscopy of epithelial tissue.
18
-
19
- Companion application: <https://github.com/LBK888/MicroridgeVectorAI> (CellVector,
20
- AGPL-3.0). The model runs standalone with nnU-Net v2 alone — CellVector is not
21
- required.
22
-
23
- | | |
24
- |---|---|
25
- | Model id | `8f1dbd06-6ec8-4c22-8e26-412cfee26ea9` |
26
- | Task | 2D semantic segmentation, 4 classes |
27
- | Architecture | nnU-Net v2 PlainConvUNet, 8 stages, patch 512x512 |
28
- | Trainer / folds | `nnUNetTrainer_100epochs`, fold 0 |
29
- | Input | single-channel 2D image, any size |
30
- | Snapshot hash | `dbe134f83c52b8ecae6cb62182310205496497ec297406ed8a2c912b60ba8cc9` |
31
-
32
- Labels: `0` background, `1` cell_region, `2` cell_membrane, `3` microridge.
33
-
34
- ## Scores
35
-
36
- Frozen test — 36 tiles from **3 fields the model never saw**. Splits are grouped
37
- by source field, so no tile of a training field appears in the test set.
38
-
39
- | Metric | Value |
40
- |---|---|
41
- | cell_region Dice | 0.944 |
42
- | cell_membrane Dice | 0.471 |
43
- | cell_membrane boundary F1 (1 px tolerance) | 0.659 |
44
- | microridge Dice | 0.877 |
45
- | microridge precision / recall | 0.911 / 0.855 |
46
- | microridge skeleton length error | 0.100 |
47
-
48
- nnU-Net's own fold-0 validation (89 tiles): cell_region 0.964, cell_membrane
49
- 0.495, microridge 0.912.
50
-
51
- **Reading the membrane number.** A Dice of 0.47 on a 3-pixel line covering ~1%
52
- of the frame is not the same failure as 0.47 on a region class: thin-structure
53
- Dice collapses when a prediction is offset by a pixel even where it follows the
54
- right path. The boundary F1 of 0.659, which allows one pixel of tolerance, is
55
- the more informative figure, and the gap between them says the membrane is
56
- mostly in the right place but not pixel-exact.
57
-
58
- ## Limitations
59
-
60
- - **Cell contours derived from the label map merge.** Reconstructing cells as
61
- the connected components of `label in (1, 3)` yields a single blob, because
62
- the predicted membrane is thin and not perfectly closed. Use the predicted
63
- membrane (class 2) for cell geometry, or split the region with a watershed
64
- seeded inside cells. Do not expect instance-separated cells out of the box.
65
- - **The ground truth was not human-reviewed.** Labels were imported from
66
- published raster masks and corrected only for import artifacts, not by an
67
- expert. Treat this model as a proposal generator to be corrected, which is how
68
- the companion application uses it.
69
- - **Trained on 13 fields.** Train and validation loss diverge (-0.755 vs
70
- -0.629), which is what a small number of independent acquisitions looks like.
71
- More fields will help more than more epochs.
72
- - **One fold, not an ensemble.** Only fold 0 was trained.
73
- - Validated on zebrafish periderm-style epithelial microridge imagery. Behaviour
74
- on other tissue, magnification or modality is unknown.
75
-
76
- ## Training data
77
-
78
- Wide-field frames cut into 477 tiles of at most 512x512 from 19 fields, keeping
79
- only regions whose raster truth is trustworthy. Uneven illumination leaves part
80
- of such a frame too dark for the upstream segmentation to resolve anything, and
81
- that failure is silent — the skeleton mask is empty while the cell mask still
82
- looks complete. Blocks were kept only where skeleton density cleared both an
83
- absolute floor and a share of the frame's own 90th percentile, **and** at least
84
- 95% of the block was attributed to a cell. 68.3% of the field pixels survived.
85
-
86
- Labels were rasterized from vector geometry with a 3 px membrane and a 5 px
87
- microridge stroke.
88
-
89
- ## Files
90
-
91
- ```text
92
- registry.json provenance record, metrics, checksums
93
- nnUNet_results/Dataset502_MicroridgeField/
94
- └─ nnUNetTrainer_100epochs__nnUNetPlans__2d/
95
- ├─ dataset.json channel names and label map
96
- ├─ plans.json preprocessing and architecture
97
- └─ fold_0/checkpoint_final.pth weights
98
- ```
99
-
100
- Those three files under the trainer folder are the complete inference set. The
101
- directory names encode the configuration — nnU-Net parses
102
- `Dataset<ID>_<name>/<trainer>__<plans>__<configuration>` — so do not rename them.
103
-
104
- The checkpoint is shipped unmodified so the `checkpoint_sha256` in
105
- `registry.json` verifies. About half of it is optimizer state; stripping to
106
- `network_weights`, `init_args`, `trainer_name` and
107
- `inference_allowed_mirroring_axes` halves the size but invalidates that
108
- checksum.
109
-
110
- ## Usage
111
-
112
- ```bash
113
- pip install nnunetv2 huggingface_hub
114
- hf download leobk/MicroridgeVectorAI --local-dir microridge-model
115
- ```
116
-
117
- ```python
118
- import torch, numpy as np, tifffile
119
- from nnunetv2.inference.predict_from_raw_data import nnUNetPredictor
120
-
121
- MODEL = ("microridge-model/nnUNet_results/Dataset502_MicroridgeField"
122
- "/nnUNetTrainer_100epochs__nnUNetPlans__2d")
123
-
124
- predictor = nnUNetPredictor(device=torch.device("cuda"))
125
- predictor.initialize_from_trained_model_folder(
126
- MODEL, use_folds=(0,), checkpoint_name="checkpoint_final.pth"
127
- )
128
-
129
- image = tifffile.imread("frame.tif").astype("float32")
130
- segmentation = predictor.predict_single_npy_array(
131
- image[None, None], {"spacing": (999.0, 1.0, 1.0)}, None, None, False
132
- )
133
- ```
134
-
135
- No nnU-Net environment variables are needed for this path. Roughly 13 s for a
136
- 512x512 tile on an RTX 4080 SUPER.
137
-
138
- ### Reimplementing the pipeline
139
-
140
- The network takes `(1, 1, H, W)` and returns 4 logit channels, and exports to
141
- TorchScript. If you drive it yourself, reproduce all of:
142
-
143
- - **Normalization** — z-score using *each image's own* mean and standard
144
- deviation (`use_mask_for_norm=False`). No dataset statistics;
145
- `foreground_intensity_properties_per_channel` in `plans.json` is for CT
146
- normalization and unused here.
147
- - **Sliding window** — 512x512 patches, step 0.5, Gaussian-weighted overlap.
148
- - **Test-time augmentation** — mirroring over axes `(0, 1)`.
149
- - **Output** — argmax over the 4 channels.
150
-
151
- Skipping the normalization or the Gaussian window degrades results noticeably
152
- and without any error.
153
-
154
- ## Licensing note
155
-
156
- These weights are released under **CC BY-NC-SA 4.0**: attribution required,
157
- **non-commercial use only**, derivatives under the same terms. Note that this
158
- differs from the companion application's code licence (AGPL-3.0) — the code and
159
- the weights are covered separately.
160
-
161
- The weights were trained on third-party imagery; if that source data carries its
162
- own terms, they may constrain redistribution of this model independently of this
163
- label.
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: cc-by-nc-sa-4.0
3
+ library_name: nnunetv2
4
+ pipeline_tag: image-segmentation
5
+ tags:
6
+ - biology
7
+ - microscopy
8
+ - cell-segmentation
9
+ - microridge
10
+ - nnunet
11
+ - zebrafish
12
+ ---
13
+
14
+ # MicroridgeVectorAI — v3
15
+
16
+ A 2D nnU-Net that segments **actin microridges**, **cell regions** and **cell
17
+ membranes** in projected single-channel microscopy of epithelial tissue.
18
+
19
+ Companion application: <https://github.com/LBK888/MicroridgeVectorAI> (CellVector,
20
+ AGPL-3.0). The model runs standalone with nnU-Net v2 alone — CellVector is not
21
+ required.
22
+
23
+ | | |
24
+ |---|---|
25
+ | Model id | `a619b15c-e00f-489b-887c-6386e3836c11` |
26
+ | Task | 2D semantic segmentation, 4 classes |
27
+ | Architecture | nnU-Net v2 PlainConvUNet, 8 stages, patch 512x512 |
28
+ | Trainer / folds | `nnUNetTrainer_100epochs`, fold 0 |
29
+ | Input | single-channel 2D image, any size |
30
+ | Snapshot hash | `dbe134f83c52b8ecae6cb62182310205496497ec297406ed8a2c912b60ba8cc9` |
31
+ | Label policy | `membrane-first-v2`, membrane 3 px, microridge 5 px |
32
+
33
+ Labels: `0` background, `1` cell_region, `2` cell_membrane, `3` microridge.
34
+
35
+ ## Scores
36
+
37
+ Frozen test — 36 tiles from **3 fields the model never saw**. Splits are grouped
38
+ by source field, so no tile of a training field appears in the test set.
39
+
40
+ | Metric | Value | v2 |
41
+ |---|---|---|
42
+ | cell_region Dice | 0.943 | 0.944 |
43
+ | cell_membrane Dice | **0.707** | 0.471 |
44
+ | cell_membrane boundary F1 (1 px tolerance) | **0.874** | 0.659 |
45
+ | microridge Dice | 0.852 | 0.877 |
46
+ | microridge precision / recall | 0.899 / 0.822 | 0.911 / 0.855 |
47
+ | microridge skeleton length error | 0.105 | 0.100 |
48
+
49
+ nnU-Net's own fold-0 validation (89 tiles): cell_region 0.964, cell_membrane
50
+ 0.696, microridge 0.886.
51
+
52
+ v2 was trained on labels in which the microridge class had erased 69.6% of the
53
+ membrane: classes are mutually exclusive and microridges were stroked last, so a
54
+ ridge running beside a cell edge overwrote it. v3 reverses that contest. The
55
+ membrane keeps all of its pixels and the microridge class yields 7.2% of its
56
+ own, which it can afford at a quarter of the frame. Nothing else changed — same
57
+ data, same architecture, same 100 epochs.
58
+
59
+ **Reading the membrane number.** Dice on a 3-pixel line covering under 3% of the
60
+ frame collapses when a prediction is offset by a pixel even where it follows the
61
+ right path, so it understates a thin structure. The boundary F1 of 0.874, which
62
+ allows one pixel of tolerance, is the more informative figure; the gap between
63
+ 0.707 and 0.874 is the residual sub-pixel offset, not missing membrane.
64
+
65
+ ## Limitations
66
+
67
+ - **Cell instances are approximate.** Cells are recovered as connected
68
+ components separated by the predicted membrane. On a frozen-test tile holding
69
+ 10 cells this returns 9, against 1 for v2, whose membrane was too broken to
70
+ separate anything. Expect near-misses where the membrane is faint, not exact
71
+ instance segmentation.
72
+ - **The ground truth was not human-reviewed.** Labels were imported from
73
+ published raster masks and corrected only for import artifacts, not by an
74
+ expert. Treat this model as a proposal generator to be corrected, which is how
75
+ the companion application uses it.
76
+ - **Trained on 13 fields.** Train and validation loss diverge (-0.782 vs
77
+ -0.636), which is what a small number of independent acquisitions looks like.
78
+ More fields will help more than more epochs.
79
+ - **One fold, not an ensemble.** Only fold 0 was trained.
80
+ - Validated on zebrafish periderm-style epithelial microridge imagery. Behaviour
81
+ on other tissue, magnification or modality is unknown.
82
+
83
+ ## Training data
84
+
85
+ Wide-field frames cut into 477 tiles of at most 512x512 from 19 fields, keeping
86
+ only regions whose raster truth is trustworthy. Uneven illumination leaves part
87
+ of such a frame too dark for the upstream segmentation to resolve anything, and
88
+ that failure is silent — the skeleton mask is empty while the cell mask still
89
+ looks complete. Blocks were kept only where skeleton density cleared both an
90
+ absolute floor and a share of the frame's own 90th percentile, **and** at least
91
+ 95% of the block was attributed to a cell. 68.3% of the field pixels survived.
92
+
93
+ Labels were rasterized from vector geometry with a 3 px membrane and a 5 px
94
+ microridge stroke.
95
+
96
+ ## Files
97
+
98
+ ```text
99
+ registry.json provenance record, metrics, checksums
100
+ nnUNet_results/Dataset503_MicroridgeMembraneFirst/
101
+ └─ nnUNetTrainer_100epochs__nnUNetPlans__2d/
102
+ ├─ dataset.json channel names and label map
103
+ ├─ plans.json preprocessing and architecture
104
+ └─ fold_0/checkpoint_final.pth weights
105
+ ```
106
+
107
+ Those three files under the trainer folder are the complete inference set. The
108
+ directory names encode the configuration — nnU-Net parses
109
+ `Dataset<ID>_<name>/<trainer>__<plans>__<configuration>` — so do not rename them.
110
+
111
+ The checkpoint is shipped unmodified so the `checkpoint_sha256` in
112
+ `registry.json` verifies. About half of it is optimizer state; stripping to
113
+ `network_weights`, `init_args`, `trainer_name` and
114
+ `inference_allowed_mirroring_axes` halves the size but invalidates that
115
+ checksum.
116
+
117
+ ## Usage
118
+
119
+ ```bash
120
+ pip install nnunetv2 huggingface_hub
121
+ hf download leobk/MicroridgeVectorAI --local-dir microridge-model
122
+ ```
123
+
124
+ ```python
125
+ import torch, numpy as np, tifffile
126
+ from nnunetv2.inference.predict_from_raw_data import nnUNetPredictor
127
+
128
+ MODEL = ("microridge-model/nnUNet_results/Dataset503_MicroridgeMembraneFirst"
129
+ "/nnUNetTrainer_100epochs__nnUNetPlans__2d")
130
+
131
+ predictor = nnUNetPredictor(device=torch.device("cuda"))
132
+ predictor.initialize_from_trained_model_folder(
133
+ MODEL, use_folds=(0,), checkpoint_name="checkpoint_final.pth"
134
+ )
135
+
136
+ image = tifffile.imread("frame.tif").astype("float32")
137
+ segmentation = predictor.predict_single_npy_array(
138
+ image[None, None], {"spacing": (999.0, 1.0, 1.0)}, None, None, False
139
+ )
140
+ ```
141
+
142
+ No nnU-Net environment variables are needed for this path. Roughly 13 s for a
143
+ 512x512 tile on an RTX 4080 SUPER.
144
+
145
+ ### Reimplementing the pipeline
146
+
147
+ The network takes `(1, 1, H, W)` and returns 4 logit channels, and exports to
148
+ TorchScript. If you drive it yourself, reproduce all of:
149
+
150
+ - **Normalization** — z-score using *each image's own* mean and standard
151
+ deviation (`use_mask_for_norm=False`). No dataset statistics;
152
+ `foreground_intensity_properties_per_channel` in `plans.json` is for CT
153
+ normalization and unused here.
154
+ - **Sliding window** — 512x512 patches, step 0.5, Gaussian-weighted overlap.
155
+ - **Test-time augmentation** — mirroring over axes `(0, 1)`.
156
+ - **Output** — argmax over the 4 channels.
157
+
158
+ Skipping the normalization or the Gaussian window degrades results noticeably
159
+ and without any error.
160
+
161
+ ## Licensing note
162
+
163
+ These weights are released under **CC BY-NC-SA 4.0**: attribution required,
164
+ **non-commercial use only**, derivatives under the same terms. Note that this
165
+ differs from the companion application's code licence (AGPL-3.0) — the code and
166
+ the weights are covered separately.
167
+
168
+ The weights were trained on third-party imagery; if that source data carries its
169
+ own terms, they may constrain redistribution of this model independently of this
170
+ label.
nnUNet_results/{Dataset502_MicroridgeField → Dataset503_MicroridgeMembraneFirst}/nnUNetTrainer_100epochs__nnUNetPlans__2d/dataset.json RENAMED
File without changes
nnUNet_results/{Dataset502_MicroridgeField → Dataset503_MicroridgeMembraneFirst}/nnUNetTrainer_100epochs__nnUNetPlans__2d/fold_0/checkpoint_final.pth RENAMED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:0e9e440280e99deffcd772cfde6e59aaa6e0f3578f59662a12246226692dbdde
3
- size 370825919
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c513cee01f60eb21f2b9ee74f9f0fd2d44a84d99437440d7e1836ccfd91e25bb
3
+ size 370825791
nnUNet_results/{Dataset502_MicroridgeField → Dataset503_MicroridgeMembraneFirst}/nnUNetTrainer_100epochs__nnUNetPlans__2d/plans.json RENAMED
@@ -1,5 +1,5 @@
1
  {
2
- "dataset_name": "Dataset502_MicroridgeField",
3
  "plans_name": "nnUNetPlans",
4
  "original_median_spacing_after_transp": [
5
  999.0,
 
1
  {
2
+ "dataset_name": "Dataset503_MicroridgeMembraneFirst",
3
  "plans_name": "nnUNetPlans",
4
  "original_median_spacing_after_transp": [
5
  999.0,
registry.json CHANGED
@@ -5,36 +5,38 @@
5
  "artifact_sha256": {
6
  "dataset.json": "aa6242b569dc3fa70ee707db38970fd7e97fbfb45f48aa7f1a68a1c7a5a899cf",
7
  "dataset_fingerprint.json": "9234acf421a087a276d8271f214cbddfdd97c1b71f4974e18a71fe44f680c7b9",
8
- "fold_0/checkpoint_best.pth": "189e5d97d34dd8750bf279e47a78b8038ebb31d95b72ddcf0425f55c2785eb75",
9
- "fold_0/checkpoint_final.pth": "0e9e440280e99deffcd772cfde6e59aaa6e0f3578f59662a12246226692dbdde",
10
- "plans.json": "7e403e7cb95ad1efbf184de013d651595561f248bd885d461d5b0f8fa2e73874"
11
  },
12
  "augmentation_profile_hash": "6f738a972b6f7eba84ee6a2cd5cbd01f83dbed2afa9633439b89e76bb3a5a4dd",
13
  "backend_id": "nnunetv2-local",
14
  "backend_version": "2.8.1",
15
  "benchmark_id": null,
16
  "checkpoint_path": "fold_0/checkpoint_final.pth",
17
- "checkpoint_sha256": "0e9e440280e99deffcd772cfde6e59aaa6e0f3578f59662a12246226692dbdde",
18
  "configuration": {
19
  "configuration": "2d",
20
- "dataset_id": 502,
21
- "dataset_name": "MicroridgeField",
22
  "epochs": 100,
23
  "executed_locally": true,
24
  "fold": 0,
 
25
  "membrane_width_px": 3,
26
  "microridge_width_px": 5,
27
- "plan_command": "nnUNetv2_plan_and_preprocess -d 502 -c 2d --verify_dataset_integrity",
28
  "plans": "nnUNetPlans",
29
  "source_data": "full view field tiles, trustworthy regions only",
30
  "split_grouping": "specimen:field_frame_uri",
 
31
  "torch_version": "2.12.1+cu130",
32
- "train_command": "nnUNetv2_train 502 2d 0 -tr nnUNetTrainer_100epochs --npz",
33
  "trainer": "nnUNetTrainer_100epochs",
34
- "training_job_id": "0305ef07-38d7-41d3-bc44-a1e51a2c0d4f"
35
  },
36
- "created_at": "2026-08-31T10:00:21.285927Z",
37
- "dataset_artifact_hash": "90178985de2ef8d24b5a7338b7e9fec83dfe6164e0558ef30d449d8e13439547",
38
  "folds_completed": [
39
  0
40
  ],
@@ -43,19 +45,19 @@
43
  "label_contract": "cellvector.annotation/1.0.0",
44
  "metrics": {
45
  "frozen_test_cases": 36,
46
- "frozen_test_cell_membrane_boundary_f1": 0.6589374464002449,
47
- "frozen_test_cell_membrane_dice": 0.4708712201149024,
48
- "frozen_test_cell_region_dice": 0.9438357584291484,
49
- "frozen_test_cell_region_iou": 0.8940270075353971,
50
- "frozen_test_microridge_dice": 0.8767592825579081,
51
- "frozen_test_microridge_precision": 0.9106816936813859,
52
- "frozen_test_microridge_recall": 0.8550323207264082,
53
- "frozen_test_microridge_skeleton_length_error": 0.0997634178921583,
54
- "nnunet_validation_dice_cell_membrane": 0.4954518160625487,
55
- "nnunet_validation_dice_cell_region": 0.9644053946394331,
56
- "nnunet_validation_dice_microridge": 0.9114529420774974
57
  },
58
- "model_id": "8f1dbd06-6ec8-4c22-8e26-412cfee26ea9",
59
  "parent_model_id": null,
60
  "provenance_status": "verified",
61
  "selected_at": null,
@@ -64,8 +66,8 @@
64
  "snapshot_hash": "dbe134f83c52b8ecae6cb62182310205496497ec297406ed8a2c912b60ba8cc9",
65
  "software_smoke_test": false,
66
  "status": "trained",
67
- "training_job_id": "0305ef07-38d7-41d3-bc44-a1e51a2c0d4f",
68
- "updated_at": "2026-08-31T10:00:21.285927Z"
69
  }
70
  ],
71
  "schema_version": "1.0.0"
 
5
  "artifact_sha256": {
6
  "dataset.json": "aa6242b569dc3fa70ee707db38970fd7e97fbfb45f48aa7f1a68a1c7a5a899cf",
7
  "dataset_fingerprint.json": "9234acf421a087a276d8271f214cbddfdd97c1b71f4974e18a71fe44f680c7b9",
8
+ "fold_0/checkpoint_best.pth": "74ae48ea41fb2ebe5fefe00a775f5ee61b81d3bb91963e0ffc9c35630f3f1a3a",
9
+ "fold_0/checkpoint_final.pth": "c513cee01f60eb21f2b9ee74f9f0fd2d44a84d99437440d7e1836ccfd91e25bb",
10
+ "plans.json": "edadfcb32d5d88e1da2c466bc16cf0e34521c148596c91bf57805f33b94c1d4a"
11
  },
12
  "augmentation_profile_hash": "6f738a972b6f7eba84ee6a2cd5cbd01f83dbed2afa9633439b89e76bb3a5a4dd",
13
  "backend_id": "nnunetv2-local",
14
  "backend_version": "2.8.1",
15
  "benchmark_id": null,
16
  "checkpoint_path": "fold_0/checkpoint_final.pth",
17
+ "checkpoint_sha256": "c513cee01f60eb21f2b9ee74f9f0fd2d44a84d99437440d7e1836ccfd91e25bb",
18
  "configuration": {
19
  "configuration": "2d",
20
+ "dataset_id": 503,
21
+ "dataset_name": "MicroridgeMembraneFirst",
22
  "epochs": 100,
23
  "executed_locally": true,
24
  "fold": 0,
25
+ "label_priority": "membrane-first-v2",
26
  "membrane_width_px": 3,
27
  "microridge_width_px": 5,
28
+ "plan_command": "nnUNetv2_plan_and_preprocess -d 503 -c 2d --verify_dataset_integrity",
29
  "plans": "nnUNetPlans",
30
  "source_data": "full view field tiles, trustworthy regions only",
31
  "split_grouping": "specimen:field_frame_uri",
32
+ "supersedes": "Dataset502 (exclusive-v1) whose labels lost 71% of the membrane",
33
  "torch_version": "2.12.1+cu130",
34
+ "train_command": "nnUNetv2_train 503 2d 0 -tr nnUNetTrainer_100epochs --npz",
35
  "trainer": "nnUNetTrainer_100epochs",
36
+ "training_job_id": "064df461-43de-4393-aca9-51b2d97209e4"
37
  },
38
+ "created_at": "2026-09-01T10:29:13.172184Z",
39
+ "dataset_artifact_hash": "f5a648f0dde8485a96df95d26d7b0edadd68482a8d9fa1c91420b1c58809d090",
40
  "folds_completed": [
41
  0
42
  ],
 
45
  "label_contract": "cellvector.annotation/1.0.0",
46
  "metrics": {
47
  "frozen_test_cases": 36,
48
+ "frozen_test_cell_membrane_boundary_f1": 0.87437327255091,
49
+ "frozen_test_cell_membrane_dice": 0.7074205306372878,
50
+ "frozen_test_cell_region_dice": 0.9432985097912598,
51
+ "frozen_test_cell_region_iou": 0.8930619679511916,
52
+ "frozen_test_microridge_dice": 0.8519748198693858,
53
+ "frozen_test_microridge_precision": 0.8986679339680429,
54
+ "frozen_test_microridge_recall": 0.8215124251430418,
55
+ "frozen_test_microridge_skeleton_length_error": 0.10468182937528298,
56
+ "nnunet_validation_dice_cell_membrane": 0.6959348980123595,
57
+ "nnunet_validation_dice_cell_region": 0.9642334995848282,
58
+ "nnunet_validation_dice_microridge": 0.8858968681328583
59
  },
60
+ "model_id": "a619b15c-e00f-489b-887c-6386e3836c11",
61
  "parent_model_id": null,
62
  "provenance_status": "verified",
63
  "selected_at": null,
 
66
  "snapshot_hash": "dbe134f83c52b8ecae6cb62182310205496497ec297406ed8a2c912b60ba8cc9",
67
  "software_smoke_test": false,
68
  "status": "trained",
69
+ "training_job_id": "064df461-43de-4393-aca9-51b2d97209e4",
70
+ "updated_at": "2026-09-01T10:29:13.172184Z"
71
  }
72
  ],
73
  "schema_version": "1.0.0"