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,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
|