Automated 3D cell detection in large microscopy images
Project description
cellfinder-core
Standalone cellfinder cell detection algorithm
This package implements the cell detection algorithm from Tyson, Rousseau & Niedworok et al. (2021) without any dependency on data type (i.e. it can be used outside of whole-brain microscopy).
cellfinder-core
supports the
cellfinder software for
whole-brain microscopy analysis, and the algorithm can also be implemented in
napari using the
cellfinder napari plugin.
Instructions
Installation
cellfinder-core
supports Python >=3.7,
and works across Linux, Windows, and should work on most versions of macOS
(although this is not tested).
Assuming you have a Python environment set up
(e.g. using conda),
you can install cellfinder-core
with:
pip install cellfinder-core
Once you have installed napari. You can install napari either through the napari plugin installation tool, or directly from PyPI with:
pip install cellfinder-napari
N.B. To speed up cellfinder, you need CUDA & cuDNN installed. Instructions here.
Usage
Before using cellfinder-core, it may be useful to take a look at the preprint which outlines the algorithm.
The API is not yet fully documented. For an idea of what the parameters do, see the documentation for the cellfinder whole-brain microscopy image analysis command-line tool (cell candidate detection, cell candidate classification). It may also be useful to try the cellfinder napari plugin so you can adjust the parameters in a GUI.
To run the full pipeline (cell candidate detection and classification)
from cellfinder_core.main import main as cellfinder_run
import tifffile
signal_array = tifffile.imread("/path/to/signal_image.tif")
background_array = tifffile.imread("/path/to/background_image.tif")
voxel_sizes = [5, 2, 2] # in microns
detected_cells = cellfinder_run(signal_array,background_array,voxel_sizes)
The output is a list of
imlib Cell objects.
Each Cell
has a centroid coordinate, and a type:
print(detected_cells[0])
# Cell: x: 132, y: 308, z: 10, type: 2
Cell type 2 is a "real" cell, and Cell type 1 is a "rejected" object (i.e. not classified as a cell):
from imlib.cells.cells import Cell
print(Cell.CELL)
# 2
print(Cell.NO_CELL)
# 1
Saving the results
If you want to save the detected cells for use in other BrainGlobe software (e.g. the cellfinder napari plugin), you can save in the cellfinder XML standard:
from imlib.IO.cells import save_cells
save_cells(detected_cells, "/path/to/cells.xml")
You can load these back with:
from imlib.IO.cells import get_cells
cells = get_cells("/path/to/cells.xml")
Using dask for lazy loading
cellfinder-core
supports most array-like objects. Using
Dask arrays allows for lazy
loading of data, allowing large (e.g. TB) datasets to be processed.
cellfinder-core
comes with a function
(based on napari-ndtiffs) to
load a series of image files (e.g. a directory of 2D tiff files) as a Dask
array. cellfinder-core
can then be used in the same way as with a numpy array.
from cellfinder_core.main import main as cellfinder_run
from cellfinder_core.tools.IO import read_with_dask
signal_array = read_with_dask("/path/to/signal_image_directory")
background_array = read_with_dask("/path/to/background_image_directory")
voxel_sizes = [5, 2, 2] # in microns
detected_cells = cellfinder_run(signal_array,background_array,voxel_sizes)
Running the cell candidate detection and classification separately.
import tifffile
from pathlib import Path
from cellfinder_core.detect import detect
from cellfinder_core.classify import classify
signal_array = tifffile.imread("/path/to/signal_image.tif")
background_array = tifffile.imread("/path/to/background_image.tif")
voxel_sizes = [5, 2, 2] # in microns
home = Path.home()
install_path = home / ".cellfinder" # default
start_plane=0
end_plane=-1
trained_model=None
model_weights=None
model="resnet50_tv"
batch_size=32
n_free_cpus=2
network_voxel_sizes=[5, 1, 1]
soma_diameter=16
ball_xy_size=6
ball_z_size=15
ball_overlap_fraction=0.6
log_sigma_size=0.2
n_sds_above_mean_thresh=10
soma_spread_factor=1.4
max_cluster_size=100000
cube_width=50
cube_height=50
cube_depth=20
network_depth="50"
cell_candidates = detect.main(
signal_array,
start_plane,
end_plane,
voxel_sizes,
soma_diameter,
max_cluster_size,
ball_xy_size,
ball_z_size,
ball_overlap_fraction,
soma_spread_factor,
n_free_cpus,
log_sigma_size,
n_sds_above_mean_thresh,
)
if len(cell_candidates) > 0: # Don't run if there's nothing to classify
classified_cells = classify.main(
cell_candidates,
signal_array,
background_array,
n_free_cpus,
voxel_sizes,
network_voxel_sizes,
batch_size,
cube_height,
cube_width,
cube_depth,
trained_model,
model_weights,
network_depth,
)
Training the network
The training data needed are matched pairs (signal & background) of small (usually 50 x 50 x 100um) images centered on the coordinate of candidate cells. These can be generated however you like, but I recommend using the Napari plugin.
cellfinder-core
comes with a 50-layer ResNet trained on ~100,000 data points
from serial two-photon microscopy images of mouse brains
(available here).
Training the network is likely simpler using the command-line interface or the Napari plugin, but it is possible through the Python API.
from pathlib import Path
from cellfinder_core.train.train_yml import run as run_training
# list of training yml files
yaml_files = [Path("/path/to/training_yml.yml)]
# where to save the output
output_directory = Path("/path/to/saved_training_data")
home = Path.home()
install_path = home / ".cellfinder" # default
run_training(
output_directory,
yaml_files,
install_path=install_path,
learning_rate=0.0001,
continue_training=True, # by default use supplied model
test_fraction=0.1,
batch_size=32,
save_progress=True,
epochs=10,
)
More info
More documentation about cellfinder and other BrainGlobe tools can be found here.
This software is at a very early stage, and was written with our data in mind. Over time we hope to support other data types/formats. If you have any questions or issues, please get in touch by email, on the forum or by raising an issue.
Illustration
Introduction
cellfinder takes a stitched, but otherwise raw dataset with at least two channels:
- Background channel (i.e. autofluorescence)
- Signal channel, the one with the cells to be detected:
Raw coronal serial two-photon mouse brain image showing labelled cells
Cell candidate detection
Classical image analysis (e.g. filters, thresholding) is used to find cell-like objects (with false positives):
Candidate cells (including many artefacts)
Cell candidate classification
A deep-learning network (ResNet) is used to classify cell candidates as true cells or artefacts:
Cassified cell candidates. Yellow - cells, Blue - artefacts
Citing cellfinder
If you find this plugin useful, and use it in your research, please cite the preprint outlining the cell detection algorithm:
Tyson, A. L., Rousseau, C. V., Niedworok, C. J., Keshavarzi, S., Tsitoura, C., Cossell, L., Strom, M. and Margrie, T. W. (2021) “A deep learning algorithm for 3D cell detection in whole mouse brain image datasets’ PLOS Computational Biology, 17(5), e1009074 https://doi.org/10.1371/journal.pcbi.1009074
If you use this, or any other tools in the brainglobe suite, please let us know, and we'd be happy to promote your paper/talk etc.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Hashes for cellfinder_core-0.2.6rc3-cp39-cp39-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6562156a5631e17a6e79ff3693bcb47f1e9836bce551435efd6501615fd35ebf |
|
MD5 | 9c6c1d398a31ba043b8a90d2e92b598b |
|
BLAKE2b-256 | 97bf69a68bb1ed733364df5543f25da170203159d5c36d4afc5b6cdba054c8c6 |
Hashes for cellfinder_core-0.2.6rc3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f4bb3df0fcc4db6e5007f93759dd8065989224217c83badc5ffcc09e79a8f19c |
|
MD5 | 95ffde94f52da07e19bdaa13cd38a365 |
|
BLAKE2b-256 | 224ff07148c0b600cacf927e3acf9c3f281eba5437e4ebbf67affe10c9d8c168 |
Hashes for cellfinder_core-0.2.6rc3-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a268e328cec15272a477278593e4d132bdd8eee258590b568d7256798e89e952 |
|
MD5 | a519178e04959974acc7b97fb96cb266 |
|
BLAKE2b-256 | e651581e8b0e623c14d6c5d646822f89a88d2fe5c414d24787c8db73db015ccb |
Hashes for cellfinder_core-0.2.6rc3-cp38-cp38-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1c7f3b90a204201e5aca714b07709235e9dd56ce79bf07245eef8253e851d36a |
|
MD5 | 28c34afb4771e0d37a519b2fc8cd5793 |
|
BLAKE2b-256 | 5dddea72db4ce477f4ccbace1541a9d930b0bad8dd6550adf6c5cfbf59c312a1 |
Hashes for cellfinder_core-0.2.6rc3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7148f0c75965a33044b8dd944846b1c2c9808e5191d906e0bd4ec668eeef31ee |
|
MD5 | 1d49d53ad08ec1ec2dc823b50c00fe02 |
|
BLAKE2b-256 | 1d9adba328c962229d0ff6155c61d93b16356d17df860d8cd5e9bf9f02390215 |
Hashes for cellfinder_core-0.2.6rc3-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3a62872900b6d959b76438250e9ef60ef97790ced1a3354a1efbc799e6e7dd39 |
|
MD5 | 45ea8c80af88805cf0a237c790c2ac26 |
|
BLAKE2b-256 | 733f1efd0214a97f49cd9e3c2b4fd31f88e3302354165e9e7848257a61f8cb20 |
Hashes for cellfinder_core-0.2.6rc3-cp37-cp37m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ce73c8fa1868613e72c0f2f9535cefdf7536bad43a8a1b05538f7cbef30407bd |
|
MD5 | 40791bfe9bde04468f363c2c6bb30d23 |
|
BLAKE2b-256 | 02b0dcf12a20d32c844430d665bb3c23a324915b8fad896a3028103f82daeddb |
Hashes for cellfinder_core-0.2.6rc3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 08312e5250a2b20b16b36927426ee05c968ee3b86e9aa5438cc5194d297137cd |
|
MD5 | d8a119afe906ca5be6cc50053df84a6a |
|
BLAKE2b-256 | 1a2996b588cabc336e7518c6b55256b224e401e27c935a1d2637f6a021d062ad |
Hashes for cellfinder_core-0.2.6rc3-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3c4741fab46aa6ebb342db5b20562c63680967b97b16211e1efd3131cd667f7e |
|
MD5 | 4d47160460d033f7620b051ab06e1646 |
|
BLAKE2b-256 | 55a96b12d34039bd00a3208f44bbb55b00abc22ecbb374516ca6d6e84c7cc85a |