cars 1.0.0rc2__cp312-cp312-win_amd64.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.

Potentially problematic release.


This version of cars might be problematic. Click here for more details.

Files changed (225) hide show
  1. cars/__init__.py +86 -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 +42 -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.cp312-win_amd64.dll.a +0 -0
  30. cars/applications/dense_matching/cpp/dense_matching_cpp.cp312-win_amd64.pyd +0 -0
  31. cars/applications/dense_matching/cpp/dense_matching_cpp.py +94 -0
  32. cars/applications/dense_matching/cpp/includes/dense_matching.hpp +58 -0
  33. cars/applications/dense_matching/cpp/meson.build +9 -0
  34. cars/applications/dense_matching/cpp/src/bindings.cpp +13 -0
  35. cars/applications/dense_matching/cpp/src/dense_matching.cpp +207 -0
  36. cars/applications/dense_matching/dense_matching_algo.py +401 -0
  37. cars/applications/dense_matching/dense_matching_constants.py +89 -0
  38. cars/applications/dense_matching/dense_matching_wrappers.py +951 -0
  39. cars/applications/dense_matching/disparity_grid_algo.py +597 -0
  40. cars/applications/dense_matching/loaders/__init__.py +23 -0
  41. cars/applications/dense_matching/loaders/config_census_sgm_default.json +31 -0
  42. cars/applications/dense_matching/loaders/config_census_sgm_homogeneous.json +30 -0
  43. cars/applications/dense_matching/loaders/config_census_sgm_mountain_and_vegetation.json +30 -0
  44. cars/applications/dense_matching/loaders/config_census_sgm_shadow.json +30 -0
  45. cars/applications/dense_matching/loaders/config_census_sgm_sparse.json +36 -0
  46. cars/applications/dense_matching/loaders/config_census_sgm_urban.json +30 -0
  47. cars/applications/dense_matching/loaders/config_mapping.json +13 -0
  48. cars/applications/dense_matching/loaders/config_mccnn.json +28 -0
  49. cars/applications/dense_matching/loaders/global_land_cover_map.tif +0 -0
  50. cars/applications/dense_matching/loaders/pandora_loader.py +593 -0
  51. cars/applications/dsm_filling/__init__.py +32 -0
  52. cars/applications/dsm_filling/abstract_dsm_filling_app.py +101 -0
  53. cars/applications/dsm_filling/border_interpolation_app.py +278 -0
  54. cars/applications/dsm_filling/bulldozer_config/base_config.yaml +44 -0
  55. cars/applications/dsm_filling/bulldozer_filling_app.py +288 -0
  56. cars/applications/dsm_filling/exogenous_filling_app.py +341 -0
  57. cars/applications/dsm_merging/__init__.py +28 -0
  58. cars/applications/dsm_merging/abstract_dsm_merging_app.py +101 -0
  59. cars/applications/dsm_merging/weighted_fusion_app.py +639 -0
  60. cars/applications/grid_correction/__init__.py +30 -0
  61. cars/applications/grid_correction/abstract_grid_correction_app.py +103 -0
  62. cars/applications/grid_correction/grid_correction_app.py +557 -0
  63. cars/applications/grid_generation/__init__.py +30 -0
  64. cars/applications/grid_generation/abstract_grid_generation_app.py +142 -0
  65. cars/applications/grid_generation/epipolar_grid_generation_app.py +327 -0
  66. cars/applications/grid_generation/grid_generation_algo.py +388 -0
  67. cars/applications/grid_generation/grid_generation_constants.py +46 -0
  68. cars/applications/grid_generation/transform_grid.py +88 -0
  69. cars/applications/ground_truth_reprojection/__init__.py +30 -0
  70. cars/applications/ground_truth_reprojection/abstract_ground_truth_reprojection_app.py +137 -0
  71. cars/applications/ground_truth_reprojection/direct_localization_app.py +629 -0
  72. cars/applications/ground_truth_reprojection/ground_truth_reprojection_algo.py +275 -0
  73. cars/applications/point_cloud_outlier_removal/__init__.py +30 -0
  74. cars/applications/point_cloud_outlier_removal/abstract_outlier_removal_app.py +385 -0
  75. cars/applications/point_cloud_outlier_removal/outlier_removal_algo.py +392 -0
  76. cars/applications/point_cloud_outlier_removal/outlier_removal_constants.py +43 -0
  77. cars/applications/point_cloud_outlier_removal/small_components_app.py +522 -0
  78. cars/applications/point_cloud_outlier_removal/statistical_app.py +528 -0
  79. cars/applications/rasterization/__init__.py +30 -0
  80. cars/applications/rasterization/abstract_pc_rasterization_app.py +183 -0
  81. cars/applications/rasterization/rasterization_algo.py +534 -0
  82. cars/applications/rasterization/rasterization_constants.py +38 -0
  83. cars/applications/rasterization/rasterization_wrappers.py +639 -0
  84. cars/applications/rasterization/simple_gaussian_app.py +1152 -0
  85. cars/applications/resampling/__init__.py +28 -0
  86. cars/applications/resampling/abstract_resampling_app.py +187 -0
  87. cars/applications/resampling/bicubic_resampling_app.py +760 -0
  88. cars/applications/resampling/resampling_algo.py +590 -0
  89. cars/applications/resampling/resampling_constants.py +36 -0
  90. cars/applications/resampling/resampling_wrappers.py +309 -0
  91. cars/applications/sensors_subsampling/__init__.py +32 -0
  92. cars/applications/sensors_subsampling/abstract_subsampling_app.py +109 -0
  93. cars/applications/sensors_subsampling/rasterio_subsampling_app.py +420 -0
  94. cars/applications/sensors_subsampling/subsampling_algo.py +108 -0
  95. cars/applications/sparse_matching/__init__.py +30 -0
  96. cars/applications/sparse_matching/abstract_sparse_matching_app.py +599 -0
  97. cars/applications/sparse_matching/sift_app.py +724 -0
  98. cars/applications/sparse_matching/sparse_matching_algo.py +360 -0
  99. cars/applications/sparse_matching/sparse_matching_constants.py +66 -0
  100. cars/applications/sparse_matching/sparse_matching_wrappers.py +282 -0
  101. cars/applications/triangulation/__init__.py +32 -0
  102. cars/applications/triangulation/abstract_triangulation_app.py +227 -0
  103. cars/applications/triangulation/line_of_sight_intersection_app.py +1243 -0
  104. cars/applications/triangulation/pc_transform.py +552 -0
  105. cars/applications/triangulation/triangulation_algo.py +371 -0
  106. cars/applications/triangulation/triangulation_constants.py +38 -0
  107. cars/applications/triangulation/triangulation_wrappers.py +259 -0
  108. cars/bundleadjustment.py +750 -0
  109. cars/cars.py +179 -0
  110. cars/conf/__init__.py +23 -0
  111. cars/conf/geoid/egm96.grd +0 -0
  112. cars/conf/geoid/egm96.grd.hdr +15 -0
  113. cars/conf/input_parameters.py +156 -0
  114. cars/conf/mask_cst.py +35 -0
  115. cars/core/__init__.py +23 -0
  116. cars/core/cars_logging.py +402 -0
  117. cars/core/constants.py +191 -0
  118. cars/core/constants_disparity.py +50 -0
  119. cars/core/datasets.py +140 -0
  120. cars/core/geometry/__init__.py +27 -0
  121. cars/core/geometry/abstract_geometry.py +1119 -0
  122. cars/core/geometry/shareloc_geometry.py +598 -0
  123. cars/core/inputs.py +568 -0
  124. cars/core/outputs.py +176 -0
  125. cars/core/preprocessing.py +722 -0
  126. cars/core/projection.py +843 -0
  127. cars/core/roi_tools.py +215 -0
  128. cars/core/tiling.py +774 -0
  129. cars/core/utils.py +164 -0
  130. cars/data_structures/__init__.py +23 -0
  131. cars/data_structures/cars_dataset.py +1544 -0
  132. cars/data_structures/cars_dict.py +74 -0
  133. cars/data_structures/corresponding_tiles_tools.py +186 -0
  134. cars/data_structures/dataframe_converter.py +185 -0
  135. cars/data_structures/format_transformation.py +297 -0
  136. cars/devibrate.py +689 -0
  137. cars/extractroi.py +264 -0
  138. cars/orchestrator/__init__.py +23 -0
  139. cars/orchestrator/achievement_tracker.py +125 -0
  140. cars/orchestrator/cluster/__init__.py +37 -0
  141. cars/orchestrator/cluster/abstract_cluster.py +250 -0
  142. cars/orchestrator/cluster/abstract_dask_cluster.py +381 -0
  143. cars/orchestrator/cluster/dask_cluster_tools.py +103 -0
  144. cars/orchestrator/cluster/dask_config/README.md +94 -0
  145. cars/orchestrator/cluster/dask_config/dask.yaml +21 -0
  146. cars/orchestrator/cluster/dask_config/distributed.yaml +70 -0
  147. cars/orchestrator/cluster/dask_config/jobqueue.yaml +26 -0
  148. cars/orchestrator/cluster/dask_config/reference_confs/dask-schema.yaml +137 -0
  149. cars/orchestrator/cluster/dask_config/reference_confs/dask.yaml +26 -0
  150. cars/orchestrator/cluster/dask_config/reference_confs/distributed-schema.yaml +1009 -0
  151. cars/orchestrator/cluster/dask_config/reference_confs/distributed.yaml +273 -0
  152. cars/orchestrator/cluster/dask_config/reference_confs/jobqueue.yaml +212 -0
  153. cars/orchestrator/cluster/dask_jobqueue_utils.py +204 -0
  154. cars/orchestrator/cluster/local_dask_cluster.py +116 -0
  155. cars/orchestrator/cluster/log_wrapper.py +728 -0
  156. cars/orchestrator/cluster/mp_cluster/__init__.py +27 -0
  157. cars/orchestrator/cluster/mp_cluster/mp_factorizer.py +212 -0
  158. cars/orchestrator/cluster/mp_cluster/mp_objects.py +535 -0
  159. cars/orchestrator/cluster/mp_cluster/mp_tools.py +93 -0
  160. cars/orchestrator/cluster/mp_cluster/mp_wrapper.py +505 -0
  161. cars/orchestrator/cluster/mp_cluster/multiprocessing_cluster.py +986 -0
  162. cars/orchestrator/cluster/mp_cluster/multiprocessing_profiler.py +399 -0
  163. cars/orchestrator/cluster/pbs_dask_cluster.py +207 -0
  164. cars/orchestrator/cluster/sequential_cluster.py +139 -0
  165. cars/orchestrator/cluster/slurm_dask_cluster.py +234 -0
  166. cars/orchestrator/memory_tools.py +47 -0
  167. cars/orchestrator/orchestrator.py +755 -0
  168. cars/orchestrator/orchestrator_constants.py +29 -0
  169. cars/orchestrator/registry/__init__.py +23 -0
  170. cars/orchestrator/registry/abstract_registry.py +143 -0
  171. cars/orchestrator/registry/compute_registry.py +106 -0
  172. cars/orchestrator/registry/id_generator.py +116 -0
  173. cars/orchestrator/registry/replacer_registry.py +213 -0
  174. cars/orchestrator/registry/saver_registry.py +363 -0
  175. cars/orchestrator/registry/unseen_registry.py +118 -0
  176. cars/orchestrator/tiles_profiler.py +279 -0
  177. cars/pipelines/__init__.py +26 -0
  178. cars/pipelines/conf_resolution/conf_final_resolution.yaml +5 -0
  179. cars/pipelines/conf_resolution/conf_first_resolution.yaml +4 -0
  180. cars/pipelines/conf_resolution/conf_intermediate_resolution.yaml +2 -0
  181. cars/pipelines/default/__init__.py +26 -0
  182. cars/pipelines/default/default_pipeline.py +1088 -0
  183. cars/pipelines/filling/__init__.py +26 -0
  184. cars/pipelines/filling/filling.py +981 -0
  185. cars/pipelines/formatting/__init__.py +26 -0
  186. cars/pipelines/formatting/formatting.py +186 -0
  187. cars/pipelines/merging/__init__.py +26 -0
  188. cars/pipelines/merging/merging.py +439 -0
  189. cars/pipelines/parameters/__init__.py +0 -0
  190. cars/pipelines/parameters/advanced_parameters.py +256 -0
  191. cars/pipelines/parameters/advanced_parameters_constants.py +68 -0
  192. cars/pipelines/parameters/application_parameters.py +72 -0
  193. cars/pipelines/parameters/depth_map_inputs.py +0 -0
  194. cars/pipelines/parameters/dsm_inputs.py +349 -0
  195. cars/pipelines/parameters/dsm_inputs_constants.py +25 -0
  196. cars/pipelines/parameters/output_constants.py +52 -0
  197. cars/pipelines/parameters/output_parameters.py +438 -0
  198. cars/pipelines/parameters/sensor_inputs.py +859 -0
  199. cars/pipelines/parameters/sensor_inputs_constants.py +51 -0
  200. cars/pipelines/parameters/sensor_loaders/__init__.py +29 -0
  201. cars/pipelines/parameters/sensor_loaders/basic_classif_loader.py +86 -0
  202. cars/pipelines/parameters/sensor_loaders/basic_image_loader.py +98 -0
  203. cars/pipelines/parameters/sensor_loaders/pivot_classif_loader.py +90 -0
  204. cars/pipelines/parameters/sensor_loaders/pivot_image_loader.py +105 -0
  205. cars/pipelines/parameters/sensor_loaders/sensor_loader.py +93 -0
  206. cars/pipelines/parameters/sensor_loaders/sensor_loader_template.py +71 -0
  207. cars/pipelines/parameters/sensor_loaders/slurp_classif_loader.py +86 -0
  208. cars/pipelines/pipeline.py +119 -0
  209. cars/pipelines/pipeline_constants.py +38 -0
  210. cars/pipelines/pipeline_template.py +135 -0
  211. cars/pipelines/subsampling/__init__.py +26 -0
  212. cars/pipelines/subsampling/subsampling.py +358 -0
  213. cars/pipelines/surface_modeling/__init__.py +26 -0
  214. cars/pipelines/surface_modeling/surface_modeling.py +2098 -0
  215. cars/pipelines/tie_points/__init__.py +26 -0
  216. cars/pipelines/tie_points/tie_points.py +536 -0
  217. cars/starter.py +167 -0
  218. cars-1.0.0rc2.dist-info/DELVEWHEEL +2 -0
  219. cars-1.0.0rc2.dist-info/METADATA +289 -0
  220. cars-1.0.0rc2.dist-info/RECORD +225 -0
  221. cars-1.0.0rc2.dist-info/WHEEL +4 -0
  222. cars-1.0.0rc2.dist-info/entry_points.txt +8 -0
  223. cars.libs/libgcc_s_seh-1-b2494fcbd4d80cf2c98fdd5261f6d850.dll +0 -0
  224. cars.libs/libstdc++-6-e9b0d12ae0e9555bbae55e8dfd08c3f7.dll +0 -0
  225. cars.libs/libwinpthread-1-7882d1b093714ccdfaf4e0789a817792.dll +0 -0
@@ -0,0 +1,358 @@
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
+ # pylint: disable=too-many-lines
22
+ # attribute-defined-outside-init is disabled so that we can create and use
23
+ # attributes however we need, to stick to the "everything is attribute" logic
24
+ # introduced in issue#895
25
+ # pylint: disable=attribute-defined-outside-init
26
+ # pylint: disable=too-many-nested-blocks
27
+ """
28
+ CARS subsampling pipeline class file
29
+ """
30
+ # Standard imports
31
+ from __future__ import print_function
32
+
33
+ import copy
34
+ import logging
35
+ import os
36
+ from pathlib import Path
37
+
38
+ import rasterio as rio
39
+ import yaml
40
+ from json_checker import Checker, OptionalKey, Or
41
+
42
+ from cars.applications.application import Application
43
+ from cars.core import cars_logging
44
+ from cars.core.utils import safe_makedirs
45
+ from cars.orchestrator import orchestrator
46
+ from cars.orchestrator.cluster.log_wrapper import cars_profile
47
+ from cars.pipelines.parameters import advanced_parameters_constants as adv_cst
48
+ from cars.pipelines.parameters import output_constants as out_cst
49
+ from cars.pipelines.parameters import output_parameters, sensor_inputs
50
+ from cars.pipelines.parameters import sensor_inputs_constants as sens_cst
51
+ from cars.pipelines.pipeline import Pipeline
52
+ from cars.pipelines.pipeline_constants import (
53
+ ADVANCED,
54
+ APPLICATIONS,
55
+ INPUT,
56
+ ORCHESTRATOR,
57
+ OUTPUT,
58
+ )
59
+ from cars.pipelines.pipeline_template import PipelineTemplate
60
+
61
+ PIPELINE = "subsampling"
62
+
63
+
64
+ @Pipeline.register(
65
+ PIPELINE,
66
+ )
67
+ class SubsamplingPipeline(PipelineTemplate):
68
+ """
69
+ SubsamplingPipeline
70
+ """
71
+
72
+ # pylint: disable=too-many-instance-attributes
73
+
74
+ def __init__(self, conf, config_dir=None): # noqa: C901
75
+ """
76
+ Creates pipeline
77
+
78
+ :param pipeline_name: name of the pipeline.
79
+ :type pipeline_name: str
80
+ :param cfg: configuration {'matching_cost_method': value}
81
+ :type cfg: dictionary
82
+ :param config_dir: path to dir containing json or yaml file
83
+ :type config_dir: str
84
+ """
85
+
86
+ self.config_dir = config_dir
87
+ # Transform relative path to absolute path
88
+ if config_dir is not None:
89
+ config_dir = os.path.abspath(config_dir)
90
+
91
+ # Check global conf
92
+ self.check_global_schema(conf)
93
+
94
+ if PIPELINE in conf:
95
+ self.check_pipeline_conf(conf)
96
+
97
+ self.out_dir = conf[OUTPUT][out_cst.OUT_DIRECTORY]
98
+
99
+ self.subsampling_dir = os.path.join(self.out_dir, "subsampling")
100
+
101
+ pipeline_conf = conf.get(PIPELINE, {})
102
+
103
+ # Check input
104
+ conf[INPUT] = self.check_inputs(conf[INPUT], config_json_dir=config_dir)
105
+
106
+ # check advanced
107
+ conf[PIPELINE][ADVANCED] = self.check_advanced(
108
+ pipeline_conf.get(ADVANCED, {}),
109
+ conf[INPUT],
110
+ )
111
+
112
+ # Get epipolar resolutions to use
113
+ self.resolutions = conf[PIPELINE][ADVANCED][adv_cst.RESOLUTIONS]
114
+
115
+ # check output
116
+ conf[OUTPUT] = self.check_output(conf)
117
+
118
+ self.used_conf = {}
119
+
120
+ # Check conf orchestrator
121
+ self.used_conf[ORCHESTRATOR] = self.check_orchestrator(
122
+ conf.get(ORCHESTRATOR, None)
123
+ )
124
+ self.used_conf[INPUT] = conf[INPUT]
125
+ self.used_conf[OUTPUT] = conf[OUTPUT]
126
+ self.used_conf[ADVANCED] = conf[PIPELINE][ADVANCED]
127
+
128
+ self.used_conf[APPLICATIONS] = self.check_applications(
129
+ pipeline_conf.get(APPLICATIONS, {})
130
+ )
131
+
132
+ def check_pipeline_conf(self, conf):
133
+ """
134
+ Check pipeline configuration
135
+ """
136
+
137
+ # Validate inputs
138
+ pipeline_schema = {
139
+ OptionalKey(ADVANCED): dict,
140
+ OptionalKey(APPLICATIONS): dict,
141
+ }
142
+
143
+ checker_inputs = Checker(pipeline_schema)
144
+ checker_inputs.validate(conf[PIPELINE])
145
+
146
+ def check_inputs(self, conf, config_json_dir=None):
147
+ """
148
+ Check the inputs given
149
+
150
+ :param conf: configuration
151
+ :type conf: dict
152
+ :param config_dir: directory of used json, if
153
+ user filled paths with relative paths
154
+ :type config_dir: str
155
+
156
+ :return: overloader inputs
157
+ :rtype: dict
158
+ """
159
+ return sensor_inputs.sensors_check_inputs(
160
+ conf, config_dir=config_json_dir
161
+ )
162
+
163
+ def check_output(self, conf):
164
+ """
165
+ Check the output given
166
+
167
+ :param conf: configuration of output
168
+ :type conf: dict
169
+
170
+ :return overloader output
171
+ :rtype : dict
172
+ """
173
+ conf_output, _ = output_parameters.check_output_parameters(
174
+ conf[INPUT], conf[OUTPUT], None
175
+ )
176
+ return conf_output
177
+
178
+ def check_advanced(self, conf, inputs):
179
+ """
180
+ Check all conf for advanced configuration
181
+
182
+ :return: overridden advanced conf
183
+ :rtype: dict
184
+ """
185
+
186
+ overloaded_conf = conf.copy()
187
+
188
+ overloaded_conf[adv_cst.SAVE_INTERMEDIATE_DATA] = conf.get(
189
+ adv_cst.SAVE_INTERMEDIATE_DATA, False
190
+ )
191
+
192
+ overloaded_conf[adv_cst.RESOLUTIONS] = conf.get(
193
+ adv_cst.RESOLUTIONS, [16, 4, 1]
194
+ )
195
+
196
+ overloaded_conf[adv_cst.MIN_IMAGE_SIZE] = conf.get(
197
+ adv_cst.MIN_IMAGE_SIZE, 80
198
+ )
199
+
200
+ if isinstance(overloaded_conf[adv_cst.RESOLUTIONS], int):
201
+ overloaded_conf[adv_cst.RESOLUTIONS] = [
202
+ overloaded_conf[adv_cst.RESOLUTIONS]
203
+ ]
204
+
205
+ # Check minimal image size
206
+ sizes = []
207
+ for sensor in inputs[sens_cst.SENSORS]:
208
+ try:
209
+ image = rio.open(
210
+ inputs[sens_cst.SENSORS][sensor][sens_cst.INPUT_IMG][
211
+ "bands"
212
+ ]["b0"]["path"]
213
+ )
214
+ image_width = min(image.height, image.width)
215
+ sizes.append(image_width)
216
+ except (KeyError, rio.errors.RasterioIOError):
217
+ logging.warning("Sensor {} not found".format(sensor))
218
+ if sizes:
219
+ min_size = min(sizes)
220
+ for res in overloaded_conf[adv_cst.RESOLUTIONS]:
221
+ if min_size / res < overloaded_conf[adv_cst.MIN_IMAGE_SIZE]:
222
+ overloaded_conf[adv_cst.RESOLUTIONS].remove(res)
223
+
224
+ schema = {
225
+ adv_cst.SAVE_INTERMEDIATE_DATA: Or(dict, bool),
226
+ adv_cst.RESOLUTIONS: [int],
227
+ adv_cst.MIN_IMAGE_SIZE: int,
228
+ }
229
+
230
+ checker_advanced_parameters = Checker(schema)
231
+ checker_advanced_parameters.validate(overloaded_conf)
232
+
233
+ return overloaded_conf
234
+
235
+ def check_applications(self, conf):
236
+ """
237
+ Check the given configuration for applications
238
+
239
+ :param conf: configuration of applications
240
+ :type conf: dict
241
+ """
242
+
243
+ needed_applications = ["sensors_subsampling"]
244
+
245
+ # Check if all specified applications are used
246
+ # Application in terrain_application are note used in
247
+ # the sensors_to_dense_depth_maps pipeline
248
+ for app_key in conf.keys():
249
+ if app_key not in needed_applications:
250
+ msg = (
251
+ f"No {app_key} application used in the "
252
+ + "default Cars pipeline"
253
+ )
254
+ logging.error(msg)
255
+ raise NameError(msg)
256
+
257
+ used_conf = {}
258
+
259
+ self.sensors_subsampling = Application(
260
+ "sensors_subsampling",
261
+ cfg=used_conf.get("sensors_subsampling", {}),
262
+ )
263
+ used_conf["sensors_subsampling"] = self.sensors_subsampling.get_conf()
264
+
265
+ return used_conf
266
+
267
+ def formatting(self, key, out_dir, conf_to_save):
268
+ """
269
+ Format the input.yaml with new inputs
270
+ """
271
+
272
+ inputs = conf_to_save[INPUT]
273
+ sensor = inputs[sens_cst.SENSORS][key]
274
+
275
+ def replace_path(path):
276
+ """
277
+ Replace format by TIF
278
+
279
+ :param path: image path
280
+ """
281
+ return os.path.join(out_dir, key, Path(path).stem + ".tif")
282
+
283
+ sensor[sens_cst.INPUT_IMG]["bands"]["b0"]["path"] = replace_path(
284
+ sensor[sens_cst.INPUT_IMG]["bands"]["b0"]["path"]
285
+ )
286
+
287
+ if (
288
+ sens_cst.INPUT_CLASSIFICATION in sensor
289
+ and sensor[sens_cst.INPUT_CLASSIFICATION] is not None
290
+ ):
291
+ sensor[sens_cst.INPUT_CLASSIFICATION]["path"] = replace_path(
292
+ sensor[sens_cst.INPUT_CLASSIFICATION]["path"]
293
+ )
294
+
295
+ if (
296
+ sens_cst.INPUT_MSK in sensor
297
+ and sensor[sens_cst.INPUT_MSK] is not None
298
+ ):
299
+ sensor[sens_cst.INPUT_MSK] = replace_path(
300
+ sensor[sens_cst.INPUT_MSK]
301
+ )
302
+
303
+ for band_name, band_info in sensor[sens_cst.INPUT_IMG]["bands"].items():
304
+ if band_name == "b0":
305
+ continue
306
+ band_info["path"] = replace_path(band_info["path"])
307
+
308
+ @cars_profile(name="Run_subsampling_pipeline", interval=0.5)
309
+ def run(self): # noqa C901
310
+ """
311
+ Run pipeline
312
+ """
313
+ cars_logging.add_progress_message("Starting subsampling pipeline")
314
+ inputs = copy.deepcopy(self.used_conf[INPUT])
315
+
316
+ self.log_dir = os.path.join(self.subsampling_dir, "logs")
317
+
318
+ with orchestrator.Orchestrator(
319
+ orchestrator_conf=self.used_conf[ORCHESTRATOR],
320
+ out_dir=self.subsampling_dir,
321
+ log_dir=self.log_dir,
322
+ out_yaml_path=os.path.join(
323
+ self.subsampling_dir,
324
+ out_cst.INFO_FILENAME,
325
+ ),
326
+ ) as self.cars_orchestrator:
327
+ for res in self.resolutions:
328
+ if res != 1:
329
+ conf_to_save = copy.deepcopy(self.used_conf)
330
+ for key, val in inputs[sens_cst.SENSORS].items():
331
+ # Define the output directory
332
+ out_directory = os.path.join(
333
+ self.subsampling_dir, "res_" + str(res)
334
+ )
335
+ safe_makedirs(out_directory)
336
+
337
+ _ = self.sensors_subsampling.run(
338
+ key,
339
+ val,
340
+ res,
341
+ out_directory,
342
+ self.cars_orchestrator,
343
+ )
344
+
345
+ self.formatting(
346
+ key, os.path.abspath(out_directory), conf_to_save
347
+ )
348
+
349
+ out_yaml = os.path.abspath(
350
+ os.path.join(out_directory, "input.yaml")
351
+ )
352
+ with open(out_yaml, "w", encoding="utf-8") as f:
353
+ yaml.dump(
354
+ conf_to_save[INPUT],
355
+ f,
356
+ default_flow_style=False,
357
+ sort_keys=False,
358
+ )
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env python
2
+ # coding: utf8
3
+ #
4
+ # Copyright (c) 2025 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 tie points pipeline module init file
23
+ """
24
+
25
+ # Cars imports
26
+ from cars.pipelines.surface_modeling import surface_modeling # noqa: F401