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.
- cars/__init__.py +74 -0
- cars/applications/__init__.py +40 -0
- cars/applications/application.py +117 -0
- cars/applications/application_constants.py +29 -0
- cars/applications/application_template.py +146 -0
- cars/applications/auxiliary_filling/__init__.py +29 -0
- cars/applications/auxiliary_filling/abstract_auxiliary_filling_app.py +105 -0
- cars/applications/auxiliary_filling/auxiliary_filling_algo.py +475 -0
- cars/applications/auxiliary_filling/auxiliary_filling_from_sensors_app.py +632 -0
- cars/applications/auxiliary_filling/auxiliary_filling_wrappers.py +90 -0
- cars/applications/dem_generation/__init__.py +30 -0
- cars/applications/dem_generation/abstract_dem_generation_app.py +116 -0
- cars/applications/dem_generation/bulldozer_config/base_config.yaml +46 -0
- cars/applications/dem_generation/bulldozer_dem_app.py +641 -0
- cars/applications/dem_generation/bulldozer_memory.py +55 -0
- cars/applications/dem_generation/dem_generation_algo.py +107 -0
- cars/applications/dem_generation/dem_generation_constants.py +32 -0
- cars/applications/dem_generation/dem_generation_wrappers.py +323 -0
- cars/applications/dense_match_filling/__init__.py +30 -0
- cars/applications/dense_match_filling/abstract_dense_match_filling_app.py +242 -0
- cars/applications/dense_match_filling/fill_disp_algo.py +113 -0
- cars/applications/dense_match_filling/fill_disp_constants.py +39 -0
- cars/applications/dense_match_filling/fill_disp_wrappers.py +83 -0
- cars/applications/dense_match_filling/zero_padding_app.py +302 -0
- cars/applications/dense_matching/__init__.py +30 -0
- cars/applications/dense_matching/abstract_dense_matching_app.py +261 -0
- cars/applications/dense_matching/census_mccnn_sgm_app.py +1461 -0
- cars/applications/dense_matching/cpp/__init__.py +0 -0
- cars/applications/dense_matching/cpp/dense_matching_cpp.cpython-313-x86_64-linux-gnu.so +0 -0
- cars/applications/dense_matching/cpp/dense_matching_cpp.py +94 -0
- cars/applications/dense_matching/cpp/includes/dense_matching.hpp +58 -0
- cars/applications/dense_matching/cpp/meson.build +9 -0
- cars/applications/dense_matching/cpp/src/bindings.cpp +13 -0
- cars/applications/dense_matching/cpp/src/dense_matching.cpp +207 -0
- cars/applications/dense_matching/dense_matching_algo.py +401 -0
- cars/applications/dense_matching/dense_matching_constants.py +89 -0
- cars/applications/dense_matching/dense_matching_wrappers.py +951 -0
- cars/applications/dense_matching/disparity_grid_algo.py +597 -0
- cars/applications/dense_matching/loaders/__init__.py +23 -0
- cars/applications/dense_matching/loaders/config_census_sgm_default.json +31 -0
- cars/applications/dense_matching/loaders/config_census_sgm_homogeneous.json +30 -0
- cars/applications/dense_matching/loaders/config_census_sgm_mountain_and_vegetation.json +30 -0
- cars/applications/dense_matching/loaders/config_census_sgm_shadow.json +30 -0
- cars/applications/dense_matching/loaders/config_census_sgm_sparse.json +36 -0
- cars/applications/dense_matching/loaders/config_census_sgm_urban.json +30 -0
- cars/applications/dense_matching/loaders/config_mapping.json +13 -0
- cars/applications/dense_matching/loaders/config_mccnn.json +28 -0
- cars/applications/dense_matching/loaders/global_land_cover_map.tif +0 -0
- cars/applications/dense_matching/loaders/pandora_loader.py +593 -0
- cars/applications/dsm_filling/__init__.py +32 -0
- cars/applications/dsm_filling/abstract_dsm_filling_app.py +101 -0
- cars/applications/dsm_filling/border_interpolation_app.py +278 -0
- cars/applications/dsm_filling/bulldozer_config/base_config.yaml +44 -0
- cars/applications/dsm_filling/bulldozer_filling_app.py +288 -0
- cars/applications/dsm_filling/exogenous_filling_app.py +341 -0
- cars/applications/dsm_merging/__init__.py +28 -0
- cars/applications/dsm_merging/abstract_dsm_merging_app.py +101 -0
- cars/applications/dsm_merging/weighted_fusion_app.py +639 -0
- cars/applications/grid_correction/__init__.py +30 -0
- cars/applications/grid_correction/abstract_grid_correction_app.py +103 -0
- cars/applications/grid_correction/grid_correction_app.py +557 -0
- cars/applications/grid_generation/__init__.py +30 -0
- cars/applications/grid_generation/abstract_grid_generation_app.py +142 -0
- cars/applications/grid_generation/epipolar_grid_generation_app.py +327 -0
- cars/applications/grid_generation/grid_generation_algo.py +388 -0
- cars/applications/grid_generation/grid_generation_constants.py +46 -0
- cars/applications/grid_generation/transform_grid.py +88 -0
- cars/applications/ground_truth_reprojection/__init__.py +30 -0
- cars/applications/ground_truth_reprojection/abstract_ground_truth_reprojection_app.py +137 -0
- cars/applications/ground_truth_reprojection/direct_localization_app.py +629 -0
- cars/applications/ground_truth_reprojection/ground_truth_reprojection_algo.py +275 -0
- cars/applications/point_cloud_outlier_removal/__init__.py +30 -0
- cars/applications/point_cloud_outlier_removal/abstract_outlier_removal_app.py +385 -0
- cars/applications/point_cloud_outlier_removal/outlier_removal_algo.py +392 -0
- cars/applications/point_cloud_outlier_removal/outlier_removal_constants.py +43 -0
- cars/applications/point_cloud_outlier_removal/small_components_app.py +522 -0
- cars/applications/point_cloud_outlier_removal/statistical_app.py +528 -0
- cars/applications/rasterization/__init__.py +30 -0
- cars/applications/rasterization/abstract_pc_rasterization_app.py +183 -0
- cars/applications/rasterization/rasterization_algo.py +534 -0
- cars/applications/rasterization/rasterization_constants.py +38 -0
- cars/applications/rasterization/rasterization_wrappers.py +639 -0
- cars/applications/rasterization/simple_gaussian_app.py +1152 -0
- cars/applications/resampling/__init__.py +28 -0
- cars/applications/resampling/abstract_resampling_app.py +187 -0
- cars/applications/resampling/bicubic_resampling_app.py +760 -0
- cars/applications/resampling/resampling_algo.py +590 -0
- cars/applications/resampling/resampling_constants.py +36 -0
- cars/applications/resampling/resampling_wrappers.py +309 -0
- cars/applications/sensors_subsampling/__init__.py +32 -0
- cars/applications/sensors_subsampling/abstract_subsampling_app.py +109 -0
- cars/applications/sensors_subsampling/rasterio_subsampling_app.py +420 -0
- cars/applications/sensors_subsampling/subsampling_algo.py +108 -0
- cars/applications/sparse_matching/__init__.py +30 -0
- cars/applications/sparse_matching/abstract_sparse_matching_app.py +599 -0
- cars/applications/sparse_matching/sift_app.py +724 -0
- cars/applications/sparse_matching/sparse_matching_algo.py +360 -0
- cars/applications/sparse_matching/sparse_matching_constants.py +66 -0
- cars/applications/sparse_matching/sparse_matching_wrappers.py +282 -0
- cars/applications/triangulation/__init__.py +32 -0
- cars/applications/triangulation/abstract_triangulation_app.py +227 -0
- cars/applications/triangulation/line_of_sight_intersection_app.py +1243 -0
- cars/applications/triangulation/pc_transform.py +552 -0
- cars/applications/triangulation/triangulation_algo.py +371 -0
- cars/applications/triangulation/triangulation_constants.py +38 -0
- cars/applications/triangulation/triangulation_wrappers.py +259 -0
- cars/bundleadjustment.py +750 -0
- cars/cars.py +179 -0
- cars/conf/__init__.py +23 -0
- cars/conf/geoid/egm96.grd +0 -0
- cars/conf/geoid/egm96.grd.hdr +15 -0
- cars/conf/input_parameters.py +156 -0
- cars/conf/mask_cst.py +35 -0
- cars/core/__init__.py +23 -0
- cars/core/cars_logging.py +402 -0
- cars/core/constants.py +191 -0
- cars/core/constants_disparity.py +50 -0
- cars/core/datasets.py +140 -0
- cars/core/geometry/__init__.py +27 -0
- cars/core/geometry/abstract_geometry.py +1130 -0
- cars/core/geometry/shareloc_geometry.py +604 -0
- cars/core/inputs.py +568 -0
- cars/core/outputs.py +176 -0
- cars/core/preprocessing.py +722 -0
- cars/core/projection.py +843 -0
- cars/core/roi_tools.py +215 -0
- cars/core/tiling.py +774 -0
- cars/core/utils.py +164 -0
- cars/data_structures/__init__.py +23 -0
- cars/data_structures/cars_dataset.py +1544 -0
- cars/data_structures/cars_dict.py +74 -0
- cars/data_structures/corresponding_tiles_tools.py +186 -0
- cars/data_structures/dataframe_converter.py +185 -0
- cars/data_structures/format_transformation.py +297 -0
- cars/devibrate.py +689 -0
- cars/extractroi.py +264 -0
- cars/orchestrator/__init__.py +23 -0
- cars/orchestrator/achievement_tracker.py +125 -0
- cars/orchestrator/cluster/__init__.py +37 -0
- cars/orchestrator/cluster/abstract_cluster.py +250 -0
- cars/orchestrator/cluster/abstract_dask_cluster.py +381 -0
- cars/orchestrator/cluster/dask_cluster_tools.py +103 -0
- cars/orchestrator/cluster/dask_config/README.md +94 -0
- cars/orchestrator/cluster/dask_config/dask.yaml +21 -0
- cars/orchestrator/cluster/dask_config/distributed.yaml +70 -0
- cars/orchestrator/cluster/dask_config/jobqueue.yaml +26 -0
- cars/orchestrator/cluster/dask_config/reference_confs/dask-schema.yaml +137 -0
- cars/orchestrator/cluster/dask_config/reference_confs/dask.yaml +26 -0
- cars/orchestrator/cluster/dask_config/reference_confs/distributed-schema.yaml +1009 -0
- cars/orchestrator/cluster/dask_config/reference_confs/distributed.yaml +273 -0
- cars/orchestrator/cluster/dask_config/reference_confs/jobqueue.yaml +212 -0
- cars/orchestrator/cluster/dask_jobqueue_utils.py +204 -0
- cars/orchestrator/cluster/local_dask_cluster.py +116 -0
- cars/orchestrator/cluster/log_wrapper.py +728 -0
- cars/orchestrator/cluster/mp_cluster/__init__.py +27 -0
- cars/orchestrator/cluster/mp_cluster/mp_factorizer.py +212 -0
- cars/orchestrator/cluster/mp_cluster/mp_objects.py +535 -0
- cars/orchestrator/cluster/mp_cluster/mp_tools.py +93 -0
- cars/orchestrator/cluster/mp_cluster/mp_wrapper.py +505 -0
- cars/orchestrator/cluster/mp_cluster/multiprocessing_cluster.py +986 -0
- cars/orchestrator/cluster/mp_cluster/multiprocessing_profiler.py +399 -0
- cars/orchestrator/cluster/pbs_dask_cluster.py +207 -0
- cars/orchestrator/cluster/sequential_cluster.py +139 -0
- cars/orchestrator/cluster/slurm_dask_cluster.py +234 -0
- cars/orchestrator/memory_tools.py +47 -0
- cars/orchestrator/orchestrator.py +755 -0
- cars/orchestrator/orchestrator_constants.py +29 -0
- cars/orchestrator/registry/__init__.py +23 -0
- cars/orchestrator/registry/abstract_registry.py +143 -0
- cars/orchestrator/registry/compute_registry.py +106 -0
- cars/orchestrator/registry/id_generator.py +116 -0
- cars/orchestrator/registry/replacer_registry.py +213 -0
- cars/orchestrator/registry/saver_registry.py +363 -0
- cars/orchestrator/registry/unseen_registry.py +118 -0
- cars/orchestrator/tiles_profiler.py +279 -0
- cars/pipelines/__init__.py +26 -0
- cars/pipelines/conf_resolution/conf_final_resolution.yaml +5 -0
- cars/pipelines/conf_resolution/conf_first_resolution.yaml +4 -0
- cars/pipelines/conf_resolution/conf_intermediate_resolution.yaml +2 -0
- cars/pipelines/default/__init__.py +26 -0
- cars/pipelines/default/default_pipeline.py +1095 -0
- cars/pipelines/filling/__init__.py +26 -0
- cars/pipelines/filling/filling.py +981 -0
- cars/pipelines/formatting/__init__.py +26 -0
- cars/pipelines/formatting/formatting.py +190 -0
- cars/pipelines/merging/__init__.py +26 -0
- cars/pipelines/merging/merging.py +439 -0
- cars/pipelines/parameters/__init__.py +0 -0
- cars/pipelines/parameters/advanced_parameters.py +256 -0
- cars/pipelines/parameters/advanced_parameters_constants.py +68 -0
- cars/pipelines/parameters/application_parameters.py +72 -0
- cars/pipelines/parameters/depth_map_inputs.py +0 -0
- cars/pipelines/parameters/dsm_inputs.py +349 -0
- cars/pipelines/parameters/dsm_inputs_constants.py +25 -0
- cars/pipelines/parameters/output_constants.py +52 -0
- cars/pipelines/parameters/output_parameters.py +435 -0
- cars/pipelines/parameters/sensor_inputs.py +859 -0
- cars/pipelines/parameters/sensor_inputs_constants.py +51 -0
- cars/pipelines/parameters/sensor_loaders/__init__.py +29 -0
- cars/pipelines/parameters/sensor_loaders/basic_classif_loader.py +86 -0
- cars/pipelines/parameters/sensor_loaders/basic_image_loader.py +98 -0
- cars/pipelines/parameters/sensor_loaders/pivot_classif_loader.py +90 -0
- cars/pipelines/parameters/sensor_loaders/pivot_image_loader.py +105 -0
- cars/pipelines/parameters/sensor_loaders/sensor_loader.py +93 -0
- cars/pipelines/parameters/sensor_loaders/sensor_loader_template.py +71 -0
- cars/pipelines/parameters/sensor_loaders/slurp_classif_loader.py +86 -0
- cars/pipelines/pipeline.py +119 -0
- cars/pipelines/pipeline_constants.py +38 -0
- cars/pipelines/pipeline_template.py +135 -0
- cars/pipelines/subsampling/__init__.py +26 -0
- cars/pipelines/subsampling/subsampling.py +358 -0
- cars/pipelines/surface_modeling/__init__.py +26 -0
- cars/pipelines/surface_modeling/surface_modeling.py +2098 -0
- cars/pipelines/tie_points/__init__.py +26 -0
- cars/pipelines/tie_points/tie_points.py +536 -0
- cars/starter.py +167 -0
- cars-1.0.0rc3.dist-info/METADATA +289 -0
- cars-1.0.0rc3.dist-info/RECORD +220 -0
- cars-1.0.0rc3.dist-info/WHEEL +6 -0
- 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
|