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,256 @@
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
+ CARS module containing functions to check advanced parameters configuration
24
+ """
25
+ import logging
26
+ import os
27
+
28
+ import rasterio as rio
29
+ from json_checker import And, Checker, OptionalKey, Or
30
+
31
+ from cars.pipelines.parameters import advanced_parameters_constants as adv_cst
32
+ from cars.pipelines.parameters import dsm_inputs
33
+ from cars.pipelines.parameters import dsm_inputs_constants as dsm_cst
34
+ from cars.pipelines.parameters import sensor_inputs
35
+ from cars.pipelines.parameters import sensor_inputs_constants as sens_cst
36
+ from cars.pipelines.parameters.sensor_inputs import CARS_GEOID_PATH
37
+
38
+
39
+ def get_resolutions(conf):
40
+ """
41
+ Get the epipolar resolutions from the configuration
42
+
43
+ :param conf: configuration of advanced parameters
44
+ :type conf: dict
45
+
46
+ :return: list of epipolar resolutions
47
+ :rtype: list
48
+ """
49
+ if adv_cst.RESOLUTIONS in conf:
50
+ return conf[adv_cst.RESOLUTIONS]
51
+
52
+ return [16, 4, 1]
53
+
54
+
55
+ def check_advanced_parameters(inputs, conf, output_dem_dir=None):
56
+ """
57
+ Check the advanced parameters consistency
58
+
59
+ :param inputs: configuration of inputs
60
+ :type inputs: dict
61
+ :param conf: configuration of advanced parameters
62
+ :type conf: dict
63
+
64
+ :return: overloaded configuration
65
+ :rtype: dict
66
+ """
67
+
68
+ overloaded_conf = conf.copy()
69
+
70
+ overloaded_conf[adv_cst.SAVE_INTERMEDIATE_DATA] = conf.get(
71
+ adv_cst.SAVE_INTERMEDIATE_DATA, False
72
+ )
73
+
74
+ overloaded_conf[adv_cst.LAND_COVER_MAP] = conf.get(
75
+ adv_cst.LAND_COVER_MAP, "global_land_cover_map.tif"
76
+ )
77
+
78
+ overloaded_conf[adv_cst.KEEP_LOW_RES_DIR] = conf.get(
79
+ adv_cst.KEEP_LOW_RES_DIR,
80
+ bool(overloaded_conf[adv_cst.SAVE_INTERMEDIATE_DATA]),
81
+ )
82
+
83
+ overloaded_conf[adv_cst.DEBUG_WITH_ROI] = conf.get(
84
+ adv_cst.DEBUG_WITH_ROI, False
85
+ )
86
+
87
+ overloaded_conf[adv_cst.CLASSIFICATION_TO_CONFIGURATION_MAPPING] = conf.get(
88
+ adv_cst.CLASSIFICATION_TO_CONFIGURATION_MAPPING, "config_mapping.json"
89
+ )
90
+
91
+ overloaded_conf[adv_cst.PHASING] = conf.get(adv_cst.PHASING, None)
92
+
93
+ # use endogenous dm when generated
94
+ overloaded_conf[adv_cst.USE_ENDOGENOUS_DEM] = conf.get(
95
+ adv_cst.USE_ENDOGENOUS_DEM,
96
+ inputs[sens_cst.INITIAL_ELEVATION][sens_cst.DEM_PATH] is None,
97
+ )
98
+
99
+ overloaded_conf[adv_cst.DSM_MERGING_TILE_SIZE] = conf.get(
100
+ adv_cst.DSM_MERGING_TILE_SIZE, 4000
101
+ )
102
+
103
+ overloaded_conf[adv_cst.GROUND_TRUTH_DSM] = conf.get(
104
+ adv_cst.GROUND_TRUTH_DSM, {}
105
+ )
106
+
107
+ # Validate ground truth DSM
108
+ if overloaded_conf[adv_cst.GROUND_TRUTH_DSM]:
109
+ overloaded_conf[adv_cst.GROUND_TRUTH_DSM][adv_cst.INPUT_AUX_PATH] = (
110
+ conf[adv_cst.GROUND_TRUTH_DSM].get(adv_cst.INPUT_AUX_PATH, None)
111
+ )
112
+ overloaded_conf[adv_cst.GROUND_TRUTH_DSM][adv_cst.INPUT_AUX_INTERP] = (
113
+ conf[adv_cst.GROUND_TRUTH_DSM].get(adv_cst.INPUT_AUX_INTERP, None)
114
+ )
115
+ check_ground_truth_dsm_data(overloaded_conf[adv_cst.GROUND_TRUTH_DSM])
116
+
117
+ # Check geometry plugin
118
+ geom_plugin_without_dem_and_geoid = None
119
+ geom_plugin_with_dem_and_geoid = None
120
+
121
+ scaling_coeff = None
122
+
123
+ if inputs[sens_cst.SENSORS] is not None:
124
+ # Check geometry plugin and overwrite geomodel in conf inputs
125
+ (
126
+ inputs,
127
+ overloaded_conf[adv_cst.GEOMETRY_PLUGIN],
128
+ geom_plugin_without_dem_and_geoid,
129
+ geom_plugin_with_dem_and_geoid,
130
+ scaling_coeff,
131
+ ) = sensor_inputs.check_geometry_plugin(
132
+ inputs,
133
+ conf.get(adv_cst.GEOMETRY_PLUGIN, None),
134
+ output_dem_dir,
135
+ )
136
+ elif dsm_cst.DSMS in inputs:
137
+ # assume the input comes from 0.5m sensor images
138
+ scaling_coeff = 1
139
+ # If there's an initial elevation with
140
+ # point clouds as inputs, generate a plugin (used in dsm_filling)
141
+ (
142
+ overloaded_conf[adv_cst.GEOMETRY_PLUGIN],
143
+ geom_plugin_with_dem_and_geoid,
144
+ ) = dsm_inputs.check_geometry_plugin(
145
+ inputs, conf.get(adv_cst.GEOMETRY_PLUGIN, None)
146
+ )
147
+
148
+ # Check pipeline
149
+ overloaded_conf[adv_cst.PIPELINE] = conf.get(adv_cst.PIPELINE, "default")
150
+
151
+ # Validate inputs
152
+ schema = {
153
+ adv_cst.DEBUG_WITH_ROI: bool,
154
+ adv_cst.SAVE_INTERMEDIATE_DATA: Or(dict, bool),
155
+ adv_cst.KEEP_LOW_RES_DIR: bool,
156
+ adv_cst.GROUND_TRUTH_DSM: Or(dict, str),
157
+ adv_cst.PHASING: Or(dict, None),
158
+ adv_cst.GEOMETRY_PLUGIN: Or(str, dict),
159
+ adv_cst.PIPELINE: str,
160
+ adv_cst.DSM_MERGING_TILE_SIZE: And(int, lambda x: x > 0),
161
+ adv_cst.LAND_COVER_MAP: str,
162
+ adv_cst.CLASSIFICATION_TO_CONFIGURATION_MAPPING: str,
163
+ adv_cst.USE_ENDOGENOUS_DEM: bool,
164
+ }
165
+
166
+ checker_advanced_parameters = Checker(schema)
167
+ checker_advanced_parameters.validate(overloaded_conf)
168
+
169
+ return (
170
+ inputs,
171
+ overloaded_conf,
172
+ overloaded_conf[adv_cst.GEOMETRY_PLUGIN],
173
+ geom_plugin_without_dem_and_geoid,
174
+ geom_plugin_with_dem_and_geoid,
175
+ scaling_coeff,
176
+ overloaded_conf[adv_cst.LAND_COVER_MAP],
177
+ overloaded_conf[adv_cst.CLASSIFICATION_TO_CONFIGURATION_MAPPING],
178
+ )
179
+
180
+
181
+ def check_ground_truth_dsm_data(conf):
182
+ """
183
+ Check data of the image ground truth
184
+
185
+ :param conf: ground truth dsm configuration
186
+ :type conf: str
187
+ """
188
+ if isinstance(conf, str):
189
+ with rio.open(conf) as img_reader:
190
+ trans = img_reader.transform
191
+ if trans.e < 0:
192
+ logging.warning(
193
+ "{} seems to have an incoherent pixel size. "
194
+ "Input images has to be in sensor geometry.".format(conf)
195
+ )
196
+
197
+ conf[adv_cst.INPUT_GEOID] = conf.get(adv_cst.INPUT_GEOID, None)
198
+
199
+ if isinstance(conf, dict):
200
+ ground_truth_dsm_schema = {
201
+ adv_cst.INPUT_GROUND_TRUTH_DSM: str,
202
+ OptionalKey(adv_cst.INPUT_AUX_PATH): Or(dict, None),
203
+ OptionalKey(adv_cst.INPUT_AUX_INTERP): Or(dict, None),
204
+ adv_cst.INPUT_GEOID: Or(None, str, bool),
205
+ }
206
+
207
+ checker_ground_truth_dsm_schema = Checker(ground_truth_dsm_schema)
208
+ checker_ground_truth_dsm_schema.validate(conf)
209
+
210
+ gt_dsm_path = conf[adv_cst.INPUT_GROUND_TRUTH_DSM]
211
+ with rio.open(gt_dsm_path) as img_reader:
212
+ trans = img_reader.transform
213
+ if trans.e < 0:
214
+ logging.warning(
215
+ "{} seems to have an incoherent pixel size. "
216
+ "Input images has to be in sensor geometry.".format(
217
+ gt_dsm_path
218
+ )
219
+ )
220
+
221
+ # Update geoid
222
+ if isinstance(conf[adv_cst.INPUT_GEOID], bool):
223
+ if conf[adv_cst.INPUT_GEOID]:
224
+ # Use CARS geoid
225
+ logging.info(
226
+ "CARS will use its own internal file as geoid reference"
227
+ )
228
+ package_path = os.path.dirname(__file__)
229
+ geoid_path = os.path.join(
230
+ package_path, "..", "..", "conf", CARS_GEOID_PATH
231
+ )
232
+ conf[adv_cst.INPUT_GEOID] = geoid_path
233
+ else:
234
+ conf[adv_cst.INPUT_GEOID] = None
235
+
236
+ path_dict = conf.get(adv_cst.INPUT_AUX_PATH, None)
237
+ if path_dict is not None:
238
+ for key in path_dict.keys():
239
+ if not isinstance(path_dict[key], str):
240
+ raise RuntimeError("Path should be a string")
241
+ if not os.path.exists(path_dict[key]):
242
+ raise RuntimeError("Path doesn't exist")
243
+
244
+ path_interp = conf.get(adv_cst.INPUT_AUX_INTERP, None)
245
+ if path_interp is not None:
246
+ for key in path_interp.keys():
247
+ if not isinstance(path_interp[key], str):
248
+ raise RuntimeError("interpolator should be a string")
249
+ if path_interp[key] not in (
250
+ "nearest",
251
+ "linear",
252
+ "cubic",
253
+ "slinear",
254
+ "quintic",
255
+ ):
256
+ raise RuntimeError("interpolator does not exist")
@@ -0,0 +1,68 @@
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 the advanced parameter definitions
24
+ """
25
+
26
+ SAVE_INTERMEDIATE_DATA = "save_intermediate_data"
27
+ KEEP_LOW_RES_DIR = "keep_low_res_dir"
28
+ PHASING = "phasing"
29
+ DEBUG_WITH_ROI = "debug_with_roi"
30
+ LAND_COVER_MAP = "land_cover_map"
31
+ CLASSIFICATION_TO_CONFIGURATION_MAPPING = (
32
+ "classification_to_configuration_mapping"
33
+ )
34
+
35
+ RESOLUTION_A_PRIORI = "resolution_a_priori"
36
+ GROUND_TRUTH_DSM = "ground_truth_dsm"
37
+
38
+ RESOLUTIONS = "resolutions"
39
+ MIN_IMAGE_SIZE = "min_image_size"
40
+
41
+ DSM_MERGING_TILE_SIZE = "dsm_merging_tile_size"
42
+
43
+
44
+ # inner epipolar a priori constants
45
+ GRID_CORRECTION = "grid_correction"
46
+ DISPARITY_RANGE = "disparity_range"
47
+ REFERENCE_DEM = "reference_dem"
48
+
49
+ USE_ENDOGENOUS_DEM = "use_endogenous_dem"
50
+ DEM_MEDIAN = "dem_median"
51
+ DEM_MIN = "dem_min"
52
+ DEM_MAX = "dem_max"
53
+
54
+ # ground truth dsm
55
+ INPUT_GROUND_TRUTH_DSM = "dsm"
56
+ INPUT_CLASSIFICATION = "classification"
57
+ INPUT_AUX_PATH = "auxiliary_data"
58
+ INPUT_AUX_INTERP = "auxiliary_data_interpolation"
59
+ INPUT_GEOID = "geoid"
60
+ INPUT_EPSG = "epsg"
61
+
62
+ PERFORMANCE_MAP_CLASSES = "performance_map_classes"
63
+
64
+ TEXTURE_BANDS = "texture_bands"
65
+
66
+ GEOMETRY_PLUGIN = "geometry_plugin"
67
+
68
+ PIPELINE = "pipeline"
@@ -0,0 +1,72 @@
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
+ General application configuration module
23
+ """
24
+
25
+
26
+ def get_needed_apps(
27
+ sensors_in_inputs, save_output_dsm, save_output_point_cloud, conf
28
+ ):
29
+ """
30
+ This function returns the apps needed by the CARS pipeline,
31
+ depending on overall parameters and the user configuration
32
+ """
33
+ needed_applications = []
34
+ if sensors_in_inputs:
35
+ needed_applications += [
36
+ "grid_generation",
37
+ "grid_correction",
38
+ "resampling",
39
+ "ground_truth_reprojection",
40
+ "dense_match_filling",
41
+ "sparse_matching",
42
+ "dense_matching",
43
+ "triangulation",
44
+ "dem_generation",
45
+ ]
46
+
47
+ add_default_pc_outlier_removal = True
48
+ for key in conf:
49
+ if key.startswith("point_cloud_outlier_removal"):
50
+ add_default_pc_outlier_removal = False
51
+ needed_applications += [key]
52
+
53
+ if add_default_pc_outlier_removal:
54
+ needed_applications += [
55
+ "point_cloud_outlier_removal.1",
56
+ "point_cloud_outlier_removal.2",
57
+ ]
58
+
59
+ if save_output_dsm or save_output_point_cloud:
60
+ needed_applications += ["pc_denoising"]
61
+
62
+ if save_output_dsm:
63
+ needed_applications += [
64
+ "point_cloud_rasterization",
65
+ "auxiliary_filling",
66
+ ]
67
+
68
+ for key in conf:
69
+ if key.startswith("dsm_filling"):
70
+ needed_applications += [key]
71
+
72
+ return needed_applications
File without changes