careamics 0.0.19__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.
- careamics/__init__.py +24 -0
- careamics/careamist.py +961 -0
- careamics/cli/__init__.py +5 -0
- careamics/cli/conf.py +394 -0
- careamics/cli/main.py +234 -0
- careamics/cli/utils.py +27 -0
- careamics/config/__init__.py +66 -0
- careamics/config/algorithms/__init__.py +21 -0
- careamics/config/algorithms/care_algorithm_config.py +122 -0
- careamics/config/algorithms/hdn_algorithm_config.py +103 -0
- careamics/config/algorithms/microsplit_algorithm_config.py +103 -0
- careamics/config/algorithms/n2n_algorithm_config.py +115 -0
- careamics/config/algorithms/n2v_algorithm_config.py +296 -0
- careamics/config/algorithms/pn2v_algorithm_config.py +301 -0
- careamics/config/algorithms/unet_algorithm_config.py +91 -0
- careamics/config/algorithms/vae_algorithm_config.py +178 -0
- careamics/config/architectures/__init__.py +7 -0
- careamics/config/architectures/architecture_config.py +37 -0
- careamics/config/architectures/lvae_config.py +262 -0
- careamics/config/architectures/unet_config.py +125 -0
- careamics/config/configuration.py +367 -0
- careamics/config/configuration_factories.py +2400 -0
- careamics/config/data/__init__.py +27 -0
- careamics/config/data/data_config.py +472 -0
- careamics/config/data/inference_config.py +237 -0
- careamics/config/data/ng_data_config.py +1038 -0
- careamics/config/data/patch_filter/__init__.py +15 -0
- careamics/config/data/patch_filter/filter_config.py +16 -0
- careamics/config/data/patch_filter/mask_filter_config.py +17 -0
- careamics/config/data/patch_filter/max_filter_config.py +15 -0
- careamics/config/data/patch_filter/meanstd_filter_config.py +18 -0
- careamics/config/data/patch_filter/shannon_filter_config.py +15 -0
- careamics/config/data/patching_strategies/__init__.py +15 -0
- careamics/config/data/patching_strategies/_overlapping_patched_config.py +102 -0
- careamics/config/data/patching_strategies/_patched_config.py +56 -0
- careamics/config/data/patching_strategies/random_patching_config.py +45 -0
- careamics/config/data/patching_strategies/sequential_patching_config.py +25 -0
- careamics/config/data/patching_strategies/tiled_patching_config.py +40 -0
- careamics/config/data/patching_strategies/whole_patching_config.py +12 -0
- careamics/config/data/tile_information.py +65 -0
- careamics/config/lightning/__init__.py +15 -0
- careamics/config/lightning/callbacks/__init__.py +8 -0
- careamics/config/lightning/callbacks/callback_config.py +116 -0
- careamics/config/lightning/optimizer_configs.py +186 -0
- careamics/config/lightning/training_config.py +70 -0
- careamics/config/losses/__init__.py +8 -0
- careamics/config/losses/loss_config.py +60 -0
- careamics/config/ng_configs/__init__.py +5 -0
- careamics/config/ng_configs/n2v_configuration.py +64 -0
- careamics/config/ng_configs/ng_configuration.py +256 -0
- careamics/config/ng_factories/__init__.py +9 -0
- careamics/config/ng_factories/algorithm_factory.py +120 -0
- careamics/config/ng_factories/data_factory.py +154 -0
- careamics/config/ng_factories/n2v_factory.py +256 -0
- careamics/config/ng_factories/training_factory.py +69 -0
- careamics/config/noise_model/__init__.py +12 -0
- careamics/config/noise_model/likelihood_config.py +60 -0
- careamics/config/noise_model/noise_model_config.py +149 -0
- careamics/config/support/__init__.py +31 -0
- careamics/config/support/supported_activations.py +27 -0
- careamics/config/support/supported_algorithms.py +40 -0
- careamics/config/support/supported_architectures.py +13 -0
- careamics/config/support/supported_data.py +122 -0
- careamics/config/support/supported_filters.py +17 -0
- careamics/config/support/supported_loggers.py +10 -0
- careamics/config/support/supported_losses.py +32 -0
- careamics/config/support/supported_optimizers.py +57 -0
- careamics/config/support/supported_patching_strategies.py +22 -0
- careamics/config/support/supported_pixel_manipulations.py +15 -0
- careamics/config/support/supported_struct_axis.py +21 -0
- careamics/config/support/supported_transforms.py +12 -0
- careamics/config/transformations/__init__.py +22 -0
- careamics/config/transformations/n2v_manipulate_config.py +79 -0
- careamics/config/transformations/normalize_config.py +59 -0
- careamics/config/transformations/transform_config.py +45 -0
- careamics/config/transformations/transform_unions.py +29 -0
- careamics/config/transformations/xy_flip_config.py +43 -0
- careamics/config/transformations/xy_random_rotate90_config.py +35 -0
- careamics/config/utils/__init__.py +8 -0
- careamics/config/utils/configuration_io.py +85 -0
- careamics/config/validators/__init__.py +18 -0
- careamics/config/validators/axes_validators.py +90 -0
- careamics/config/validators/model_validators.py +84 -0
- careamics/config/validators/patch_validators.py +55 -0
- careamics/conftest.py +39 -0
- careamics/dataset/__init__.py +17 -0
- careamics/dataset/dataset_utils/__init__.py +19 -0
- careamics/dataset/dataset_utils/dataset_utils.py +118 -0
- careamics/dataset/dataset_utils/file_utils.py +141 -0
- careamics/dataset/dataset_utils/iterate_over_files.py +84 -0
- careamics/dataset/dataset_utils/running_stats.py +189 -0
- careamics/dataset/in_memory_dataset.py +303 -0
- careamics/dataset/in_memory_pred_dataset.py +88 -0
- careamics/dataset/in_memory_tiled_pred_dataset.py +131 -0
- careamics/dataset/iterable_dataset.py +294 -0
- careamics/dataset/iterable_pred_dataset.py +121 -0
- careamics/dataset/iterable_tiled_pred_dataset.py +141 -0
- careamics/dataset/patching/__init__.py +1 -0
- careamics/dataset/patching/patching.py +300 -0
- careamics/dataset/patching/random_patching.py +110 -0
- careamics/dataset/patching/sequential_patching.py +212 -0
- careamics/dataset/patching/validate_patch_dimension.py +64 -0
- careamics/dataset/tiling/__init__.py +10 -0
- careamics/dataset/tiling/collate_tiles.py +33 -0
- careamics/dataset/tiling/lvae_tiled_patching.py +375 -0
- careamics/dataset/tiling/tiled_patching.py +166 -0
- careamics/dataset_ng/README.md +212 -0
- careamics/dataset_ng/__init__.py +0 -0
- careamics/dataset_ng/dataset.py +365 -0
- careamics/dataset_ng/demos/bsd68_demo.ipynb +361 -0
- careamics/dataset_ng/demos/bsd68_zarr_demo.ipynb +453 -0
- careamics/dataset_ng/demos/care_U2OS_demo.ipynb +330 -0
- careamics/dataset_ng/demos/demo_custom_image_stack.ipynb +736 -0
- careamics/dataset_ng/demos/demo_datamodule.ipynb +447 -0
- careamics/dataset_ng/demos/demo_dataset.ipynb +278 -0
- careamics/dataset_ng/demos/demo_patch_extractor.py +51 -0
- careamics/dataset_ng/demos/mouse_nuclei_demo.ipynb +293 -0
- careamics/dataset_ng/factory.py +180 -0
- careamics/dataset_ng/grouped_index_sampler.py +73 -0
- careamics/dataset_ng/image_stack/__init__.py +14 -0
- careamics/dataset_ng/image_stack/czi_image_stack.py +396 -0
- careamics/dataset_ng/image_stack/file_image_stack.py +140 -0
- careamics/dataset_ng/image_stack/image_stack_protocol.py +93 -0
- careamics/dataset_ng/image_stack/image_utils/__init__.py +6 -0
- careamics/dataset_ng/image_stack/image_utils/image_stack_utils.py +125 -0
- careamics/dataset_ng/image_stack/in_memory_image_stack.py +93 -0
- careamics/dataset_ng/image_stack/zarr_image_stack.py +170 -0
- careamics/dataset_ng/image_stack_loader/__init__.py +19 -0
- careamics/dataset_ng/image_stack_loader/image_stack_loader_protocol.py +70 -0
- careamics/dataset_ng/image_stack_loader/image_stack_loaders.py +273 -0
- careamics/dataset_ng/image_stack_loader/zarr_utils.py +130 -0
- careamics/dataset_ng/legacy_interoperability.py +175 -0
- careamics/dataset_ng/microsplit_input_synth.py +377 -0
- careamics/dataset_ng/patch_extractor/__init__.py +7 -0
- careamics/dataset_ng/patch_extractor/limit_file_extractor.py +50 -0
- careamics/dataset_ng/patch_extractor/patch_construction.py +151 -0
- careamics/dataset_ng/patch_extractor/patch_extractor.py +117 -0
- careamics/dataset_ng/patch_filter/__init__.py +20 -0
- careamics/dataset_ng/patch_filter/coordinate_filter_protocol.py +27 -0
- careamics/dataset_ng/patch_filter/filter_factory.py +95 -0
- careamics/dataset_ng/patch_filter/mask_filter.py +96 -0
- careamics/dataset_ng/patch_filter/max_filter.py +188 -0
- careamics/dataset_ng/patch_filter/mean_std_filter.py +218 -0
- careamics/dataset_ng/patch_filter/patch_filter_protocol.py +50 -0
- careamics/dataset_ng/patch_filter/shannon_filter.py +188 -0
- careamics/dataset_ng/patching_strategies/__init__.py +26 -0
- careamics/dataset_ng/patching_strategies/patching_strategy_factory.py +50 -0
- careamics/dataset_ng/patching_strategies/patching_strategy_protocol.py +161 -0
- careamics/dataset_ng/patching_strategies/random_patching.py +393 -0
- careamics/dataset_ng/patching_strategies/sequential_patching.py +99 -0
- careamics/dataset_ng/patching_strategies/tiling_strategy.py +207 -0
- careamics/dataset_ng/patching_strategies/whole_sample.py +61 -0
- careamics/file_io/__init__.py +15 -0
- careamics/file_io/read/__init__.py +11 -0
- careamics/file_io/read/get_func.py +57 -0
- careamics/file_io/read/tiff.py +58 -0
- careamics/file_io/write/__init__.py +15 -0
- careamics/file_io/write/get_func.py +63 -0
- careamics/file_io/write/tiff.py +40 -0
- careamics/lightning/__init__.py +32 -0
- careamics/lightning/callbacks/__init__.py +13 -0
- careamics/lightning/callbacks/data_stats_callback.py +33 -0
- careamics/lightning/callbacks/hyperparameters_callback.py +49 -0
- careamics/lightning/callbacks/prediction_writer_callback/__init__.py +20 -0
- careamics/lightning/callbacks/prediction_writer_callback/file_path_utils.py +56 -0
- careamics/lightning/callbacks/prediction_writer_callback/prediction_writer_callback.py +234 -0
- careamics/lightning/callbacks/prediction_writer_callback/write_strategy.py +399 -0
- careamics/lightning/callbacks/prediction_writer_callback/write_strategy_factory.py +215 -0
- careamics/lightning/callbacks/progress_bar_callback.py +90 -0
- careamics/lightning/dataset_ng/__init__.py +1 -0
- careamics/lightning/dataset_ng/callbacks/__init__.py +1 -0
- careamics/lightning/dataset_ng/callbacks/prediction_writer/__init__.py +29 -0
- careamics/lightning/dataset_ng/callbacks/prediction_writer/cached_tiles_strategy.py +164 -0
- careamics/lightning/dataset_ng/callbacks/prediction_writer/file_path_utils.py +33 -0
- careamics/lightning/dataset_ng/callbacks/prediction_writer/prediction_writer_callback.py +219 -0
- careamics/lightning/dataset_ng/callbacks/prediction_writer/write_image_strategy.py +91 -0
- careamics/lightning/dataset_ng/callbacks/prediction_writer/write_strategy.py +27 -0
- careamics/lightning/dataset_ng/callbacks/prediction_writer/write_strategy_factory.py +214 -0
- careamics/lightning/dataset_ng/callbacks/prediction_writer/write_tiles_zarr_strategy.py +375 -0
- careamics/lightning/dataset_ng/data_module.py +529 -0
- careamics/lightning/dataset_ng/data_module_utils.py +395 -0
- careamics/lightning/dataset_ng/lightning_modules/__init__.py +9 -0
- careamics/lightning/dataset_ng/lightning_modules/care_module.py +97 -0
- careamics/lightning/dataset_ng/lightning_modules/n2v_module.py +106 -0
- careamics/lightning/dataset_ng/lightning_modules/unet_module.py +221 -0
- careamics/lightning/dataset_ng/prediction/__init__.py +16 -0
- careamics/lightning/dataset_ng/prediction/convert_prediction.py +198 -0
- careamics/lightning/dataset_ng/prediction/stitch_prediction.py +171 -0
- careamics/lightning/lightning_module.py +914 -0
- careamics/lightning/microsplit_data_module.py +632 -0
- careamics/lightning/predict_data_module.py +341 -0
- careamics/lightning/train_data_module.py +666 -0
- careamics/losses/__init__.py +21 -0
- careamics/losses/fcn/__init__.py +1 -0
- careamics/losses/fcn/losses.py +125 -0
- careamics/losses/loss_factory.py +80 -0
- careamics/losses/lvae/__init__.py +1 -0
- careamics/losses/lvae/loss_utils.py +83 -0
- careamics/losses/lvae/losses.py +589 -0
- careamics/lvae_training/__init__.py +0 -0
- careamics/lvae_training/calibration.py +191 -0
- careamics/lvae_training/dataset/__init__.py +20 -0
- careamics/lvae_training/dataset/config.py +135 -0
- careamics/lvae_training/dataset/lc_dataset.py +274 -0
- careamics/lvae_training/dataset/ms_dataset_ref.py +1067 -0
- careamics/lvae_training/dataset/multich_dataset.py +1121 -0
- careamics/lvae_training/dataset/multicrop_dset.py +196 -0
- careamics/lvae_training/dataset/multifile_dataset.py +335 -0
- careamics/lvae_training/dataset/types.py +32 -0
- careamics/lvae_training/dataset/utils/__init__.py +0 -0
- careamics/lvae_training/dataset/utils/data_utils.py +114 -0
- careamics/lvae_training/dataset/utils/empty_patch_fetcher.py +65 -0
- careamics/lvae_training/dataset/utils/index_manager.py +491 -0
- careamics/lvae_training/dataset/utils/index_switcher.py +165 -0
- careamics/lvae_training/eval_utils.py +987 -0
- careamics/lvae_training/get_config.py +84 -0
- careamics/lvae_training/lightning_module.py +701 -0
- careamics/lvae_training/metrics.py +214 -0
- careamics/lvae_training/train_lvae.py +342 -0
- careamics/lvae_training/train_utils.py +121 -0
- careamics/model_io/__init__.py +7 -0
- careamics/model_io/bioimage/__init__.py +11 -0
- careamics/model_io/bioimage/_readme_factory.py +113 -0
- careamics/model_io/bioimage/bioimage_utils.py +56 -0
- careamics/model_io/bioimage/cover_factory.py +171 -0
- careamics/model_io/bioimage/model_description.py +341 -0
- careamics/model_io/bmz_io.py +251 -0
- careamics/model_io/model_io_utils.py +95 -0
- careamics/models/__init__.py +5 -0
- careamics/models/activation.py +40 -0
- careamics/models/layers.py +495 -0
- careamics/models/lvae/__init__.py +3 -0
- careamics/models/lvae/layers.py +1371 -0
- careamics/models/lvae/likelihoods.py +394 -0
- careamics/models/lvae/lvae.py +848 -0
- careamics/models/lvae/noise_models.py +738 -0
- careamics/models/lvae/stochastic.py +394 -0
- careamics/models/lvae/utils.py +404 -0
- careamics/models/model_factory.py +54 -0
- careamics/models/unet.py +449 -0
- careamics/nm_training_placeholder.py +203 -0
- careamics/prediction_utils/__init__.py +21 -0
- careamics/prediction_utils/lvae_prediction.py +158 -0
- careamics/prediction_utils/lvae_tiling_manager.py +362 -0
- careamics/prediction_utils/prediction_outputs.py +238 -0
- careamics/prediction_utils/stitch_prediction.py +193 -0
- careamics/py.typed +5 -0
- careamics/transforms/__init__.py +22 -0
- careamics/transforms/compose.py +173 -0
- careamics/transforms/n2v_manipulate.py +150 -0
- careamics/transforms/n2v_manipulate_torch.py +149 -0
- careamics/transforms/normalize.py +374 -0
- careamics/transforms/pixel_manipulation.py +406 -0
- careamics/transforms/pixel_manipulation_torch.py +388 -0
- careamics/transforms/struct_mask_parameters.py +20 -0
- careamics/transforms/transform.py +24 -0
- careamics/transforms/tta.py +88 -0
- careamics/transforms/xy_flip.py +131 -0
- careamics/transforms/xy_random_rotate90.py +108 -0
- careamics/utils/__init__.py +19 -0
- careamics/utils/autocorrelation.py +40 -0
- careamics/utils/base_enum.py +60 -0
- careamics/utils/context.py +67 -0
- careamics/utils/deprecation.py +63 -0
- careamics/utils/lightning_utils.py +71 -0
- careamics/utils/logging.py +323 -0
- careamics/utils/metrics.py +394 -0
- careamics/utils/path_utils.py +26 -0
- careamics/utils/plotting.py +76 -0
- careamics/utils/ram.py +15 -0
- careamics/utils/receptive_field.py +108 -0
- careamics/utils/serializers.py +62 -0
- careamics/utils/torch_utils.py +150 -0
- careamics/utils/version.py +38 -0
- careamics-0.0.19.dist-info/METADATA +80 -0
- careamics-0.0.19.dist-info/RECORD +279 -0
- careamics-0.0.19.dist-info/WHEEL +4 -0
- careamics-0.0.19.dist-info/entry_points.txt +2 -0
- careamics-0.0.19.dist-info/licenses/LICENSE +28 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"""Patch transform applying XY random 90 degrees rotations."""
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
from numpy.typing import NDArray
|
|
5
|
+
|
|
6
|
+
from careamics.transforms.transform import Transform
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class XYRandomRotate90(Transform):
|
|
10
|
+
"""Applies random 90 degree rotations to the YX axis.
|
|
11
|
+
|
|
12
|
+
This transform expects C(Z)YX dimensions.
|
|
13
|
+
|
|
14
|
+
Attributes
|
|
15
|
+
----------
|
|
16
|
+
rng : np.random.Generator
|
|
17
|
+
Random number generator.
|
|
18
|
+
p : float
|
|
19
|
+
Probability of applying the transform.
|
|
20
|
+
seed : Optional[int]
|
|
21
|
+
Random seed.
|
|
22
|
+
|
|
23
|
+
Parameters
|
|
24
|
+
----------
|
|
25
|
+
p : float
|
|
26
|
+
Probability of applying the transform, by default 0.5.
|
|
27
|
+
seed : Optional[int]
|
|
28
|
+
Random seed, by default None.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
def __init__(self, p: float = 0.5, seed: int | None = None):
|
|
32
|
+
"""Constructor.
|
|
33
|
+
|
|
34
|
+
Parameters
|
|
35
|
+
----------
|
|
36
|
+
p : float
|
|
37
|
+
Probability of applying the transform, by default 0.5.
|
|
38
|
+
seed : Optional[int]
|
|
39
|
+
Random seed, by default None.
|
|
40
|
+
"""
|
|
41
|
+
if p < 0 or p > 1:
|
|
42
|
+
raise ValueError("Probability must be in [0, 1].")
|
|
43
|
+
|
|
44
|
+
# probability to apply the transform
|
|
45
|
+
self.p = p
|
|
46
|
+
|
|
47
|
+
# numpy random generator
|
|
48
|
+
self.rng = np.random.default_rng(seed=seed)
|
|
49
|
+
|
|
50
|
+
def __call__(
|
|
51
|
+
self,
|
|
52
|
+
patch: NDArray,
|
|
53
|
+
target: NDArray | None = None,
|
|
54
|
+
**additional_arrays: NDArray,
|
|
55
|
+
) -> tuple[NDArray, NDArray | None, dict[str, NDArray]]:
|
|
56
|
+
"""Apply the transform to the source patch and the target (optional).
|
|
57
|
+
|
|
58
|
+
Parameters
|
|
59
|
+
----------
|
|
60
|
+
patch : np.ndarray
|
|
61
|
+
Patch, 2D or 3D, shape C(Z)YX.
|
|
62
|
+
target : Optional[np.ndarray], optional
|
|
63
|
+
Target for the patch, by default None.
|
|
64
|
+
**additional_arrays : NDArray
|
|
65
|
+
Additional arrays that will be transformed identically to `patch` and
|
|
66
|
+
`target`.
|
|
67
|
+
|
|
68
|
+
Returns
|
|
69
|
+
-------
|
|
70
|
+
tuple[np.ndarray, Optional[np.ndarray]]
|
|
71
|
+
Transformed patch and target.
|
|
72
|
+
"""
|
|
73
|
+
if self.rng.random() > self.p:
|
|
74
|
+
return patch, target, additional_arrays
|
|
75
|
+
|
|
76
|
+
# number of rotations
|
|
77
|
+
n_rot = int(self.rng.integers(1, 4))
|
|
78
|
+
|
|
79
|
+
axes = (-2, -1)
|
|
80
|
+
patch_transformed = self._apply(patch, n_rot, axes)
|
|
81
|
+
target_transformed = (
|
|
82
|
+
self._apply(target, n_rot, axes) if target is not None else None
|
|
83
|
+
)
|
|
84
|
+
additional_transformed = {
|
|
85
|
+
key: self._apply(array, n_rot, axes)
|
|
86
|
+
for key, array in additional_arrays.items()
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return patch_transformed, target_transformed, additional_transformed
|
|
90
|
+
|
|
91
|
+
def _apply(self, patch: NDArray, n_rot: int, axes: tuple[int, int]) -> NDArray:
|
|
92
|
+
"""Apply the transform to the image.
|
|
93
|
+
|
|
94
|
+
Parameters
|
|
95
|
+
----------
|
|
96
|
+
patch : np.ndarray
|
|
97
|
+
Image or image patch, 2D or 3D, shape C(Z)YX.
|
|
98
|
+
n_rot : int
|
|
99
|
+
Number of 90 degree rotations.
|
|
100
|
+
axes : tuple[int, int]
|
|
101
|
+
Axes along which to rotate the patch.
|
|
102
|
+
|
|
103
|
+
Returns
|
|
104
|
+
-------
|
|
105
|
+
np.ndarray
|
|
106
|
+
Transformed patch.
|
|
107
|
+
"""
|
|
108
|
+
return np.ascontiguousarray(np.rot90(patch, k=n_rot, axes=axes))
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""Utils module."""
|
|
2
|
+
|
|
3
|
+
__all__ = [
|
|
4
|
+
"BaseEnum",
|
|
5
|
+
"autocorrelation",
|
|
6
|
+
"check_path_exists",
|
|
7
|
+
"cwd",
|
|
8
|
+
"get_careamics_home",
|
|
9
|
+
"get_logger",
|
|
10
|
+
"get_ram_size",
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
from .autocorrelation import autocorrelation
|
|
15
|
+
from .base_enum import BaseEnum
|
|
16
|
+
from .context import cwd, get_careamics_home
|
|
17
|
+
from .logging import get_logger
|
|
18
|
+
from .path_utils import check_path_exists
|
|
19
|
+
from .ram import get_ram_size
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""Autocorrelation function."""
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
from numpy.typing import NDArray
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def autocorrelation(image: NDArray) -> NDArray:
|
|
8
|
+
"""Compute the autocorrelation of an image.
|
|
9
|
+
|
|
10
|
+
This method is used to explore spatial correlations in images,
|
|
11
|
+
in particular in the noise.
|
|
12
|
+
|
|
13
|
+
The autocorrelation is normalized to the zero-shift value, which is centered in
|
|
14
|
+
the resulting images.
|
|
15
|
+
|
|
16
|
+
Parameters
|
|
17
|
+
----------
|
|
18
|
+
image : NDArray
|
|
19
|
+
Input image.
|
|
20
|
+
|
|
21
|
+
Returns
|
|
22
|
+
-------
|
|
23
|
+
numpy.ndarray
|
|
24
|
+
Autocorrelation of the input image.
|
|
25
|
+
"""
|
|
26
|
+
# normalize image
|
|
27
|
+
image = (image - np.mean(image)) / np.std(image)
|
|
28
|
+
|
|
29
|
+
# compute autocorrelation in fourier space
|
|
30
|
+
image = np.fft.fftn(image)
|
|
31
|
+
image = np.abs(image) ** 2
|
|
32
|
+
image = np.fft.ifftn(image).real
|
|
33
|
+
|
|
34
|
+
# normalize to zero shift value
|
|
35
|
+
image = image / image.flat[0]
|
|
36
|
+
|
|
37
|
+
# shift zero frequency to center
|
|
38
|
+
image = np.fft.fftshift(image)
|
|
39
|
+
|
|
40
|
+
return image
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""A base class for Enum that allows checking if a value is in the Enum."""
|
|
2
|
+
|
|
3
|
+
from enum import Enum, EnumMeta
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class _ContainerEnum(EnumMeta):
|
|
8
|
+
"""Metaclass for Enum with __contains__ method."""
|
|
9
|
+
|
|
10
|
+
def __contains__(cls, item: Any) -> bool:
|
|
11
|
+
"""Check if an item is in the Enum.
|
|
12
|
+
|
|
13
|
+
Parameters
|
|
14
|
+
----------
|
|
15
|
+
item : Any
|
|
16
|
+
Item to check.
|
|
17
|
+
|
|
18
|
+
Returns
|
|
19
|
+
-------
|
|
20
|
+
bool
|
|
21
|
+
True if the item is in the Enum, False otherwise.
|
|
22
|
+
"""
|
|
23
|
+
try:
|
|
24
|
+
cls(item)
|
|
25
|
+
except ValueError:
|
|
26
|
+
return False
|
|
27
|
+
return True
|
|
28
|
+
|
|
29
|
+
@classmethod
|
|
30
|
+
def has_value(cls, value: Any) -> bool:
|
|
31
|
+
"""Check if a value is in the Enum.
|
|
32
|
+
|
|
33
|
+
Parameters
|
|
34
|
+
----------
|
|
35
|
+
value : Any
|
|
36
|
+
Value to check.
|
|
37
|
+
|
|
38
|
+
Returns
|
|
39
|
+
-------
|
|
40
|
+
bool
|
|
41
|
+
True if the value is in the Enum, False otherwise.
|
|
42
|
+
"""
|
|
43
|
+
return value in cls._value2member_map_
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class BaseEnum(Enum, metaclass=_ContainerEnum):
|
|
47
|
+
"""Base Enum class, allowing checking if a value is in the enum.
|
|
48
|
+
|
|
49
|
+
Example
|
|
50
|
+
-------
|
|
51
|
+
>>> from careamics.utils.base_enum import BaseEnum
|
|
52
|
+
>>> # Define a new enum
|
|
53
|
+
>>> class BaseEnumExtension(BaseEnum):
|
|
54
|
+
... VALUE = "value"
|
|
55
|
+
>>> # Check if value is in the enum
|
|
56
|
+
>>> "value" in BaseEnumExtension
|
|
57
|
+
True
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
pass
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Context submodule.
|
|
3
|
+
|
|
4
|
+
A convenience function to change the working directory in order to save data.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
from collections.abc import Iterator
|
|
9
|
+
from contextlib import contextmanager
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Union
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def get_careamics_home() -> Path:
|
|
15
|
+
"""Return the CAREamics home directory.
|
|
16
|
+
|
|
17
|
+
CAREamics home directory is a hidden folder in home.
|
|
18
|
+
|
|
19
|
+
Returns
|
|
20
|
+
-------
|
|
21
|
+
Path
|
|
22
|
+
CAREamics home directory path.
|
|
23
|
+
"""
|
|
24
|
+
home = Path.home() / ".careamics"
|
|
25
|
+
|
|
26
|
+
if not home.exists():
|
|
27
|
+
home.mkdir(parents=True, exist_ok=True)
|
|
28
|
+
|
|
29
|
+
return home
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@contextmanager
|
|
33
|
+
def cwd(path: Union[str, Path]) -> Iterator[None]:
|
|
34
|
+
"""
|
|
35
|
+
Change the current working directory to the given path.
|
|
36
|
+
|
|
37
|
+
This method can be used to generate files in a specific directory, once out of the
|
|
38
|
+
context, the working directory is set back to the original one.
|
|
39
|
+
|
|
40
|
+
Parameters
|
|
41
|
+
----------
|
|
42
|
+
path : Union[str,Path]
|
|
43
|
+
New working directory path.
|
|
44
|
+
|
|
45
|
+
Returns
|
|
46
|
+
-------
|
|
47
|
+
Iterator[None]
|
|
48
|
+
None values.
|
|
49
|
+
|
|
50
|
+
Examples
|
|
51
|
+
--------
|
|
52
|
+
The context is whcnaged within the block and then restored to the original one.
|
|
53
|
+
|
|
54
|
+
>>> with cwd(my_path):
|
|
55
|
+
... pass # do something
|
|
56
|
+
"""
|
|
57
|
+
path = Path(path)
|
|
58
|
+
|
|
59
|
+
if not path.exists():
|
|
60
|
+
path.mkdir(parents=True, exist_ok=True)
|
|
61
|
+
|
|
62
|
+
old_pwd = Path(".").absolute()
|
|
63
|
+
os.chdir(path)
|
|
64
|
+
try:
|
|
65
|
+
yield
|
|
66
|
+
finally:
|
|
67
|
+
os.chdir(old_pwd)
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"""Deprecation utilities."""
|
|
2
|
+
|
|
3
|
+
import functools
|
|
4
|
+
import warnings
|
|
5
|
+
from collections.abc import Callable
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# TODO useful until py3.13 which has warnings.deprecated decorator
|
|
10
|
+
def deprecated(msg: str = "This function is deprecated") -> Callable:
|
|
11
|
+
"""Decorator to mark functions as deprecated.
|
|
12
|
+
|
|
13
|
+
Parameters
|
|
14
|
+
----------
|
|
15
|
+
msg : str
|
|
16
|
+
The deprecation message to display when the function is called.
|
|
17
|
+
|
|
18
|
+
Returns
|
|
19
|
+
-------
|
|
20
|
+
Callable
|
|
21
|
+
The decorator that marks the function as deprecated.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def decorator(func: Callable) -> Callable:
|
|
25
|
+
"""Decorator.
|
|
26
|
+
|
|
27
|
+
Parameters
|
|
28
|
+
----------
|
|
29
|
+
func : Callable
|
|
30
|
+
The function to be decorated.
|
|
31
|
+
|
|
32
|
+
Returns
|
|
33
|
+
-------
|
|
34
|
+
Callable
|
|
35
|
+
The wrapped function.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
@functools.wraps(func)
|
|
39
|
+
def wrapper(*args: Any, **kwargs: Any) -> Any:
|
|
40
|
+
"""Wrapper.
|
|
41
|
+
|
|
42
|
+
Parameters
|
|
43
|
+
----------
|
|
44
|
+
*args : Any
|
|
45
|
+
Positional arguments for the original function.
|
|
46
|
+
**kwargs : Any
|
|
47
|
+
Keyword arguments for the original function.
|
|
48
|
+
|
|
49
|
+
Returns
|
|
50
|
+
-------
|
|
51
|
+
Any
|
|
52
|
+
The return value of the original function.
|
|
53
|
+
"""
|
|
54
|
+
warnings.warn(
|
|
55
|
+
f"{func.__name__} is deprecated: {msg}",
|
|
56
|
+
DeprecationWarning,
|
|
57
|
+
stacklevel=2,
|
|
58
|
+
)
|
|
59
|
+
return func(*args, **kwargs)
|
|
60
|
+
|
|
61
|
+
return wrapper
|
|
62
|
+
|
|
63
|
+
return decorator
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""PyTorch lightning utilities."""
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Union
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def read_csv_logger(experiment_name: str, log_folder: Union[str, Path]) -> dict:
|
|
8
|
+
"""Return the loss curves from the csv logs.
|
|
9
|
+
|
|
10
|
+
Parameters
|
|
11
|
+
----------
|
|
12
|
+
experiment_name : str
|
|
13
|
+
Name of the experiment.
|
|
14
|
+
log_folder : Path or str
|
|
15
|
+
Path to the folder containing the csv logs.
|
|
16
|
+
|
|
17
|
+
Returns
|
|
18
|
+
-------
|
|
19
|
+
dict
|
|
20
|
+
Dictionary containing the loss curves, with keys "train_epoch", "val_epoch",
|
|
21
|
+
"train_loss" and "val_loss".
|
|
22
|
+
"""
|
|
23
|
+
path = Path(log_folder) / experiment_name
|
|
24
|
+
|
|
25
|
+
# find the most recent of version_* folders
|
|
26
|
+
versions = [int(v.name.split("_")[-1]) for v in path.iterdir() if v.is_dir()]
|
|
27
|
+
version = max(versions)
|
|
28
|
+
|
|
29
|
+
path_log = path / f"version_{version}" / "metrics.csv"
|
|
30
|
+
|
|
31
|
+
with open(path_log) as f:
|
|
32
|
+
lines = f.readlines()
|
|
33
|
+
|
|
34
|
+
header = lines[0].strip().split(",")
|
|
35
|
+
metrics: dict[str, list] = {value: [] for value in header}
|
|
36
|
+
print(metrics)
|
|
37
|
+
|
|
38
|
+
for single_line in lines[1:]:
|
|
39
|
+
values = single_line.strip().split(",")
|
|
40
|
+
|
|
41
|
+
for k, v in zip(header, values, strict=False):
|
|
42
|
+
metrics[k].append(v)
|
|
43
|
+
|
|
44
|
+
# train and val are not logged on the same row and can have different lengths
|
|
45
|
+
train_epoch = [
|
|
46
|
+
int(metrics["epoch"][i])
|
|
47
|
+
for i in range(len(metrics["epoch"]))
|
|
48
|
+
if metrics["train_loss_epoch"][i] != ""
|
|
49
|
+
]
|
|
50
|
+
val_epoch = [
|
|
51
|
+
int(metrics["epoch"][i])
|
|
52
|
+
for i in range(len(metrics["epoch"]))
|
|
53
|
+
if metrics["val_loss"][i] != ""
|
|
54
|
+
]
|
|
55
|
+
train_losses = [
|
|
56
|
+
float(metrics["train_loss_epoch"][i])
|
|
57
|
+
for i in range(len(metrics["train_loss_epoch"]))
|
|
58
|
+
if metrics["train_loss_epoch"][i] != ""
|
|
59
|
+
]
|
|
60
|
+
val_losses = [
|
|
61
|
+
float(metrics["val_loss"][i])
|
|
62
|
+
for i in range(len(metrics["val_loss"]))
|
|
63
|
+
if metrics["val_loss"][i] != ""
|
|
64
|
+
]
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
"train_epoch": train_epoch,
|
|
68
|
+
"val_epoch": val_epoch,
|
|
69
|
+
"train_loss": train_losses,
|
|
70
|
+
"val_loss": val_losses,
|
|
71
|
+
}
|