LiangLabUMB's picture
Update README.md
a885eb4 verified
|
Raw History Blame Contribute Delete
3.12 kB
---
title: CellposeCellCounter_v5
emoji: πŸ”¬
colorFrom: blue
colorTo: indigo
sdk: gradio
sdk_version: 5.35.0
app_file: app.py
pinned: false
---
# CellposeCellCounter
Cell counting and viability from a phone photograph of a hemocytometer, using a
fine-tuned Cellpose-SAM model for segmentation and a single interpretable contrast
threshold for viability.
## How to use it
1. Photograph one 4Γ—4 counting block through the phone adaptor.
2. Upload it and **tap once in the centre of the block**. The app detects the four
corners and crops to it. This step is not optional β€” an uncropped frame covers far
more than one block and the concentration would be wrong.
3. Run segmentation. Live/dead and concentration are reported together.
## Segmentation
Cellpose-SAM fine-tuned on 13 hand-corrected images (1,069 annotated cells) from this
imaging setup. Held-out performance on 6 further images (556 annotated cells, IoU 0.5):
| model | count error | precision | recall | F1 |
|---|---|---|---|---|
| **this model** | **βˆ’1.1%** | **0.940** | 0.926 | **0.933** |
| previous fine-tune | +40.6% | 0.656 | 0.932 | 0.768 |
| Cellpose-SAM, off the shelf | βˆ’63.7% | 0.741 | 0.238 | 0.319 |
The dominant error of the previous model was over-segmentation of debris: correcting
its output required 336 deletions against 79 additions.
## Viability
Each cell's mean grey level is divided by the median grey of a background annulus
around it (20 px wide, 2 px gap, neighbouring cells excluded). Cells scoring below
**1.0** β€” no brighter than the medium surrounding them β€” are called dead.
The threshold is not fitted: 1.0 means the cell has lost all refractile contrast
against its own local background. It was chosen from that reasoning and then tested
against 1,625 hand-labelled cells. On 556 held-out cells: **accuracy 0.993**, AUC
0.984, and per-field viability within **0.3 percentage points** of expert annotation.
Accuracy is insensitive to the annulus geometry: across widths of 8–40 px and gaps of
0–8 px, held-out accuracy varied by 0.7 points (four cells of 556).
No training data, calibration, scaler or colour information is used for viability.
## Note on the minimum size filter
It is **off by default** and should stay off. When enabled without an explicit value
it uses the 25th percentile of each image, so it always deletes a quarter of the
objects however clean the field is β€” measured on this dataset it removed 18–25% of
real cells, cut the count by the same fraction, and inflated viability by ~2 points
because dead cells are the smaller ones.
## Limitations
- Viability assumes brightfield imaging with an exclusion stain (live cells refractile,
dead cells stained). It does not apply to fluorescence viability assays.
- The threshold is calibration-free *given a segmentation convention*. Changing what
the mask covers β€” a different model, a different working resolution β€” shifts the
measured ratio even though the cell has not changed.
- Any dark object accepted as a cell by segmentation will be called dead, so accuracy
is bounded by segmentation quality.