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.
Files changed (279) hide show
  1. careamics/__init__.py +24 -0
  2. careamics/careamist.py +961 -0
  3. careamics/cli/__init__.py +5 -0
  4. careamics/cli/conf.py +394 -0
  5. careamics/cli/main.py +234 -0
  6. careamics/cli/utils.py +27 -0
  7. careamics/config/__init__.py +66 -0
  8. careamics/config/algorithms/__init__.py +21 -0
  9. careamics/config/algorithms/care_algorithm_config.py +122 -0
  10. careamics/config/algorithms/hdn_algorithm_config.py +103 -0
  11. careamics/config/algorithms/microsplit_algorithm_config.py +103 -0
  12. careamics/config/algorithms/n2n_algorithm_config.py +115 -0
  13. careamics/config/algorithms/n2v_algorithm_config.py +296 -0
  14. careamics/config/algorithms/pn2v_algorithm_config.py +301 -0
  15. careamics/config/algorithms/unet_algorithm_config.py +91 -0
  16. careamics/config/algorithms/vae_algorithm_config.py +178 -0
  17. careamics/config/architectures/__init__.py +7 -0
  18. careamics/config/architectures/architecture_config.py +37 -0
  19. careamics/config/architectures/lvae_config.py +262 -0
  20. careamics/config/architectures/unet_config.py +125 -0
  21. careamics/config/configuration.py +367 -0
  22. careamics/config/configuration_factories.py +2400 -0
  23. careamics/config/data/__init__.py +27 -0
  24. careamics/config/data/data_config.py +472 -0
  25. careamics/config/data/inference_config.py +237 -0
  26. careamics/config/data/ng_data_config.py +1038 -0
  27. careamics/config/data/patch_filter/__init__.py +15 -0
  28. careamics/config/data/patch_filter/filter_config.py +16 -0
  29. careamics/config/data/patch_filter/mask_filter_config.py +17 -0
  30. careamics/config/data/patch_filter/max_filter_config.py +15 -0
  31. careamics/config/data/patch_filter/meanstd_filter_config.py +18 -0
  32. careamics/config/data/patch_filter/shannon_filter_config.py +15 -0
  33. careamics/config/data/patching_strategies/__init__.py +15 -0
  34. careamics/config/data/patching_strategies/_overlapping_patched_config.py +102 -0
  35. careamics/config/data/patching_strategies/_patched_config.py +56 -0
  36. careamics/config/data/patching_strategies/random_patching_config.py +45 -0
  37. careamics/config/data/patching_strategies/sequential_patching_config.py +25 -0
  38. careamics/config/data/patching_strategies/tiled_patching_config.py +40 -0
  39. careamics/config/data/patching_strategies/whole_patching_config.py +12 -0
  40. careamics/config/data/tile_information.py +65 -0
  41. careamics/config/lightning/__init__.py +15 -0
  42. careamics/config/lightning/callbacks/__init__.py +8 -0
  43. careamics/config/lightning/callbacks/callback_config.py +116 -0
  44. careamics/config/lightning/optimizer_configs.py +186 -0
  45. careamics/config/lightning/training_config.py +70 -0
  46. careamics/config/losses/__init__.py +8 -0
  47. careamics/config/losses/loss_config.py +60 -0
  48. careamics/config/ng_configs/__init__.py +5 -0
  49. careamics/config/ng_configs/n2v_configuration.py +64 -0
  50. careamics/config/ng_configs/ng_configuration.py +256 -0
  51. careamics/config/ng_factories/__init__.py +9 -0
  52. careamics/config/ng_factories/algorithm_factory.py +120 -0
  53. careamics/config/ng_factories/data_factory.py +154 -0
  54. careamics/config/ng_factories/n2v_factory.py +256 -0
  55. careamics/config/ng_factories/training_factory.py +69 -0
  56. careamics/config/noise_model/__init__.py +12 -0
  57. careamics/config/noise_model/likelihood_config.py +60 -0
  58. careamics/config/noise_model/noise_model_config.py +149 -0
  59. careamics/config/support/__init__.py +31 -0
  60. careamics/config/support/supported_activations.py +27 -0
  61. careamics/config/support/supported_algorithms.py +40 -0
  62. careamics/config/support/supported_architectures.py +13 -0
  63. careamics/config/support/supported_data.py +122 -0
  64. careamics/config/support/supported_filters.py +17 -0
  65. careamics/config/support/supported_loggers.py +10 -0
  66. careamics/config/support/supported_losses.py +32 -0
  67. careamics/config/support/supported_optimizers.py +57 -0
  68. careamics/config/support/supported_patching_strategies.py +22 -0
  69. careamics/config/support/supported_pixel_manipulations.py +15 -0
  70. careamics/config/support/supported_struct_axis.py +21 -0
  71. careamics/config/support/supported_transforms.py +12 -0
  72. careamics/config/transformations/__init__.py +22 -0
  73. careamics/config/transformations/n2v_manipulate_config.py +79 -0
  74. careamics/config/transformations/normalize_config.py +59 -0
  75. careamics/config/transformations/transform_config.py +45 -0
  76. careamics/config/transformations/transform_unions.py +29 -0
  77. careamics/config/transformations/xy_flip_config.py +43 -0
  78. careamics/config/transformations/xy_random_rotate90_config.py +35 -0
  79. careamics/config/utils/__init__.py +8 -0
  80. careamics/config/utils/configuration_io.py +85 -0
  81. careamics/config/validators/__init__.py +18 -0
  82. careamics/config/validators/axes_validators.py +90 -0
  83. careamics/config/validators/model_validators.py +84 -0
  84. careamics/config/validators/patch_validators.py +55 -0
  85. careamics/conftest.py +39 -0
  86. careamics/dataset/__init__.py +17 -0
  87. careamics/dataset/dataset_utils/__init__.py +19 -0
  88. careamics/dataset/dataset_utils/dataset_utils.py +118 -0
  89. careamics/dataset/dataset_utils/file_utils.py +141 -0
  90. careamics/dataset/dataset_utils/iterate_over_files.py +84 -0
  91. careamics/dataset/dataset_utils/running_stats.py +189 -0
  92. careamics/dataset/in_memory_dataset.py +303 -0
  93. careamics/dataset/in_memory_pred_dataset.py +88 -0
  94. careamics/dataset/in_memory_tiled_pred_dataset.py +131 -0
  95. careamics/dataset/iterable_dataset.py +294 -0
  96. careamics/dataset/iterable_pred_dataset.py +121 -0
  97. careamics/dataset/iterable_tiled_pred_dataset.py +141 -0
  98. careamics/dataset/patching/__init__.py +1 -0
  99. careamics/dataset/patching/patching.py +300 -0
  100. careamics/dataset/patching/random_patching.py +110 -0
  101. careamics/dataset/patching/sequential_patching.py +212 -0
  102. careamics/dataset/patching/validate_patch_dimension.py +64 -0
  103. careamics/dataset/tiling/__init__.py +10 -0
  104. careamics/dataset/tiling/collate_tiles.py +33 -0
  105. careamics/dataset/tiling/lvae_tiled_patching.py +375 -0
  106. careamics/dataset/tiling/tiled_patching.py +166 -0
  107. careamics/dataset_ng/README.md +212 -0
  108. careamics/dataset_ng/__init__.py +0 -0
  109. careamics/dataset_ng/dataset.py +365 -0
  110. careamics/dataset_ng/demos/bsd68_demo.ipynb +361 -0
  111. careamics/dataset_ng/demos/bsd68_zarr_demo.ipynb +453 -0
  112. careamics/dataset_ng/demos/care_U2OS_demo.ipynb +330 -0
  113. careamics/dataset_ng/demos/demo_custom_image_stack.ipynb +736 -0
  114. careamics/dataset_ng/demos/demo_datamodule.ipynb +447 -0
  115. careamics/dataset_ng/demos/demo_dataset.ipynb +278 -0
  116. careamics/dataset_ng/demos/demo_patch_extractor.py +51 -0
  117. careamics/dataset_ng/demos/mouse_nuclei_demo.ipynb +293 -0
  118. careamics/dataset_ng/factory.py +180 -0
  119. careamics/dataset_ng/grouped_index_sampler.py +73 -0
  120. careamics/dataset_ng/image_stack/__init__.py +14 -0
  121. careamics/dataset_ng/image_stack/czi_image_stack.py +396 -0
  122. careamics/dataset_ng/image_stack/file_image_stack.py +140 -0
  123. careamics/dataset_ng/image_stack/image_stack_protocol.py +93 -0
  124. careamics/dataset_ng/image_stack/image_utils/__init__.py +6 -0
  125. careamics/dataset_ng/image_stack/image_utils/image_stack_utils.py +125 -0
  126. careamics/dataset_ng/image_stack/in_memory_image_stack.py +93 -0
  127. careamics/dataset_ng/image_stack/zarr_image_stack.py +170 -0
  128. careamics/dataset_ng/image_stack_loader/__init__.py +19 -0
  129. careamics/dataset_ng/image_stack_loader/image_stack_loader_protocol.py +70 -0
  130. careamics/dataset_ng/image_stack_loader/image_stack_loaders.py +273 -0
  131. careamics/dataset_ng/image_stack_loader/zarr_utils.py +130 -0
  132. careamics/dataset_ng/legacy_interoperability.py +175 -0
  133. careamics/dataset_ng/microsplit_input_synth.py +377 -0
  134. careamics/dataset_ng/patch_extractor/__init__.py +7 -0
  135. careamics/dataset_ng/patch_extractor/limit_file_extractor.py +50 -0
  136. careamics/dataset_ng/patch_extractor/patch_construction.py +151 -0
  137. careamics/dataset_ng/patch_extractor/patch_extractor.py +117 -0
  138. careamics/dataset_ng/patch_filter/__init__.py +20 -0
  139. careamics/dataset_ng/patch_filter/coordinate_filter_protocol.py +27 -0
  140. careamics/dataset_ng/patch_filter/filter_factory.py +95 -0
  141. careamics/dataset_ng/patch_filter/mask_filter.py +96 -0
  142. careamics/dataset_ng/patch_filter/max_filter.py +188 -0
  143. careamics/dataset_ng/patch_filter/mean_std_filter.py +218 -0
  144. careamics/dataset_ng/patch_filter/patch_filter_protocol.py +50 -0
  145. careamics/dataset_ng/patch_filter/shannon_filter.py +188 -0
  146. careamics/dataset_ng/patching_strategies/__init__.py +26 -0
  147. careamics/dataset_ng/patching_strategies/patching_strategy_factory.py +50 -0
  148. careamics/dataset_ng/patching_strategies/patching_strategy_protocol.py +161 -0
  149. careamics/dataset_ng/patching_strategies/random_patching.py +393 -0
  150. careamics/dataset_ng/patching_strategies/sequential_patching.py +99 -0
  151. careamics/dataset_ng/patching_strategies/tiling_strategy.py +207 -0
  152. careamics/dataset_ng/patching_strategies/whole_sample.py +61 -0
  153. careamics/file_io/__init__.py +15 -0
  154. careamics/file_io/read/__init__.py +11 -0
  155. careamics/file_io/read/get_func.py +57 -0
  156. careamics/file_io/read/tiff.py +58 -0
  157. careamics/file_io/write/__init__.py +15 -0
  158. careamics/file_io/write/get_func.py +63 -0
  159. careamics/file_io/write/tiff.py +40 -0
  160. careamics/lightning/__init__.py +32 -0
  161. careamics/lightning/callbacks/__init__.py +13 -0
  162. careamics/lightning/callbacks/data_stats_callback.py +33 -0
  163. careamics/lightning/callbacks/hyperparameters_callback.py +49 -0
  164. careamics/lightning/callbacks/prediction_writer_callback/__init__.py +20 -0
  165. careamics/lightning/callbacks/prediction_writer_callback/file_path_utils.py +56 -0
  166. careamics/lightning/callbacks/prediction_writer_callback/prediction_writer_callback.py +234 -0
  167. careamics/lightning/callbacks/prediction_writer_callback/write_strategy.py +399 -0
  168. careamics/lightning/callbacks/prediction_writer_callback/write_strategy_factory.py +215 -0
  169. careamics/lightning/callbacks/progress_bar_callback.py +90 -0
  170. careamics/lightning/dataset_ng/__init__.py +1 -0
  171. careamics/lightning/dataset_ng/callbacks/__init__.py +1 -0
  172. careamics/lightning/dataset_ng/callbacks/prediction_writer/__init__.py +29 -0
  173. careamics/lightning/dataset_ng/callbacks/prediction_writer/cached_tiles_strategy.py +164 -0
  174. careamics/lightning/dataset_ng/callbacks/prediction_writer/file_path_utils.py +33 -0
  175. careamics/lightning/dataset_ng/callbacks/prediction_writer/prediction_writer_callback.py +219 -0
  176. careamics/lightning/dataset_ng/callbacks/prediction_writer/write_image_strategy.py +91 -0
  177. careamics/lightning/dataset_ng/callbacks/prediction_writer/write_strategy.py +27 -0
  178. careamics/lightning/dataset_ng/callbacks/prediction_writer/write_strategy_factory.py +214 -0
  179. careamics/lightning/dataset_ng/callbacks/prediction_writer/write_tiles_zarr_strategy.py +375 -0
  180. careamics/lightning/dataset_ng/data_module.py +529 -0
  181. careamics/lightning/dataset_ng/data_module_utils.py +395 -0
  182. careamics/lightning/dataset_ng/lightning_modules/__init__.py +9 -0
  183. careamics/lightning/dataset_ng/lightning_modules/care_module.py +97 -0
  184. careamics/lightning/dataset_ng/lightning_modules/n2v_module.py +106 -0
  185. careamics/lightning/dataset_ng/lightning_modules/unet_module.py +221 -0
  186. careamics/lightning/dataset_ng/prediction/__init__.py +16 -0
  187. careamics/lightning/dataset_ng/prediction/convert_prediction.py +198 -0
  188. careamics/lightning/dataset_ng/prediction/stitch_prediction.py +171 -0
  189. careamics/lightning/lightning_module.py +914 -0
  190. careamics/lightning/microsplit_data_module.py +632 -0
  191. careamics/lightning/predict_data_module.py +341 -0
  192. careamics/lightning/train_data_module.py +666 -0
  193. careamics/losses/__init__.py +21 -0
  194. careamics/losses/fcn/__init__.py +1 -0
  195. careamics/losses/fcn/losses.py +125 -0
  196. careamics/losses/loss_factory.py +80 -0
  197. careamics/losses/lvae/__init__.py +1 -0
  198. careamics/losses/lvae/loss_utils.py +83 -0
  199. careamics/losses/lvae/losses.py +589 -0
  200. careamics/lvae_training/__init__.py +0 -0
  201. careamics/lvae_training/calibration.py +191 -0
  202. careamics/lvae_training/dataset/__init__.py +20 -0
  203. careamics/lvae_training/dataset/config.py +135 -0
  204. careamics/lvae_training/dataset/lc_dataset.py +274 -0
  205. careamics/lvae_training/dataset/ms_dataset_ref.py +1067 -0
  206. careamics/lvae_training/dataset/multich_dataset.py +1121 -0
  207. careamics/lvae_training/dataset/multicrop_dset.py +196 -0
  208. careamics/lvae_training/dataset/multifile_dataset.py +335 -0
  209. careamics/lvae_training/dataset/types.py +32 -0
  210. careamics/lvae_training/dataset/utils/__init__.py +0 -0
  211. careamics/lvae_training/dataset/utils/data_utils.py +114 -0
  212. careamics/lvae_training/dataset/utils/empty_patch_fetcher.py +65 -0
  213. careamics/lvae_training/dataset/utils/index_manager.py +491 -0
  214. careamics/lvae_training/dataset/utils/index_switcher.py +165 -0
  215. careamics/lvae_training/eval_utils.py +987 -0
  216. careamics/lvae_training/get_config.py +84 -0
  217. careamics/lvae_training/lightning_module.py +701 -0
  218. careamics/lvae_training/metrics.py +214 -0
  219. careamics/lvae_training/train_lvae.py +342 -0
  220. careamics/lvae_training/train_utils.py +121 -0
  221. careamics/model_io/__init__.py +7 -0
  222. careamics/model_io/bioimage/__init__.py +11 -0
  223. careamics/model_io/bioimage/_readme_factory.py +113 -0
  224. careamics/model_io/bioimage/bioimage_utils.py +56 -0
  225. careamics/model_io/bioimage/cover_factory.py +171 -0
  226. careamics/model_io/bioimage/model_description.py +341 -0
  227. careamics/model_io/bmz_io.py +251 -0
  228. careamics/model_io/model_io_utils.py +95 -0
  229. careamics/models/__init__.py +5 -0
  230. careamics/models/activation.py +40 -0
  231. careamics/models/layers.py +495 -0
  232. careamics/models/lvae/__init__.py +3 -0
  233. careamics/models/lvae/layers.py +1371 -0
  234. careamics/models/lvae/likelihoods.py +394 -0
  235. careamics/models/lvae/lvae.py +848 -0
  236. careamics/models/lvae/noise_models.py +738 -0
  237. careamics/models/lvae/stochastic.py +394 -0
  238. careamics/models/lvae/utils.py +404 -0
  239. careamics/models/model_factory.py +54 -0
  240. careamics/models/unet.py +449 -0
  241. careamics/nm_training_placeholder.py +203 -0
  242. careamics/prediction_utils/__init__.py +21 -0
  243. careamics/prediction_utils/lvae_prediction.py +158 -0
  244. careamics/prediction_utils/lvae_tiling_manager.py +362 -0
  245. careamics/prediction_utils/prediction_outputs.py +238 -0
  246. careamics/prediction_utils/stitch_prediction.py +193 -0
  247. careamics/py.typed +5 -0
  248. careamics/transforms/__init__.py +22 -0
  249. careamics/transforms/compose.py +173 -0
  250. careamics/transforms/n2v_manipulate.py +150 -0
  251. careamics/transforms/n2v_manipulate_torch.py +149 -0
  252. careamics/transforms/normalize.py +374 -0
  253. careamics/transforms/pixel_manipulation.py +406 -0
  254. careamics/transforms/pixel_manipulation_torch.py +388 -0
  255. careamics/transforms/struct_mask_parameters.py +20 -0
  256. careamics/transforms/transform.py +24 -0
  257. careamics/transforms/tta.py +88 -0
  258. careamics/transforms/xy_flip.py +131 -0
  259. careamics/transforms/xy_random_rotate90.py +108 -0
  260. careamics/utils/__init__.py +19 -0
  261. careamics/utils/autocorrelation.py +40 -0
  262. careamics/utils/base_enum.py +60 -0
  263. careamics/utils/context.py +67 -0
  264. careamics/utils/deprecation.py +63 -0
  265. careamics/utils/lightning_utils.py +71 -0
  266. careamics/utils/logging.py +323 -0
  267. careamics/utils/metrics.py +394 -0
  268. careamics/utils/path_utils.py +26 -0
  269. careamics/utils/plotting.py +76 -0
  270. careamics/utils/ram.py +15 -0
  271. careamics/utils/receptive_field.py +108 -0
  272. careamics/utils/serializers.py +62 -0
  273. careamics/utils/torch_utils.py +150 -0
  274. careamics/utils/version.py +38 -0
  275. careamics-0.0.19.dist-info/METADATA +80 -0
  276. careamics-0.0.19.dist-info/RECORD +279 -0
  277. careamics-0.0.19.dist-info/WHEEL +4 -0
  278. careamics-0.0.19.dist-info/entry_points.txt +2 -0
  279. 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
+ }