dcnum 0.17.2__py3-none-any.whl → 0.18.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.
Potentially problematic release.
This version of dcnum might be problematic. Click here for more details.
- dcnum/_version.py +2 -2
- dcnum/feat/__init__.py +1 -1
- dcnum/feat/feat_background/base.py +18 -22
- dcnum/feat/feat_background/bg_copy.py +8 -4
- dcnum/feat/feat_background/bg_roll_median.py +16 -7
- dcnum/feat/feat_background/bg_sparse_median.py +53 -5
- dcnum/feat/feat_brightness/bright_all.py +41 -6
- dcnum/feat/feat_contour/__init__.py +4 -0
- dcnum/feat/{feat_moments/mt_legacy.py → feat_contour/moments.py} +32 -8
- dcnum/feat/feat_contour/volume.py +174 -0
- dcnum/feat/queue_event_extractor.py +25 -4
- dcnum/logic/ctrl.py +24 -2
- dcnum/logic/json_encoder.py +2 -0
- dcnum/meta/ppid.py +1 -1
- dcnum/read/__init__.py +1 -0
- dcnum/read/cache.py +78 -78
- dcnum/read/const.py +4 -1
- dcnum/read/hdf5_data.py +73 -16
- dcnum/read/mapped.py +79 -0
- dcnum/segm/segm_thresh.py +3 -3
- dcnum/segm/segmenter.py +73 -42
- dcnum/segm/segmenter_cpu.py +5 -5
- dcnum/segm/segmenter_manager_thread.py +11 -2
- dcnum/write/writer.py +37 -5
- {dcnum-0.17.2.dist-info → dcnum-0.18.0.dist-info}/METADATA +1 -1
- dcnum-0.18.0.dist-info/RECORD +48 -0
- dcnum/feat/feat_moments/__init__.py +0 -4
- dcnum-0.17.2.dist-info/RECORD +0 -46
- /dcnum/feat/{feat_moments/ct_opencv.py → feat_contour/contour.py} +0 -0
- {dcnum-0.17.2.dist-info → dcnum-0.18.0.dist-info}/LICENSE +0 -0
- {dcnum-0.17.2.dist-info → dcnum-0.18.0.dist-info}/WHEEL +0 -0
- {dcnum-0.17.2.dist-info → dcnum-0.18.0.dist-info}/top_level.txt +0 -0
dcnum/segm/segmenter.py
CHANGED
|
@@ -68,10 +68,8 @@ class Segmenter(abc.ABC):
|
|
|
68
68
|
def get_border(shape):
|
|
69
69
|
"""Cached boolean image with outer pixels set to True"""
|
|
70
70
|
border = np.zeros(shape, dtype=bool)
|
|
71
|
-
border[0, :] = True
|
|
72
|
-
border[-1
|
|
73
|
-
border[:, 0] = True
|
|
74
|
-
border[:, -1] = True
|
|
71
|
+
border[[0, -1], :] = True
|
|
72
|
+
border[:, [0, -1]] = True
|
|
75
73
|
return border
|
|
76
74
|
|
|
77
75
|
@staticmethod
|
|
@@ -121,25 +119,40 @@ class Segmenter(abc.ABC):
|
|
|
121
119
|
get_ppid: Same method for class instances
|
|
122
120
|
"""
|
|
123
121
|
kwargs = copy.deepcopy(kwargs)
|
|
124
|
-
if
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
122
|
+
if cls.mask_postprocessing:
|
|
123
|
+
if kwargs_mask is None and kwargs.get("kwargs_mask", None) is None:
|
|
124
|
+
raise KeyError("`kwargs_mask` must be either specified as "
|
|
125
|
+
"keyword argument to this method or as a key "
|
|
126
|
+
"in `kwargs`!")
|
|
127
|
+
if kwargs_mask is None:
|
|
128
|
+
# see check above (kwargs_mask may also be {})
|
|
129
|
+
kwargs_mask = kwargs.pop("kwargs_mask")
|
|
130
|
+
# Start with the default mask kwargs defined for this subclass
|
|
131
|
+
kwargs_mask_used = copy.deepcopy(cls.mask_default_kwargs)
|
|
132
|
+
kwargs_mask_used.update(kwargs_mask)
|
|
133
|
+
elif kwargs_mask:
|
|
134
|
+
raise ValueError(f"The segmenter '{cls.__name__}' does not "
|
|
135
|
+
f"support mask postprocessing, but 'kwargs_mask' "
|
|
136
|
+
f"was provided: {kwargs_mask}")
|
|
137
|
+
|
|
138
|
+
ppid_parts = [
|
|
139
|
+
cls.get_ppid_code(),
|
|
140
|
+
kwargs_to_ppid(cls, "segment_approach", kwargs),
|
|
141
|
+
]
|
|
142
|
+
|
|
143
|
+
if cls.mask_postprocessing:
|
|
144
|
+
ppid_parts.append(
|
|
145
|
+
kwargs_to_ppid(cls, "process_mask", kwargs_mask_used))
|
|
146
|
+
|
|
147
|
+
return ":".join(ppid_parts)
|
|
138
148
|
|
|
139
149
|
@staticmethod
|
|
140
150
|
def get_ppkw_from_ppid(segm_ppid):
|
|
141
151
|
"""Return keyword arguments for this pipeline identifier"""
|
|
142
|
-
|
|
152
|
+
ppid_parts = segm_ppid.split(":")
|
|
153
|
+
code = ppid_parts[0]
|
|
154
|
+
pp_kwargs = ppid_parts[1]
|
|
155
|
+
|
|
143
156
|
for cls_code in get_available_segmenters():
|
|
144
157
|
if cls_code == code:
|
|
145
158
|
cls = get_available_segmenters()[cls_code]
|
|
@@ -150,9 +163,11 @@ class Segmenter(abc.ABC):
|
|
|
150
163
|
kwargs = ppid_to_kwargs(cls=cls,
|
|
151
164
|
method="segment_approach",
|
|
152
165
|
ppid=pp_kwargs)
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
166
|
+
if cls.mask_postprocessing:
|
|
167
|
+
pp_kwargs_mask = ppid_parts[2]
|
|
168
|
+
kwargs["kwargs_mask"] = ppid_to_kwargs(cls=cls,
|
|
169
|
+
method="process_mask",
|
|
170
|
+
ppid=pp_kwargs_mask)
|
|
156
171
|
return kwargs
|
|
157
172
|
|
|
158
173
|
@staticmethod
|
|
@@ -196,25 +211,6 @@ class Segmenter(abc.ABC):
|
|
|
196
211
|
continue
|
|
197
212
|
labels[labels == li] = 0
|
|
198
213
|
|
|
199
|
-
# scikit-image is too slow for us here. So we use OpenCV.
|
|
200
|
-
# https://github.com/scikit-image/scikit-image/issues/1190
|
|
201
|
-
|
|
202
|
-
if closing_disk:
|
|
203
|
-
#
|
|
204
|
-
# from skimage import morphology
|
|
205
|
-
# morphology.binary_closing(
|
|
206
|
-
# mask,
|
|
207
|
-
# footprint=morphology.disk(closing_disk),
|
|
208
|
-
# out=mask)
|
|
209
|
-
#
|
|
210
|
-
element = Segmenter.get_disk(closing_disk)
|
|
211
|
-
labels_uint8 = np.array(labels, dtype=np.uint8)
|
|
212
|
-
labels_dilated = cv2.dilate(labels_uint8, element)
|
|
213
|
-
labels_eroded = cv2.erode(labels_dilated, element)
|
|
214
|
-
labels, _ = ndi.label(
|
|
215
|
-
input=labels_eroded > 0,
|
|
216
|
-
structure=ndi.generate_binary_structure(2, 2))
|
|
217
|
-
|
|
218
214
|
if fill_holes:
|
|
219
215
|
# Floodfill only works with uint8 (too small) or int32
|
|
220
216
|
if labels.dtype != np.int32:
|
|
@@ -226,17 +222,52 @@ class Segmenter(abc.ABC):
|
|
|
226
222
|
# Floodfill algorithm fills the background image and
|
|
227
223
|
# the resulting inversion is the image with holes filled.
|
|
228
224
|
# This will destroy labels (adding 2,147,483,647 to background)
|
|
225
|
+
# Since floodfill will use the upper left corner of the image as
|
|
226
|
+
# a seed, we have to make sure it is set to background. We set
|
|
227
|
+
# a line of pixels in the upper channel wall to zero to be sure.
|
|
228
|
+
labels[0, :] = 0
|
|
229
|
+
# ...and a 4x4 pixel region in the top left corner.
|
|
230
|
+
labels[1, :2] = 0
|
|
229
231
|
cv2.floodFill(labels, None, (0, 0), 2147483647)
|
|
230
232
|
mask = labels != 2147483647
|
|
231
233
|
labels, _ = ndi.label(
|
|
232
234
|
input=mask,
|
|
233
235
|
structure=ndi.generate_binary_structure(2, 2))
|
|
234
236
|
|
|
237
|
+
if closing_disk:
|
|
238
|
+
# scikit-image is too slow for us here. So we use OpenCV.
|
|
239
|
+
# https://github.com/scikit-image/scikit-image/issues/1190
|
|
240
|
+
#
|
|
241
|
+
# from skimage import morphology
|
|
242
|
+
# morphology.binary_closing(
|
|
243
|
+
# mask,
|
|
244
|
+
# footprint=morphology.disk(closing_disk),
|
|
245
|
+
# out=mask)
|
|
246
|
+
#
|
|
247
|
+
element = Segmenter.get_disk(closing_disk)
|
|
248
|
+
# Note: erode/dilate not implemented for int32
|
|
249
|
+
labels_uint8 = np.array(labels, dtype=np.uint8)
|
|
250
|
+
# Historically, we would like to do a closing (dilation followed
|
|
251
|
+
# by erosion) on the image data where lower brightness values
|
|
252
|
+
# meant "we have an event". However, since we are now working
|
|
253
|
+
# with labels instead of image data (0 is background and labels
|
|
254
|
+
# are enumerated with integers), high "brightness" values are
|
|
255
|
+
# actually the event. Thus, we have to perform an opening
|
|
256
|
+
# (erosion followed by dilation) of the label image.
|
|
257
|
+
labels_eroded = cv2.erode(labels_uint8, element)
|
|
258
|
+
labels_dilated = cv2.dilate(labels_eroded, element)
|
|
259
|
+
labels, _ = ndi.label(
|
|
260
|
+
input=labels_dilated > 0,
|
|
261
|
+
structure=ndi.generate_binary_structure(2, 2))
|
|
262
|
+
|
|
235
263
|
return labels
|
|
236
264
|
|
|
237
|
-
def segment_chunk(self, image_data, chunk):
|
|
265
|
+
def segment_chunk(self, image_data, chunk, bg_off=None):
|
|
238
266
|
"""Return the integer labels for one `image_data` chunk"""
|
|
239
267
|
data = image_data.get_chunk(chunk)
|
|
268
|
+
if bg_off is not None:
|
|
269
|
+
bg_off_chunk = bg_off[image_data.get_chunk_slice(chunk)]
|
|
270
|
+
data = data - bg_off_chunk.reshape(-1, 1, 1)
|
|
240
271
|
return self.segment_batch(data)
|
|
241
272
|
|
|
242
273
|
def segment_frame(self, image):
|
dcnum/segm/segmenter_cpu.py
CHANGED
|
@@ -96,11 +96,11 @@ class CPUSegmenter(Segmenter, abc.ABC):
|
|
|
96
96
|
batch_size: int
|
|
97
97
|
Number of images in the array
|
|
98
98
|
dtype:
|
|
99
|
-
|
|
100
|
-
or `np.ctypeslib.ctypes.c_bool`
|
|
99
|
+
numpy dtype
|
|
101
100
|
"""
|
|
102
101
|
sx, sy = image_shape
|
|
103
|
-
|
|
102
|
+
ctype = np.ctypeslib.as_ctypes_type(dtype)
|
|
103
|
+
sa_raw = mp_spawn.RawArray(ctype, int(sx * sy * batch_size))
|
|
104
104
|
# Convert the RawArray to something we can write to fast
|
|
105
105
|
# (similar to memory view, but without having to cast) using
|
|
106
106
|
# np.ctypeslib.as_array. See discussion in
|
|
@@ -172,14 +172,14 @@ class CPUSegmenter(Segmenter, abc.ABC):
|
|
|
172
172
|
self.mp_image_raw, self._mp_image_np = self._create_shared_array(
|
|
173
173
|
image_shape=self.image_shape,
|
|
174
174
|
batch_size=batch_size,
|
|
175
|
-
dtype=
|
|
175
|
+
dtype=image_data.dtype,
|
|
176
176
|
)
|
|
177
177
|
|
|
178
178
|
if self._mp_labels_np is None:
|
|
179
179
|
self.mp_labels_raw, self._mp_labels_np = self._create_shared_array(
|
|
180
180
|
image_shape=self.image_shape,
|
|
181
181
|
batch_size=batch_size,
|
|
182
|
-
dtype=np.
|
|
182
|
+
dtype=np.uint16,
|
|
183
183
|
)
|
|
184
184
|
|
|
185
185
|
# populate image data
|
|
@@ -17,6 +17,7 @@ class SegmenterManagerThread(threading.Thread):
|
|
|
17
17
|
image_data: HDF5ImageCache | ImageCorrCache,
|
|
18
18
|
slot_states: mp.Array,
|
|
19
19
|
slot_chunks: mp.Array,
|
|
20
|
+
bg_off: np.ndarray = None,
|
|
20
21
|
debug: bool = False,
|
|
21
22
|
*args, **kwargs):
|
|
22
23
|
"""Manage the segmentation of image data
|
|
@@ -38,6 +39,10 @@ class SegmenterManagerThread(threading.Thread):
|
|
|
38
39
|
slot_chunks:
|
|
39
40
|
For each slot in `slot_states`, this shared array defines
|
|
40
41
|
on which chunk in `image_data` the segmentation took place.
|
|
42
|
+
bg_off:
|
|
43
|
+
1d array containing additional background image offset values
|
|
44
|
+
that are added to each background image before subtraction
|
|
45
|
+
from the input image
|
|
41
46
|
debug:
|
|
42
47
|
Whether to run in debugging mode (more verbose messages and
|
|
43
48
|
CPU-based segmentation is done in one single thread instead
|
|
@@ -65,6 +70,8 @@ class SegmenterManagerThread(threading.Thread):
|
|
|
65
70
|
self.segmenter = segmenter
|
|
66
71
|
#: Image data which is being segmented
|
|
67
72
|
self.image_data = image_data
|
|
73
|
+
#: Additional, optional background offset
|
|
74
|
+
self.bg_off = bg_off
|
|
68
75
|
#: Slot states
|
|
69
76
|
self.slot_states = slot_states
|
|
70
77
|
#: Current slot chunk index for the slot states
|
|
@@ -89,7 +96,7 @@ class SegmenterManagerThread(threading.Thread):
|
|
|
89
96
|
# - "s" the extractor processed the data and is waiting
|
|
90
97
|
# for the segmenter
|
|
91
98
|
if self.slot_states[cur_slot] != "e":
|
|
92
|
-
# It's the
|
|
99
|
+
# It's the segmenter's turn. Note that we use '!= "e"',
|
|
93
100
|
# because the initial value is "\x00".
|
|
94
101
|
break
|
|
95
102
|
else:
|
|
@@ -106,7 +113,9 @@ class SegmenterManagerThread(threading.Thread):
|
|
|
106
113
|
# We have a free slot to compute the segmentation
|
|
107
114
|
labels = self.segmenter.segment_chunk(
|
|
108
115
|
image_data=self.image_data,
|
|
109
|
-
chunk=chunk
|
|
116
|
+
chunk=chunk,
|
|
117
|
+
bg_off=self.bg_off,
|
|
118
|
+
)
|
|
110
119
|
|
|
111
120
|
# TODO: make this more memory efficient (pre-shared mp.Arrays?)
|
|
112
121
|
# Store labels in a list accessible by the main thread
|
dcnum/write/writer.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import hashlib
|
|
2
2
|
import json
|
|
3
3
|
import pathlib
|
|
4
|
-
from typing import List
|
|
4
|
+
from typing import Dict, List
|
|
5
5
|
import warnings
|
|
6
6
|
|
|
7
7
|
import h5py
|
|
@@ -17,9 +17,39 @@ class CreatingFileWithoutBasinWarning(UserWarning):
|
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
class HDF5Writer:
|
|
20
|
-
def __init__(self,
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
def __init__(self,
|
|
21
|
+
# TODO: make this a mandatory argument when `path` is
|
|
22
|
+
# properly removed
|
|
23
|
+
obj: h5py.File | pathlib.Path | str = None,
|
|
24
|
+
mode: str = "a",
|
|
25
|
+
ds_kwds: Dict = None,
|
|
26
|
+
path: pathlib.Path | str = None,
|
|
27
|
+
):
|
|
28
|
+
"""Write deformability cytometry HDF5 data
|
|
29
|
+
|
|
30
|
+
Parameters
|
|
31
|
+
----------
|
|
32
|
+
obj: h5py.File | pathlib.Path | str
|
|
33
|
+
object to instantiate the writer from; If this is already
|
|
34
|
+
a :class:`h5py.File` object, then it is used, otherwise the
|
|
35
|
+
argument is passed to :class:`h5py.File`
|
|
36
|
+
mode: str
|
|
37
|
+
opening mode when using :class:`h5py.File`
|
|
38
|
+
ds_kwds: Dict
|
|
39
|
+
keyword arguments with which to initialize new Datasets
|
|
40
|
+
(e.g. compression)
|
|
41
|
+
"""
|
|
42
|
+
if path is not None:
|
|
43
|
+
obj = path
|
|
44
|
+
warnings.warn("The `path` keyword argument is deprecated, use "
|
|
45
|
+
"`obj` instead",
|
|
46
|
+
DeprecationWarning)
|
|
47
|
+
if isinstance(obj, h5py.File):
|
|
48
|
+
self.h5 = obj
|
|
49
|
+
self.h5_owned = False
|
|
50
|
+
else:
|
|
51
|
+
self.h5 = h5py.File(obj, mode=mode, libver="latest")
|
|
52
|
+
self.h5_owned = True
|
|
23
53
|
self.events = self.h5.require_group("events")
|
|
24
54
|
ds_kwds = set_default_filter_kwargs(ds_kwds)
|
|
25
55
|
self.ds_kwds = ds_kwds
|
|
@@ -31,7 +61,9 @@ class HDF5Writer:
|
|
|
31
61
|
self.close()
|
|
32
62
|
|
|
33
63
|
def close(self):
|
|
34
|
-
self.h5.
|
|
64
|
+
self.h5.flush()
|
|
65
|
+
if self.h5_owned:
|
|
66
|
+
self.h5.close()
|
|
35
67
|
|
|
36
68
|
@staticmethod
|
|
37
69
|
def get_best_nd_chunks(item_shape, feat_dtype=np.float64):
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
dcnum/__init__.py,sha256=hcawIKS7utYiOyVhOAX9t7K3xYzP1b9862VV0b6qSrQ,74
|
|
2
|
+
dcnum/_version.py,sha256=qQfZIFMnYUfFvdZIkQ7KTINCu5N5FVIhIaHGQZyIg1E,413
|
|
3
|
+
dcnum/feat/__init__.py,sha256=jUJYWTD3VIoDNKrmryXbjHb1rGwYtK4b7VPWihYgUoo,325
|
|
4
|
+
dcnum/feat/event_extractor_manager_thread.py,sha256=Ocid_t1awH6pOmurCmKYkC51XsXB0-DoN3fzjFDgE4c,7129
|
|
5
|
+
dcnum/feat/gate.py,sha256=svbObmqpYdqPawpfrsEjTiUPJXf24GrNi8PXTKT-z44,7225
|
|
6
|
+
dcnum/feat/queue_event_extractor.py,sha256=XhA930QVQ1Z4saisbcGTrEut-fSgwTyfDn6b9GzD4iY,15644
|
|
7
|
+
dcnum/feat/feat_background/__init__.py,sha256=OTmMuazHNaSrZb2XW4cnJ6PlgJLbKrPbaidpEixYa0A,341
|
|
8
|
+
dcnum/feat/feat_background/base.py,sha256=IYBFfsGXBfmFnZfD9QrmfrXbJtFSfVOS-v-u-uxSThs,7985
|
|
9
|
+
dcnum/feat/feat_background/bg_copy.py,sha256=muU-6eTUf3HTA2K2asrLWcR_hbRMjdygZROmjNXCm7Q,923
|
|
10
|
+
dcnum/feat/feat_background/bg_roll_median.py,sha256=G1atu6R8FWDe-Lblr1KcdP368Xx-kj6oy3q2mhljxB0,13064
|
|
11
|
+
dcnum/feat/feat_background/bg_sparse_median.py,sha256=-CShs4UAuZd00rACaXTZj3dccKevhcSGRsILFgMPLWo,20705
|
|
12
|
+
dcnum/feat/feat_brightness/__init__.py,sha256=o6AebVlmydwNgVF5kW6ITqJyFreoKrU3Ki_3EC8If-s,155
|
|
13
|
+
dcnum/feat/feat_brightness/bright_all.py,sha256=vf8xaYBdKD24hHUXdkI0_S7nbr7m49KW6gvuWvbHDVg,4545
|
|
14
|
+
dcnum/feat/feat_brightness/common.py,sha256=JX49EszYDmnvoOKXFVV1CalEIWRmOuY5EryNbqGbdac,156
|
|
15
|
+
dcnum/feat/feat_contour/__init__.py,sha256=Td4Hs47kUgJj0VXm3q5ofXhaUWr9QTfVgbwh5EELA-I,163
|
|
16
|
+
dcnum/feat/feat_contour/contour.py,sha256=_qyHCGvylVxruMWafvVbVOzhWGXLoFi10LReNxGcWhY,463
|
|
17
|
+
dcnum/feat/feat_contour/moments.py,sha256=W8sD2X7JqIBq-9nL82hf4Hm2uJkfca8EvAl_hqI_IDg,5109
|
|
18
|
+
dcnum/feat/feat_contour/volume.py,sha256=xVHWtv6USUHJZ5dM1Ur7fI7OwoPT5N2Ps0gKVWylfl8,6639
|
|
19
|
+
dcnum/feat/feat_texture/__init__.py,sha256=6StM9S540UVtdFFR3bHa7nfCTomeVdoo7Uy9CjuTgH0,137
|
|
20
|
+
dcnum/feat/feat_texture/common.py,sha256=COXHpXS-7DMouGu3WF83I76L02Sr7P9re4lxajh6g0E,439
|
|
21
|
+
dcnum/feat/feat_texture/tex_all.py,sha256=eGjjNfPpfZw7FA_VNFCIMiU38KD0qcGbxLciYy-tCiA,4097
|
|
22
|
+
dcnum/logic/__init__.py,sha256=7J3GrwJInNQbrLk61HRIV7X7p69TAIbMYpR34hh6u14,177
|
|
23
|
+
dcnum/logic/ctrl.py,sha256=dZlQBUhFrBOs5jkdtFX60g_1M_3A05kXqmCkWTTfyHk,27998
|
|
24
|
+
dcnum/logic/job.py,sha256=M0Q-Rfcm-zkTXTQc79W6YSNUjUlgmRPG0Ikbdn1aOpY,4608
|
|
25
|
+
dcnum/logic/json_encoder.py,sha256=cxMnqisbKEVf-rVcw6rK2BBAb6iz_hKFaGl81kK36lQ,571
|
|
26
|
+
dcnum/meta/__init__.py,sha256=AVqRgyKXO1orKnE305h88IBvoZ1oz6X11HN1WP5nGvg,60
|
|
27
|
+
dcnum/meta/paths.py,sha256=J_ikeHzd7gEeRgAKjuayz3x6q4h1fOiDadM-ZxhAGm4,1053
|
|
28
|
+
dcnum/meta/ppid.py,sha256=Q3jg8lZt5tlGIby_-7rBqTANesMjJrmxASXZhsvBD_Y,7706
|
|
29
|
+
dcnum/read/__init__.py,sha256=8uGj4YN7pDP4FO9TkZWXrpScwTLVWSEZexFq-TS9vsA,215
|
|
30
|
+
dcnum/read/cache.py,sha256=kC2Y9hXA92ARQ2Vgm1kBFCU-s6TPE1tPYvpzWI0aPow,5619
|
|
31
|
+
dcnum/read/const.py,sha256=8ih8rlWM7ntp8phrr9dh22hXXb210igSCatOSI9Ou30,463
|
|
32
|
+
dcnum/read/hdf5_data.py,sha256=sGqwaj3HpceSsctlVFty-3TRnWeN09WNfUh30xkt5b0,20598
|
|
33
|
+
dcnum/read/mapped.py,sha256=X__uqz5rT-N_xJhr6QsmsvXzIqu806piuTyjTHd_Ewg,2777
|
|
34
|
+
dcnum/segm/__init__.py,sha256=iiq_1A9DU5wMUcKnsZ53E7NyzCkbZCJeUDimzunE-OM,247
|
|
35
|
+
dcnum/segm/segm_thresh.py,sha256=lMf-lso_O_5Q5lJiiIQdYkM3zlj4uwNz9cNvLxVMeXc,1396
|
|
36
|
+
dcnum/segm/segmenter.py,sha256=gVzmP6CuwI9Qfk8GN_xWGu_xbtVTOhxIOWn-2yr_H1Y,12220
|
|
37
|
+
dcnum/segm/segmenter_cpu.py,sha256=IzhPNQaO4TBh3EzZqLGaBAeRryfBKnld7Joe8qY4AB4,10690
|
|
38
|
+
dcnum/segm/segmenter_gpu.py,sha256=Au1MQdAalVsmJ-cmb3OcCmEMBfXSDuJjdXJTGqEIcG8,1962
|
|
39
|
+
dcnum/segm/segmenter_manager_thread.py,sha256=xQEioOkASlm8DTdG0RBtjCJP1cOuiyJAm4q2n1l_tfM,5710
|
|
40
|
+
dcnum/write/__init__.py,sha256=Cpn3LqL18hh8OScUnGp_AnNfpWPpKW-oAJZH6ot7aRA,241
|
|
41
|
+
dcnum/write/deque_writer_thread.py,sha256=KpJ6po8JPlM696MITN-bhNnWQcy9E-qlhg9g-uzoPZg,1710
|
|
42
|
+
dcnum/write/queue_collector_thread.py,sha256=YQ6pvKNmCDf1C6HVx6gOA-q-FBoI6nkhOo-tAVYnyag,11906
|
|
43
|
+
dcnum/write/writer.py,sha256=nlJfQCPoW2Wze72y_256G4qmgYMdh5mL0vpvqg7lSaU,11728
|
|
44
|
+
dcnum-0.18.0.dist-info/LICENSE,sha256=YRChA1C8A2E-amJbudwMcbTCZy_HzmeY0hMIvduh1MM,1089
|
|
45
|
+
dcnum-0.18.0.dist-info/METADATA,sha256=Vnx_UzKsj2G9X16joXk6QOZWmDmvVmBgwXiuiGvK65o,2194
|
|
46
|
+
dcnum-0.18.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
47
|
+
dcnum-0.18.0.dist-info/top_level.txt,sha256=Hmh38rgG_MFTVDpUDGuO2HWTSq80P585Het4COQzFTg,6
|
|
48
|
+
dcnum-0.18.0.dist-info/RECORD,,
|
dcnum-0.17.2.dist-info/RECORD
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
dcnum/__init__.py,sha256=hcawIKS7utYiOyVhOAX9t7K3xYzP1b9862VV0b6qSrQ,74
|
|
2
|
-
dcnum/_version.py,sha256=9PqbWPkwwMgdNmE4GP1v5LyzvjNYATMHB-uIEy0c_aI,413
|
|
3
|
-
dcnum/feat/__init__.py,sha256=JqlgzOgDJhoTk8WVYcIiKTWq9EAM16_jGivzOtN6JGo,325
|
|
4
|
-
dcnum/feat/event_extractor_manager_thread.py,sha256=Ocid_t1awH6pOmurCmKYkC51XsXB0-DoN3fzjFDgE4c,7129
|
|
5
|
-
dcnum/feat/gate.py,sha256=svbObmqpYdqPawpfrsEjTiUPJXf24GrNi8PXTKT-z44,7225
|
|
6
|
-
dcnum/feat/queue_event_extractor.py,sha256=3CIjZOwOD8JZZTgbE9_jC81B8lbNtVElSV371Q9zoSc,15005
|
|
7
|
-
dcnum/feat/feat_background/__init__.py,sha256=OTmMuazHNaSrZb2XW4cnJ6PlgJLbKrPbaidpEixYa0A,341
|
|
8
|
-
dcnum/feat/feat_background/base.py,sha256=DKcNSQOSi0cuo4zFbqtgDJnRiYDwoKkw2GQxpnK14fA,8119
|
|
9
|
-
dcnum/feat/feat_background/bg_copy.py,sha256=EbeIy28gyPJr01Xens881IC1BtaTS5q-BkXPd3b6cLk,726
|
|
10
|
-
dcnum/feat/feat_background/bg_roll_median.py,sha256=HgiGoyfLkygIlCoo8cBbf3gQt5uvM2S6_ez_V1hhCb4,12834
|
|
11
|
-
dcnum/feat/feat_background/bg_sparse_median.py,sha256=LbWbDxAruGagidHt9wybyqkXp9OKi3eWXceujirpsqY,17608
|
|
12
|
-
dcnum/feat/feat_brightness/__init__.py,sha256=o6AebVlmydwNgVF5kW6ITqJyFreoKrU3Ki_3EC8If-s,155
|
|
13
|
-
dcnum/feat/feat_brightness/bright_all.py,sha256=Z5b-xkw7g7ejMpbGmdUqrxGRymqFhAQsZ938gaGXk9Y,3102
|
|
14
|
-
dcnum/feat/feat_brightness/common.py,sha256=JX49EszYDmnvoOKXFVV1CalEIWRmOuY5EryNbqGbdac,156
|
|
15
|
-
dcnum/feat/feat_moments/__init__.py,sha256=9eKmhBZGAZTLRnfCNHDiYM0a7qErrJCFLEgy3OlF9no,125
|
|
16
|
-
dcnum/feat/feat_moments/ct_opencv.py,sha256=_qyHCGvylVxruMWafvVbVOzhWGXLoFi10LReNxGcWhY,463
|
|
17
|
-
dcnum/feat/feat_moments/mt_legacy.py,sha256=tp85oeQ1GwVNdo6nXWhtbUGjMaXR8C6NMMWhobzThq0,4490
|
|
18
|
-
dcnum/feat/feat_texture/__init__.py,sha256=6StM9S540UVtdFFR3bHa7nfCTomeVdoo7Uy9CjuTgH0,137
|
|
19
|
-
dcnum/feat/feat_texture/common.py,sha256=COXHpXS-7DMouGu3WF83I76L02Sr7P9re4lxajh6g0E,439
|
|
20
|
-
dcnum/feat/feat_texture/tex_all.py,sha256=eGjjNfPpfZw7FA_VNFCIMiU38KD0qcGbxLciYy-tCiA,4097
|
|
21
|
-
dcnum/logic/__init__.py,sha256=7J3GrwJInNQbrLk61HRIV7X7p69TAIbMYpR34hh6u14,177
|
|
22
|
-
dcnum/logic/ctrl.py,sha256=7m1HL_kO62d8Kt_o4gX3bhxbI4pwOhv3HWHRmbCaMp0,27022
|
|
23
|
-
dcnum/logic/job.py,sha256=M0Q-Rfcm-zkTXTQc79W6YSNUjUlgmRPG0Ikbdn1aOpY,4608
|
|
24
|
-
dcnum/logic/json_encoder.py,sha256=dy44ArmdnxpUfxxONmKdIv-fde3aTXPjZDN0HPATaxs,467
|
|
25
|
-
dcnum/meta/__init__.py,sha256=AVqRgyKXO1orKnE305h88IBvoZ1oz6X11HN1WP5nGvg,60
|
|
26
|
-
dcnum/meta/paths.py,sha256=J_ikeHzd7gEeRgAKjuayz3x6q4h1fOiDadM-ZxhAGm4,1053
|
|
27
|
-
dcnum/meta/ppid.py,sha256=f3xT6k9EMhrmk2T_e-2LHE9qdXeGMZJcNOIIpr-_eb4,7706
|
|
28
|
-
dcnum/read/__init__.py,sha256=iV2wrBMdwJgpXaphNiiAVybndDzTTv0CAGRNXyvxcLY,157
|
|
29
|
-
dcnum/read/cache.py,sha256=HXbRFyTNT08_imv2460hMKVrfRrU6WnbJoO71HR1j8E,5800
|
|
30
|
-
dcnum/read/const.py,sha256=ccME3dOK7DEXNhkTD90I7KF8zagzZufnbFkrYwQeIUo,307
|
|
31
|
-
dcnum/read/hdf5_data.py,sha256=Tn-DXmtroJbrzBZK7x73MD-nEEyv0D08_OHgwcdC8IQ,18202
|
|
32
|
-
dcnum/segm/__init__.py,sha256=iiq_1A9DU5wMUcKnsZ53E7NyzCkbZCJeUDimzunE-OM,247
|
|
33
|
-
dcnum/segm/segm_thresh.py,sha256=Z6buG3ia8uFJKTLE6BICM3n7Yw8IN-9f6_umIlx0xUk,1395
|
|
34
|
-
dcnum/segm/segmenter.py,sha256=Y535ro4BTyE5Uj5lYIZ0xMbpKg2TIs5wCpv1Gg-yvTU,10625
|
|
35
|
-
dcnum/segm/segmenter_cpu.py,sha256=tCY105rVr9_0RIq2618qnF1ueHRj7UtuK_nUBoAg-nY,10743
|
|
36
|
-
dcnum/segm/segmenter_gpu.py,sha256=Au1MQdAalVsmJ-cmb3OcCmEMBfXSDuJjdXJTGqEIcG8,1962
|
|
37
|
-
dcnum/segm/segmenter_manager_thread.py,sha256=2znDaKedSueomcU1pbHtFmVcGoHzp--sf494VgJF_Tk,5342
|
|
38
|
-
dcnum/write/__init__.py,sha256=Cpn3LqL18hh8OScUnGp_AnNfpWPpKW-oAJZH6ot7aRA,241
|
|
39
|
-
dcnum/write/deque_writer_thread.py,sha256=KpJ6po8JPlM696MITN-bhNnWQcy9E-qlhg9g-uzoPZg,1710
|
|
40
|
-
dcnum/write/queue_collector_thread.py,sha256=YQ6pvKNmCDf1C6HVx6gOA-q-FBoI6nkhOo-tAVYnyag,11906
|
|
41
|
-
dcnum/write/writer.py,sha256=QGYNda102f2_12YWXu5WEBEQaTXhNnuQ20g-Dej-cek,10535
|
|
42
|
-
dcnum-0.17.2.dist-info/LICENSE,sha256=YRChA1C8A2E-amJbudwMcbTCZy_HzmeY0hMIvduh1MM,1089
|
|
43
|
-
dcnum-0.17.2.dist-info/METADATA,sha256=oS5cJxipnS9ugEpkDfRmV2WosWj_W2lFf-2w8XkOe5o,2194
|
|
44
|
-
dcnum-0.17.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
45
|
-
dcnum-0.17.2.dist-info/top_level.txt,sha256=Hmh38rgG_MFTVDpUDGuO2HWTSq80P585Het4COQzFTg,6
|
|
46
|
-
dcnum-0.17.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|