cellfinder 1.7.0__py3-none-any.whl → 1.8.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cellfinder/core/classify/classify.py +48 -2
- cellfinder/core/detect/detect.py +60 -51
- cellfinder/core/detect/filters/plane/plane_filter.py +1 -1
- cellfinder/core/detect/filters/setup_filters.py +31 -12
- cellfinder/core/detect/filters/volume/ball_filter.py +5 -5
- cellfinder/core/detect/filters/volume/structure_splitting.py +2 -0
- cellfinder/core/detect/filters/volume/volume_filter.py +1 -1
- cellfinder/core/main.py +128 -14
- cellfinder/napari/curation.py +2 -2
- cellfinder/napari/detect/detect.py +58 -26
- cellfinder/napari/detect/detect_containers.py +19 -6
- {cellfinder-1.7.0.dist-info → cellfinder-1.8.0.dist-info}/METADATA +2 -2
- {cellfinder-1.7.0.dist-info → cellfinder-1.8.0.dist-info}/RECORD +17 -17
- {cellfinder-1.7.0.dist-info → cellfinder-1.8.0.dist-info}/WHEEL +0 -0
- {cellfinder-1.7.0.dist-info → cellfinder-1.8.0.dist-info}/entry_points.txt +0 -0
- {cellfinder-1.7.0.dist-info → cellfinder-1.8.0.dist-info}/licenses/LICENSE +0 -0
- {cellfinder-1.7.0.dist-info → cellfinder-1.8.0.dist-info}/top_level.txt +0 -0
|
@@ -19,8 +19,8 @@ def main(
|
|
|
19
19
|
signal_array: types.array,
|
|
20
20
|
background_array: types.array,
|
|
21
21
|
n_free_cpus: int,
|
|
22
|
-
voxel_sizes: Tuple[
|
|
23
|
-
network_voxel_sizes: Tuple[
|
|
22
|
+
voxel_sizes: Tuple[float, float, float],
|
|
23
|
+
network_voxel_sizes: Tuple[float, float, float],
|
|
24
24
|
batch_size: int,
|
|
25
25
|
cube_height: int,
|
|
26
26
|
cube_width: int,
|
|
@@ -29,12 +29,58 @@ def main(
|
|
|
29
29
|
model_weights: Optional[os.PathLike],
|
|
30
30
|
network_depth: depth_type,
|
|
31
31
|
max_workers: int = 3,
|
|
32
|
+
pin_memory: bool = False,
|
|
32
33
|
*,
|
|
33
34
|
callback: Optional[Callable[[int], None]] = None,
|
|
34
35
|
) -> List[Cell]:
|
|
35
36
|
"""
|
|
36
37
|
Parameters
|
|
37
38
|
----------
|
|
39
|
+
|
|
40
|
+
points: List of Cell objects
|
|
41
|
+
The potential cells to classify.
|
|
42
|
+
signal_array : numpy.ndarray or dask array
|
|
43
|
+
3D array representing the signal data in z, y, x order.
|
|
44
|
+
background_array : numpy.ndarray or dask array
|
|
45
|
+
3D array representing the signal data in z, y, x order.
|
|
46
|
+
n_free_cpus : int
|
|
47
|
+
How many CPU cores to leave free.
|
|
48
|
+
voxel_sizes : 3-tuple of floats
|
|
49
|
+
Size of your voxels in the z, y, and x dimensions.
|
|
50
|
+
network_voxel_sizes : 3-tuple of floats
|
|
51
|
+
Size of the pre-trained network's voxels in the z, y, and x dimensions.
|
|
52
|
+
batch_size : int
|
|
53
|
+
How many potential cells to classify at one time. The GPU/CPU
|
|
54
|
+
memory must be able to contain at once this many data cubes for
|
|
55
|
+
the models. For performance-critical applications, tune to maximize
|
|
56
|
+
memory usage without running out. Check your GPU/CPU memory to verify
|
|
57
|
+
it's not full.
|
|
58
|
+
cube_height: int
|
|
59
|
+
The height of the data cube centered on the cell used for
|
|
60
|
+
classification. Defaults to `50`.
|
|
61
|
+
cube_width: int
|
|
62
|
+
The width of the data cube centered on the cell used for
|
|
63
|
+
classification. Defaults to `50`.
|
|
64
|
+
cube_depth: int
|
|
65
|
+
The depth of the data cube centered on the cell used for
|
|
66
|
+
classification. Defaults to `20`.
|
|
67
|
+
trained_model : Optional[Path]
|
|
68
|
+
Trained model file path (home directory (default) -> pretrained
|
|
69
|
+
weights).
|
|
70
|
+
model_weights : Optional[Path]
|
|
71
|
+
Model weights path (home directory (default) -> pretrained
|
|
72
|
+
weights).
|
|
73
|
+
network_depth: str
|
|
74
|
+
The network depth to use during classification. Defaults to `"50"`.
|
|
75
|
+
max_workers: int
|
|
76
|
+
The number of sub-processes to use for data loading / processing.
|
|
77
|
+
Defaults to 8.
|
|
78
|
+
pin_memory: bool
|
|
79
|
+
Pins data to be sent to the GPU to the CPU memory. This allows faster
|
|
80
|
+
GPU data speeds, but can only be used if the data used by the GPU can
|
|
81
|
+
stay in the CPU RAM while the GPU uses it. I.e. there's enough RAM.
|
|
82
|
+
Otherwise, if there's a risk of the RAM being paged, it shouldn't be
|
|
83
|
+
used. Defaults to False.
|
|
38
84
|
callback : Callable[int], optional
|
|
39
85
|
A callback function that is called during classification. Called with
|
|
40
86
|
the batch number once that batch has been classified.
|
cellfinder/core/detect/detect.py
CHANGED
|
@@ -49,10 +49,11 @@ def main(
|
|
|
49
49
|
plane_directory: Optional[str] = None,
|
|
50
50
|
batch_size: Optional[int] = None,
|
|
51
51
|
torch_device: Optional[str] = None,
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
pin_memory: bool = False,
|
|
53
|
+
split_ball_xy_size: float = 6,
|
|
54
|
+
split_ball_z_size: float = 15,
|
|
54
55
|
split_ball_overlap_fraction: float = 0.8,
|
|
55
|
-
|
|
56
|
+
n_splitting_iter: int = 10,
|
|
56
57
|
*,
|
|
57
58
|
callback: Optional[Callable[[int], None]] = None,
|
|
58
59
|
) -> List[Cell]:
|
|
@@ -61,69 +62,80 @@ def main(
|
|
|
61
62
|
|
|
62
63
|
Parameters
|
|
63
64
|
----------
|
|
64
|
-
signal_array : numpy.ndarray
|
|
65
|
-
3D array representing the signal data.
|
|
66
|
-
|
|
65
|
+
signal_array : numpy.ndarray or dask array
|
|
66
|
+
3D array representing the signal data in z, y, x order.
|
|
67
67
|
start_plane : int
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
First plane index to process (inclusive, to process a subset of the
|
|
69
|
+
data).
|
|
70
70
|
end_plane : int
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
voxel_sizes :
|
|
74
|
-
|
|
75
|
-
|
|
71
|
+
Last plane index to process (exclusive, to process a subset of the
|
|
72
|
+
data).
|
|
73
|
+
voxel_sizes : 3-tuple of floats
|
|
74
|
+
Size of your voxels in the z, y, and x dimensions (microns).
|
|
76
75
|
soma_diameter : float
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
The expected in-plane (xy) soma diameter (microns).
|
|
79
77
|
max_cluster_size : float
|
|
80
|
-
|
|
81
|
-
|
|
78
|
+
Largest detected cell cluster (in cubic um) where splitting
|
|
79
|
+
should be attempted. Clusters above this size will be labeled
|
|
80
|
+
as artifacts.
|
|
82
81
|
ball_xy_size : float
|
|
83
|
-
|
|
84
|
-
|
|
82
|
+
3d filter's in-plane (xy) filter ball size (microns).
|
|
85
83
|
ball_z_size : float
|
|
86
|
-
|
|
87
|
-
|
|
84
|
+
3d filter's axial (z) filter ball size (microns).
|
|
88
85
|
ball_overlap_fraction : float
|
|
89
|
-
|
|
90
|
-
|
|
86
|
+
3d filter's fraction of the ball filter needed to be filled by
|
|
87
|
+
foreground voxels, centered on a voxel, to retain the voxel.
|
|
91
88
|
soma_spread_factor : float
|
|
92
|
-
|
|
93
|
-
|
|
89
|
+
Cell spread factor for determining the largest cell volume before
|
|
90
|
+
splitting up cell clusters. Structures with spherical volume of
|
|
91
|
+
diameter `soma_spread_factor * soma_diameter` or less will not be
|
|
92
|
+
split.
|
|
94
93
|
n_free_cpus : int
|
|
95
|
-
|
|
96
|
-
|
|
94
|
+
How many CPU cores to leave free.
|
|
97
95
|
log_sigma_size : float
|
|
98
|
-
|
|
99
|
-
|
|
96
|
+
Gaussian filter width (as a fraction of soma diameter) used during
|
|
97
|
+
2d in-plane Laplacian of Gaussian filtering.
|
|
100
98
|
n_sds_above_mean_thresh : float
|
|
101
|
-
|
|
102
|
-
|
|
99
|
+
Intensity threshold (the number of standard deviations above
|
|
100
|
+
the mean) of the filtered 2d planes used to mark pixels as
|
|
101
|
+
foreground or background.
|
|
103
102
|
outlier_keep : bool, optional
|
|
104
103
|
Whether to keep outliers during detection. Defaults to False.
|
|
105
|
-
|
|
106
104
|
artifact_keep : bool, optional
|
|
107
105
|
Whether to keep artifacts during detection. Defaults to False.
|
|
108
|
-
|
|
109
106
|
save_planes : bool, optional
|
|
110
107
|
Whether to save the planes during detection. Defaults to False.
|
|
111
|
-
|
|
112
108
|
plane_directory : str, optional
|
|
113
109
|
Directory path to save the planes. Defaults to None.
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
The
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
becomes slower.
|
|
121
|
-
|
|
110
|
+
batch_size: int
|
|
111
|
+
The number of planes of the original data volume to process at
|
|
112
|
+
once. The GPU/CPU memory must be able to contain this many planes
|
|
113
|
+
for all the filters. For performance-critical applications, tune to
|
|
114
|
+
maximize memory usage without running out. Check your GPU/CPU memory
|
|
115
|
+
to verify it's not full.
|
|
122
116
|
torch_device : str, optional
|
|
123
117
|
The device on which to run the computation. If not specified (None),
|
|
124
118
|
"cuda" will be used if a GPU is available, otherwise "cpu".
|
|
125
119
|
You can also manually specify "cuda" or "cpu".
|
|
126
|
-
|
|
120
|
+
pin_memory: bool
|
|
121
|
+
Pins data to be sent to the GPU to the CPU memory. This allows faster
|
|
122
|
+
GPU data speeds, but can only be used if the data used by the GPU can
|
|
123
|
+
stay in the CPU RAM while the GPU uses it. I.e. there's enough RAM.
|
|
124
|
+
Otherwise, if there's a risk of the RAM being paged, it shouldn't be
|
|
125
|
+
used. Defaults to False.
|
|
126
|
+
split_ball_xy_size: float
|
|
127
|
+
Similar to `ball_xy_size`, except the value to use for the 3d
|
|
128
|
+
filter during cluster splitting.
|
|
129
|
+
split_ball_z_size: float
|
|
130
|
+
Similar to `ball_z_size`, except the value to use for the 3d filter
|
|
131
|
+
during cluster splitting.
|
|
132
|
+
split_ball_overlap_fraction: float
|
|
133
|
+
Similar to `ball_overlap_fraction`, except the value to use for the
|
|
134
|
+
3d filter during cluster splitting.
|
|
135
|
+
n_splitting_iter: int
|
|
136
|
+
The number of iterations to run the 3d filtering on a cluster. Each
|
|
137
|
+
iteration reduces the cluster size by the voxels not retained in
|
|
138
|
+
the previous iteration.
|
|
127
139
|
callback : Callable[int], optional
|
|
128
140
|
A callback function that is called every time a plane has finished
|
|
129
141
|
being processed. Called with the plane number that has finished.
|
|
@@ -131,7 +143,7 @@ def main(
|
|
|
131
143
|
Returns
|
|
132
144
|
-------
|
|
133
145
|
List[Cell]
|
|
134
|
-
List of detected
|
|
146
|
+
List of detected cell candidates.
|
|
135
147
|
"""
|
|
136
148
|
start_time = datetime.now()
|
|
137
149
|
if torch_device is None:
|
|
@@ -187,19 +199,16 @@ def main(
|
|
|
187
199
|
plane_directory=plane_directory,
|
|
188
200
|
batch_size=batch_size,
|
|
189
201
|
torch_device=torch_device,
|
|
202
|
+
pin_memory=pin_memory,
|
|
203
|
+
n_splitting_iter=n_splitting_iter,
|
|
190
204
|
)
|
|
191
205
|
|
|
192
206
|
# replicate the settings specific to splitting, before we access anything
|
|
193
207
|
# of the original settings, causing cached properties
|
|
194
208
|
kwargs = dataclasses.asdict(settings)
|
|
195
|
-
kwargs["ball_z_size_um"] = split_ball_z_size
|
|
196
|
-
kwargs["ball_xy_size_um"] =
|
|
197
|
-
split_ball_xy_size * settings.in_plane_pixel_size
|
|
198
|
-
)
|
|
209
|
+
kwargs["ball_z_size_um"] = split_ball_z_size
|
|
210
|
+
kwargs["ball_xy_size_um"] = split_ball_xy_size
|
|
199
211
|
kwargs["ball_overlap_fraction"] = split_ball_overlap_fraction
|
|
200
|
-
kwargs["soma_diameter_um"] = (
|
|
201
|
-
split_soma_diameter * settings.in_plane_pixel_size
|
|
202
|
-
)
|
|
203
212
|
# always run on cpu because copying to gpu overhead is likely slower than
|
|
204
213
|
# any benefit for detection on smallish volumes
|
|
205
214
|
kwargs["torch_device"] = "cpu"
|
|
@@ -39,7 +39,7 @@ class TileProcessor:
|
|
|
39
39
|
Number of standard deviations above the mean threshold to use for
|
|
40
40
|
determining whether a voxel is bright.
|
|
41
41
|
log_sigma_size : float
|
|
42
|
-
Size of the sigma for the
|
|
42
|
+
Size of the Gaussian sigma for the Laplacian of Gaussian filtering.
|
|
43
43
|
soma_diameter : float
|
|
44
44
|
Diameter of the soma in voxels.
|
|
45
45
|
torch_device: str
|
|
@@ -80,23 +80,28 @@ class DetectionSettings:
|
|
|
80
80
|
|
|
81
81
|
voxel_sizes: Tuple[float, float, float] = (1.0, 1.0, 1.0)
|
|
82
82
|
"""
|
|
83
|
-
Tuple of voxel sizes in each dimension (z, y, x). We use this
|
|
84
|
-
from `um` to pixel sizes.
|
|
83
|
+
Tuple of voxel sizes (microns) in each dimension (z, y, x). We use this
|
|
84
|
+
to convert from `um` to pixel sizes.
|
|
85
85
|
"""
|
|
86
86
|
|
|
87
87
|
soma_spread_factor: float = 1.4
|
|
88
|
-
"""
|
|
88
|
+
"""
|
|
89
|
+
Cell spread factor for determining the largest cell volume before
|
|
90
|
+
splitting up cell clusters. Structures with spherical volume of
|
|
91
|
+
diameter `soma_spread_factor * soma_diameter` or less will not be
|
|
92
|
+
split.
|
|
93
|
+
"""
|
|
89
94
|
|
|
90
95
|
soma_diameter_um: float = 16
|
|
91
96
|
"""
|
|
92
|
-
Diameter of a typical soma in
|
|
93
|
-
split.
|
|
97
|
+
Diameter of a typical soma in-plane (xy) in microns.
|
|
94
98
|
"""
|
|
95
99
|
|
|
96
100
|
max_cluster_size_um3: float = 100_000
|
|
97
101
|
"""
|
|
98
|
-
|
|
99
|
-
|
|
102
|
+
Largest detected cell cluster (in cubic um) where splitting
|
|
103
|
+
should be attempted. Clusters above this size will be labeled
|
|
104
|
+
as artifacts.
|
|
100
105
|
"""
|
|
101
106
|
|
|
102
107
|
ball_xy_size_um: float = 6
|
|
@@ -116,17 +121,21 @@ class DetectionSettings:
|
|
|
116
121
|
|
|
117
122
|
ball_overlap_fraction: float = 0.6
|
|
118
123
|
"""
|
|
119
|
-
Fraction of
|
|
120
|
-
|
|
124
|
+
Fraction of the 3d ball filter needed to be filled by foreground voxels,
|
|
125
|
+
centered on a voxel, to retain the voxel.
|
|
121
126
|
"""
|
|
122
127
|
|
|
123
128
|
log_sigma_size: float = 0.2
|
|
124
|
-
"""
|
|
129
|
+
"""
|
|
130
|
+
Gaussian filter width (as a fraction of soma diameter) used during
|
|
131
|
+
2d in-plane Laplacian of Gaussian filtering.
|
|
132
|
+
"""
|
|
125
133
|
|
|
126
134
|
n_sds_above_mean_thresh: float = 10
|
|
127
135
|
"""
|
|
128
|
-
|
|
129
|
-
|
|
136
|
+
Intensity threshold (the number of standard deviations above
|
|
137
|
+
the mean) of the filtered 2d planes used to mark pixels as
|
|
138
|
+
foreground or background.
|
|
130
139
|
"""
|
|
131
140
|
|
|
132
141
|
outlier_keep: bool = False
|
|
@@ -180,6 +189,14 @@ class DetectionSettings:
|
|
|
180
189
|
to run on the first GPU.
|
|
181
190
|
"""
|
|
182
191
|
|
|
192
|
+
pin_memory: bool = False
|
|
193
|
+
"""
|
|
194
|
+
Pins data to be sent to the GPU to the CPU memory. This allows faster GPU
|
|
195
|
+
data speeds, but can only be used if the data used by the GPU can stay in
|
|
196
|
+
the CPU RAM while the GPU uses it. I.e. there's enough RAM. Otherwise, if
|
|
197
|
+
there's a risk of the RAM being paged, it shouldn't be used.
|
|
198
|
+
"""
|
|
199
|
+
|
|
183
200
|
n_free_cpus: int = 2
|
|
184
201
|
"""
|
|
185
202
|
Number of free CPU cores to keep available and not use during parallel
|
|
@@ -191,6 +208,8 @@ class DetectionSettings:
|
|
|
191
208
|
"""
|
|
192
209
|
During the structure splitting phase we iteratively shrink the bright areas
|
|
193
210
|
and re-filter with the 3d filter. This is the number of iterations to do.
|
|
211
|
+
Each iteration reduces the cluster size by the voxels not retained in the
|
|
212
|
+
previous iteration.
|
|
194
213
|
|
|
195
214
|
This is a maximum because we also stop if there are no more structures left
|
|
196
215
|
during any iteration.
|
|
@@ -78,11 +78,11 @@ class BallFilter:
|
|
|
78
78
|
----------
|
|
79
79
|
plane_height, plane_width : int
|
|
80
80
|
Height/width of the planes.
|
|
81
|
-
ball_xy_size :
|
|
82
|
-
Diameter of the spherical kernel in the x/y dimensions.
|
|
83
|
-
ball_z_size :
|
|
84
|
-
Diameter of the spherical kernel in the z dimension.
|
|
85
|
-
|
|
81
|
+
ball_xy_size : float
|
|
82
|
+
Diameter of the spherical kernel (in microns) in the x/y dimensions.
|
|
83
|
+
ball_z_size : float
|
|
84
|
+
Diameter of the spherical kernel in the z dimension in microns.
|
|
85
|
+
Determines the number of planes stacked to filter
|
|
86
86
|
the central plane of the stack.
|
|
87
87
|
overlap_fraction : float
|
|
88
88
|
The fraction of pixels within the spherical kernel that
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from copy import copy
|
|
1
2
|
from typing import List, Tuple, Type
|
|
2
3
|
|
|
3
4
|
import numpy as np
|
|
@@ -224,6 +225,7 @@ def split_cells(
|
|
|
224
225
|
where M is the number of individual cells and each centre is
|
|
225
226
|
represented by its x, y, and z coordinates.
|
|
226
227
|
"""
|
|
228
|
+
settings = copy(settings)
|
|
227
229
|
# these points are in x, y, z order columnwise, in absolute pixels
|
|
228
230
|
orig_centre = get_structure_centre(cell_points)
|
|
229
231
|
|
cellfinder/core/main.py
CHANGED
|
@@ -1,34 +1,33 @@
|
|
|
1
1
|
import os
|
|
2
2
|
from typing import Callable, List, Optional, Tuple
|
|
3
3
|
|
|
4
|
-
import numpy as np
|
|
5
4
|
from brainglobe_utils.cells.cells import Cell
|
|
6
5
|
|
|
7
|
-
from cellfinder.core import logger
|
|
6
|
+
from cellfinder.core import logger, types
|
|
8
7
|
from cellfinder.core.download.download import model_type
|
|
9
8
|
from cellfinder.core.train.train_yaml import depth_type
|
|
10
9
|
|
|
11
10
|
|
|
12
11
|
def main(
|
|
13
|
-
signal_array:
|
|
14
|
-
background_array:
|
|
15
|
-
voxel_sizes: Tuple[
|
|
12
|
+
signal_array: types.array,
|
|
13
|
+
background_array: types.array,
|
|
14
|
+
voxel_sizes: Tuple[float, float, float],
|
|
16
15
|
start_plane: int = 0,
|
|
17
16
|
end_plane: int = -1,
|
|
18
17
|
trained_model: Optional[os.PathLike] = None,
|
|
19
18
|
model_weights: Optional[os.PathLike] = None,
|
|
20
19
|
model: model_type = "resnet50_tv",
|
|
21
|
-
|
|
20
|
+
classification_batch_size: int = 64,
|
|
22
21
|
n_free_cpus: int = 2,
|
|
23
|
-
network_voxel_sizes: Tuple[
|
|
24
|
-
soma_diameter:
|
|
25
|
-
ball_xy_size:
|
|
26
|
-
ball_z_size:
|
|
22
|
+
network_voxel_sizes: Tuple[float, float, float] = (5, 1, 1),
|
|
23
|
+
soma_diameter: float = 16,
|
|
24
|
+
ball_xy_size: float = 6,
|
|
25
|
+
ball_z_size: float = 15,
|
|
27
26
|
ball_overlap_fraction: float = 0.6,
|
|
28
27
|
log_sigma_size: float = 0.2,
|
|
29
28
|
n_sds_above_mean_thresh: float = 10,
|
|
30
29
|
soma_spread_factor: float = 1.4,
|
|
31
|
-
max_cluster_size:
|
|
30
|
+
max_cluster_size: float = 100000,
|
|
32
31
|
cube_width: int = 50,
|
|
33
32
|
cube_height: int = 50,
|
|
34
33
|
cube_depth: int = 20,
|
|
@@ -36,8 +35,13 @@ def main(
|
|
|
36
35
|
skip_detection: bool = False,
|
|
37
36
|
skip_classification: bool = False,
|
|
38
37
|
detected_cells: List[Cell] = None,
|
|
39
|
-
|
|
38
|
+
detection_batch_size: Optional[int] = None,
|
|
40
39
|
torch_device: Optional[str] = None,
|
|
40
|
+
pin_memory: bool = False,
|
|
41
|
+
split_ball_xy_size: float = 6,
|
|
42
|
+
split_ball_z_size: float = 15,
|
|
43
|
+
split_ball_overlap_fraction: float = 0.8,
|
|
44
|
+
n_splitting_iter: int = 10,
|
|
41
45
|
*,
|
|
42
46
|
detect_callback: Optional[Callable[[int], None]] = None,
|
|
43
47
|
classify_callback: Optional[Callable[[int], None]] = None,
|
|
@@ -46,6 +50,111 @@ def main(
|
|
|
46
50
|
"""
|
|
47
51
|
Parameters
|
|
48
52
|
----------
|
|
53
|
+
signal_array : numpy.ndarray or dask array
|
|
54
|
+
3D array representing the signal data in z, y, x order.
|
|
55
|
+
background_array : numpy.ndarray or dask array
|
|
56
|
+
3D array representing the signal data in z, y, x order.
|
|
57
|
+
voxel_sizes : 3-tuple of floats
|
|
58
|
+
Size of your voxels in the z, y, and x dimensions (microns).
|
|
59
|
+
start_plane : int
|
|
60
|
+
First plane index to process (inclusive, to process a subset of the
|
|
61
|
+
data).
|
|
62
|
+
end_plane : int
|
|
63
|
+
Last plane index to process (exclusive, to process a subset of the
|
|
64
|
+
data).
|
|
65
|
+
trained_model : Optional[Path]
|
|
66
|
+
Trained model file path (home directory (default) -> pretrained
|
|
67
|
+
weights).
|
|
68
|
+
model_weights : Optional[Path]
|
|
69
|
+
Model weights path (home directory (default) -> pretrained
|
|
70
|
+
weights).
|
|
71
|
+
model: str
|
|
72
|
+
Type of model to use. Defaults to `"resnet50_tv"`.
|
|
73
|
+
classification_batch_size : int
|
|
74
|
+
How many potential cells to classify at one time. The GPU/CPU
|
|
75
|
+
memory must be able to contain at once this many data cubes for
|
|
76
|
+
the models. For performance-critical applications, tune to maximize
|
|
77
|
+
memory usage without running out. Check your GPU/CPU memory to verify
|
|
78
|
+
it's not full.
|
|
79
|
+
n_free_cpus : int
|
|
80
|
+
How many CPU cores to leave free.
|
|
81
|
+
network_voxel_sizes : 3-tuple of floats
|
|
82
|
+
Size of the pre-trained network's voxels (microns) in the z, y, and x
|
|
83
|
+
dimensions.
|
|
84
|
+
soma_diameter : float
|
|
85
|
+
The expected in-plane (xy) soma diameter (microns).
|
|
86
|
+
ball_xy_size : float
|
|
87
|
+
3d filter's in-plane (xy) filter ball size (microns).
|
|
88
|
+
ball_z_size : float
|
|
89
|
+
3d filter's axial (z) filter ball size (microns).
|
|
90
|
+
ball_overlap_fraction : float
|
|
91
|
+
3d filter's fraction of the ball filter needed to be filled by
|
|
92
|
+
foreground voxels, centered on a voxel, to retain the voxel.
|
|
93
|
+
log_sigma_size : float
|
|
94
|
+
Gaussian filter width (as a fraction of soma diameter) used during
|
|
95
|
+
2d in-plane Laplacian of Gaussian filtering.
|
|
96
|
+
n_sds_above_mean_thresh : float
|
|
97
|
+
Intensity threshold (the number of standard deviations above
|
|
98
|
+
the mean) of the filtered 2d planes used to mark pixels as
|
|
99
|
+
foreground or background.
|
|
100
|
+
soma_spread_factor : float
|
|
101
|
+
Cell spread factor for determining the largest cell volume before
|
|
102
|
+
splitting up cell clusters. Structures with spherical volume of
|
|
103
|
+
diameter `soma_spread_factor * soma_diameter` or less will not be
|
|
104
|
+
split.
|
|
105
|
+
max_cluster_size : float
|
|
106
|
+
Largest detected cell cluster (in cubic um) where splitting
|
|
107
|
+
should be attempted. Clusters above this size will be labeled
|
|
108
|
+
as artifacts.
|
|
109
|
+
cube_width: int
|
|
110
|
+
The width of the data cube centered on the cell used for
|
|
111
|
+
classification. Defaults to `50`.
|
|
112
|
+
cube_height: int
|
|
113
|
+
The height of the data cube centered on the cell used for
|
|
114
|
+
classification. Defaults to `50`.
|
|
115
|
+
cube_depth: int
|
|
116
|
+
The depth of the data cube centered on the cell used for
|
|
117
|
+
classification. Defaults to `20`.
|
|
118
|
+
network_depth: str
|
|
119
|
+
The network depth to use during classification. Defaults to `"50"`.
|
|
120
|
+
skip_detection : bool
|
|
121
|
+
If selected, the detection step is skipped and instead we get the
|
|
122
|
+
detected cells from the cell layer below (from a previous
|
|
123
|
+
detection run or import).
|
|
124
|
+
skip_classification : bool
|
|
125
|
+
If selected, the classification step is skipped and all cells from
|
|
126
|
+
the detection stage are added.
|
|
127
|
+
detected_cells: Optional list of Cell objects.
|
|
128
|
+
If specified, the cells to use during classification.
|
|
129
|
+
detection_batch_size: int
|
|
130
|
+
The number of planes of the original data volume to process at
|
|
131
|
+
once. The GPU/CPU memory must be able to contain this many planes
|
|
132
|
+
for all the filters. For performance-critical applications, tune
|
|
133
|
+
to maximize memory usage without running out. Check your GPU/CPU
|
|
134
|
+
memory to verify it's not full.
|
|
135
|
+
torch_device : str, optional
|
|
136
|
+
The device on which to run the computation. If not specified (None),
|
|
137
|
+
"cuda" will be used if a GPU is available, otherwise "cpu".
|
|
138
|
+
You can also manually specify "cuda" or "cpu".
|
|
139
|
+
pin_memory: bool
|
|
140
|
+
Pins data to be sent to the GPU to the CPU memory. This allows faster
|
|
141
|
+
GPU data speeds, but can only be used if the data used by the GPU can
|
|
142
|
+
stay in the CPU RAM while the GPU uses it. I.e. there's enough RAM.
|
|
143
|
+
Otherwise, if there's a risk of the RAM being paged, it shouldn't be
|
|
144
|
+
used. Defaults to False.
|
|
145
|
+
split_ball_xy_size: float
|
|
146
|
+
Similar to `ball_xy_size`, except the value to use for the 3d
|
|
147
|
+
filter during cluster splitting.
|
|
148
|
+
split_ball_z_size: float
|
|
149
|
+
Similar to `ball_z_size`, except the value to use for the 3d filter
|
|
150
|
+
during cluster splitting.
|
|
151
|
+
split_ball_overlap_fraction: float
|
|
152
|
+
Similar to `ball_overlap_fraction`, except the value to use for the
|
|
153
|
+
3d filter during cluster splitting.
|
|
154
|
+
n_splitting_iter: int
|
|
155
|
+
The number of iterations to run the 3d filtering on a cluster. Each
|
|
156
|
+
iteration reduces the cluster size by the voxels not retained in
|
|
157
|
+
the previous iteration.
|
|
49
158
|
detect_callback : Callable[int], optional
|
|
50
159
|
Called every time a plane has finished being processed during the
|
|
51
160
|
detection stage. Called with the plane number that has finished.
|
|
@@ -76,9 +185,14 @@ def main(
|
|
|
76
185
|
n_free_cpus,
|
|
77
186
|
log_sigma_size,
|
|
78
187
|
n_sds_above_mean_thresh,
|
|
79
|
-
batch_size=
|
|
188
|
+
batch_size=detection_batch_size,
|
|
80
189
|
torch_device=torch_device,
|
|
190
|
+
pin_memory=pin_memory,
|
|
81
191
|
callback=detect_callback,
|
|
192
|
+
split_ball_z_size=split_ball_z_size,
|
|
193
|
+
split_ball_xy_size=split_ball_xy_size,
|
|
194
|
+
split_ball_overlap_fraction=split_ball_overlap_fraction,
|
|
195
|
+
n_splitting_iter=n_splitting_iter,
|
|
82
196
|
)
|
|
83
197
|
|
|
84
198
|
if detect_finished_callback is not None:
|
|
@@ -101,7 +215,7 @@ def main(
|
|
|
101
215
|
n_free_cpus,
|
|
102
216
|
voxel_sizes,
|
|
103
217
|
network_voxel_sizes,
|
|
104
|
-
|
|
218
|
+
classification_batch_size,
|
|
105
219
|
cube_height,
|
|
106
220
|
cube_width,
|
|
107
221
|
cube_depth,
|
cellfinder/napari/curation.py
CHANGED
|
@@ -228,8 +228,8 @@ class CurationWidget(QWidget):
|
|
|
228
228
|
self.layout.addWidget(self.load_data_panel, row, column, 1, 1)
|
|
229
229
|
|
|
230
230
|
def setup_keybindings(self):
|
|
231
|
-
self.viewer.bind_key("c", self.mark_as_cell)
|
|
232
|
-
self.viewer.bind_key("x", self.mark_as_non_cell)
|
|
231
|
+
self.viewer.bind_key("c", self.mark_as_cell, overwrite=True)
|
|
232
|
+
self.viewer.bind_key("x", self.mark_as_non_cell, overwrite=True)
|
|
233
233
|
|
|
234
234
|
def set_signal_image(self):
|
|
235
235
|
"""
|
|
@@ -244,24 +244,26 @@ def detect_widget() -> FunctionGui:
|
|
|
244
244
|
detection_options,
|
|
245
245
|
skip_detection: bool,
|
|
246
246
|
soma_diameter: float,
|
|
247
|
+
log_sigma_size: float,
|
|
248
|
+
n_sds_above_mean_thresh: float,
|
|
247
249
|
ball_xy_size: float,
|
|
248
250
|
ball_z_size: float,
|
|
249
251
|
ball_overlap_fraction: float,
|
|
250
|
-
|
|
251
|
-
n_sds_above_mean_thresh: int,
|
|
252
|
+
detection_batch_size: int,
|
|
252
253
|
soma_spread_factor: float,
|
|
253
|
-
max_cluster_size:
|
|
254
|
+
max_cluster_size: float,
|
|
254
255
|
classification_options,
|
|
255
256
|
skip_classification: bool,
|
|
256
257
|
use_pre_trained_weights: bool,
|
|
257
258
|
trained_model: Optional[Path],
|
|
258
|
-
|
|
259
|
+
classification_batch_size: int,
|
|
259
260
|
misc_options,
|
|
260
261
|
start_plane: int,
|
|
261
262
|
end_plane: int,
|
|
262
263
|
n_free_cpus: int,
|
|
263
264
|
analyse_local: bool,
|
|
264
265
|
use_gpu: bool,
|
|
266
|
+
pin_memory: bool,
|
|
265
267
|
debug: bool,
|
|
266
268
|
reset_button,
|
|
267
269
|
) -> None:
|
|
@@ -271,43 +273,60 @@ def detect_widget() -> FunctionGui:
|
|
|
271
273
|
Parameters
|
|
272
274
|
----------
|
|
273
275
|
voxel_size_z : float
|
|
274
|
-
Size of your voxels in the axial dimension
|
|
276
|
+
Size of your voxels in the axial dimension (microns)
|
|
275
277
|
voxel_size_y : float
|
|
276
|
-
Size of your voxels in the y direction (top to bottom)
|
|
278
|
+
Size of your voxels in the y direction (top to bottom) (microns)
|
|
277
279
|
voxel_size_x : float
|
|
278
|
-
Size of your voxels in the x direction (left to right)
|
|
280
|
+
Size of your voxels in the x direction (left to right) (microns)
|
|
279
281
|
skip_detection : bool
|
|
280
282
|
If selected, the detection step is skipped and instead we get the
|
|
281
283
|
detected cells from the cell layer below (from a previous
|
|
282
284
|
detection run or import)
|
|
283
285
|
soma_diameter : float
|
|
284
|
-
The expected in-plane soma diameter (microns)
|
|
286
|
+
The expected in-plane (xy) soma diameter (microns)
|
|
287
|
+
log_sigma_size : float
|
|
288
|
+
Gaussian filter width (as a fraction of soma diameter) used during
|
|
289
|
+
2d in-plane Laplacian of Gaussian filtering
|
|
290
|
+
n_sds_above_mean_thresh : float
|
|
291
|
+
Intensity threshold (the number of standard deviations above
|
|
292
|
+
the mean) of the filtered 2d planes used to mark pixels as
|
|
293
|
+
foreground or background
|
|
285
294
|
ball_xy_size : float
|
|
286
|
-
|
|
295
|
+
3d filter's in-plane (xy) filter ball size (microns)
|
|
287
296
|
ball_z_size : float
|
|
288
|
-
|
|
297
|
+
3d filter's axial (z) filter ball size (microns)
|
|
289
298
|
ball_overlap_fraction : float
|
|
290
|
-
|
|
291
|
-
to retain
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
299
|
+
3d filter's fraction of the ball filter needed to be filled by
|
|
300
|
+
foreground voxels, centered on a voxel, to retain the voxel
|
|
301
|
+
detection_batch_size: int
|
|
302
|
+
The number of planes of the original data volume to process at
|
|
303
|
+
once. The GPU/CPU memory must be able to contain this many planes
|
|
304
|
+
for all the filters. For performance-critical applications, tune
|
|
305
|
+
to maximize memory usage without
|
|
306
|
+
running out. Check your GPU/CPU memory to verify it's not full
|
|
296
307
|
soma_spread_factor : float
|
|
297
|
-
Cell spread factor
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
308
|
+
Cell spread factor for determining the largest cell volume before
|
|
309
|
+
splitting up cell clusters. Structures with spherical volume of
|
|
310
|
+
diameter `soma_spread_factor * soma_diameter` or less will not be
|
|
311
|
+
split
|
|
312
|
+
max_cluster_size : float
|
|
313
|
+
Largest detected cell cluster (in cubic um) where splitting
|
|
314
|
+
should be attempted. Clusters above this size will be labeled
|
|
315
|
+
as artifacts
|
|
305
316
|
skip_classification : bool
|
|
306
317
|
If selected, the classification step is skipped and all cells from
|
|
307
318
|
the detection stage are added
|
|
319
|
+
use_pre_trained_weights : bool
|
|
320
|
+
Select to use pre-trained model weights
|
|
308
321
|
trained_model : Optional[Path]
|
|
309
322
|
Trained model file path (home directory (default) -> pretrained
|
|
310
323
|
weights)
|
|
324
|
+
classification_batch_size : int
|
|
325
|
+
How many potential cells to classify at one time. The GPU/CPU
|
|
326
|
+
memory must be able to contain at once this many data cubes for
|
|
327
|
+
the models. For performance-critical applications, tune to
|
|
328
|
+
maximize memory usage without running
|
|
329
|
+
out. Check your GPU/CPU memory to verify it's not full
|
|
311
330
|
start_plane : int
|
|
312
331
|
First plane to process (to process a subset of the data)
|
|
313
332
|
end_plane : int
|
|
@@ -318,6 +337,12 @@ def detect_widget() -> FunctionGui:
|
|
|
318
337
|
Only analyse planes around the current position
|
|
319
338
|
use_gpu : bool
|
|
320
339
|
If True, use GPU for processing (if available); otherwise, use CPU.
|
|
340
|
+
pin_memory: bool
|
|
341
|
+
Pins data to be sent to the GPU to the CPU memory. This allows
|
|
342
|
+
faster GPU data speeds, but can only be used if the data used by
|
|
343
|
+
the GPU can stay in the CPU RAM while the GPU uses it. I.e. there's
|
|
344
|
+
enough RAM. Otherwise, if there's a risk of the RAM being paged, it
|
|
345
|
+
shouldn't be used. Defaults to False.
|
|
321
346
|
debug : bool
|
|
322
347
|
Increase logging
|
|
323
348
|
reset_button :
|
|
@@ -373,6 +398,7 @@ def detect_widget() -> FunctionGui:
|
|
|
373
398
|
n_sds_above_mean_thresh,
|
|
374
399
|
soma_spread_factor,
|
|
375
400
|
max_cluster_size,
|
|
401
|
+
detection_batch_size,
|
|
376
402
|
)
|
|
377
403
|
|
|
378
404
|
if use_pre_trained_weights:
|
|
@@ -381,7 +407,7 @@ def detect_widget() -> FunctionGui:
|
|
|
381
407
|
skip_classification,
|
|
382
408
|
use_pre_trained_weights,
|
|
383
409
|
trained_model,
|
|
384
|
-
|
|
410
|
+
classification_batch_size,
|
|
385
411
|
)
|
|
386
412
|
|
|
387
413
|
if analyse_local:
|
|
@@ -392,7 +418,13 @@ def detect_widget() -> FunctionGui:
|
|
|
392
418
|
end_plane = len(signal_image.data)
|
|
393
419
|
|
|
394
420
|
misc_inputs = MiscInputs(
|
|
395
|
-
start_plane,
|
|
421
|
+
start_plane,
|
|
422
|
+
end_plane,
|
|
423
|
+
n_free_cpus,
|
|
424
|
+
analyse_local,
|
|
425
|
+
use_gpu,
|
|
426
|
+
pin_memory,
|
|
427
|
+
debug,
|
|
396
428
|
)
|
|
397
429
|
|
|
398
430
|
worker = Worker(
|
|
@@ -68,9 +68,10 @@ class DetectionInputs(InputContainer):
|
|
|
68
68
|
ball_z_size: float = 15
|
|
69
69
|
ball_overlap_fraction: float = 0.6
|
|
70
70
|
log_sigma_size: float = 0.2
|
|
71
|
-
n_sds_above_mean_thresh:
|
|
71
|
+
n_sds_above_mean_thresh: float = 10
|
|
72
72
|
soma_spread_factor: float = 1.4
|
|
73
|
-
max_cluster_size:
|
|
73
|
+
max_cluster_size: float = 100000
|
|
74
|
+
detection_batch_size: int = 1
|
|
74
75
|
|
|
75
76
|
def as_core_arguments(self) -> dict:
|
|
76
77
|
return super().as_core_arguments()
|
|
@@ -97,14 +98,17 @@ class DetectionInputs(InputContainer):
|
|
|
97
98
|
"n_sds_above_mean_thresh", custom_label="Threshold"
|
|
98
99
|
),
|
|
99
100
|
soma_spread_factor=cls._custom_widget(
|
|
100
|
-
"soma_spread_factor", custom_label="
|
|
101
|
+
"soma_spread_factor", custom_label="Split cell spread"
|
|
101
102
|
),
|
|
102
103
|
max_cluster_size=cls._custom_widget(
|
|
103
104
|
"max_cluster_size",
|
|
104
|
-
custom_label="
|
|
105
|
+
custom_label="Split max cluster",
|
|
105
106
|
min=0,
|
|
106
107
|
max=10000000,
|
|
107
108
|
),
|
|
109
|
+
detection_batch_size=cls._custom_widget(
|
|
110
|
+
"detection_batch_size", custom_label="Batch size (detection)"
|
|
111
|
+
),
|
|
108
112
|
)
|
|
109
113
|
|
|
110
114
|
|
|
@@ -115,7 +119,7 @@ class ClassificationInputs(InputContainer):
|
|
|
115
119
|
skip_classification: bool = False
|
|
116
120
|
use_pre_trained_weights: bool = True
|
|
117
121
|
trained_model: Optional[Path] = Path.home()
|
|
118
|
-
|
|
122
|
+
classification_batch_size: int = 64
|
|
119
123
|
|
|
120
124
|
def as_core_arguments(self) -> dict:
|
|
121
125
|
args = super().as_core_arguments()
|
|
@@ -133,7 +137,10 @@ class ClassificationInputs(InputContainer):
|
|
|
133
137
|
skip_classification=dict(
|
|
134
138
|
value=cls.defaults()["skip_classification"]
|
|
135
139
|
),
|
|
136
|
-
|
|
140
|
+
classification_batch_size=dict(
|
|
141
|
+
value=cls.defaults()["classification_batch_size"],
|
|
142
|
+
label="Batch size (classification)",
|
|
143
|
+
),
|
|
137
144
|
)
|
|
138
145
|
|
|
139
146
|
|
|
@@ -146,6 +153,7 @@ class MiscInputs(InputContainer):
|
|
|
146
153
|
n_free_cpus: int = 2
|
|
147
154
|
analyse_local: bool = False
|
|
148
155
|
use_gpu: bool = field(default_factory=lambda: torch.cuda.is_available())
|
|
156
|
+
pin_memory: bool = False
|
|
149
157
|
debug: bool = False
|
|
150
158
|
|
|
151
159
|
def as_core_arguments(self) -> dict:
|
|
@@ -172,5 +180,10 @@ class MiscInputs(InputContainer):
|
|
|
172
180
|
value=cls.defaults()["use_gpu"],
|
|
173
181
|
enabled=torch.cuda.is_available(),
|
|
174
182
|
),
|
|
183
|
+
pin_memory=dict(
|
|
184
|
+
widget_type="CheckBox",
|
|
185
|
+
label="Pin data to memory",
|
|
186
|
+
value=cls.defaults()["pin_memory"],
|
|
187
|
+
),
|
|
175
188
|
debug=dict(value=cls.defaults()["debug"]),
|
|
176
189
|
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cellfinder
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.8.0
|
|
4
4
|
Summary: Automated 3D cell detection in large microscopy images
|
|
5
5
|
Author-email: "Adam Tyson, Christian Niedworok, Charly Rousseau" <code@adamltyson.com>
|
|
6
6
|
License: BSD-3-Clause
|
|
@@ -53,7 +53,7 @@ Requires-Dist: brainglobe-napari-io; extra == "napari"
|
|
|
53
53
|
Requires-Dist: magicgui; extra == "napari"
|
|
54
54
|
Requires-Dist: napari-ndtiffs; extra == "napari"
|
|
55
55
|
Requires-Dist: napari-plugin-engine>=0.1.4; extra == "napari"
|
|
56
|
-
Requires-Dist: napari[pyqt5]; extra == "napari"
|
|
56
|
+
Requires-Dist: napari[pyqt5]>=0.6.1; extra == "napari"
|
|
57
57
|
Requires-Dist: pooch>=1; extra == "napari"
|
|
58
58
|
Requires-Dist: qtpy; extra == "napari"
|
|
59
59
|
Dynamic: license-file
|
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
cellfinder/__init__.py,sha256=S5oQ3EORuyQTMYC4uUuzGKZ23J3Ya6q-1DOBib1KfiA,1166
|
|
2
2
|
cellfinder/cli_migration_warning.py,sha256=u4nKQiPYmpx0HRqm0PI8wBx78rNiiBSQSGciDoXEq78,1623
|
|
3
3
|
cellfinder/core/__init__.py,sha256=pRFuQsl78HEK0S6gvhJw70QLbjjSBzP-GFO0AtVaGtk,62
|
|
4
|
-
cellfinder/core/main.py,sha256=
|
|
4
|
+
cellfinder/core/main.py,sha256=QaangjXVi5Sq_fCvMs_PGS-qiFZAsTwymnJ7lhggSno,9497
|
|
5
5
|
cellfinder/core/types.py,sha256=lTqWE4v0SMM0qLAZJdyAzqV1nLgDtobEpglNJcXt160,106
|
|
6
6
|
cellfinder/core/classify/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
7
|
cellfinder/core/classify/augment.py,sha256=8dMbM7KhimM6NMgdMC53oHoCfYj1CIB-h3Yk8CZAxPw,6321
|
|
8
|
-
cellfinder/core/classify/classify.py,sha256=
|
|
8
|
+
cellfinder/core/classify/classify.py,sha256=cgZ_2aY8sbQbFo8-43RPPaQMSdS-nt4ukWRzDfWcuOU,5750
|
|
9
9
|
cellfinder/core/classify/cube_generator.py,sha256=jC5aogTVy213PHouViSR9CgKkuOks3yk6csQC5kRoOE,17125
|
|
10
10
|
cellfinder/core/classify/resnet.py,sha256=vGa85y_NcQnOXwAt5EtatLx5mrO8IoShCcNKtJ5-EFg,10034
|
|
11
11
|
cellfinder/core/classify/tools.py,sha256=gdWE8cBMlT1pqxBKt6j2az7i7FOMR4N0ds4w9YnBvtQ,2924
|
|
12
12
|
cellfinder/core/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
13
|
cellfinder/core/config/cellfinder.conf,sha256=5i8axif7ekMutKDiVnZRs-LiJrgVQljg_beltidqtNk,56
|
|
14
14
|
cellfinder/core/detect/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
|
-
cellfinder/core/detect/detect.py,sha256=
|
|
15
|
+
cellfinder/core/detect/detect.py,sha256=jtttIndsVsT0Ww_Dz41GgcVan0nlGzeq24Aulf8g6GQ,9919
|
|
16
16
|
cellfinder/core/detect/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
-
cellfinder/core/detect/filters/setup_filters.py,sha256=
|
|
17
|
+
cellfinder/core/detect/filters/setup_filters.py,sha256=DIOQe2bvfSTRLPLgDJdzmaPQIgLpmS4lNxihHCRnU5Y,15252
|
|
18
18
|
cellfinder/core/detect/filters/plane/__init__.py,sha256=lybcPbVDnurEQeq2FiLq0zR8p_ztarQOlajhdh1Q2-4,40
|
|
19
19
|
cellfinder/core/detect/filters/plane/classical_filter.py,sha256=X5k266tbl9EHRVY5dls53B5IZlmP7U0UB9BsZ1ey_pc,13250
|
|
20
|
-
cellfinder/core/detect/filters/plane/plane_filter.py,sha256=
|
|
20
|
+
cellfinder/core/detect/filters/plane/plane_filter.py,sha256=4ByEQkF73W5oK_YyrdUwW8GxD-XSrCTtLo4SOT8NCdQ,6127
|
|
21
21
|
cellfinder/core/detect/filters/plane/tile_walker.py,sha256=IiQibvWKnYlgl9h414fRklV7C2xZ0vXNmJ9t89DhYuI,4863
|
|
22
22
|
cellfinder/core/detect/filters/volume/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
23
|
-
cellfinder/core/detect/filters/volume/ball_filter.py,sha256=
|
|
23
|
+
cellfinder/core/detect/filters/volume/ball_filter.py,sha256=DSBaHXtJ8TM71xT4fgzwL9E1MTE1euNv0vZ6Ozcx5cQ,14491
|
|
24
24
|
cellfinder/core/detect/filters/volume/structure_detection.py,sha256=AIHq-5u5VFpKBBLEsE1Py-MlndbL8T0zXu0Bq2CI16Y,12916
|
|
25
|
-
cellfinder/core/detect/filters/volume/structure_splitting.py,sha256=
|
|
26
|
-
cellfinder/core/detect/filters/volume/volume_filter.py,sha256=
|
|
25
|
+
cellfinder/core/detect/filters/volume/structure_splitting.py,sha256=AcQTi_Gddj0vxSVz4JhZz_z16mVBOfCHQlkv8y3uPl4,10190
|
|
26
|
+
cellfinder/core/detect/filters/volume/volume_filter.py,sha256=G9uK6rALRTZufrihzz5TVtE1oGpkXNktrFA4nnOIEaM,20573
|
|
27
27
|
cellfinder/core/download/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
28
28
|
cellfinder/core/download/cli.py,sha256=X9L9ZIkWqs58hX8G8q_0AKN4gk8BhydGxI9nLpdHQQE,1764
|
|
29
29
|
cellfinder/core/download/download.py,sha256=bmPwOm48ApylydasJ8ZvuoQgSSlsb8k4_DL1ikNZrIY,3318
|
|
@@ -41,21 +41,21 @@ cellfinder/core/tools/tools.py,sha256=opMGC5GBBsId0dmL8V0KQrI4U70w_D_KtGQYpZNeHY
|
|
|
41
41
|
cellfinder/core/train/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
42
42
|
cellfinder/core/train/train_yaml.py,sha256=tG5FXHZj26PqPUaZCVmFgnvACvIh23mCwEDXwoXv2Hc,13104
|
|
43
43
|
cellfinder/napari/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
44
|
-
cellfinder/napari/curation.py,sha256=
|
|
44
|
+
cellfinder/napari/curation.py,sha256=jItls1SmD5GWNzPlSlF-H73AGgmmBk-PwFO7_gZBY40,22207
|
|
45
45
|
cellfinder/napari/input_container.py,sha256=upTkufWF3aOr9sPPK13C2YwqQ6tygULym8oDXrRLXJs,2510
|
|
46
46
|
cellfinder/napari/napari.yaml,sha256=WMR1CIAmYIVyQngbdbomTRZLvlDbb6LxsXsvTRClQnE,921
|
|
47
47
|
cellfinder/napari/sample_data.py,sha256=oUST23q09MM8dxHbUCmO0AjtXG6OlR_32LLqP0EU2UA,732
|
|
48
48
|
cellfinder/napari/utils.py,sha256=AwTs76M9azutHhHj2yuaKErDEQ5F6pFbIIakBfzen6M,3824
|
|
49
49
|
cellfinder/napari/detect/__init__.py,sha256=BD9Bg9NTAr6yRTq2A_p58U6j4w5wbY0sdXwhPJ3MSMY,34
|
|
50
|
-
cellfinder/napari/detect/detect.py,sha256=
|
|
51
|
-
cellfinder/napari/detect/detect_containers.py,sha256=
|
|
50
|
+
cellfinder/napari/detect/detect.py,sha256=nFpoxXnDuKTa2nHj62ACvYsiIHzVFXJ6qczomAaBr1g,15723
|
|
51
|
+
cellfinder/napari/detect/detect_containers.py,sha256=rxvSiRszyaVFevJAi8bLMoUog51McfiXWvaQkr-fZQA,6429
|
|
52
52
|
cellfinder/napari/detect/thread_worker.py,sha256=PWM3OE-FpK-dpdhaE_Gi-2lD3u8sL-SJ13mp0pMhTyI,3078
|
|
53
53
|
cellfinder/napari/train/__init__.py,sha256=xo4CK-DvSecInGEc2ohcTgQYlH3iylFnGvKTCoq2WkI,35
|
|
54
54
|
cellfinder/napari/train/train.py,sha256=tXrB8j_c293mzhWX5iEs4FvIwV1FpZuaX1rsSP4dgDQ,5830
|
|
55
55
|
cellfinder/napari/train/train_containers.py,sha256=ovPl4ZiH6DUr-CGIYu-iju05z3_rtomyYnCWI6fURKc,4296
|
|
56
|
-
cellfinder-1.
|
|
57
|
-
cellfinder-1.
|
|
58
|
-
cellfinder-1.
|
|
59
|
-
cellfinder-1.
|
|
60
|
-
cellfinder-1.
|
|
61
|
-
cellfinder-1.
|
|
56
|
+
cellfinder-1.8.0.dist-info/licenses/LICENSE,sha256=Tw8iMytIDXLSmcIUsbQmRWojstl9yOWsPCx6ZT6dZLY,1564
|
|
57
|
+
cellfinder-1.8.0.dist-info/METADATA,sha256=m_i5i-J0oyEdjkcipTpZIdcpWjjnxfdfIaqNN6CO4zw,7165
|
|
58
|
+
cellfinder-1.8.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
59
|
+
cellfinder-1.8.0.dist-info/entry_points.txt,sha256=n2n3muDgifENJtTRz1JqYStxvuprROCwmKLt-VxvEHk,248
|
|
60
|
+
cellfinder-1.8.0.dist-info/top_level.txt,sha256=jyTQzX-tDjbsMr6s-E71Oy0IKQzmHTXSk4ZhpG5EDSE,11
|
|
61
|
+
cellfinder-1.8.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|