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,402 @@
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
+ cCars logging module:
24
+ contains cars logging setup logger for main thread
25
+ and workers
26
+ """
27
+
28
+ import logging
29
+ import logging.config
30
+ import os
31
+ import platform
32
+
33
+ # Standard imports
34
+ from datetime import datetime
35
+ from functools import wraps
36
+
37
+ SYS_PLATFORM = platform.system().lower()
38
+ IS_WIN = "windows" == SYS_PLATFORM
39
+
40
+ if IS_WIN:
41
+ import msvcrt # pylint: disable=E0401
42
+
43
+ def lock(file):
44
+ """Lock file for safe writing (Windows version)"""
45
+ msvcrt.locking(file.fileno(), msvcrt.LK_LOCK, 0)
46
+
47
+ def unlock(file):
48
+ """Unlock file for safe writing (Windows version)"""
49
+ msvcrt.locking(file.fileno(), msvcrt.LK_UNLCK, 0)
50
+
51
+ else:
52
+ import fcntl
53
+
54
+ def lock(file):
55
+ """Lock file for safe writing (Unix version)"""
56
+ fcntl.flock(file, fcntl.LOCK_EX)
57
+
58
+ def unlock(file):
59
+ """Unlock file for safe writing (Unix version)"""
60
+ fcntl.flock(file, fcntl.LOCK_UN)
61
+
62
+
63
+ PROGRESS = 21
64
+ logging.addLevelName(PROGRESS, "PROGRESS")
65
+ PROFILING_LOG = 15
66
+ logging.addLevelName(PROFILING_LOG, "PROFILING_LOG")
67
+
68
+ profiling_logger = logging.getLogger("profiling_logger")
69
+
70
+
71
+ class ProfilingFilter(logging.Filter): # pylint: disable=R0903
72
+ """
73
+ ProfilingFilter
74
+ """
75
+
76
+ def filter(self, record):
77
+ """
78
+ Filter message
79
+ """
80
+ return "PROFILING_LOG" not in record.msg
81
+
82
+
83
+ class ProfilinglHandler(logging.FileHandler): # pylint: disable=R0903
84
+ """
85
+ Profiling
86
+ """
87
+
88
+ def __init__(self, filename, mode="a", encoding=None, delay=False):
89
+ """
90
+ Init
91
+ """
92
+ super().__init__(filename, mode, encoding, delay)
93
+ self.sender = LogSender(filename)
94
+
95
+ def emit(self, record):
96
+ """
97
+ Emit
98
+ """
99
+ if "PROFILING" in record.levelname:
100
+ self.sender.write_log(self.format(record) + "\n")
101
+
102
+
103
+ class WorkerHandler(logging.FileHandler): # pylint: disable=R0903
104
+ """
105
+ Profiling
106
+ """
107
+
108
+ def __init__(self, filename, mode="a", encoding=None, delay=False):
109
+ """
110
+ Init
111
+ """
112
+ super().__init__(filename, mode, encoding, delay)
113
+ self.sender = LogSender(filename)
114
+
115
+ def emit(self, record):
116
+ """
117
+ Emit
118
+ """
119
+ if "PROFILING" not in record.levelname:
120
+ self.sender.write_log(self.format(record) + "\n")
121
+
122
+
123
+ class LogSender: # pylint: disable=R0903
124
+ """
125
+ LogSender
126
+ """
127
+
128
+ def __init__(self, log_file):
129
+ """
130
+ Init
131
+ """
132
+ self.log_file = log_file
133
+
134
+ def write_log(self, msg) -> None:
135
+ """
136
+ Write log
137
+ """
138
+ with open(self.log_file, "a", encoding="utf-8") as file:
139
+ lock(file)
140
+ file.write(msg)
141
+ unlock(file)
142
+
143
+
144
+ def setup_logging( # pylint: disable=too-many-positional-arguments
145
+ loglevel="PROGRESS",
146
+ out_dir=None,
147
+ log_dir=None,
148
+ pipeline="",
149
+ in_worker=False,
150
+ global_log_file=None,
151
+ ):
152
+ """
153
+ Setup the CARS logging configuration
154
+
155
+ :param loglevel: log level default WARNING
156
+ """
157
+ # logging
158
+ if loglevel == "PROGRESS":
159
+ numeric_level = PROGRESS
160
+ else:
161
+ if isinstance(loglevel, int):
162
+ numeric_level = loglevel
163
+ else:
164
+ numeric_level = getattr(logging, loglevel, None)
165
+
166
+ if not isinstance(numeric_level, int):
167
+ raise ValueError("Invalid log level: %s" % loglevel)
168
+
169
+ def add_handler_name(config, handler_name, filtered_logger=None):
170
+ """
171
+ add handler name in known handlers of loggers
172
+ """
173
+ for key in config["loggers"].keys():
174
+ if filtered_logger is not None:
175
+ if key in filtered_logger:
176
+ config["loggers"][key]["handlers"].append(handler_name)
177
+ else:
178
+ config["loggers"][key]["handlers"].append(handler_name)
179
+
180
+ logging_config = {
181
+ "version": 1,
182
+ "disable_existing_loggers": True,
183
+ "formatters": {
184
+ "standard": {
185
+ "format": "%(asctime)s :: %(levelname)s :: %(message)s"
186
+ },
187
+ "workers": {
188
+ "format": (
189
+ "%(asctime)s :: %(levelname)s "
190
+ + ":: %(thread)d :: %(process)d :: %(message)s"
191
+ )
192
+ },
193
+ },
194
+ "handlers": {
195
+ "stdout": {
196
+ "level": numeric_level,
197
+ "formatter": "standard",
198
+ "class": "logging.StreamHandler",
199
+ "stream": "ext://sys.stdout",
200
+ "filters": ["no_profiling"],
201
+ }
202
+ },
203
+ "filters": {"no_profiling": {"()": ProfilingFilter}},
204
+ "loggers": {
205
+ "": { # root logger
206
+ "handlers": [],
207
+ "level": min(numeric_level, PROFILING_LOG),
208
+ "propagate": False,
209
+ },
210
+ "cars": {
211
+ "handlers": [],
212
+ "level": min(numeric_level, PROFILING_LOG),
213
+ "propagate": False,
214
+ },
215
+ "__main__": { # if __name__ == '__main__'
216
+ "handlers": [],
217
+ "level": min(numeric_level, PROFILING_LOG),
218
+ "propagate": False,
219
+ },
220
+ },
221
+ }
222
+
223
+ # add global log file
224
+ if global_log_file is not None:
225
+ os.makedirs(os.path.dirname(global_log_file), exist_ok=True)
226
+
227
+ handler_global_main = "file_global_main"
228
+ logging_config["handlers"][handler_global_main] = {
229
+ "class": "logging.FileHandler",
230
+ "filename": global_log_file,
231
+ "level": min(numeric_level, logging.INFO),
232
+ "mode": "a",
233
+ "formatter": "standard",
234
+ "filters": ["no_profiling"],
235
+ }
236
+ add_handler_name(logging_config, handler_global_main)
237
+
238
+ # add file formaters:
239
+ if out_dir is not None:
240
+ log_file = os.path.join(
241
+ out_dir,
242
+ "{}_{}.log".format(
243
+ datetime.now().strftime("%y-%m-%d_%Hh%Mm"), pipeline
244
+ ),
245
+ )
246
+ os.makedirs(os.path.dirname(log_file), exist_ok=True)
247
+ handler_main = "file_main"
248
+ logging_config["handlers"][handler_main] = {
249
+ "class": "logging.FileHandler",
250
+ "filename": log_file,
251
+ "level": min(numeric_level, logging.INFO),
252
+ "mode": "a",
253
+ "formatter": "standard",
254
+ "filters": ["no_profiling"],
255
+ }
256
+ add_handler_name(logging_config, handler_main)
257
+
258
+ # profiling for main
259
+ profiling_dir = os.path.join(out_dir, "profiling")
260
+ if not os.path.exists(profiling_dir):
261
+ os.makedirs(profiling_dir)
262
+ profiling_file = os.path.join(profiling_dir, "profiling.log")
263
+
264
+ handler_main_profiling = "file_main_profiling"
265
+ logging_config["handlers"][handler_main_profiling] = {
266
+ "class": "logging.FileHandler",
267
+ "filename": profiling_file,
268
+ "level": PROFILING_LOG,
269
+ "mode": "a",
270
+ "formatter": "standard",
271
+ }
272
+ add_handler_name(logging_config, handler_main_profiling)
273
+
274
+ if not in_worker:
275
+ add_handler_name(logging_config, "stdout")
276
+ else:
277
+ # remove stdout as handler
278
+ del logging_config["handlers"]["stdout"]
279
+
280
+ # add file handlers
281
+
282
+ # change level of root logger in workerss
283
+ handler_workers = "file_workers"
284
+ handler_workers_profiling = "file_workers_profiling"
285
+ logging_config["loggers"]["profiling_logger"] = {
286
+ "handlers": [],
287
+ "level": PROFILING_LOG,
288
+ "propagate": False,
289
+ }
290
+
291
+ # sett handlers
292
+ log_file_workers = os.path.join(
293
+ log_dir,
294
+ "workers.log",
295
+ )
296
+ os.makedirs(os.path.dirname(log_file_workers), exist_ok=True)
297
+
298
+ logging_config["handlers"][handler_workers] = {
299
+ "class": "cars.core.cars_logging.WorkerHandler",
300
+ "filename": log_file_workers,
301
+ "level": min(numeric_level, logging.INFO),
302
+ "formatter": "workers",
303
+ }
304
+ add_handler_name(logging_config, handler_workers)
305
+
306
+ # profiling
307
+ log_file_workers_profiling = os.path.join(
308
+ log_dir,
309
+ "profiling.log",
310
+ )
311
+
312
+ logging_config["handlers"][handler_workers_profiling] = {
313
+ "class": "cars.core.cars_logging.ProfilinglHandler",
314
+ "filename": log_file_workers_profiling,
315
+ "level": PROFILING_LOG,
316
+ "formatter": "workers",
317
+ }
318
+ add_handler_name(logging_config, handler_workers_profiling)
319
+
320
+ # Create config
321
+ logging.config.dictConfig(logging_config)
322
+
323
+
324
+ def add_progress_message(message):
325
+ """
326
+ Add enforced message with INFO level
327
+ to stdout and logging file
328
+
329
+ :param message: logging message
330
+ """
331
+ logging.log(PROGRESS, message)
332
+
333
+
334
+ def add_profiling_message(message):
335
+ """
336
+ Add enforced message with PROFILING_LOG level
337
+ to stdout and logging file
338
+
339
+ :param message: logging message
340
+ """
341
+ logging.log(PROFILING_LOG, message)
342
+
343
+
344
+ def wrap_logger(func, log_dir, log_level):
345
+ """
346
+ Wrapper logger function to wrap worker func
347
+ and setup the worker logger
348
+ :param func: wrapped function
349
+ :param log_dir: output directory of worker logs
350
+ :param log_level: logging level of the worker logs
351
+ """
352
+
353
+ @wraps(func)
354
+ def wrapper_builder(*args, **kwargs):
355
+ """
356
+ Wrapper function
357
+
358
+ :param argv: args of func
359
+ :param kwargs: kwargs of func
360
+ """
361
+ # init logger
362
+ try:
363
+ setup_logging(loglevel=log_level, log_dir=log_dir, in_worker=True)
364
+ res = func(*args, **kwargs)
365
+ except Exception as worker_error:
366
+ logging.exception(worker_error, exc_info=True)
367
+ raise worker_error
368
+ return res
369
+
370
+ return wrapper_builder
371
+
372
+
373
+ def logger_func(*args, **kwargs):
374
+ """
375
+ Logger function to wrap worker func (with non local method)
376
+ and setup the worker logger
377
+
378
+ :param argv: args of func
379
+ :param kwargs: kwargs of func
380
+ """
381
+ # Get function to wrap and id_list
382
+ try:
383
+ log_dir = kwargs["log_dir"]
384
+ log_level = kwargs["log_level"]
385
+ func = kwargs["log_fun"]
386
+ kwargs.pop("log_dir")
387
+ kwargs.pop("log_level")
388
+ kwargs.pop("log_fun")
389
+ except Exception as exc: # pylint: disable=W0702 # noqa: B001, E722
390
+ raise RuntimeError(
391
+ "Failed in unwrapping. \n Args: {}, \n Kwargs: {}\n".format(
392
+ args, kwargs
393
+ )
394
+ ) from exc
395
+ # init logger
396
+ try:
397
+ setup_logging(loglevel=log_level, log_dir=log_dir, in_worker=True)
398
+ res = func(*args, **kwargs)
399
+ except Exception as worker_error:
400
+ logging.exception(worker_error, exc_info=True)
401
+ raise worker_error
402
+ return res
cars/core/constants.py ADDED
@@ -0,0 +1,191 @@
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 Constants module
23
+ """
24
+
25
+ # general
26
+ ROW = "row" # cannot be changed because of PANDORA input format
27
+ COL = "col" # cannot be changed because of PANDORA input format
28
+ BAND = "band"
29
+ BAND_IM = "band_im"
30
+ BAND_CLASSIF = "band_classif"
31
+ BAND_PERFORMANCE_MAP = "band_performance_map"
32
+ BAND_LAYER_INF = "band_inf_layer"
33
+ BAND_LAYER_SUP = "band_sup_layer"
34
+ BAND_FILLING = "filling_type"
35
+ BAND_SOURCE_PC = "source_point_cloud"
36
+ RIO_TAG_PERFORMANCE_MAP_CLASSES = "rio_tag_performance_map_classes"
37
+ X = "x"
38
+ Y = "y"
39
+ Z = "z"
40
+ TEXTURE = "texture"
41
+ PERFORMANCE_MAP_FROM_RISK = "risk_performance_map"
42
+ PERFORMANCE_MAP_FROM_INTERVALS = "intervals_performance_map"
43
+ RESOLUTION = "resolution"
44
+ EPI_FULL_SIZE = "full_epipolar_size"
45
+ ROI = "roi"
46
+ ROI_WITH_MARGINS = "roi_with_margins"
47
+ EPSG = "epsg"
48
+ DISPARITY = "disparity"
49
+ PC_EPSG = "point_cloud_epsg"
50
+
51
+ BAND_NAMES = "band_names"
52
+ IMAGE_TYPE = "image_type"
53
+ NBITS = "nbits"
54
+ EPSG_WSG84 = 4326
55
+ # stereo keys
56
+ STEREO_REF = "ref"
57
+ STEREO_SEC = "sec"
58
+
59
+ CROPPED_DISPARITY_RANGE = "cropped_disparity_range"
60
+
61
+ # epipolar image dataset
62
+ EPI_IMAGE = "im" # has to be synchronized with the PANDORA input format
63
+ EPI_MSK = "msk" # has to be synchronized with the PANDORA input format
64
+ EPI_TEXTURE = "texture"
65
+ EPI_CLASSIFICATION = "classif"
66
+ EPI_FILLING = "filling"
67
+ EPI_CONFIDENCE_KEY_ROOT = "confidence"
68
+ EPI_PERFORMANCE_MAP = "performance_map"
69
+ # used in re entrance
70
+ EPI_Z_SUP = "z_sup"
71
+ EPI_Z_INF = "z_inf"
72
+ EPI_AMBIGUITY = "ambiguity"
73
+ EPI_DENOISING_INFO_KEY_ROOT = "denoising"
74
+ EPI_MARGINS = "margins"
75
+ EPI_DISP_MIN = "disp_min"
76
+ EPI_DISP_MAX = "disp_max"
77
+ EPI_VALID_PIXELS = "valid_pixels"
78
+ EPI_NO_DATA_MASK = "no_data_mask"
79
+ EPI_NO_DATA_IMG = "no_data_img"
80
+ EPI_TRANSFORM = "transform"
81
+ EPI_CRS = "crs"
82
+ EPI_GROUND_TRUTH = "epi_ground_truth"
83
+ SENSOR_GROUND_TRUTH = "sensor_ground_truth"
84
+
85
+ # points cloud fields (xarray Dataset and pandas Dataframe)
86
+ POINT_CLOUD_CORR_MSK = "corr_msk"
87
+ POINT_CLOUD_MSK = "mask"
88
+ POINT_CLOUD_CLR_KEY_ROOT = "texture"
89
+ # base name used to parse
90
+ POINT_CLOUD_PERFORMANCE_MAP_ROOT = "performance_map"
91
+ POINT_CLOUD_PERFORMANCE_MAP_FROM_RISK = (
92
+ POINT_CLOUD_PERFORMANCE_MAP_ROOT + "_from_risk"
93
+ )
94
+ POINT_CLOUD_PERFORMANCE_MAP_FROM_INTERVALS = (
95
+ POINT_CLOUD_PERFORMANCE_MAP_ROOT + "_from_intervals"
96
+ )
97
+ POINT_CLOUD_CONFIDENCE_KEY_ROOT = "confidence"
98
+ POINT_CLOUD_AMBIGUITY_KEY_ROOT = "ambiguity"
99
+ POINT_CLOUD_INTERVALS_KEY_ROOT = "intervals"
100
+ # base name used to parse
101
+ POINT_CLOUD_LAYER_SUP_OR_INF_ROOT = "layer_border_z"
102
+ POINT_CLOUD_LAYER_SUP = POINT_CLOUD_LAYER_SUP_OR_INF_ROOT + "_sup"
103
+ POINT_CLOUD_LAYER_INF = POINT_CLOUD_LAYER_SUP_OR_INF_ROOT + "_inf"
104
+ POINT_CLOUD_LAYER_SUP_FROM_RISK = POINT_CLOUD_LAYER_SUP + "_from_risk"
105
+ POINT_CLOUD_LAYER_INF_FROM_RISK = POINT_CLOUD_LAYER_INF + "_from_risk"
106
+ POINT_CLOUD_LAYER_SUP_FROM_INTERVALS = POINT_CLOUD_LAYER_SUP + "_from_intervals"
107
+ POINT_CLOUD_LAYER_INF_FROM_INTERVALS = POINT_CLOUD_LAYER_INF + "_from_intervals"
108
+ POINT_CLOUD_CLASSIF_KEY_ROOT = "classif"
109
+ POINT_CLOUD_FILLING_KEY_ROOT = "filling"
110
+ POINT_CLOUD_SOURCE_KEY_ROOT = "source_pc"
111
+ POINT_CLOUD_COORD_EPI_GEOM_I = "coord_epi_geom_i"
112
+ POINT_CLOUD_COORD_EPI_GEOM_J = "coord_epi_geom_j"
113
+ POINT_CLOUD_ID_IM_EPI = "id_im_epi"
114
+ POINT_CLOUD_MATCHES = "point_cloud_matches"
115
+
116
+ # raster fields (xarray Dataset)
117
+ RASTER_HGT = "hgt"
118
+ RASTER_HGT_INF = "hgt_inf"
119
+ RASTER_HGT_SUP = "hgt_sup"
120
+ RASTER_WEIGHTS_SUM = "weights_sum"
121
+ RASTER_COLOR_IMG = "img"
122
+ RASTER_MSK = "raster_msk"
123
+ RASTER_CLASSIF = "raster_classif"
124
+ RASTER_NB_PTS = "n_pts"
125
+ RASTER_NB_PTS_IN_CELL = "pts_in_cell"
126
+ RASTER_HGT_MEAN = "hgt_mean"
127
+ RASTER_HGT_STD_DEV = "hgt_stdev"
128
+ RASTER_HGT_INF_MEAN = "hgt_inf_mean"
129
+ RASTER_HGT_INF_STD_DEV = "hgt_inf_stdev"
130
+ RASTER_HGT_SUP_MEAN = "hgt_sup_mean"
131
+ RASTER_HGT_SUP_STD_DEV = "hgt_sup_stdev"
132
+ RASTER_BAND_MEAN = "band_mean"
133
+ RASTER_BAND_STD_DEV = "band_stdev"
134
+ RASTER_CONFIDENCE = "confidence"
135
+ RASTER_PERFORMANCE_MAP = "performance_map"
136
+ RASTER_AMBIGUITY = "ambiguity"
137
+ RASTER_PERFORMANCE_MAP_RAW = "performance_map_raw"
138
+ RASTER_SOURCE_PC = "source_pc"
139
+ RASTER_FILLING = "filling"
140
+ # Geometry constants
141
+ DISP_MODE = "disp"
142
+ MATCHES_MODE = "matches"
143
+
144
+ # DSM index
145
+ INDEX_DSM_ALT = "dsm"
146
+ INDEX_DSM_WEIGHTS = "weights"
147
+ INDEX_DSM_COLOR = "image"
148
+ INDEX_DSM_MASK = "mask"
149
+ INDEX_DSM_CLASSIFICATION = "classification"
150
+ INDEX_DSM_PERFORMANCE_MAP = "performance_map"
151
+ INDEX_DSM_AMBIGUITY = "ambiguity"
152
+ INDEX_DSM_CONTRIBUTING_PAIR = "contributing_pair"
153
+ INDEX_DSM_FILLING = "filling"
154
+ INDEX_DEM_MIN = "dem_min"
155
+ INDEX_DEM_MAX = "dem_max"
156
+ INDEX_DEM_MEDIAN = "dem_median"
157
+
158
+
159
+ # depth map index
160
+ INDEX_DEPTH_MAP_X = "x"
161
+ INDEX_DEPTH_MAP_Y = "y"
162
+ INDEX_DEPTH_MAP_Z = "z"
163
+ INDEX_DEPTH_MAP_COLOR = "image"
164
+ INDEX_DEPTH_MAP_MASK = "mask"
165
+ INDEX_DEPTH_MAP_CLASSIFICATION = "classification"
166
+ INDEX_DEPTH_MAP_PERFORMANCE_MAP = "performance_map"
167
+ INDEX_DEPTH_MAP_AMBIGUITY = "ambiguity"
168
+ INDEX_DEPTH_MAP_FILLING = "filling"
169
+ INDEX_DEPTH_MAP_EPSG = "epsg"
170
+
171
+ # dsms inputs index
172
+ DSM_CLASSIF = "merging_classification"
173
+ DSM_ALT = "dsm"
174
+ DSM_ALT_INF = "dsm_inf"
175
+ DSM_ALT_SUP = "dsm_sup"
176
+ DSM_WEIGHTS_SUM = "weights"
177
+ DSM_MSK = "mask"
178
+ DSM_NB_PTS = "dsm_n_pts"
179
+ DSM_NB_PTS_IN_CELL = "dsm_pts_in_cell"
180
+ DSM_MEAN = "dsm_mean"
181
+ DSM_STD_DEV = "dsm_std"
182
+ DSM_INF_MEAN = "dsm_inf_mean"
183
+ DSM_INF_STD = "dsm_inf_std"
184
+ DSM_SUP_MEAN = "dsm_sup_mean"
185
+ DSM_SUP_STD = "dsm_sup_std"
186
+ DSM_AMBIGUITY = "ambiguity"
187
+ DSM_CONFIDENCE = "confidence"
188
+ DSM_PERFORMANCE_MAP = "performance_map"
189
+ DSM_SOURCE_PC = "contributing_pair"
190
+ DSM_FILLING = "merging_filling"
191
+ DSM_COLOR = "image"
@@ -0,0 +1,50 @@
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 Disparity Constants module
23
+ """
24
+
25
+ # disparity map
26
+ MAP = "disp"
27
+ CONFIDENCE = "confidence"
28
+ CONFIDENCE_KEY = "cost_volume_confidence"
29
+ INTERVAL = "interval_bounds"
30
+ INTERVAL_INF = "confidence_from_interval_bounds_inf"
31
+ INTERVAL_SUP = "confidence_from_interval_bounds_sup"
32
+ EPI_DISP_MIN_GRID = "disp_min_grid"
33
+ EPI_DISP_MAX_GRID = "disp_max_grid"
34
+
35
+ # disparity mask
36
+ VALID = "disp_msk"
37
+ FILLING = "filling"
38
+ INVALID_REF = "msk_invalid_ref"
39
+ INVALID_SEC = "msk_invalid_sec"
40
+ MASKED_REF = "msk_masked_ref"
41
+ MASKED_SEC = "msk_masked_sec"
42
+ OCCLUSION = "msk_occlusion"
43
+ FALSE_MATCH = "msk_false_match"
44
+ INCOMPLETE_DISP = "msk_incomplete_disp"
45
+ STOPPED_INTERP = "msk_stopped_interp"
46
+ FILLED_OCCLUSION = "msk_filled_occlusion"
47
+ FILLED_FALSE_MATCH = "msk_filled_false_match"
48
+ INSIDE_SEC_ROI = "msk_inside_sec_roi"
49
+ DISP_TO_0 = "msk_disp_to_0"
50
+ INCOMPLETE_VARIABLE_DISP = "msk_incomplete_variable_disp"