Cross-channel nuclei-from-cellmask (Cellpose-SAM)
Segments nuclei from the host cell mask channel alone — no nuclear stain required. A cross-channel model: it is given the cell image and predicts where the nuclei are, freeing the DAPI/Hoechst channel for another marker.
- Architecture: Cellpose-SAM (cpsam_v2)
- Model Zoo key:
nuclei_from_cellmask_v1
- Checkpoint:
nuclei_from_cellmask
- Trained by: einarolafsson
Use it in spaCR
This model is distributed through the spaCR Model Zoo. spaCR is an open-source
package for spatial phenotype analysis of CRISPR screens and microscopy images.
pip install spacr
Model Zoo (GUI)
Launch the GUI and open the Model Zoo:
spacr
Find Cross-channel nuclei-from-cellmask (Cellpose-SAM) in the model list and press Download. The Model Zoo verifies
the checkpoint's SHA-256 after download, so a truncated or substituted file is
rejected rather than silently used.
Model Zoo (Python)
from spacr import model_zoo
entry = next(e for e in model_zoo.catalogue() if e.key == "nuclei_from_cellmask_v1")
path = model_zoo.install(entry, dest="~/spacr_models")
print(path) # verified local checkpoint
Mask generation
Point spaCR's mask generation at the downloaded checkpoint:
from spacr.core import preprocess_generate_masks
settings = {
"src": "/path/to/images",
"nucleus": "cellpose",
"nucleus_model": str(path), # the checkpoint fetched above
"nucleus_diameter": 20,
}
preprocess_generate_masks(settings)
In the GUI the same thing is under Make masks — choose the downloaded model in
the Cellpose model field for the relevant object.
API: :func:spacr.core.preprocess_generate_masks,
:func:spacr.spacr_cellpose.generate_masks_from_imgs
Performance
| model |
train |
train obj. |
test |
test obj. |
CV |
F1 @ IoU 0.5 |
AJI |
Dice |
final train loss |
final val loss |
val - train |
best epoch |
| stock cpsam_v2 (no fine-tuning) |
— |
— |
453 |
42487 |
— |
0.2009 |
0.2856 |
0.4493 |
— |
— |
— |
— |
| this model |
— |
not recorded |
453 |
42487 |
no (single well-grouped split) |
0.8881 |
0.7916 |
0.8774 |
— |
— |
— |
best / 100 |
Scored on a well-grouped held-out split — no well appears in both train and test.
Per host cell line:
| host |
n |
F1 |
AJI |
| HFF |
157 |
0.9323 |
0.7462 |
| HeLa |
147 |
0.8596 |
0.8799 |
| THP1 |
149 |
0.8610 |
0.7524 |
Objects are reference (ground-truth) objects. Training-set object counts and the per-epoch history were not preserved for this run, so the loss columns and training curves are unavailable.
Training data
Well-grouped split shared with the other cross-channel models, so no well leaks
across train and test. 100 epochs from stock cpsam_v2, AdamW, lr 1e-5, weight decay 0.1.
Files in this repository
| path |
what |
checkpoints/nuclei_from_cellmask |
data |
checkpoints/nuclei_from_cellmask_epoch_0010 |
data |
checkpoints/nuclei_from_cellmask_epoch_0020 |
data |
checkpoints/nuclei_from_cellmask_epoch_0030 |
data |
checkpoints/nuclei_from_cellmask_epoch_0040 |
data |
checkpoints/nuclei_from_cellmask_epoch_0050 |
data |
checkpoints/nuclei_from_cellmask_epoch_0060 |
data |
checkpoints/nuclei_from_cellmask_epoch_0070 |
data |
checkpoints/nuclei_from_cellmask_epoch_0080 |
data |
checkpoints/nuclei_from_cellmask_epoch_0090 |
data |
qc/best_matched_ious.csv |
data |
qc/best_perimage.csv |
data |
qc/best_perimage_periou.csv |
data |
qc/best_periou.csv |
data |
qc/best_summary.json |
data |
qc/comparison_vs_stock.csv |
data |
qc/final_matched_ious.csv |
data |
qc/final_perimage.csv |
data |
qc/final_perimage_periou.csv |
data |
qc/final_periou.csv |
data |
qc/final_summary.json |
data |
qc/stock_cpsam_v2_matched_ious.csv |
data |
qc/stock_cpsam_v2_perimage.csv |
data |
qc/stock_cpsam_v2_perimage_periou.csv |
data |
qc/stock_cpsam_v2_periou.csv |
data |
qc/stock_cpsam_v2_summary.json |
data |
training/best_perimage.csv |
training metrics |
training/loss_per_epoch.csv |
training metrics |
training/metrics.csv |
training metrics |
training/nuclei_from_cellmask_training_curves.pdf |
training metrics |
training/nuclei_from_cellmask_training_curves.png |
training metrics |
training/report.json |
training metrics |
training/scores/best_matched_ious.csv |
training metrics |
training/scores/best_perimage.csv |
training metrics |
training/scores/best_perimage_periou.csv |
training metrics |
training/scores/best_periou.csv |
training metrics |
training/scores/comparison_vs_stock.csv |
training metrics |
training/scores/final_matched_ious.csv |
training metrics |
training/scores/final_perimage.csv |
training metrics |
training/scores/final_perimage_periou.csv |
training metrics |
training/scores/final_periou.csv |
training metrics |
training/scores/stock_cpsam_v2_matched_ious.csv |
training metrics |
training/scores/stock_cpsam_v2_perimage.csv |
training metrics |
training/scores/stock_cpsam_v2_perimage_periou.csv |
training metrics |
training/scores/stock_cpsam_v2_periou.csv |
training metrics |
weights/nuclei_from_cellmask |
data |
weights/nuclei_from_cellmask_best |
data |
Limitations
- The held-out split is used for checkpoint selection, so it is validation data rather than a fully independent test set.
- Targets are automatic reference labels rather than hand-drawn ground truth.
- Predicts nuclei positions from cell morphology — expect degraded accuracy on unusual or highly confluent morphologies.
Links
- spaCR on GitHub: https://github.com/EinarOlafsson/spacr
- Model Zoo API:
spacr.model_zoo — catalogue(), install(), fetch(), verify()
- Mask generation API:
spacr.core.preprocess_generate_masks
- Issues and questions: https://github.com/EinarOlafsson/spacr/issues