cars 1.0.0rc3__cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.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 (220) hide show
  1. cars/__init__.py +74 -0
  2. cars/applications/__init__.py +40 -0
  3. cars/applications/application.py +117 -0
  4. cars/applications/application_constants.py +29 -0
  5. cars/applications/application_template.py +146 -0
  6. cars/applications/auxiliary_filling/__init__.py +29 -0
  7. cars/applications/auxiliary_filling/abstract_auxiliary_filling_app.py +105 -0
  8. cars/applications/auxiliary_filling/auxiliary_filling_algo.py +475 -0
  9. cars/applications/auxiliary_filling/auxiliary_filling_from_sensors_app.py +632 -0
  10. cars/applications/auxiliary_filling/auxiliary_filling_wrappers.py +90 -0
  11. cars/applications/dem_generation/__init__.py +30 -0
  12. cars/applications/dem_generation/abstract_dem_generation_app.py +116 -0
  13. cars/applications/dem_generation/bulldozer_config/base_config.yaml +46 -0
  14. cars/applications/dem_generation/bulldozer_dem_app.py +641 -0
  15. cars/applications/dem_generation/bulldozer_memory.py +55 -0
  16. cars/applications/dem_generation/dem_generation_algo.py +107 -0
  17. cars/applications/dem_generation/dem_generation_constants.py +32 -0
  18. cars/applications/dem_generation/dem_generation_wrappers.py +323 -0
  19. cars/applications/dense_match_filling/__init__.py +30 -0
  20. cars/applications/dense_match_filling/abstract_dense_match_filling_app.py +242 -0
  21. cars/applications/dense_match_filling/fill_disp_algo.py +113 -0
  22. cars/applications/dense_match_filling/fill_disp_constants.py +39 -0
  23. cars/applications/dense_match_filling/fill_disp_wrappers.py +83 -0
  24. cars/applications/dense_match_filling/zero_padding_app.py +302 -0
  25. cars/applications/dense_matching/__init__.py +30 -0
  26. cars/applications/dense_matching/abstract_dense_matching_app.py +261 -0
  27. cars/applications/dense_matching/census_mccnn_sgm_app.py +1461 -0
  28. cars/applications/dense_matching/cpp/__init__.py +0 -0
  29. cars/applications/dense_matching/cpp/dense_matching_cpp.cpython-313-x86_64-linux-gnu.so +0 -0
  30. cars/applications/dense_matching/cpp/dense_matching_cpp.py +94 -0
  31. cars/applications/dense_matching/cpp/includes/dense_matching.hpp +58 -0
  32. cars/applications/dense_matching/cpp/meson.build +9 -0
  33. cars/applications/dense_matching/cpp/src/bindings.cpp +13 -0
  34. cars/applications/dense_matching/cpp/src/dense_matching.cpp +207 -0
  35. cars/applications/dense_matching/dense_matching_algo.py +401 -0
  36. cars/applications/dense_matching/dense_matching_constants.py +89 -0
  37. cars/applications/dense_matching/dense_matching_wrappers.py +951 -0
  38. cars/applications/dense_matching/disparity_grid_algo.py +597 -0
  39. cars/applications/dense_matching/loaders/__init__.py +23 -0
  40. cars/applications/dense_matching/loaders/config_census_sgm_default.json +31 -0
  41. cars/applications/dense_matching/loaders/config_census_sgm_homogeneous.json +30 -0
  42. cars/applications/dense_matching/loaders/config_census_sgm_mountain_and_vegetation.json +30 -0
  43. cars/applications/dense_matching/loaders/config_census_sgm_shadow.json +30 -0
  44. cars/applications/dense_matching/loaders/config_census_sgm_sparse.json +36 -0
  45. cars/applications/dense_matching/loaders/config_census_sgm_urban.json +30 -0
  46. cars/applications/dense_matching/loaders/config_mapping.json +13 -0
  47. cars/applications/dense_matching/loaders/config_mccnn.json +28 -0
  48. cars/applications/dense_matching/loaders/global_land_cover_map.tif +0 -0
  49. cars/applications/dense_matching/loaders/pandora_loader.py +593 -0
  50. cars/applications/dsm_filling/__init__.py +32 -0
  51. cars/applications/dsm_filling/abstract_dsm_filling_app.py +101 -0
  52. cars/applications/dsm_filling/border_interpolation_app.py +278 -0
  53. cars/applications/dsm_filling/bulldozer_config/base_config.yaml +44 -0
  54. cars/applications/dsm_filling/bulldozer_filling_app.py +288 -0
  55. cars/applications/dsm_filling/exogenous_filling_app.py +341 -0
  56. cars/applications/dsm_merging/__init__.py +28 -0
  57. cars/applications/dsm_merging/abstract_dsm_merging_app.py +101 -0
  58. cars/applications/dsm_merging/weighted_fusion_app.py +639 -0
  59. cars/applications/grid_correction/__init__.py +30 -0
  60. cars/applications/grid_correction/abstract_grid_correction_app.py +103 -0
  61. cars/applications/grid_correction/grid_correction_app.py +557 -0
  62. cars/applications/grid_generation/__init__.py +30 -0
  63. cars/applications/grid_generation/abstract_grid_generation_app.py +142 -0
  64. cars/applications/grid_generation/epipolar_grid_generation_app.py +327 -0
  65. cars/applications/grid_generation/grid_generation_algo.py +388 -0
  66. cars/applications/grid_generation/grid_generation_constants.py +46 -0
  67. cars/applications/grid_generation/transform_grid.py +88 -0
  68. cars/applications/ground_truth_reprojection/__init__.py +30 -0
  69. cars/applications/ground_truth_reprojection/abstract_ground_truth_reprojection_app.py +137 -0
  70. cars/applications/ground_truth_reprojection/direct_localization_app.py +629 -0
  71. cars/applications/ground_truth_reprojection/ground_truth_reprojection_algo.py +275 -0
  72. cars/applications/point_cloud_outlier_removal/__init__.py +30 -0
  73. cars/applications/point_cloud_outlier_removal/abstract_outlier_removal_app.py +385 -0
  74. cars/applications/point_cloud_outlier_removal/outlier_removal_algo.py +392 -0
  75. cars/applications/point_cloud_outlier_removal/outlier_removal_constants.py +43 -0
  76. cars/applications/point_cloud_outlier_removal/small_components_app.py +522 -0
  77. cars/applications/point_cloud_outlier_removal/statistical_app.py +528 -0
  78. cars/applications/rasterization/__init__.py +30 -0
  79. cars/applications/rasterization/abstract_pc_rasterization_app.py +183 -0
  80. cars/applications/rasterization/rasterization_algo.py +534 -0
  81. cars/applications/rasterization/rasterization_constants.py +38 -0
  82. cars/applications/rasterization/rasterization_wrappers.py +639 -0
  83. cars/applications/rasterization/simple_gaussian_app.py +1152 -0
  84. cars/applications/resampling/__init__.py +28 -0
  85. cars/applications/resampling/abstract_resampling_app.py +187 -0
  86. cars/applications/resampling/bicubic_resampling_app.py +760 -0
  87. cars/applications/resampling/resampling_algo.py +590 -0
  88. cars/applications/resampling/resampling_constants.py +36 -0
  89. cars/applications/resampling/resampling_wrappers.py +309 -0
  90. cars/applications/sensors_subsampling/__init__.py +32 -0
  91. cars/applications/sensors_subsampling/abstract_subsampling_app.py +109 -0
  92. cars/applications/sensors_subsampling/rasterio_subsampling_app.py +420 -0
  93. cars/applications/sensors_subsampling/subsampling_algo.py +108 -0
  94. cars/applications/sparse_matching/__init__.py +30 -0
  95. cars/applications/sparse_matching/abstract_sparse_matching_app.py +599 -0
  96. cars/applications/sparse_matching/sift_app.py +724 -0
  97. cars/applications/sparse_matching/sparse_matching_algo.py +360 -0
  98. cars/applications/sparse_matching/sparse_matching_constants.py +66 -0
  99. cars/applications/sparse_matching/sparse_matching_wrappers.py +282 -0
  100. cars/applications/triangulation/__init__.py +32 -0
  101. cars/applications/triangulation/abstract_triangulation_app.py +227 -0
  102. cars/applications/triangulation/line_of_sight_intersection_app.py +1243 -0
  103. cars/applications/triangulation/pc_transform.py +552 -0
  104. cars/applications/triangulation/triangulation_algo.py +371 -0
  105. cars/applications/triangulation/triangulation_constants.py +38 -0
  106. cars/applications/triangulation/triangulation_wrappers.py +259 -0
  107. cars/bundleadjustment.py +750 -0
  108. cars/cars.py +179 -0
  109. cars/conf/__init__.py +23 -0
  110. cars/conf/geoid/egm96.grd +0 -0
  111. cars/conf/geoid/egm96.grd.hdr +15 -0
  112. cars/conf/input_parameters.py +156 -0
  113. cars/conf/mask_cst.py +35 -0
  114. cars/core/__init__.py +23 -0
  115. cars/core/cars_logging.py +402 -0
  116. cars/core/constants.py +191 -0
  117. cars/core/constants_disparity.py +50 -0
  118. cars/core/datasets.py +140 -0
  119. cars/core/geometry/__init__.py +27 -0
  120. cars/core/geometry/abstract_geometry.py +1130 -0
  121. cars/core/geometry/shareloc_geometry.py +604 -0
  122. cars/core/inputs.py +568 -0
  123. cars/core/outputs.py +176 -0
  124. cars/core/preprocessing.py +722 -0
  125. cars/core/projection.py +843 -0
  126. cars/core/roi_tools.py +215 -0
  127. cars/core/tiling.py +774 -0
  128. cars/core/utils.py +164 -0
  129. cars/data_structures/__init__.py +23 -0
  130. cars/data_structures/cars_dataset.py +1544 -0
  131. cars/data_structures/cars_dict.py +74 -0
  132. cars/data_structures/corresponding_tiles_tools.py +186 -0
  133. cars/data_structures/dataframe_converter.py +185 -0
  134. cars/data_structures/format_transformation.py +297 -0
  135. cars/devibrate.py +689 -0
  136. cars/extractroi.py +264 -0
  137. cars/orchestrator/__init__.py +23 -0
  138. cars/orchestrator/achievement_tracker.py +125 -0
  139. cars/orchestrator/cluster/__init__.py +37 -0
  140. cars/orchestrator/cluster/abstract_cluster.py +250 -0
  141. cars/orchestrator/cluster/abstract_dask_cluster.py +381 -0
  142. cars/orchestrator/cluster/dask_cluster_tools.py +103 -0
  143. cars/orchestrator/cluster/dask_config/README.md +94 -0
  144. cars/orchestrator/cluster/dask_config/dask.yaml +21 -0
  145. cars/orchestrator/cluster/dask_config/distributed.yaml +70 -0
  146. cars/orchestrator/cluster/dask_config/jobqueue.yaml +26 -0
  147. cars/orchestrator/cluster/dask_config/reference_confs/dask-schema.yaml +137 -0
  148. cars/orchestrator/cluster/dask_config/reference_confs/dask.yaml +26 -0
  149. cars/orchestrator/cluster/dask_config/reference_confs/distributed-schema.yaml +1009 -0
  150. cars/orchestrator/cluster/dask_config/reference_confs/distributed.yaml +273 -0
  151. cars/orchestrator/cluster/dask_config/reference_confs/jobqueue.yaml +212 -0
  152. cars/orchestrator/cluster/dask_jobqueue_utils.py +204 -0
  153. cars/orchestrator/cluster/local_dask_cluster.py +116 -0
  154. cars/orchestrator/cluster/log_wrapper.py +728 -0
  155. cars/orchestrator/cluster/mp_cluster/__init__.py +27 -0
  156. cars/orchestrator/cluster/mp_cluster/mp_factorizer.py +212 -0
  157. cars/orchestrator/cluster/mp_cluster/mp_objects.py +535 -0
  158. cars/orchestrator/cluster/mp_cluster/mp_tools.py +93 -0
  159. cars/orchestrator/cluster/mp_cluster/mp_wrapper.py +505 -0
  160. cars/orchestrator/cluster/mp_cluster/multiprocessing_cluster.py +986 -0
  161. cars/orchestrator/cluster/mp_cluster/multiprocessing_profiler.py +399 -0
  162. cars/orchestrator/cluster/pbs_dask_cluster.py +207 -0
  163. cars/orchestrator/cluster/sequential_cluster.py +139 -0
  164. cars/orchestrator/cluster/slurm_dask_cluster.py +234 -0
  165. cars/orchestrator/memory_tools.py +47 -0
  166. cars/orchestrator/orchestrator.py +755 -0
  167. cars/orchestrator/orchestrator_constants.py +29 -0
  168. cars/orchestrator/registry/__init__.py +23 -0
  169. cars/orchestrator/registry/abstract_registry.py +143 -0
  170. cars/orchestrator/registry/compute_registry.py +106 -0
  171. cars/orchestrator/registry/id_generator.py +116 -0
  172. cars/orchestrator/registry/replacer_registry.py +213 -0
  173. cars/orchestrator/registry/saver_registry.py +363 -0
  174. cars/orchestrator/registry/unseen_registry.py +118 -0
  175. cars/orchestrator/tiles_profiler.py +279 -0
  176. cars/pipelines/__init__.py +26 -0
  177. cars/pipelines/conf_resolution/conf_final_resolution.yaml +5 -0
  178. cars/pipelines/conf_resolution/conf_first_resolution.yaml +4 -0
  179. cars/pipelines/conf_resolution/conf_intermediate_resolution.yaml +2 -0
  180. cars/pipelines/default/__init__.py +26 -0
  181. cars/pipelines/default/default_pipeline.py +1095 -0
  182. cars/pipelines/filling/__init__.py +26 -0
  183. cars/pipelines/filling/filling.py +981 -0
  184. cars/pipelines/formatting/__init__.py +26 -0
  185. cars/pipelines/formatting/formatting.py +190 -0
  186. cars/pipelines/merging/__init__.py +26 -0
  187. cars/pipelines/merging/merging.py +439 -0
  188. cars/pipelines/parameters/__init__.py +0 -0
  189. cars/pipelines/parameters/advanced_parameters.py +256 -0
  190. cars/pipelines/parameters/advanced_parameters_constants.py +68 -0
  191. cars/pipelines/parameters/application_parameters.py +72 -0
  192. cars/pipelines/parameters/depth_map_inputs.py +0 -0
  193. cars/pipelines/parameters/dsm_inputs.py +349 -0
  194. cars/pipelines/parameters/dsm_inputs_constants.py +25 -0
  195. cars/pipelines/parameters/output_constants.py +52 -0
  196. cars/pipelines/parameters/output_parameters.py +435 -0
  197. cars/pipelines/parameters/sensor_inputs.py +859 -0
  198. cars/pipelines/parameters/sensor_inputs_constants.py +51 -0
  199. cars/pipelines/parameters/sensor_loaders/__init__.py +29 -0
  200. cars/pipelines/parameters/sensor_loaders/basic_classif_loader.py +86 -0
  201. cars/pipelines/parameters/sensor_loaders/basic_image_loader.py +98 -0
  202. cars/pipelines/parameters/sensor_loaders/pivot_classif_loader.py +90 -0
  203. cars/pipelines/parameters/sensor_loaders/pivot_image_loader.py +105 -0
  204. cars/pipelines/parameters/sensor_loaders/sensor_loader.py +93 -0
  205. cars/pipelines/parameters/sensor_loaders/sensor_loader_template.py +71 -0
  206. cars/pipelines/parameters/sensor_loaders/slurp_classif_loader.py +86 -0
  207. cars/pipelines/pipeline.py +119 -0
  208. cars/pipelines/pipeline_constants.py +38 -0
  209. cars/pipelines/pipeline_template.py +135 -0
  210. cars/pipelines/subsampling/__init__.py +26 -0
  211. cars/pipelines/subsampling/subsampling.py +358 -0
  212. cars/pipelines/surface_modeling/__init__.py +26 -0
  213. cars/pipelines/surface_modeling/surface_modeling.py +2098 -0
  214. cars/pipelines/tie_points/__init__.py +26 -0
  215. cars/pipelines/tie_points/tie_points.py +536 -0
  216. cars/starter.py +167 -0
  217. cars-1.0.0rc3.dist-info/METADATA +289 -0
  218. cars-1.0.0rc3.dist-info/RECORD +220 -0
  219. cars-1.0.0rc3.dist-info/WHEEL +6 -0
  220. cars-1.0.0rc3.dist-info/entry_points.txt +8 -0
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env python
2
+ # coding: utf8
3
+ #
4
+ # Copyright (c) 2020 Centre National d'Etudes Spatiales (CNES).
5
+ #
6
+ # This file is part of CARS
7
+ # (see https://github.com/CNES/cars).
8
+ #
9
+ # Licensed under the Apache License, Version 2.0 (the "License");
10
+ # you may not use this file except in compliance with the License.
11
+ # You may obtain a copy of the License at
12
+ #
13
+ # http://www.apache.org/licenses/LICENSE-2.0
14
+ #
15
+ # Unless required by applicable law or agreed to in writing, software
16
+ # distributed under the License is distributed on an "AS IS" BASIS,
17
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+ """
22
+ This module contains the constants used in sensor_to_full_resolution
23
+ pipeline.
24
+ """
25
+
26
+ # Sensor input
27
+
28
+ SENSORS = "sensors"
29
+ PAIRING = "pairing"
30
+ RECTIFICATION_GRIDS = "rectification_grids"
31
+
32
+ INITIAL_ELEVATION = "initial_elevation"
33
+ LOW_RES_DSM = "low_res_dsm"
34
+
35
+ ROI = "roi"
36
+ GEOID = "geoid"
37
+ DEM_PATH = "dem"
38
+ LOADERS = "loaders"
39
+ FILLING = "filling"
40
+
41
+ INPUT_IMG = "image"
42
+ INPUT_MSK = "mask"
43
+ INPUT_CLASSIFICATION = "classification"
44
+ INPUT_GEO_MODEL = "geomodel"
45
+ INPUT_GEO_MODEL_TYPE = "geomodel_type"
46
+ INPUT_GEO_MODEL_FILTER = "geomodel_filters"
47
+ INPUT_NODATA = "no_data"
48
+ INPUT_PATH = "path"
49
+ INPUT_VALUES = "values"
50
+
51
+ CARS_DEFAULT_ALT = 0 # Default altitude used in cars pipelines
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env python
2
+ # coding: utf8
3
+ #
4
+ # Copyright (c) 2020 Centre National d'Etudes Spatiales (CNES).
5
+ #
6
+ # This file is part of CARS
7
+ # (see https://github.com/CNES/cars).
8
+ #
9
+ # Licensed under the Apache License, Version 2.0 (the "License");
10
+ # you may not use this file except in compliance with the License.
11
+ # You may obtain a copy of the License at
12
+ #
13
+ # http://www.apache.org/licenses/LICENSE-2.0
14
+ #
15
+ # Unless required by applicable law or agreed to in writing, software
16
+ # distributed under the License is distributed on an "AS IS" BASIS,
17
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+ """
22
+ CARS application module init file
23
+ """
24
+
25
+ from .basic_classif_loader import BasicClassifSensorLoader # noqa: F401
26
+ from .basic_image_loader import BasicImageSensorLoader # noqa: F401
27
+ from .pivot_classif_loader import PivotClassifSensorLoader # noqa: F401
28
+ from .pivot_image_loader import PivotImageSensorLoader # noqa: F401
29
+ from .slurp_classif_loader import SlurpClassifSensorLoader # noqa: F401
@@ -0,0 +1,86 @@
1
+ # !/usr/bin/env python
2
+ # coding: utf8
3
+ #
4
+ # Copyright (c) 2024 Centre National d'Etudes Spatiales (CNES).
5
+ #
6
+ # This file is part of CARS
7
+ # (see https://github.com/CNES/cars).
8
+ #
9
+ # Licensed under the Apache License, Version 2.0 (the "License");
10
+ # you may not use this file except in compliance with the License.
11
+ # You may obtain a copy of the License at
12
+ #
13
+ # http://www.apache.org/licenses/LICENSE-2.0
14
+ #
15
+ # Unless required by applicable law or agreed to in writing, software
16
+ # distributed under the License is distributed on an "AS IS" BASIS,
17
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+ """
22
+ This module contains the ClassifSensorLoader class.
23
+ """
24
+
25
+ from json_checker import Checker
26
+
27
+ from cars.core import inputs
28
+ from cars.core.utils import make_relative_path_absolute
29
+ from cars.pipelines.parameters import sensor_inputs_constants as sens_cst
30
+ from cars.pipelines.parameters.sensor_loaders.pivot_classif_loader import (
31
+ PivotClassifSensorLoader,
32
+ )
33
+ from cars.pipelines.parameters.sensor_loaders.sensor_loader import SensorLoader
34
+ from cars.pipelines.parameters.sensor_loaders.sensor_loader_template import (
35
+ SensorLoaderTemplate,
36
+ )
37
+
38
+
39
+ @SensorLoader.register("basic_classification")
40
+ class BasicClassifSensorLoader(SensorLoaderTemplate):
41
+ """
42
+ Default sensor loader (used when no sensor loader is specified)
43
+ """
44
+
45
+ def check_conf(self, conf):
46
+ """
47
+ Check configuration
48
+
49
+ :param conf: configuration to check
50
+
51
+ :return: overloaded configuration
52
+ :rtype: dict
53
+ """
54
+ if isinstance(conf, str):
55
+ overloaded_conf = {}
56
+ image_path = make_relative_path_absolute(conf, self.config_dir)
57
+ overloaded_conf[sens_cst.INPUT_PATH] = image_path
58
+ else:
59
+ raise TypeError(f"Input {conf} is not a string")
60
+
61
+ sensor_schema = {
62
+ sens_cst.INPUT_PATH: str,
63
+ }
64
+
65
+ # Check conf
66
+ checker = Checker(sensor_schema)
67
+ checker.validate(overloaded_conf)
68
+
69
+ return overloaded_conf
70
+
71
+ def set_pivot_format(self):
72
+ """
73
+ Transform input configuration to pivot format and store it
74
+ """
75
+ pivot_config = {
76
+ sens_cst.INPUT_PATH: self.used_config[sens_cst.INPUT_PATH],
77
+ }
78
+ pivot_config["values"] = inputs.rasterio_get_classif_values(
79
+ self.used_config[sens_cst.INPUT_PATH]
80
+ )
81
+ # Remove value 0 because it corresponds to unclassified data
82
+ pivot_config["values"].remove(0)
83
+ pivot_sensor_loader = PivotClassifSensorLoader(
84
+ pivot_config, self.config_dir
85
+ )
86
+ self.pivot_format = pivot_sensor_loader.get_pivot_format()
@@ -0,0 +1,98 @@
1
+ # !/usr/bin/env python
2
+ # coding: utf8
3
+ #
4
+ # Copyright (c) 2024 Centre National d'Etudes Spatiales (CNES).
5
+ #
6
+ # This file is part of CARS
7
+ # (see https://github.com/CNES/cars).
8
+ #
9
+ # Licensed under the Apache License, Version 2.0 (the "License");
10
+ # you may not use this file except in compliance with the License.
11
+ # You may obtain a copy of the License at
12
+ #
13
+ # http://www.apache.org/licenses/LICENSE-2.0
14
+ #
15
+ # Unless required by applicable law or agreed to in writing, software
16
+ # distributed under the License is distributed on an "AS IS" BASIS,
17
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+ """
22
+ This module contains the BasicImageSensorLoader class.
23
+ """
24
+
25
+ from json_checker import Checker, Or
26
+
27
+ from cars.core import inputs
28
+ from cars.core.utils import make_relative_path_absolute
29
+ from cars.pipelines.parameters import sensor_inputs_constants as sens_cst
30
+ from cars.pipelines.parameters.sensor_loaders.pivot_image_loader import (
31
+ PivotImageSensorLoader,
32
+ )
33
+ from cars.pipelines.parameters.sensor_loaders.sensor_loader import SensorLoader
34
+ from cars.pipelines.parameters.sensor_loaders.sensor_loader_template import (
35
+ SensorLoaderTemplate,
36
+ )
37
+
38
+
39
+ @SensorLoader.register("basic_image")
40
+ class BasicImageSensorLoader(SensorLoaderTemplate):
41
+ """
42
+ Default sensor loader for image (used when no sensor loader is specified)
43
+ """
44
+
45
+ def check_conf(self, conf):
46
+ """
47
+ Check configuration
48
+
49
+ :param conf: configuration to check
50
+
51
+ :return: overloaded configuration
52
+ :rtype: dict
53
+ """
54
+ if isinstance(conf, str):
55
+ overloaded_conf = {}
56
+ image_path = make_relative_path_absolute(conf, self.config_dir)
57
+ overloaded_conf[sens_cst.INPUT_PATH] = image_path
58
+ overloaded_conf[sens_cst.INPUT_NODATA] = 0
59
+ elif isinstance(conf, dict):
60
+ overloaded_conf = conf.copy()
61
+ image_path = make_relative_path_absolute(
62
+ conf[sens_cst.INPUT_PATH], self.config_dir
63
+ )
64
+ overloaded_conf[sens_cst.INPUT_PATH] = image_path
65
+ overloaded_conf[sens_cst.INPUT_NODATA] = conf.get(
66
+ sens_cst.INPUT_NODATA, 0
67
+ )
68
+ else:
69
+ raise TypeError(f"Input {conf} is not a string ot dict")
70
+
71
+ sensor_schema = {
72
+ sens_cst.INPUT_PATH: str,
73
+ sens_cst.INPUT_NODATA: Or(None, int),
74
+ }
75
+
76
+ # Check conf
77
+ checker = Checker(sensor_schema)
78
+ checker.validate(overloaded_conf)
79
+
80
+ return overloaded_conf
81
+
82
+ def set_pivot_format(self):
83
+ """
84
+ Transform input configuration to pivot format and store it
85
+ """
86
+ pivot_config = {"bands": {}}
87
+ for band_id in range(
88
+ inputs.rasterio_get_nb_bands(self.used_config[sens_cst.INPUT_PATH])
89
+ ):
90
+ band_name = "b" + str(band_id)
91
+ pivot_config["bands"][band_name] = {
92
+ sens_cst.INPUT_PATH: self.used_config[sens_cst.INPUT_PATH],
93
+ "band": band_id,
94
+ }
95
+ pivot_sensor_loader = PivotImageSensorLoader(
96
+ pivot_config, self.config_dir
97
+ )
98
+ self.pivot_format = pivot_sensor_loader.get_pivot_format()
@@ -0,0 +1,90 @@
1
+ # !/usr/bin/env python
2
+ # coding: utf8
3
+ #
4
+ # Copyright (c) 2024 Centre National d'Etudes Spatiales (CNES).
5
+ #
6
+ # This file is part of CARS
7
+ # (see https://github.com/CNES/cars).
8
+ #
9
+ # Licensed under the Apache License, Version 2.0 (the "License");
10
+ # you may not use this file except in compliance with the License.
11
+ # You may obtain a copy of the License at
12
+ #
13
+ # http://www.apache.org/licenses/LICENSE-2.0
14
+ #
15
+ # Unless required by applicable law or agreed to in writing, software
16
+ # distributed under the License is distributed on an "AS IS" BASIS,
17
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+ """
22
+ this module contains the PivotImageSensorLoader class.
23
+ """
24
+
25
+ from json_checker import Checker
26
+
27
+ from cars.core import inputs
28
+ from cars.core.utils import make_relative_path_absolute
29
+ from cars.pipelines.parameters import sensor_inputs_constants as sens_cst
30
+ from cars.pipelines.parameters.sensor_loaders.sensor_loader import SensorLoader
31
+ from cars.pipelines.parameters.sensor_loaders.sensor_loader_template import (
32
+ SensorLoaderTemplate,
33
+ )
34
+
35
+
36
+ @SensorLoader.register("pivot_classification")
37
+ class PivotClassifSensorLoader(SensorLoaderTemplate):
38
+ """
39
+ Pivot image sensor loader : used by CARS to read inputs
40
+ """
41
+
42
+ def check_conf(self, conf):
43
+ """
44
+ Check configuration
45
+
46
+ :param conf: configuration to check
47
+
48
+ :return: overloaded configuration
49
+ :rtype: dict
50
+ """
51
+ overloaded_conf = conf.copy()
52
+ # Make relative path absolute
53
+ overloaded_conf["path"] = make_relative_path_absolute(
54
+ overloaded_conf["path"], self.config_dir
55
+ )
56
+ overloaded_conf[sens_cst.INPUT_VALUES] = conf.get(
57
+ sens_cst.INPUT_VALUES, []
58
+ )
59
+ # Check dtype and number of bands
60
+ classif_file = overloaded_conf["path"]
61
+ classif_dtype = inputs.rasterio_get_dtype(classif_file)
62
+ if classif_dtype != "uint8":
63
+ raise TypeError(
64
+ "Classification file {} has type {} which is not supported "
65
+ "for classification : type must be uint8".format(
66
+ classif_file, classif_dtype
67
+ )
68
+ )
69
+ classif_nb_bands = inputs.rasterio_get_nb_bands(classif_file)
70
+ if classif_nb_bands != 1:
71
+ raise TypeError(
72
+ "Classification file {} has {} bands but only mono-band "
73
+ "classification is allowed".format(
74
+ classif_file, classif_nb_bands
75
+ )
76
+ )
77
+
78
+ sensor_schema = {
79
+ sens_cst.INPUT_PATH: str,
80
+ sens_cst.INPUT_VALUES: list,
81
+ }
82
+
83
+ # Check conf
84
+ checker = Checker(sensor_schema)
85
+ checker.validate(overloaded_conf)
86
+
87
+ return overloaded_conf
88
+
89
+ def set_pivot_format(self):
90
+ self.pivot_format = self.used_config
@@ -0,0 +1,105 @@
1
+ # !/usr/bin/env python
2
+ # coding: utf8
3
+ #
4
+ # Copyright (c) 2024 Centre National d'Etudes Spatiales (CNES).
5
+ #
6
+ # This file is part of CARS
7
+ # (see https://github.com/CNES/cars).
8
+ #
9
+ # Licensed under the Apache License, Version 2.0 (the "License");
10
+ # you may not use this file except in compliance with the License.
11
+ # You may obtain a copy of the License at
12
+ #
13
+ # http://www.apache.org/licenses/LICENSE-2.0
14
+ #
15
+ # Unless required by applicable law or agreed to in writing, software
16
+ # distributed under the License is distributed on an "AS IS" BASIS,
17
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+ """
22
+ this module contains the PivotImageSensorLoader class.
23
+ """
24
+
25
+ from json_checker import Checker, Or
26
+
27
+ from cars.core import inputs
28
+ from cars.core.utils import make_relative_path_absolute
29
+ from cars.pipelines.parameters import sensor_inputs_constants as sens_cst
30
+ from cars.pipelines.parameters.sensor_loaders.sensor_loader import SensorLoader
31
+ from cars.pipelines.parameters.sensor_loaders.sensor_loader_template import (
32
+ SensorLoaderTemplate,
33
+ )
34
+
35
+
36
+ @SensorLoader.register("pivot_image")
37
+ class PivotImageSensorLoader(SensorLoaderTemplate):
38
+ """
39
+ Pivot image sensor loader : used by CARS to read inputs
40
+ """
41
+
42
+ def check_conf(self, conf):
43
+ """
44
+ Check configuration
45
+
46
+ :param conf: configuration to check
47
+
48
+ :return: overloaded configuration
49
+ :rtype: dict
50
+ """
51
+ overloaded_conf = conf.copy()
52
+ # Make relative paths absolutes
53
+ for band in overloaded_conf["bands"]:
54
+ overloaded_conf["bands"][band]["path"] = (
55
+ make_relative_path_absolute(
56
+ overloaded_conf["bands"][band]["path"], self.config_dir
57
+ )
58
+ )
59
+ # Check consistency between files
60
+ b0_path = overloaded_conf["bands"]["b0"]["path"]
61
+ b0_size = inputs.rasterio_get_size(b0_path)
62
+ b0_transform = inputs.rasterio_get_transform(b0_path)
63
+ for band in overloaded_conf["bands"]:
64
+ band_path = overloaded_conf["bands"][band]["path"]
65
+ band_id = overloaded_conf["bands"][band]["band"]
66
+ nb_bands = inputs.rasterio_get_nb_bands(band_path)
67
+ if band_id >= nb_bands:
68
+ raise RuntimeError(
69
+ "Band id {} is not valid for sensor which "
70
+ "has only {} bands".format(band_id, nb_bands)
71
+ )
72
+ if band_path != b0_path:
73
+ band_size = inputs.rasterio_get_size(band_path)
74
+ band_transform = inputs.rasterio_get_transform(band_path)
75
+ if b0_size != band_size:
76
+ raise RuntimeError(
77
+ "The files {} and {} do not have the same size "
78
+ "but are in the same image".format(b0_path, band_path)
79
+ )
80
+ if b0_transform != band_transform:
81
+ raise RuntimeError(
82
+ "The files {} and {} do not have the same transform "
83
+ "but are in the same image".format(
84
+ b0_path,
85
+ band_path,
86
+ )
87
+ )
88
+
89
+ overloaded_conf[sens_cst.INPUT_NODATA] = conf.get(
90
+ sens_cst.INPUT_NODATA, 0
91
+ )
92
+
93
+ sensor_schema = {
94
+ "bands": dict,
95
+ sens_cst.INPUT_NODATA: Or(None, int),
96
+ }
97
+
98
+ # Check conf
99
+ checker = Checker(sensor_schema)
100
+ checker.validate(overloaded_conf)
101
+
102
+ return overloaded_conf
103
+
104
+ def set_pivot_format(self):
105
+ self.pivot_format = self.used_config
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env python
2
+ # coding: utf8
3
+ #
4
+ # Copyright (c) 2020 Centre National d'Etudes Spatiales (CNES).
5
+ #
6
+ # This file is part of CARS
7
+ # (see https://github.com/CNES/cars).
8
+ #
9
+ # Licensed under the Apache License, Version 2.0 (the "License");
10
+ # you may not use this file except in compliance with the License.
11
+ # You may obtain a copy of the License at
12
+ #
13
+ # http://www.apache.org/licenses/LICENSE-2.0
14
+ #
15
+ # Unless required by applicable law or agreed to in writing, software
16
+ # distributed under the License is distributed on an "AS IS" BASIS,
17
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+
22
+ """
23
+ This module contains sensor loader factory.
24
+ """
25
+
26
+ import logging
27
+
28
+
29
+ class SensorLoader:
30
+ """
31
+ SensorLoader factory:
32
+ A class designed for registered all available Cars sensor loader and
33
+ instantiate when needed.
34
+
35
+ """
36
+
37
+ # Dict (loader_name:str, class: object) containing registered
38
+ # sensor loaders
39
+ available_loaders = {}
40
+
41
+ def __new__(cls, app_name: str, cfg: dict, config_dir: str):
42
+ """
43
+ Return the instance of sensor loader associated with the sensor loader
44
+ name given as parameter
45
+
46
+ :param app_name: name of the sensor loader.
47
+ :type app_name: str
48
+ :param cfg: configuration {'matching_cost_method': value}
49
+ :type cfg: dictionary
50
+ """
51
+
52
+ return cls.create_app(app_name, cfg, config_dir)
53
+
54
+ @classmethod
55
+ def create_app(cls, name: str, cfg: dict, config_dir: str):
56
+ """
57
+ Factory command to create the sensor loader
58
+ Return the instance of sensor loader associated with the sensor loader
59
+ name given as parameter
60
+
61
+ :param app_name: name of the sensor loader.
62
+ :type app_name: str
63
+ :param cfg: sensor loader configuration
64
+ :type cfg: dictionary
65
+ """
66
+ loader = None
67
+
68
+ try:
69
+ loader_class = cls.available_loaders[name]
70
+ except KeyError:
71
+ logging.error("No sensor loader named {0} supported".format(name))
72
+ return None
73
+ loader = loader_class(cfg, config_dir)
74
+ return loader
75
+
76
+ @classmethod
77
+ def register(cls, app_name: str):
78
+ """
79
+ Allows to register the sensor loader with its name
80
+ :param app_name: the sensor loader to be registered
81
+ :type app_name: string
82
+ """
83
+
84
+ def decorator(app):
85
+ """
86
+ Registers the class in the available methods
87
+ :param app: the app class to be registered
88
+ :type app: object
89
+ """
90
+ cls.available_loaders[app_name] = app
91
+ return app
92
+
93
+ return decorator
@@ -0,0 +1,71 @@
1
+ # !/usr/bin/env python
2
+ # coding: utf8
3
+ #
4
+ # Copyright (c) 2024 Centre National d'Etudes Spatiales (CNES).
5
+ #
6
+ # This file is part of CARS
7
+ # (see https://github.com/CNES/cars).
8
+ #
9
+ # Licensed under the Apache License, Version 2.0 (the "License");
10
+ # you may not use this file except in compliance with the License.
11
+ # You may obtain a copy of the License at
12
+ #
13
+ # http://www.apache.org/licenses/LICENSE-2.0
14
+ #
15
+ # Unless required by applicable law or agreed to in writing, software
16
+ # distributed under the License is distributed on an "AS IS" BASIS,
17
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+ """
22
+ this module contains the AbstractSensorLoader class.
23
+ """
24
+
25
+ from abc import abstractmethod
26
+
27
+
28
+ class SensorLoaderTemplate:
29
+ """
30
+ Class for general specification of a sensor loader
31
+ """
32
+
33
+ def __init__(self, conf, config_dir):
34
+ """
35
+ Init function of SensorLoaderTemplate
36
+
37
+ :param conf: configuration for sensor loader
38
+ """
39
+ self.config_dir = config_dir
40
+ self.used_config = self.check_conf(conf)
41
+
42
+ self.pivot_format = None
43
+
44
+ @abstractmethod
45
+ def check_conf(self, conf):
46
+ """
47
+ Check configuration
48
+
49
+ :param conf: configuration to check
50
+
51
+ :return: overloaded configuration
52
+ :rtype: dict
53
+ """
54
+
55
+ def get_pivot_format(self):
56
+ """
57
+ Return sensor configuration as pivot format
58
+
59
+ :return: pivot format configuration
60
+ :rtype: dict
61
+ """
62
+ if self.pivot_format is None:
63
+ self.set_pivot_format()
64
+
65
+ return self.pivot_format
66
+
67
+ @abstractmethod
68
+ def set_pivot_format(self):
69
+ """
70
+ Transform input configuration to pivot format and store it
71
+ """