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.
- cars/__init__.py +86 -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 +42 -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.cp312-win_amd64.dll.a +0 -0
- cars/applications/dense_matching/cpp/dense_matching_cpp.cp312-win_amd64.pyd +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 +1119 -0
- cars/core/geometry/shareloc_geometry.py +598 -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 +1088 -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 +186 -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 +438 -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.0rc2.dist-info/DELVEWHEEL +2 -0
- cars-1.0.0rc2.dist-info/METADATA +289 -0
- cars-1.0.0rc2.dist-info/RECORD +225 -0
- cars-1.0.0rc2.dist-info/WHEEL +4 -0
- cars-1.0.0rc2.dist-info/entry_points.txt +8 -0
- cars.libs/libgcc_s_seh-1-b2494fcbd4d80cf2c98fdd5261f6d850.dll +0 -0
- cars.libs/libstdc++-6-e9b0d12ae0e9555bbae55e8dfd08c3f7.dll +0 -0
- cars.libs/libwinpthread-1-7882d1b093714ccdfaf4e0789a817792.dll +0 -0
|
@@ -0,0 +1,629 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# coding: utf8
|
|
3
|
+
#
|
|
4
|
+
# Copyright (c) 2024 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
|
+
This module contains the abstract direct_localization application class.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
# Standard imports
|
|
26
|
+
import collections
|
|
27
|
+
import logging
|
|
28
|
+
import os
|
|
29
|
+
|
|
30
|
+
import numpy as np
|
|
31
|
+
import rasterio as rio
|
|
32
|
+
import xarray as xr
|
|
33
|
+
from json_checker import And, Checker
|
|
34
|
+
|
|
35
|
+
# CARS imports
|
|
36
|
+
import cars.orchestrator.orchestrator as ocht
|
|
37
|
+
from cars.applications.ground_truth_reprojection import (
|
|
38
|
+
abstract_ground_truth_reprojection_app,
|
|
39
|
+
)
|
|
40
|
+
from cars.applications.ground_truth_reprojection import (
|
|
41
|
+
ground_truth_reprojection_algo as gnd_truth_algo,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
# CARS imports
|
|
45
|
+
from cars.core import constants as cst
|
|
46
|
+
from cars.core import inputs
|
|
47
|
+
from cars.core.utils import safe_makedirs
|
|
48
|
+
from cars.data_structures import cars_dataset
|
|
49
|
+
from cars.pipelines.parameters import sensor_inputs_constants as sens_cst
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class DirectLocalization(
|
|
53
|
+
abstract_ground_truth_reprojection_app.GroundTruthReprojection,
|
|
54
|
+
short_name="direct_loc",
|
|
55
|
+
):
|
|
56
|
+
"""
|
|
57
|
+
DirectLocalization
|
|
58
|
+
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
# pylint: disable=too-many-instance-attributes
|
|
62
|
+
|
|
63
|
+
def __init__(self, conf=None):
|
|
64
|
+
"""
|
|
65
|
+
Init function of DirectLocalization
|
|
66
|
+
:param conf: configuration for resampling
|
|
67
|
+
:return: an application_to_use object
|
|
68
|
+
|
|
69
|
+
"""
|
|
70
|
+
super().__init__(conf=conf)
|
|
71
|
+
|
|
72
|
+
# check conf
|
|
73
|
+
self.used_method = self.used_config["method"]
|
|
74
|
+
self.target = self.used_config["target"]
|
|
75
|
+
self.tile_size = self.used_config["tile_size"]
|
|
76
|
+
|
|
77
|
+
# Init orchestrator
|
|
78
|
+
self.orchestrator = None
|
|
79
|
+
|
|
80
|
+
def check_conf(self, conf):
|
|
81
|
+
"""
|
|
82
|
+
Check configuration
|
|
83
|
+
|
|
84
|
+
:param conf: configuration to check
|
|
85
|
+
:type conf: dict
|
|
86
|
+
:return: overloaded configuration
|
|
87
|
+
:rtype: dict
|
|
88
|
+
|
|
89
|
+
"""
|
|
90
|
+
|
|
91
|
+
# init conf
|
|
92
|
+
if conf is not None:
|
|
93
|
+
overloaded_conf = conf.copy()
|
|
94
|
+
else:
|
|
95
|
+
conf = {}
|
|
96
|
+
overloaded_conf = {}
|
|
97
|
+
|
|
98
|
+
# Overload conf
|
|
99
|
+
overloaded_conf["method"] = conf.get("method", "direct_loc")
|
|
100
|
+
overloaded_conf["target"] = conf.get("target", "epipolar")
|
|
101
|
+
overloaded_conf["tile_size"] = conf.get("tile_size", 2500)
|
|
102
|
+
# save_intermediate_data not used in this app, but overiden
|
|
103
|
+
overloaded_conf["save_intermediate_data"] = True
|
|
104
|
+
|
|
105
|
+
ground_truth_reprojection_schema = {
|
|
106
|
+
"method": str,
|
|
107
|
+
"target": And(
|
|
108
|
+
str, lambda input: input in ["epipolar", "sensor", "all"]
|
|
109
|
+
),
|
|
110
|
+
"tile_size": And(int, lambda size: size > 0),
|
|
111
|
+
"save_intermediate_data": bool,
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
# Check conf
|
|
115
|
+
checker = Checker(ground_truth_reprojection_schema)
|
|
116
|
+
checker.validate(overloaded_conf)
|
|
117
|
+
|
|
118
|
+
return overloaded_conf
|
|
119
|
+
|
|
120
|
+
def run( # pylint: disable=too-many-positional-arguments # noqa: C901
|
|
121
|
+
self,
|
|
122
|
+
sensor_left,
|
|
123
|
+
sensor_right,
|
|
124
|
+
grid_left,
|
|
125
|
+
grid_right,
|
|
126
|
+
geom_plugin,
|
|
127
|
+
geom_plugin_dem_median,
|
|
128
|
+
disp_to_alt_ratio,
|
|
129
|
+
auxiliary_values,
|
|
130
|
+
auxiliary_interp,
|
|
131
|
+
orchestrator=None,
|
|
132
|
+
pair_folder=None,
|
|
133
|
+
pair_key="PAIR_0",
|
|
134
|
+
):
|
|
135
|
+
"""
|
|
136
|
+
Run direct localization for ground truth disparity
|
|
137
|
+
|
|
138
|
+
:param sensor_left: Tiled sensor left image.
|
|
139
|
+
Dict must contain keys: "image", "texture", "geomodel",
|
|
140
|
+
"no_data", "mask". Paths must be absolute.
|
|
141
|
+
:type sensor_left: CarsDataset
|
|
142
|
+
:param sensor_right: Tiled sensor right image.
|
|
143
|
+
Dict must contain keys: "image", "texture", "geomodel",
|
|
144
|
+
"no_data", "mask". Paths must be absolute.
|
|
145
|
+
:type sensor_right: CarsDataset
|
|
146
|
+
:param grid_left: Grid left.
|
|
147
|
+
:type grid_left: CarsDataset
|
|
148
|
+
:param grid_right: Grid right.
|
|
149
|
+
:type grid_right: CarsDataset
|
|
150
|
+
:param geom_plugin_dem_median: Geometry plugin with dem median
|
|
151
|
+
:type geom_plugin_dem_median: geometry_plugin
|
|
152
|
+
:param geom_plugin: Geometry plugin with user's DSM used to
|
|
153
|
+
generate epipolar grids.
|
|
154
|
+
:type geom_plugin: GeometryPlugin
|
|
155
|
+
:param disp_to_alt_ratio: Disp to altitude ratio used
|
|
156
|
+
for performance map.
|
|
157
|
+
:type disp_to_alt_ratio: float
|
|
158
|
+
:param orchestrator: orchestrator used
|
|
159
|
+
:type orchestrator: orchestrator
|
|
160
|
+
:param pair_folder: Folder used for current pair.
|
|
161
|
+
:type pair_folder: str
|
|
162
|
+
:param pair_key: Pair ID.
|
|
163
|
+
:type pair_key: str
|
|
164
|
+
"""
|
|
165
|
+
|
|
166
|
+
logging.info("Starting ground truth reprojection application")
|
|
167
|
+
|
|
168
|
+
# Default orchestrator
|
|
169
|
+
if orchestrator is None:
|
|
170
|
+
# Create default sequential orchestrator for current application
|
|
171
|
+
# be aware, no out_json will be shared between orchestrators
|
|
172
|
+
# No files saved
|
|
173
|
+
self.orchestrator = ocht.Orchestrator(
|
|
174
|
+
orchestrator_conf={"mode": "sequential"}
|
|
175
|
+
)
|
|
176
|
+
else:
|
|
177
|
+
self.orchestrator = orchestrator
|
|
178
|
+
|
|
179
|
+
if pair_folder is None:
|
|
180
|
+
pair_folder = os.path.join(self.orchestrator.out_dir, "tmp")
|
|
181
|
+
else:
|
|
182
|
+
safe_makedirs(pair_folder)
|
|
183
|
+
|
|
184
|
+
# Get profile
|
|
185
|
+
with rio.open(
|
|
186
|
+
sensor_left[sens_cst.INPUT_IMG]["bands"]["b0"]["path"]
|
|
187
|
+
) as src_left:
|
|
188
|
+
width_left = src_left.width
|
|
189
|
+
height_left = src_left.height
|
|
190
|
+
transform_left = src_left.transform
|
|
191
|
+
|
|
192
|
+
with rio.open(
|
|
193
|
+
sensor_right[sens_cst.INPUT_IMG]["bands"]["b0"]["path"]
|
|
194
|
+
) as src_right:
|
|
195
|
+
width_right = src_right.width
|
|
196
|
+
height_right = src_right.height
|
|
197
|
+
transform_right = src_right.transform
|
|
198
|
+
|
|
199
|
+
raster_profile_left = collections.OrderedDict(
|
|
200
|
+
{
|
|
201
|
+
"height": height_left,
|
|
202
|
+
"width": width_left,
|
|
203
|
+
"driver": "GTiff",
|
|
204
|
+
"dtype": "float32",
|
|
205
|
+
"transform": transform_left,
|
|
206
|
+
"tiled": True,
|
|
207
|
+
}
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
raster_profile_right = collections.OrderedDict(
|
|
211
|
+
{
|
|
212
|
+
"height": height_right,
|
|
213
|
+
"width": width_right,
|
|
214
|
+
"driver": "GTiff",
|
|
215
|
+
"dtype": "float32",
|
|
216
|
+
"transform": transform_right,
|
|
217
|
+
"tiled": True,
|
|
218
|
+
}
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
if self.used_config["target"] in ["all", "epipolar"]:
|
|
222
|
+
|
|
223
|
+
# Create cars datasets
|
|
224
|
+
epi_disparity_ground_truth_left = cars_dataset.CarsDataset(
|
|
225
|
+
"arrays", name="epipolar_disparity_ground_truth_left" + pair_key
|
|
226
|
+
)
|
|
227
|
+
epi_disp_ground_truth_right = cars_dataset.CarsDataset(
|
|
228
|
+
"arrays",
|
|
229
|
+
name="epipolar_disparity_ground_truth_right" + pair_key,
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
epi_disparity_ground_truth_left.create_grid(
|
|
233
|
+
grid_left["epipolar_size_x"],
|
|
234
|
+
grid_left["epipolar_size_y"],
|
|
235
|
+
self.tile_size,
|
|
236
|
+
self.tile_size,
|
|
237
|
+
0,
|
|
238
|
+
0,
|
|
239
|
+
)
|
|
240
|
+
epi_disp_ground_truth_right.tiling_grid = (
|
|
241
|
+
epi_disparity_ground_truth_left.tiling_grid
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
self.orchestrator.add_to_save_lists(
|
|
245
|
+
os.path.join(
|
|
246
|
+
pair_folder, "epipolar_disp_ground_truth_left.tif"
|
|
247
|
+
),
|
|
248
|
+
cst.EPI_GROUND_TRUTH,
|
|
249
|
+
epi_disparity_ground_truth_left,
|
|
250
|
+
cars_ds_name="epipolar_disparity_ground_truth",
|
|
251
|
+
)
|
|
252
|
+
self.orchestrator.add_to_save_lists(
|
|
253
|
+
os.path.join(
|
|
254
|
+
pair_folder, "epipolar_disp_ground_truth_right.tif"
|
|
255
|
+
),
|
|
256
|
+
cst.EPI_GROUND_TRUTH,
|
|
257
|
+
epi_disp_ground_truth_right,
|
|
258
|
+
cars_ds_name="epipolar_disparity_ground_truth",
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
# Save all file that are in inputs
|
|
262
|
+
if auxiliary_values is not None:
|
|
263
|
+
for key in auxiliary_values.keys():
|
|
264
|
+
if key in (cst.DSM_COLOR, cst.DSM_WEIGHTS_SUM):
|
|
265
|
+
option = False
|
|
266
|
+
else:
|
|
267
|
+
option = True
|
|
268
|
+
|
|
269
|
+
out_file_left_name = os.path.join(
|
|
270
|
+
pair_folder, key + "_left_epipolar.tif"
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
orchestrator.add_to_save_lists(
|
|
274
|
+
out_file_left_name,
|
|
275
|
+
key,
|
|
276
|
+
epi_disparity_ground_truth_left,
|
|
277
|
+
dtype=inputs.rasterio_get_dtype(auxiliary_values[key]),
|
|
278
|
+
nodata=inputs.rasterio_get_nodata(
|
|
279
|
+
auxiliary_values[key]
|
|
280
|
+
),
|
|
281
|
+
cars_ds_name=key,
|
|
282
|
+
optional_data=option,
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
out_file_right_name = os.path.join(
|
|
286
|
+
pair_folder, key + "_right_epipolar.tif"
|
|
287
|
+
)
|
|
288
|
+
|
|
289
|
+
orchestrator.add_to_save_lists(
|
|
290
|
+
out_file_right_name,
|
|
291
|
+
key,
|
|
292
|
+
epi_disp_ground_truth_right,
|
|
293
|
+
dtype=inputs.rasterio_get_dtype(auxiliary_values[key]),
|
|
294
|
+
nodata=inputs.rasterio_get_nodata(
|
|
295
|
+
auxiliary_values[key]
|
|
296
|
+
),
|
|
297
|
+
cars_ds_name=key,
|
|
298
|
+
optional_data=option,
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
# Get saving infos in order to save tiles when they are computed
|
|
302
|
+
[saving_infos_epi_left] = self.orchestrator.get_saving_infos(
|
|
303
|
+
[epi_disparity_ground_truth_left]
|
|
304
|
+
)
|
|
305
|
+
[saving_infos_epi_right] = self.orchestrator.get_saving_infos(
|
|
306
|
+
[epi_disp_ground_truth_right]
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
for col in range(
|
|
310
|
+
epi_disparity_ground_truth_left.tiling_grid.shape[1]
|
|
311
|
+
):
|
|
312
|
+
for row in range(
|
|
313
|
+
epi_disparity_ground_truth_left.tiling_grid.shape[0]
|
|
314
|
+
):
|
|
315
|
+
# update saving infos with row col
|
|
316
|
+
full_saving_info_left = ocht.update_saving_infos(
|
|
317
|
+
saving_infos_epi_left, row=row, col=col
|
|
318
|
+
)
|
|
319
|
+
full_saving_info_right = ocht.update_saving_infos(
|
|
320
|
+
saving_infos_epi_right, row=row, col=col
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
# generate ground truth
|
|
324
|
+
(
|
|
325
|
+
epi_disparity_ground_truth_left[row, col]
|
|
326
|
+
) = self.orchestrator.cluster.create_task(
|
|
327
|
+
maps_generation_wrapper, nout=1
|
|
328
|
+
)(
|
|
329
|
+
sensor_left,
|
|
330
|
+
grid_left,
|
|
331
|
+
geom_plugin,
|
|
332
|
+
disp_to_alt_ratio,
|
|
333
|
+
"epipolar",
|
|
334
|
+
full_saving_info_left,
|
|
335
|
+
epi_disparity_ground_truth_left.tiling_grid[row, col],
|
|
336
|
+
auxiliary_values,
|
|
337
|
+
auxiliary_interp,
|
|
338
|
+
geom_plugin_dem_median=geom_plugin_dem_median,
|
|
339
|
+
window_dict=(
|
|
340
|
+
epi_disparity_ground_truth_left.get_window_as_dict(
|
|
341
|
+
row, col
|
|
342
|
+
)
|
|
343
|
+
),
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
(
|
|
347
|
+
epi_disp_ground_truth_right[row, col]
|
|
348
|
+
) = self.orchestrator.cluster.create_task(
|
|
349
|
+
maps_generation_wrapper, nout=1
|
|
350
|
+
)(
|
|
351
|
+
sensor_right,
|
|
352
|
+
grid_right,
|
|
353
|
+
geom_plugin,
|
|
354
|
+
disp_to_alt_ratio,
|
|
355
|
+
"epipolar",
|
|
356
|
+
full_saving_info_right,
|
|
357
|
+
epi_disp_ground_truth_right.tiling_grid[row, col],
|
|
358
|
+
auxiliary_values,
|
|
359
|
+
auxiliary_interp,
|
|
360
|
+
geom_plugin_dem_median=geom_plugin_dem_median,
|
|
361
|
+
reverse=True,
|
|
362
|
+
window_dict=(
|
|
363
|
+
epi_disp_ground_truth_right.get_window_as_dict(
|
|
364
|
+
row, col
|
|
365
|
+
)
|
|
366
|
+
),
|
|
367
|
+
)
|
|
368
|
+
|
|
369
|
+
if self.used_config["target"] in ["all", "sensor"]:
|
|
370
|
+
|
|
371
|
+
sensor_dsm_gt_left = cars_dataset.CarsDataset(
|
|
372
|
+
"arrays", name="sensor_dsm_ground_truth_left" + pair_key
|
|
373
|
+
)
|
|
374
|
+
sensor_dsm_gt_right = cars_dataset.CarsDataset(
|
|
375
|
+
"arrays", name="sensor_dsm_ground_truth_right" + pair_key
|
|
376
|
+
)
|
|
377
|
+
|
|
378
|
+
# update grid
|
|
379
|
+
sensor_dsm_gt_left.create_grid(
|
|
380
|
+
width_left, height_left, self.tile_size, self.tile_size, 0, 0
|
|
381
|
+
)
|
|
382
|
+
sensor_dsm_gt_right.create_grid(
|
|
383
|
+
width_right, height_right, self.tile_size, self.tile_size, 0, 0
|
|
384
|
+
)
|
|
385
|
+
|
|
386
|
+
self.orchestrator.add_to_save_lists(
|
|
387
|
+
os.path.join(pair_folder, "sensor_dsm_ground_truth_left.tif"),
|
|
388
|
+
cst.SENSOR_GROUND_TRUTH,
|
|
389
|
+
sensor_dsm_gt_left,
|
|
390
|
+
cars_ds_name="sensor_dsm_ground_truth_left",
|
|
391
|
+
)
|
|
392
|
+
self.orchestrator.add_to_save_lists(
|
|
393
|
+
os.path.join(pair_folder, "sensor_dsm_ground_truth_right.tif"),
|
|
394
|
+
cst.SENSOR_GROUND_TRUTH,
|
|
395
|
+
sensor_dsm_gt_right,
|
|
396
|
+
cars_ds_name="sensor_dsm_ground_truth_right",
|
|
397
|
+
)
|
|
398
|
+
|
|
399
|
+
# Save all file that are in inputs
|
|
400
|
+
if auxiliary_values is not None:
|
|
401
|
+
for key in auxiliary_values.keys():
|
|
402
|
+
if key in (cst.DSM_COLOR, cst.DSM_WEIGHTS_SUM):
|
|
403
|
+
option = False
|
|
404
|
+
else:
|
|
405
|
+
option = True
|
|
406
|
+
|
|
407
|
+
out_file_left_name = os.path.join(
|
|
408
|
+
pair_folder, key + "_left_sensor.tif"
|
|
409
|
+
)
|
|
410
|
+
|
|
411
|
+
orchestrator.add_to_save_lists(
|
|
412
|
+
out_file_left_name,
|
|
413
|
+
key,
|
|
414
|
+
sensor_dsm_gt_left,
|
|
415
|
+
dtype=inputs.rasterio_get_dtype(auxiliary_values[key]),
|
|
416
|
+
nodata=inputs.rasterio_get_nodata(
|
|
417
|
+
auxiliary_values[key]
|
|
418
|
+
),
|
|
419
|
+
cars_ds_name=key,
|
|
420
|
+
optional_data=option,
|
|
421
|
+
)
|
|
422
|
+
|
|
423
|
+
out_file_right_name = os.path.join(
|
|
424
|
+
pair_folder, key + "_right_sensor.tif"
|
|
425
|
+
)
|
|
426
|
+
|
|
427
|
+
orchestrator.add_to_save_lists(
|
|
428
|
+
out_file_right_name,
|
|
429
|
+
key,
|
|
430
|
+
sensor_dsm_gt_right,
|
|
431
|
+
dtype=inputs.rasterio_get_dtype(auxiliary_values[key]),
|
|
432
|
+
nodata=inputs.rasterio_get_nodata(
|
|
433
|
+
auxiliary_values[key]
|
|
434
|
+
),
|
|
435
|
+
cars_ds_name=key,
|
|
436
|
+
optional_data=option,
|
|
437
|
+
)
|
|
438
|
+
|
|
439
|
+
# Get saving infos in order to save tiles when they are computed
|
|
440
|
+
[saving_infos_sensor_left] = self.orchestrator.get_saving_infos(
|
|
441
|
+
[sensor_dsm_gt_left]
|
|
442
|
+
)
|
|
443
|
+
[saving_infos_sensor_right] = self.orchestrator.get_saving_infos(
|
|
444
|
+
[sensor_dsm_gt_right]
|
|
445
|
+
)
|
|
446
|
+
|
|
447
|
+
# left
|
|
448
|
+
for col in range(sensor_dsm_gt_left.tiling_grid.shape[1]):
|
|
449
|
+
for row in range(sensor_dsm_gt_left.tiling_grid.shape[0]):
|
|
450
|
+
full_saving_info_left = ocht.update_saving_infos(
|
|
451
|
+
saving_infos_sensor_left, row=row, col=col
|
|
452
|
+
)
|
|
453
|
+
(
|
|
454
|
+
sensor_dsm_gt_left[row, col]
|
|
455
|
+
) = self.orchestrator.cluster.create_task(
|
|
456
|
+
maps_generation_wrapper, nout=1
|
|
457
|
+
)(
|
|
458
|
+
sensor_left,
|
|
459
|
+
grid_left,
|
|
460
|
+
geom_plugin,
|
|
461
|
+
disp_to_alt_ratio,
|
|
462
|
+
"sensor",
|
|
463
|
+
full_saving_info_left,
|
|
464
|
+
sensor_dsm_gt_left.tiling_grid[row, col],
|
|
465
|
+
auxiliary_values,
|
|
466
|
+
auxiliary_interp,
|
|
467
|
+
raster_profile=raster_profile_left,
|
|
468
|
+
window_dict=sensor_dsm_gt_left.get_window_as_dict(
|
|
469
|
+
row, col
|
|
470
|
+
),
|
|
471
|
+
)
|
|
472
|
+
|
|
473
|
+
# right
|
|
474
|
+
for col in range(sensor_dsm_gt_right.tiling_grid.shape[1]):
|
|
475
|
+
for row in range(sensor_dsm_gt_right.tiling_grid.shape[0]):
|
|
476
|
+
full_saving_info_right = ocht.update_saving_infos(
|
|
477
|
+
saving_infos_sensor_right, row=row, col=col
|
|
478
|
+
)
|
|
479
|
+
(
|
|
480
|
+
sensor_dsm_gt_right[row, col]
|
|
481
|
+
) = self.orchestrator.cluster.create_task(
|
|
482
|
+
maps_generation_wrapper, nout=1
|
|
483
|
+
)(
|
|
484
|
+
sensor_right,
|
|
485
|
+
grid_right,
|
|
486
|
+
geom_plugin,
|
|
487
|
+
disp_to_alt_ratio,
|
|
488
|
+
"sensor",
|
|
489
|
+
full_saving_info_right,
|
|
490
|
+
sensor_dsm_gt_right.tiling_grid[row, col],
|
|
491
|
+
auxiliary_values,
|
|
492
|
+
auxiliary_interp,
|
|
493
|
+
raster_profile=raster_profile_right,
|
|
494
|
+
window_dict=sensor_dsm_gt_right.get_window_as_dict(
|
|
495
|
+
row, col
|
|
496
|
+
),
|
|
497
|
+
)
|
|
498
|
+
|
|
499
|
+
|
|
500
|
+
def maps_generation_wrapper( # pylint: disable=too-many-positional-arguments
|
|
501
|
+
sensor_left,
|
|
502
|
+
grid_left,
|
|
503
|
+
geom_plugin,
|
|
504
|
+
disp_to_alt_ratio,
|
|
505
|
+
target,
|
|
506
|
+
saving_infos,
|
|
507
|
+
window,
|
|
508
|
+
auxiliary_values,
|
|
509
|
+
auxiliary_interp,
|
|
510
|
+
raster_profile=None,
|
|
511
|
+
geom_plugin_dem_median=None,
|
|
512
|
+
reverse=False,
|
|
513
|
+
window_dict=None,
|
|
514
|
+
):
|
|
515
|
+
"""
|
|
516
|
+
Computes ground truth epipolar disparity map and sensor geometry.
|
|
517
|
+
|
|
518
|
+
:param sensor_left: sensor data
|
|
519
|
+
Dict must contain keys: "image", "texture", "geomodel",
|
|
520
|
+
"no_data", "mask". Paths must be absolute.
|
|
521
|
+
:type sensor_left: dict
|
|
522
|
+
:param grid_left: Grid left.
|
|
523
|
+
:type grid_left: CarsDataset
|
|
524
|
+
:param geom_plugin: Geometry plugin with user's DSM used to
|
|
525
|
+
generate epipolar grids.
|
|
526
|
+
:type geom_plugin: GeometryPlugin
|
|
527
|
+
:param disp_to_alt_ratio: Disp to altitude ratio used for performance map.
|
|
528
|
+
:type disp_to_alt_ratio: float
|
|
529
|
+
:param target: "epipolar", "sensor", or both ("all") geometry.
|
|
530
|
+
:type target: str
|
|
531
|
+
:param saving_infos: Information about CarsDataset ID.
|
|
532
|
+
:type saving_infos: dict
|
|
533
|
+
:param window: size of tile
|
|
534
|
+
:type window: np.ndarray
|
|
535
|
+
:param raster_profile: dictionnary containing dataset information
|
|
536
|
+
:type raster_profile: dict
|
|
537
|
+
:param geom_plugin_dem_median: Geometry plugin with dem median
|
|
538
|
+
:type geom_plugin_dem_median: geometry_plugin
|
|
539
|
+
:param reverse: true if right-> left
|
|
540
|
+
:type reverse: bool
|
|
541
|
+
:param window_dict: window as dict
|
|
542
|
+
"""
|
|
543
|
+
|
|
544
|
+
ground_truth, direct_loc = gnd_truth_algo.get_ground_truth(
|
|
545
|
+
geom_plugin,
|
|
546
|
+
grid_left,
|
|
547
|
+
sensor_left,
|
|
548
|
+
disp_to_alt_ratio,
|
|
549
|
+
target,
|
|
550
|
+
window,
|
|
551
|
+
geom_plugin_dem_median,
|
|
552
|
+
reverse=reverse,
|
|
553
|
+
)
|
|
554
|
+
|
|
555
|
+
constant_for_dataset = cst.EPI_GROUND_TRUTH
|
|
556
|
+
if target == "sensor":
|
|
557
|
+
constant_for_dataset = cst.SENSOR_GROUND_TRUTH
|
|
558
|
+
|
|
559
|
+
rows = np.arange(window[0], window[1])
|
|
560
|
+
cols = np.arange(window[2], window[3])
|
|
561
|
+
|
|
562
|
+
values = {
|
|
563
|
+
constant_for_dataset: (
|
|
564
|
+
[
|
|
565
|
+
cst.ROW,
|
|
566
|
+
cst.COL,
|
|
567
|
+
],
|
|
568
|
+
ground_truth,
|
|
569
|
+
)
|
|
570
|
+
}
|
|
571
|
+
outputs_dataset = xr.Dataset(
|
|
572
|
+
values,
|
|
573
|
+
coords={cst.ROW: rows, cst.COL: cols},
|
|
574
|
+
)
|
|
575
|
+
|
|
576
|
+
if auxiliary_values is not None:
|
|
577
|
+
for key in auxiliary_values.keys():
|
|
578
|
+
if auxiliary_interp is not None and key in auxiliary_interp:
|
|
579
|
+
interpolation = auxiliary_interp[key]
|
|
580
|
+
else:
|
|
581
|
+
interpolation = "nearest"
|
|
582
|
+
|
|
583
|
+
band_description = inputs.get_descriptions_bands(
|
|
584
|
+
auxiliary_values[key]
|
|
585
|
+
)
|
|
586
|
+
|
|
587
|
+
keep_band = False
|
|
588
|
+
if band_description[0] is not None or len(band_description) > 1:
|
|
589
|
+
if len(band_description) == 1:
|
|
590
|
+
band_description = np.array([band_description[0]])
|
|
591
|
+
else:
|
|
592
|
+
band_description = list(band_description)
|
|
593
|
+
|
|
594
|
+
band_description = [
|
|
595
|
+
"band_" + str(i + 1) if v is None else v
|
|
596
|
+
for i, v in enumerate(band_description)
|
|
597
|
+
]
|
|
598
|
+
|
|
599
|
+
outputs_dataset.coords[cst.BAND_IM] = (
|
|
600
|
+
key,
|
|
601
|
+
band_description,
|
|
602
|
+
)
|
|
603
|
+
dim = [key, cst.Y, cst.X]
|
|
604
|
+
keep_band = True
|
|
605
|
+
else:
|
|
606
|
+
dim = [cst.Y, cst.X]
|
|
607
|
+
|
|
608
|
+
interp_value = gnd_truth_algo.resample_auxiliary_values(
|
|
609
|
+
direct_loc,
|
|
610
|
+
auxiliary_values[key],
|
|
611
|
+
window,
|
|
612
|
+
interpolation,
|
|
613
|
+
keep_band,
|
|
614
|
+
)
|
|
615
|
+
|
|
616
|
+
outputs_dataset[key] = (dim, interp_value)
|
|
617
|
+
|
|
618
|
+
# Fill datasets based on target
|
|
619
|
+
attributes = {}
|
|
620
|
+
# Return results based on target
|
|
621
|
+
cars_dataset.fill_dataset(
|
|
622
|
+
outputs_dataset,
|
|
623
|
+
saving_info=saving_infos,
|
|
624
|
+
window=window_dict,
|
|
625
|
+
attributes=attributes,
|
|
626
|
+
profile=raster_profile,
|
|
627
|
+
)
|
|
628
|
+
|
|
629
|
+
return outputs_dataset
|