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,629 @@
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 abstract direct_localization application class.
23
+ """
24
+
25
+ # Standard imports
26
+ import collections
27
+ import logging
28
+ import os
29
+
30
+ import numpy as np
31
+ import rasterio as rio
32
+ import xarray as xr
33
+ from json_checker import And, Checker
34
+
35
+ # CARS imports
36
+ import cars.orchestrator.orchestrator as ocht
37
+ from cars.applications.ground_truth_reprojection import (
38
+ abstract_ground_truth_reprojection_app,
39
+ )
40
+ from cars.applications.ground_truth_reprojection import (
41
+ ground_truth_reprojection_algo as gnd_truth_algo,
42
+ )
43
+
44
+ # CARS imports
45
+ from cars.core import constants as cst
46
+ from cars.core import inputs
47
+ from cars.core.utils import safe_makedirs
48
+ from cars.data_structures import cars_dataset
49
+ from cars.pipelines.parameters import sensor_inputs_constants as sens_cst
50
+
51
+
52
+ class DirectLocalization(
53
+ abstract_ground_truth_reprojection_app.GroundTruthReprojection,
54
+ short_name="direct_loc",
55
+ ):
56
+ """
57
+ DirectLocalization
58
+
59
+ """
60
+
61
+ # pylint: disable=too-many-instance-attributes
62
+
63
+ def __init__(self, conf=None):
64
+ """
65
+ Init function of DirectLocalization
66
+ :param conf: configuration for resampling
67
+ :return: an application_to_use object
68
+
69
+ """
70
+ super().__init__(conf=conf)
71
+
72
+ # check conf
73
+ self.used_method = self.used_config["method"]
74
+ self.target = self.used_config["target"]
75
+ self.tile_size = self.used_config["tile_size"]
76
+
77
+ # Init orchestrator
78
+ self.orchestrator = None
79
+
80
+ def check_conf(self, conf):
81
+ """
82
+ Check configuration
83
+
84
+ :param conf: configuration to check
85
+ :type conf: dict
86
+ :return: overloaded configuration
87
+ :rtype: dict
88
+
89
+ """
90
+
91
+ # init conf
92
+ if conf is not None:
93
+ overloaded_conf = conf.copy()
94
+ else:
95
+ conf = {}
96
+ overloaded_conf = {}
97
+
98
+ # Overload conf
99
+ overloaded_conf["method"] = conf.get("method", "direct_loc")
100
+ overloaded_conf["target"] = conf.get("target", "epipolar")
101
+ overloaded_conf["tile_size"] = conf.get("tile_size", 2500)
102
+ # save_intermediate_data not used in this app, but overiden
103
+ overloaded_conf["save_intermediate_data"] = True
104
+
105
+ ground_truth_reprojection_schema = {
106
+ "method": str,
107
+ "target": And(
108
+ str, lambda input: input in ["epipolar", "sensor", "all"]
109
+ ),
110
+ "tile_size": And(int, lambda size: size > 0),
111
+ "save_intermediate_data": bool,
112
+ }
113
+
114
+ # Check conf
115
+ checker = Checker(ground_truth_reprojection_schema)
116
+ checker.validate(overloaded_conf)
117
+
118
+ return overloaded_conf
119
+
120
+ def run( # pylint: disable=too-many-positional-arguments # noqa: C901
121
+ self,
122
+ sensor_left,
123
+ sensor_right,
124
+ grid_left,
125
+ grid_right,
126
+ geom_plugin,
127
+ geom_plugin_dem_median,
128
+ disp_to_alt_ratio,
129
+ auxiliary_values,
130
+ auxiliary_interp,
131
+ orchestrator=None,
132
+ pair_folder=None,
133
+ pair_key="PAIR_0",
134
+ ):
135
+ """
136
+ Run direct localization for ground truth disparity
137
+
138
+ :param sensor_left: Tiled sensor left image.
139
+ Dict must contain keys: "image", "texture", "geomodel",
140
+ "no_data", "mask". Paths must be absolute.
141
+ :type sensor_left: CarsDataset
142
+ :param sensor_right: Tiled sensor right image.
143
+ Dict must contain keys: "image", "texture", "geomodel",
144
+ "no_data", "mask". Paths must be absolute.
145
+ :type sensor_right: CarsDataset
146
+ :param grid_left: Grid left.
147
+ :type grid_left: CarsDataset
148
+ :param grid_right: Grid right.
149
+ :type grid_right: CarsDataset
150
+ :param geom_plugin_dem_median: Geometry plugin with dem median
151
+ :type geom_plugin_dem_median: geometry_plugin
152
+ :param geom_plugin: Geometry plugin with user's DSM used to
153
+ generate epipolar grids.
154
+ :type geom_plugin: GeometryPlugin
155
+ :param disp_to_alt_ratio: Disp to altitude ratio used
156
+ for performance map.
157
+ :type disp_to_alt_ratio: float
158
+ :param orchestrator: orchestrator used
159
+ :type orchestrator: orchestrator
160
+ :param pair_folder: Folder used for current pair.
161
+ :type pair_folder: str
162
+ :param pair_key: Pair ID.
163
+ :type pair_key: str
164
+ """
165
+
166
+ logging.info("Starting ground truth reprojection application")
167
+
168
+ # Default orchestrator
169
+ if orchestrator is None:
170
+ # Create default sequential orchestrator for current application
171
+ # be aware, no out_json will be shared between orchestrators
172
+ # No files saved
173
+ self.orchestrator = ocht.Orchestrator(
174
+ orchestrator_conf={"mode": "sequential"}
175
+ )
176
+ else:
177
+ self.orchestrator = orchestrator
178
+
179
+ if pair_folder is None:
180
+ pair_folder = os.path.join(self.orchestrator.out_dir, "tmp")
181
+ else:
182
+ safe_makedirs(pair_folder)
183
+
184
+ # Get profile
185
+ with rio.open(
186
+ sensor_left[sens_cst.INPUT_IMG]["bands"]["b0"]["path"]
187
+ ) as src_left:
188
+ width_left = src_left.width
189
+ height_left = src_left.height
190
+ transform_left = src_left.transform
191
+
192
+ with rio.open(
193
+ sensor_right[sens_cst.INPUT_IMG]["bands"]["b0"]["path"]
194
+ ) as src_right:
195
+ width_right = src_right.width
196
+ height_right = src_right.height
197
+ transform_right = src_right.transform
198
+
199
+ raster_profile_left = collections.OrderedDict(
200
+ {
201
+ "height": height_left,
202
+ "width": width_left,
203
+ "driver": "GTiff",
204
+ "dtype": "float32",
205
+ "transform": transform_left,
206
+ "tiled": True,
207
+ }
208
+ )
209
+
210
+ raster_profile_right = collections.OrderedDict(
211
+ {
212
+ "height": height_right,
213
+ "width": width_right,
214
+ "driver": "GTiff",
215
+ "dtype": "float32",
216
+ "transform": transform_right,
217
+ "tiled": True,
218
+ }
219
+ )
220
+
221
+ if self.used_config["target"] in ["all", "epipolar"]:
222
+
223
+ # Create cars datasets
224
+ epi_disparity_ground_truth_left = cars_dataset.CarsDataset(
225
+ "arrays", name="epipolar_disparity_ground_truth_left" + pair_key
226
+ )
227
+ epi_disp_ground_truth_right = cars_dataset.CarsDataset(
228
+ "arrays",
229
+ name="epipolar_disparity_ground_truth_right" + pair_key,
230
+ )
231
+
232
+ epi_disparity_ground_truth_left.create_grid(
233
+ grid_left["epipolar_size_x"],
234
+ grid_left["epipolar_size_y"],
235
+ self.tile_size,
236
+ self.tile_size,
237
+ 0,
238
+ 0,
239
+ )
240
+ epi_disp_ground_truth_right.tiling_grid = (
241
+ epi_disparity_ground_truth_left.tiling_grid
242
+ )
243
+
244
+ self.orchestrator.add_to_save_lists(
245
+ os.path.join(
246
+ pair_folder, "epipolar_disp_ground_truth_left.tif"
247
+ ),
248
+ cst.EPI_GROUND_TRUTH,
249
+ epi_disparity_ground_truth_left,
250
+ cars_ds_name="epipolar_disparity_ground_truth",
251
+ )
252
+ self.orchestrator.add_to_save_lists(
253
+ os.path.join(
254
+ pair_folder, "epipolar_disp_ground_truth_right.tif"
255
+ ),
256
+ cst.EPI_GROUND_TRUTH,
257
+ epi_disp_ground_truth_right,
258
+ cars_ds_name="epipolar_disparity_ground_truth",
259
+ )
260
+
261
+ # Save all file that are in inputs
262
+ if auxiliary_values is not None:
263
+ for key in auxiliary_values.keys():
264
+ if key in (cst.DSM_COLOR, cst.DSM_WEIGHTS_SUM):
265
+ option = False
266
+ else:
267
+ option = True
268
+
269
+ out_file_left_name = os.path.join(
270
+ pair_folder, key + "_left_epipolar.tif"
271
+ )
272
+
273
+ orchestrator.add_to_save_lists(
274
+ out_file_left_name,
275
+ key,
276
+ epi_disparity_ground_truth_left,
277
+ dtype=inputs.rasterio_get_dtype(auxiliary_values[key]),
278
+ nodata=inputs.rasterio_get_nodata(
279
+ auxiliary_values[key]
280
+ ),
281
+ cars_ds_name=key,
282
+ optional_data=option,
283
+ )
284
+
285
+ out_file_right_name = os.path.join(
286
+ pair_folder, key + "_right_epipolar.tif"
287
+ )
288
+
289
+ orchestrator.add_to_save_lists(
290
+ out_file_right_name,
291
+ key,
292
+ epi_disp_ground_truth_right,
293
+ dtype=inputs.rasterio_get_dtype(auxiliary_values[key]),
294
+ nodata=inputs.rasterio_get_nodata(
295
+ auxiliary_values[key]
296
+ ),
297
+ cars_ds_name=key,
298
+ optional_data=option,
299
+ )
300
+
301
+ # Get saving infos in order to save tiles when they are computed
302
+ [saving_infos_epi_left] = self.orchestrator.get_saving_infos(
303
+ [epi_disparity_ground_truth_left]
304
+ )
305
+ [saving_infos_epi_right] = self.orchestrator.get_saving_infos(
306
+ [epi_disp_ground_truth_right]
307
+ )
308
+
309
+ for col in range(
310
+ epi_disparity_ground_truth_left.tiling_grid.shape[1]
311
+ ):
312
+ for row in range(
313
+ epi_disparity_ground_truth_left.tiling_grid.shape[0]
314
+ ):
315
+ # update saving infos with row col
316
+ full_saving_info_left = ocht.update_saving_infos(
317
+ saving_infos_epi_left, row=row, col=col
318
+ )
319
+ full_saving_info_right = ocht.update_saving_infos(
320
+ saving_infos_epi_right, row=row, col=col
321
+ )
322
+
323
+ # generate ground truth
324
+ (
325
+ epi_disparity_ground_truth_left[row, col]
326
+ ) = self.orchestrator.cluster.create_task(
327
+ maps_generation_wrapper, nout=1
328
+ )(
329
+ sensor_left,
330
+ grid_left,
331
+ geom_plugin,
332
+ disp_to_alt_ratio,
333
+ "epipolar",
334
+ full_saving_info_left,
335
+ epi_disparity_ground_truth_left.tiling_grid[row, col],
336
+ auxiliary_values,
337
+ auxiliary_interp,
338
+ geom_plugin_dem_median=geom_plugin_dem_median,
339
+ window_dict=(
340
+ epi_disparity_ground_truth_left.get_window_as_dict(
341
+ row, col
342
+ )
343
+ ),
344
+ )
345
+
346
+ (
347
+ epi_disp_ground_truth_right[row, col]
348
+ ) = self.orchestrator.cluster.create_task(
349
+ maps_generation_wrapper, nout=1
350
+ )(
351
+ sensor_right,
352
+ grid_right,
353
+ geom_plugin,
354
+ disp_to_alt_ratio,
355
+ "epipolar",
356
+ full_saving_info_right,
357
+ epi_disp_ground_truth_right.tiling_grid[row, col],
358
+ auxiliary_values,
359
+ auxiliary_interp,
360
+ geom_plugin_dem_median=geom_plugin_dem_median,
361
+ reverse=True,
362
+ window_dict=(
363
+ epi_disp_ground_truth_right.get_window_as_dict(
364
+ row, col
365
+ )
366
+ ),
367
+ )
368
+
369
+ if self.used_config["target"] in ["all", "sensor"]:
370
+
371
+ sensor_dsm_gt_left = cars_dataset.CarsDataset(
372
+ "arrays", name="sensor_dsm_ground_truth_left" + pair_key
373
+ )
374
+ sensor_dsm_gt_right = cars_dataset.CarsDataset(
375
+ "arrays", name="sensor_dsm_ground_truth_right" + pair_key
376
+ )
377
+
378
+ # update grid
379
+ sensor_dsm_gt_left.create_grid(
380
+ width_left, height_left, self.tile_size, self.tile_size, 0, 0
381
+ )
382
+ sensor_dsm_gt_right.create_grid(
383
+ width_right, height_right, self.tile_size, self.tile_size, 0, 0
384
+ )
385
+
386
+ self.orchestrator.add_to_save_lists(
387
+ os.path.join(pair_folder, "sensor_dsm_ground_truth_left.tif"),
388
+ cst.SENSOR_GROUND_TRUTH,
389
+ sensor_dsm_gt_left,
390
+ cars_ds_name="sensor_dsm_ground_truth_left",
391
+ )
392
+ self.orchestrator.add_to_save_lists(
393
+ os.path.join(pair_folder, "sensor_dsm_ground_truth_right.tif"),
394
+ cst.SENSOR_GROUND_TRUTH,
395
+ sensor_dsm_gt_right,
396
+ cars_ds_name="sensor_dsm_ground_truth_right",
397
+ )
398
+
399
+ # Save all file that are in inputs
400
+ if auxiliary_values is not None:
401
+ for key in auxiliary_values.keys():
402
+ if key in (cst.DSM_COLOR, cst.DSM_WEIGHTS_SUM):
403
+ option = False
404
+ else:
405
+ option = True
406
+
407
+ out_file_left_name = os.path.join(
408
+ pair_folder, key + "_left_sensor.tif"
409
+ )
410
+
411
+ orchestrator.add_to_save_lists(
412
+ out_file_left_name,
413
+ key,
414
+ sensor_dsm_gt_left,
415
+ dtype=inputs.rasterio_get_dtype(auxiliary_values[key]),
416
+ nodata=inputs.rasterio_get_nodata(
417
+ auxiliary_values[key]
418
+ ),
419
+ cars_ds_name=key,
420
+ optional_data=option,
421
+ )
422
+
423
+ out_file_right_name = os.path.join(
424
+ pair_folder, key + "_right_sensor.tif"
425
+ )
426
+
427
+ orchestrator.add_to_save_lists(
428
+ out_file_right_name,
429
+ key,
430
+ sensor_dsm_gt_right,
431
+ dtype=inputs.rasterio_get_dtype(auxiliary_values[key]),
432
+ nodata=inputs.rasterio_get_nodata(
433
+ auxiliary_values[key]
434
+ ),
435
+ cars_ds_name=key,
436
+ optional_data=option,
437
+ )
438
+
439
+ # Get saving infos in order to save tiles when they are computed
440
+ [saving_infos_sensor_left] = self.orchestrator.get_saving_infos(
441
+ [sensor_dsm_gt_left]
442
+ )
443
+ [saving_infos_sensor_right] = self.orchestrator.get_saving_infos(
444
+ [sensor_dsm_gt_right]
445
+ )
446
+
447
+ # left
448
+ for col in range(sensor_dsm_gt_left.tiling_grid.shape[1]):
449
+ for row in range(sensor_dsm_gt_left.tiling_grid.shape[0]):
450
+ full_saving_info_left = ocht.update_saving_infos(
451
+ saving_infos_sensor_left, row=row, col=col
452
+ )
453
+ (
454
+ sensor_dsm_gt_left[row, col]
455
+ ) = self.orchestrator.cluster.create_task(
456
+ maps_generation_wrapper, nout=1
457
+ )(
458
+ sensor_left,
459
+ grid_left,
460
+ geom_plugin,
461
+ disp_to_alt_ratio,
462
+ "sensor",
463
+ full_saving_info_left,
464
+ sensor_dsm_gt_left.tiling_grid[row, col],
465
+ auxiliary_values,
466
+ auxiliary_interp,
467
+ raster_profile=raster_profile_left,
468
+ window_dict=sensor_dsm_gt_left.get_window_as_dict(
469
+ row, col
470
+ ),
471
+ )
472
+
473
+ # right
474
+ for col in range(sensor_dsm_gt_right.tiling_grid.shape[1]):
475
+ for row in range(sensor_dsm_gt_right.tiling_grid.shape[0]):
476
+ full_saving_info_right = ocht.update_saving_infos(
477
+ saving_infos_sensor_right, row=row, col=col
478
+ )
479
+ (
480
+ sensor_dsm_gt_right[row, col]
481
+ ) = self.orchestrator.cluster.create_task(
482
+ maps_generation_wrapper, nout=1
483
+ )(
484
+ sensor_right,
485
+ grid_right,
486
+ geom_plugin,
487
+ disp_to_alt_ratio,
488
+ "sensor",
489
+ full_saving_info_right,
490
+ sensor_dsm_gt_right.tiling_grid[row, col],
491
+ auxiliary_values,
492
+ auxiliary_interp,
493
+ raster_profile=raster_profile_right,
494
+ window_dict=sensor_dsm_gt_right.get_window_as_dict(
495
+ row, col
496
+ ),
497
+ )
498
+
499
+
500
+ def maps_generation_wrapper( # pylint: disable=too-many-positional-arguments
501
+ sensor_left,
502
+ grid_left,
503
+ geom_plugin,
504
+ disp_to_alt_ratio,
505
+ target,
506
+ saving_infos,
507
+ window,
508
+ auxiliary_values,
509
+ auxiliary_interp,
510
+ raster_profile=None,
511
+ geom_plugin_dem_median=None,
512
+ reverse=False,
513
+ window_dict=None,
514
+ ):
515
+ """
516
+ Computes ground truth epipolar disparity map and sensor geometry.
517
+
518
+ :param sensor_left: sensor data
519
+ Dict must contain keys: "image", "texture", "geomodel",
520
+ "no_data", "mask". Paths must be absolute.
521
+ :type sensor_left: dict
522
+ :param grid_left: Grid left.
523
+ :type grid_left: CarsDataset
524
+ :param geom_plugin: Geometry plugin with user's DSM used to
525
+ generate epipolar grids.
526
+ :type geom_plugin: GeometryPlugin
527
+ :param disp_to_alt_ratio: Disp to altitude ratio used for performance map.
528
+ :type disp_to_alt_ratio: float
529
+ :param target: "epipolar", "sensor", or both ("all") geometry.
530
+ :type target: str
531
+ :param saving_infos: Information about CarsDataset ID.
532
+ :type saving_infos: dict
533
+ :param window: size of tile
534
+ :type window: np.ndarray
535
+ :param raster_profile: dictionnary containing dataset information
536
+ :type raster_profile: dict
537
+ :param geom_plugin_dem_median: Geometry plugin with dem median
538
+ :type geom_plugin_dem_median: geometry_plugin
539
+ :param reverse: true if right-> left
540
+ :type reverse: bool
541
+ :param window_dict: window as dict
542
+ """
543
+
544
+ ground_truth, direct_loc = gnd_truth_algo.get_ground_truth(
545
+ geom_plugin,
546
+ grid_left,
547
+ sensor_left,
548
+ disp_to_alt_ratio,
549
+ target,
550
+ window,
551
+ geom_plugin_dem_median,
552
+ reverse=reverse,
553
+ )
554
+
555
+ constant_for_dataset = cst.EPI_GROUND_TRUTH
556
+ if target == "sensor":
557
+ constant_for_dataset = cst.SENSOR_GROUND_TRUTH
558
+
559
+ rows = np.arange(window[0], window[1])
560
+ cols = np.arange(window[2], window[3])
561
+
562
+ values = {
563
+ constant_for_dataset: (
564
+ [
565
+ cst.ROW,
566
+ cst.COL,
567
+ ],
568
+ ground_truth,
569
+ )
570
+ }
571
+ outputs_dataset = xr.Dataset(
572
+ values,
573
+ coords={cst.ROW: rows, cst.COL: cols},
574
+ )
575
+
576
+ if auxiliary_values is not None:
577
+ for key in auxiliary_values.keys():
578
+ if auxiliary_interp is not None and key in auxiliary_interp:
579
+ interpolation = auxiliary_interp[key]
580
+ else:
581
+ interpolation = "nearest"
582
+
583
+ band_description = inputs.get_descriptions_bands(
584
+ auxiliary_values[key]
585
+ )
586
+
587
+ keep_band = False
588
+ if band_description[0] is not None or len(band_description) > 1:
589
+ if len(band_description) == 1:
590
+ band_description = np.array([band_description[0]])
591
+ else:
592
+ band_description = list(band_description)
593
+
594
+ band_description = [
595
+ "band_" + str(i + 1) if v is None else v
596
+ for i, v in enumerate(band_description)
597
+ ]
598
+
599
+ outputs_dataset.coords[cst.BAND_IM] = (
600
+ key,
601
+ band_description,
602
+ )
603
+ dim = [key, cst.Y, cst.X]
604
+ keep_band = True
605
+ else:
606
+ dim = [cst.Y, cst.X]
607
+
608
+ interp_value = gnd_truth_algo.resample_auxiliary_values(
609
+ direct_loc,
610
+ auxiliary_values[key],
611
+ window,
612
+ interpolation,
613
+ keep_band,
614
+ )
615
+
616
+ outputs_dataset[key] = (dim, interp_value)
617
+
618
+ # Fill datasets based on target
619
+ attributes = {}
620
+ # Return results based on target
621
+ cars_dataset.fill_dataset(
622
+ outputs_dataset,
623
+ saving_info=saving_infos,
624
+ window=window_dict,
625
+ attributes=attributes,
626
+ profile=raster_profile,
627
+ )
628
+
629
+ return outputs_dataset