Cross-channel cell from hoechst (Cellpose-SAM)
Fine-tuned from stock cpsam_v2 (CellposeSAM), 100 epochs, file-mode training.
Built for use with spaCR.
Data
2578 training fields (237957 annotated objects), 451 held-out test fields
(45098 objects); 451 test fields contained objects and were scored.
Split by well, so no well appears on both sides. Per-field split and counts: training/fields.csv.
Results (held-out, best epoch 70)
| model | F1 | precision | recall | mAP | AJI | Dice |
|---|---|---|---|---|---|---|
| stock cpsam_v2 | 0.3012 | 0.3086 | 0.2942 | 0.0575 | 0.3506 | 0.5235 |
| best | 0.8697 | 0.9437 | 0.8064 | 0.5591 | 0.7991 | 0.8948 |
| final | 0.8667 | 0.9429 | 0.8018 | 0.552 | 0.7929 | 0.8904 |
F1 improves 0.5685 over stock (2.89x). The mAP ratio is inflated by a near-zero stock denominator (0.0575) - quote the delta, not the ratio.
Installation
This model is trained and used with spaCR, a toolkit for spatial phenotype analysis of high-content microscopy screens.
pip install spacr # https://pypi.org/project/spacr/
conda install -c conda-forge spacr # https://anaconda.org/conda-forge/spacr
- Source: https://github.com/EinarOlafsson/spacr
- PyPI: https://pypi.org/project/spacr/
- conda-forge: https://anaconda.org/conda-forge/spacr
Get the weights
from huggingface_hub import hf_hub_download
w = hf_hub_download("einarolafsson/cross-channel-cell-from-hoechst-cpsam", "weights/cell_from_hoechst")
Use in spaCR
spaCR takes a path to a custom Cellpose model via the custom_model setting, so point it at the
file downloaded above:
from spacr.core import preprocess_generate_masks
settings = {
"src": "/path/to/your/plate",
"cell_channel": 0, # the cell-mask channel this model reads
"nucleus_channel": 1,
"custom_model": w, # path from hf_hub_download above
"preprocess": True,
"masks": True,
}
preprocess_generate_masks(settings)
One caveat worth knowing: pathogen_model is not a free-form path. spaCR validates it against a
fixed list (['toxo_pv_lumen', 'toxo_cyto']), so a custom model on disk goes through custom_model,
not pathogen_model. See spacr/settings.py and spacr/core.py.
Use with Cellpose directly
from cellpose import models
m = models.CellposeModel(gpu=True, pretrained_model=w)
masks = m.eval(img, normalize=True)[0]
Always pass a real path. Cellpose silently substitutes its own default model for an unrecognised bare name, which would quietly give you the wrong weights.
Environment
| cellpose (training) | 4.0.9 |
| cellpose (scoring) | 4.0.9 |
| GPU | NVIDIA GeForce RTX 3090 Ti |
| base weights | cpsam_v2 |
Contents
weights/- final and bestcheckpoints/- epoch snapshotsqc/- per-image and per-IoU metrics, per-tag summaries,comparison_vs_stock.csvtraining/-loss_per_epoch.csv(per-epoch train and validation loss),metrics.csv(per-checkpoint F1/precision/recall/mAP/AJI/Dice), curves,fields.csv,report.json
Metrics are at IoU 0.50-0.95 in 0.05 steps; every model is scored against stock cpsam_v2 on the
identical holdout so "better than stock" is always answerable.
Training data: einarolafsson/cross-channel-cell-from-hoechst