.. _example_active_learning: Active learning with Random Forest for topo-bathymetric point clouds ********************************************************************** Active learning is a training paradigm that allows us to train models on unlabeled datasets without manually labeling a full training dataset. It is a human-in-the-loop approach that enables semiautomatic labeling. The first step consists of building a good initial budget, i.e., manually labeling a portion of the data that significantly represents the model's task. One common pitfall that prevents successful active learning is to start the loop with a poor initial budget `(see Lüth et al., 2023) `_. Once the initial budget is built, the active learning loop will iterate until the oracle (i.e., the human actor in the active learning loop) decides that the results are good enough. In the fully automatic self-training paradigm, the model is trained directly on its predictions. On the contrary, in active learning, the oracle manually corrects the predictions and selects the more relevant ones (typically following an uncertainty-guided strategy, e.g., considering high-uncertainty regions to extend the training dataset) for the next iteration. The figure below represents the most basic form of an active learning loop. The entry point for this loop could be the oracle building the initial budget. Alternatively, it can start at model training when there is a labeled training dataset that can be used as the initial budget, e.g., 1) generated by simulation `(see Esmoris et al., 2024) `_ or 2) a partially labeled dataset (as is the case of this example, where one of the point clouds in the dataset is already labeled). .. figure:: ../../img/active_learning_basics.png :scale: 45 :alt: Figure representing the basics of an active learning loop. Data ====== The point clouds used in this example are from the `Pielach River research dataset October 2024 `_ acquired by Silvia Glas et al. combining a green water penetrating laser with a wavelength of :math:`532\,\text{nm}` and near-infrarred laser with a wavelength of :math:`905\,\text{nm}`. Further details about the dataset can be read at `Mandlburger et al. (2025) `_. JSON ====== All the JSONs here described, as well as the missing ones corresponding to intermediate active learning iterations, are available in the VL3D++ repository at the ``spec/demo/al_pielach`` folder. First training JSON ----------------------- The JSON below was used to train the initial Random Forest using the only classified point cloud available in the dataset (*Pielach_20241024_topoBathy_LiDAR*). Note that it transforms the original classes to merge all the outliers in a single class. Furthermore, note that the input file is not the original classified point cloud as downloaded. Instead, it has been updated so its classification attribute starts at zero and continues with sequential unitary increments. .. code-block:: json { "in_pcloud_concat": [ { "in_pcloud": "/data/topobathy/active_learning/iterative_dataset/T0/Pielach_20241024_topoBathy_LiDAR.laz", "conditions": null } ], "out_pcloud": ["/data/topobathy/vl3d/out/T0/*"], "sequential_pipeline": [ { "class_transformer": "ClassReducer", "on_predictions": false, "input_class_names": ["ground", "vegetation", "riverbot", "watersurf", "low_outlier", "high_outlier", "water_outlier"], "output_class_names": ["ground", "vegetation", "riverbot", "watersurf", "outlier"], "class_groups": [ ["ground"], ["vegetation"], ["riverbot"], ["watersurf"], ["low_outlier", "high_outlier", "water_outlier"] ], "report_path": "*training/class_reduction.log", "plot_path": "*training/class_reduction.svg" }, { "miner": "SmoothFeaturesPP", "nan_policy": "replace", "neighborhood": { "type": "sphere", "radius": 0.15 }, "weighted_mean_omega": 0, "gaussian_rbf_omega": 0, "input_fnames": ["number_of_returns", "Reflectance", "FWA"], "fnames": ["mean"], "frenames": ["nor_mean_r0_15", "refl_mean_r0_15", "FWA_mean_r0_15"], "nthreads": -1 }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/3", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "SmoothFeaturesPP", "nan_policy": "replace", "neighborhood": { "type": "sphere", "radius": 0.6 }, "weighted_mean_omega": 0, "gaussian_rbf_omega": 0, "input_fnames": ["number_of_returns", "Reflectance", "FWA"], "fnames": ["mean"], "frenames": ["nor_mean_r0_6", "refl_mean_r0_6", "FWA_mean_r0_6"], "nthreads": -1 } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/5", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "SmoothFeaturesPP", "nan_policy": "replace", "neighborhood": { "type": "sphere", "radius": 1.2 }, "weighted_mean_omega": 0, "gaussian_rbf_omega": 0, "input_fnames": ["number_of_returns", "Reflectance", "FWA"], "fnames": ["mean"], "frenames": ["nor_mean_r1_2", "refl_mean_r1_2", "FWA_mean_r1_2"], "nthreads": -1 } }, { "miner": "GeometricFeatures", "radius": 0.15, "fnames": ["linearity", "planarity", "surface_variation", "verticality", "anisotropy", "omnivariance", "PCA1", "PCA2"], "frenames": ["linearity_r0_15", "planarity_r0_15", "surface_variation_r0_15", "verticality_r0_15", "anisotropy_r0_15", "omnivariance_r0_15", "PCA1_r0_15", "PCA2_r0_15"], "nthreads": -1 }, { "miner": "GeometricFeatures", "radius": 0.30, "fnames": ["linearity", "planarity", "surface_variation", "verticality", "anisotropy", "omnivariance", "PCA1", "PCA2"], "frenames": ["linearity_r0_3", "planarity_r0_3", "surface_variation_r0_3", "verticality_r0_3", "anisotropy_r0_3", "omnivariance_r0_3", "PCA1_r0_3", "PCA2_r0_3"], "nthreads": -1 }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/3", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "GeometricFeatures", "radius": 0.6, "fnames": ["linearity", "planarity", "surface_variation", "verticality", "anisotropy", "omnivariance", "PCA1", "PCA2"], "frenames": ["linearity_r0_6", "planarity_r0_6", "surface_variation_r0_6", "verticality_r0_6", "anisotropy_r0_6", "omnivariance_r0_6", "PCA1_r0_6", "PCA2_r0_6"], "nthreads": -1 } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/5", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "GeometricFeatures", "radius": 1.2, "fnames": ["linearity", "planarity", "surface_variation", "verticality", "anisotropy", "omnivariance", "PCA1", "PCA2"], "frenames": ["linearity_r1_2", "planarity_r1_2", "surface_variation_r1_2", "verticality_r1_2", "anisotropy_r1_2", "omnivariance_r1_2", "PCA1_r1_2", "PCA2_r1_2"], "nthreads": -1 } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/7", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "HeightFeaturesPP", "nthreads": -1, "neighborhood": { "type": "Cylinder", "radius": 5.0, "separation_factor": 0 }, "outlier_filter": null, "fnames": ["floor_distance", "ceil_distance"], "frenames": ["floor_dist_r5", "ceil_dist_r5"] } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/23", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "HeightFeaturesPP", "nthreads": -1, "neighborhood": { "type": "Cylinder", "radius": 15.0, "separation_factor": 0 }, "outlier_filter": null, "fnames": ["floor_distance", "ceil_distance"], "frenames": ["floor_dist_r15", "ceil_dist_r15"] } }, { "writer": "Writer", "out_pcloud": "*training/training_feats.las" }, { "train": "RandomForestClassifier", "fnames": ["AUTO"], "training_type": "base", "random_seed": null, "shuffle_points": false, "model_args": { "n_estimators": 100, "criterion": "entropy", "max_depth": 25, "min_samples_split": 16, "min_samples_leaf": 4, "min_weight_fraction_leaf": 0.0, "max_features": "sqrt", "max_leaf_nodes": null, "min_impurity_decrease": 0.0, "bootstrap": true, "oob_score": false, "n_jobs": -1, "warm_start": false, "class_weight": null, "ccp_alpha": 0.0, "max_samples": 0.8 }, "hyperparameter_tuning": null, "importance_report_path": "*training/RF_importance.log", "importance_report_permutation": false, "decision_plot_path": null, "decision_plot_trees": 0, "decision_plot_max_depth": 0 }, { "writer": "PredictivePipelineWriter", "out_pipeline": "*pipe/rf_topobathy.pipe", "include_writer": false, "include_imputer": false, "include_feature_transformer": false, "include_miner": true, "include_class_transformer": false } ] } First prediction JSON ------------------------ Once the first model has been trained, it can be used to classify the many available point clouds. On top of that, the uncertainty evaluation will provide point-wise class ambiguities that can help us understanding what points are more problematic. This information can guide us to semi-automatically generate a second training point cloud to improve the model. In doing so we will start by considering the predictions of the model and then manually correcting them where they fail. The JSON below illustrates how to compute these predictions from the previously trained Random Forest. .. code-block:: json { "in_pcloud": [ "/data/topobathy/raw/241024_092229_0_GR.laz", "/data/topobathy/raw/241024_092229_1_GR.laz", "/data/topobathy/raw/241024_092304_1_GR.laz", "/data/topobathy/raw/241024_092343_0_GR.laz", "/data/topobathy/raw/241024_092343_1_GR.laz", "/data/topobathy/raw/241024_092423_0_GR.laz", "/data/topobathy/raw/241024_092423_1_GR.laz", "/data/topobathy/raw/241024_092459_0_GR.laz", "/data/topobathy/raw/241024_092459_1_GR.laz", "/data/topobathy/raw/241024_093749_0_GR.laz", "/data/topobathy/raw/241024_093749_1_GR.laz", "/data/topobathy/raw/241024_093823_0_GR.laz", "/data/topobathy/raw/241024_093823_1_GR.laz", "/data/topobathy/raw/241024_093839_0_GR.laz", "/data/topobathy/raw/241024_093839_1_GR.laz", "/data/topobathy/raw/241024_093903_0_GR.laz", "/data/topobathy/raw/241024_093903_1_GR.laz", "/data/topobathy/raw/241024_093927_0_GR.laz", "/data/topobathy/raw/241024_093927_1_GR.laz", "/data/topobathy/raw/241024_093959_0_GR.laz", "/data/topobathy/raw/241024_093959_1_GR.laz", "/data/topobathy/raw/241024_094030_0_GR.laz", "/data/topobathy/raw/241024_094030_1_GR.laz", "/data/topobathy/raw/241024_094055_0_GR.laz", "/data/topobathy/raw/241024_094055_1_GR.laz", "/data/topobathy/raw/241024_094130_0_GR.laz", "/data/topobathy/raw/241024_094130_1_GR.laz", "/data/topobathy/raw/241024_094540_0_GR.laz", "/data/topobathy/raw/241024_094540_1_GR.laz", "/data/topobathy/raw/241024_094630_0_GR.laz", "/data/topobathy/raw/241024_094630_1_GR.laz" ], "out_pcloud": [ "/data/topobathy/vl3d/out/T0/pred/241024_092229_0_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_092229_1_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_092304_1_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_092343_0_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_092343_1_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_092423_0_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_092423_1_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_092459_0_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_092459_1_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_093749_0_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_093749_1_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_093823_0_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_093823_1_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_093839_0_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_093839_1_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_093903_0_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_093903_1_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_093927_0_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_093927_1_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_093959_0_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_093959_1_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_094030_0_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_094030_1_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_094055_0_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_094055_1_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_094130_0_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_094130_1_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_094540_0_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_094540_1_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_094630_0_GR/*", "/data/topobathy/vl3d/out/T0/pred/241024_094630_1_GR/*" ], "sequential_pipeline": [ { "predict": "PredictivePipeline", "model_path": "/data/topobathy/vl3d/out/T0/pipe/rf_topobathy.pipe", "nn_path": null }, { "eval": "ClassificationUncertaintyEvaluator", "class_names": ["ground", "vegetation", "riverbot", "watersurf", "outlier"], "include_probabilities": true, "include_weighted_entropy": false, "include_clusters": false, "weight_by_predictions": false, "num_clusters": 0, "clustering_max_iters": 0, "clustering_batch_size": 0, "clustering_entropy_weights": false, "clustering_reduce_function": null, "gaussian_kernel_points": 0, "report_path": "*/uncertainty/uncertainty.las", "plot_path": null } ] } Second training JSON ----------------------- A few experiments with different training JSONs were conducted with the first labeled point cloud. Thus, the features for the next iteration were updated. Note that class-wise training sampling has also been introduced at this iteration. The JSON below represents the model used for the second iteration of the active learning approach. .. code-block:: json { "in_pcloud_concat": [ { "in_pcloud": "/data/topobathy/active_learning/iterative_dataset/T1/241024_092229_0_GR_mined.laz", "fnames": ["Reflectance", "FWA", "number_of_returns"], "conditions": null }, { "in_pcloud": "/data/topobathy/active_learning/iterative_dataset/T1/Pielach_20241024_topoBathy_LiDAR.laz", "conditions": null } ], "out_pcloud": ["/data/topobathy/vl3d/out/T1/*"], "sequential_pipeline": [ { "miner": "RecountPP", "nthreads": -1, "neighborhood": { "type": "sphere", "radius": 0.30 }, "input_fnames": ["number_of_returns", "FWA"], "filters": [ { "filter_name": "manyret_r0_3", "ignore_nan": true, "absolute_frequency": true, "relative_frequency": true, "surface_density": false, "volume_density": false, "vertical_segments": 0, "conditions": [ { "value_name": "number_of_returns", "condition_type": "greater_than", "value_target": 1 } ] }, { "filter_name": "ret2_r0_3", "ignore_nan": true, "absolute_frequency": true, "relative_frequency": true, "surface_density": false, "volume_density": false, "vertical_segments": 0, "conditions": [ { "value_name": "number_of_returns", "condition_type": "equals", "value_target": 2 } ] }, { "filter_name": "fwa1_r0_3", "ignore_nan": true, "absolute_frequency": true, "relative_frequency": true, "surface_density": false, "volume_density": false, "vertical_segments": 0, "conditions": [ { "value_name": "FWA", "condition_type": "equals", "value_target": 1 } ] } ] }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/2", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "RecountPP", "nthreads": -1, "neighborhood": { "type": "sphere", "radius": 0.6 }, "input_fnames": ["number_of_returns", "FWA"], "filters": [ { "filter_name": "manyret_r0_6", "ignore_nan": true, "absolute_frequency": true, "relative_frequency": true, "surface_density": false, "volume_density": false, "vertical_segments": 0, "conditions": [ { "value_name": "number_of_returns", "condition_type": "greater_than", "value_target": 1 } ] }, { "filter_name": "ret2_r0_6", "ignore_nan": true, "absolute_frequency": true, "relative_frequency": true, "surface_density": false, "volume_density": false, "vertical_segments": 0, "conditions": [ { "value_name": "number_of_returns", "condition_type": "equals", "value_target": 2 } ] }, { "filter_name": "fwa1_r0_6", "ignore_nan": true, "absolute_frequency": true, "relative_frequency": true, "surface_density": false, "volume_density": false, "vertical_segments": 0, "conditions": [ { "value_name": "FWA", "condition_type": "equals", "value_target": 1 } ] } ] } }, { "miner": "SmoothFeaturesPP", "nan_policy": "replace", "neighborhood": { "type": "sphere", "radius": 0.15 }, "weighted_mean_omega": 0, "gaussian_rbf_omega": 0, "input_fnames": ["number_of_returns", "Reflectance", "FWA"], "fnames": ["mean"], "frenames": ["nor_mean_r0_15", "refl_mean_r0_15", "FWA_mean_r0_15"], "nthreads": -1 }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/2", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "SmoothFeaturesPP", "nan_policy": "replace", "neighborhood": { "type": "sphere", "radius": 0.6 }, "weighted_mean_omega": 0, "gaussian_rbf_omega": 0, "input_fnames": ["number_of_returns", "Reflectance", "FWA"], "fnames": ["mean"], "frenames": ["nor_mean_r0_6", "refl_mean_r0_6", "FWA_mean_r0_6"], "nthreads": -1 } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/3", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "SmoothFeaturesPP", "nan_policy": "replace", "neighborhood": { "type": "sphere", "radius": 1.2 }, "weighted_mean_omega": 0, "gaussian_rbf_omega": 0, "input_fnames": ["number_of_returns", "Reflectance", "FWA"], "fnames": ["mean"], "frenames": ["nor_mean_r1_2", "refl_mean_r1_2", "FWA_mean_r1_2"], "nthreads": -1 } }, { "miner": "GeometricFeatures", "radius": 0.15, "fnames": ["linearity", "planarity", "surface_variation", "verticality", "anisotropy", "omnivariance", "PCA1", "PCA2"], "frenames": ["linearity_r0_15", "planarity_r0_15", "surface_variation_r0_15", "verticality_r0_15", "anisotropy_r0_15", "omnivariance_r0_15", "PCA1_r0_15", "PCA2_r0_15"], "nthreads": -1 }, { "miner": "GeometricFeatures", "radius": 0.30, "fnames": ["linearity", "planarity", "surface_variation", "verticality", "anisotropy", "omnivariance", "PCA1", "PCA2"], "frenames": ["linearity_r0_3", "planarity_r0_3", "surface_variation_r0_3", "verticality_r0_3", "anisotropy_r0_3", "omnivariance_r0_3", "PCA1_r0_3", "PCA2_r0_3"], "nthreads": -1 }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/2", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "GeometricFeatures", "radius": 0.6, "fnames": ["linearity", "planarity", "surface_variation", "verticality", "anisotropy", "omnivariance", "PCA1", "PCA2"], "frenames": ["linearity_r0_6", "planarity_r0_6", "surface_variation_r0_6", "verticality_r0_6", "anisotropy_r0_6", "omnivariance_r0_6", "PCA1_r0_6", "PCA2_r0_6"], "nthreads": -1 } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/3", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "GeometricFeatures", "radius": 1.2, "fnames": ["linearity", "planarity", "surface_variation", "verticality", "anisotropy", "omnivariance", "PCA1", "PCA2"], "frenames": ["linearity_r1_2", "planarity_r1_2", "surface_variation_r1_2", "verticality_r1_2", "anisotropy_r1_2", "omnivariance_r1_2", "PCA1_r1_2", "PCA2_r1_2"], "nthreads": -1 } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/5", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "GeometricFeatures", "radius": 2.4, "fnames": ["linearity", "planarity", "surface_variation", "verticality", "anisotropy", "omnivariance", "PCA1", "PCA2"], "frenames": ["linearity_r2_4", "planarity_r2_4", "surface_variation_r2_4", "verticality_r2_4", "anisotropy_r2_4", "omnivariance_r2_4", "PCA1_r2_4", "PCA2_r2_4"], "nthreads": -1 } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/7", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "GeometricFeatures", "radius": 4.8, "fnames": ["linearity", "planarity", "surface_variation", "verticality", "anisotropy", "omnivariance", "PCA1", "PCA2"], "frenames": ["linearity_r4_8", "planarity_r4_8", "surface_variation_r4_8", "verticality_r4_8", "anisotropy_r4_8", "omnivariance_r4_8", "PCA1_r4_8", "PCA2_r4_8"], "nthreads": -1 } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/5", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "HeightFeaturesPP", "nthreads": -1, "neighborhood": { "type": "Cylinder", "radius": 2.5, "separation_factor": 0 }, "outlier_filter": null, "fnames": ["floor_distance", "ceil_distance"], "frenames": ["floor_dist_r2_5", "ceil_dist_r2_5"] } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/7", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "HeightFeaturesPP", "nthreads": -1, "neighborhood": { "type": "Cylinder", "radius": 5.0, "separation_factor": 0 }, "outlier_filter": null, "fnames": ["floor_distance", "ceil_distance"], "frenames": ["floor_dist_r5", "ceil_dist_r5"] } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/23", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "HeightFeaturesPP", "nthreads": -1, "neighborhood": { "type": "Cylinder", "radius": 15.0, "separation_factor": 0 }, "outlier_filter": null, "fnames": ["floor_distance", "ceil_distance"], "frenames": ["floor_dist_r15", "ceil_dist_r15"] } }, { "writer": "Writer", "out_pcloud": "*training/training_feats.las" }, { "train": "RandomForestClassifier", "fnames": ["AUTO"], "training_type": "base", "random_seed": null, "shuffle_points": false, "model_args": { "n_estimators": 100, "criterion": "entropy", "max_depth": 25, "min_samples_split": 16, "min_samples_leaf": 4, "min_weight_fraction_leaf": 0.0, "max_features": "sqrt", "max_leaf_nodes": null, "min_impurity_decrease": 0.0, "bootstrap": true, "oob_score": false, "n_jobs": -1, "warm_start": false, "class_weight": null, "ccp_alpha": 0.0, "max_samples": 0.8 }, "hyperparameter_tuning": null, "importance_report_path": "*training/RF_importance.log", "importance_report_permutation": false, "decision_plot_path": null, "decision_plot_trees": 0, "decision_plot_max_depth": 0, "training_data_pipeline": [ { "component": "ClasswiseSampler", "component_args": { "target_class_distribution": [10000000, 10000000, 10000000, 10000000, 10000000, 0], "replace": false } } ] }, { "writer": "PredictivePipelineWriter", "out_pipeline": "*pipe/rf_topobathy.pipe", "include_writer": false, "include_imputer": false, "include_feature_transformer": false, "include_miner": true, "include_class_transformer": false } ] } Final training JSON ---------------------- Finally, the last active learning iteration in this example corresponds to the JSON below. Note that the advanced input translates the point clouds to prevent corrupting the geometric features due to overlapping. A total of 9 point clouds out of 31 have been used for training, i.e., approximately 29% of the available data. .. code-block:: json { "in_pcloud_concat": [ { "in_pcloud": "/data/topobathy/active_learning/iterative_dataset/T10/241024_093903_1_GR_mined.laz", "fnames": ["Reflectance", "FWA", "number_of_returns"], "offset": [0, 0, 0], "conditions": null, "center": [500, 0, 0] }, { "in_pcloud": "/data/topobathy/active_learning/iterative_dataset/T9/241024_094055_0_GR_mined.laz", "conditions": null, "center": [-3000, 0, 0] }, { "in_pcloud": "/data/topobathy/active_learning/iterative_dataset/T8/241024_094030_0_GR_mined.laz", "conditions": null, "center": [-2500, 0, 0] }, { "in_pcloud": "/data/topobathy/active_learning/iterative_dataset/T7/241024_092343_0_GR_mined.laz", "conditions": null, "center": [-2000, 0, 0] }, { "in_pcloud": "/data/topobathy/active_learning/iterative_dataset/T5/241024_094630_0_GR_mined.laz", "conditions": null, "center": [-1000, 0, 0] }, { "in_pcloud": "/data/topobathy/active_learning/iterative_dataset/T4/241024_094055_1_GR_mined.laz", "conditions": null, "center": [-500, 0, 0] }, { "in_pcloud": "/data/topobathy/active_learning/iterative_dataset/T3/241024_093839_0_GR_mined.laz", "conditions": null, "center": [0, 0, 0] }, { "in_pcloud": "/data/topobathy/active_learning/iterative_dataset/T1/241024_092229_0_GR_mined.laz", "conditions": null, "center": [1000, 0, 0] }, { "in_pcloud": "/data/topobathy/active_learning/iterative_dataset/T1/Pielach_20241024_topoBathy_LiDAR.laz", "conditions": null, "center": [1500, 0, 0] } ], "out_pcloud": ["/data/topobathy/vl3d/out/T10/*"], "sequential_pipeline": [ { "miner": "RecountPP", "nthreads": -1, "neighborhood": { "type": "sphere", "radius": 0.30 }, "input_fnames": ["number_of_returns", "FWA"], "filters": [ { "filter_name": "manyret_r0_3", "ignore_nan": true, "absolute_frequency": true, "relative_frequency": true, "surface_density": false, "volume_density": false, "vertical_segments": 0, "conditions": [ { "value_name": "number_of_returns", "condition_type": "greater_than", "value_target": 1 } ] }, { "filter_name": "ret2_r0_3", "ignore_nan": true, "absolute_frequency": true, "relative_frequency": true, "surface_density": false, "volume_density": false, "vertical_segments": 0, "conditions": [ { "value_name": "number_of_returns", "condition_type": "equals", "value_target": 2 } ] }, { "filter_name": "fwa1_r0_3", "ignore_nan": true, "absolute_frequency": true, "relative_frequency": true, "surface_density": false, "volume_density": false, "vertical_segments": 0, "conditions": [ { "value_name": "FWA", "condition_type": "equals", "value_target": 1 } ] } ] }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/2", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "RecountPP", "nthreads": -1, "neighborhood": { "type": "sphere", "radius": 0.6 }, "input_fnames": ["number_of_returns", "FWA"], "filters": [ { "filter_name": "manyret_r0_6", "ignore_nan": true, "absolute_frequency": true, "relative_frequency": true, "surface_density": false, "volume_density": false, "vertical_segments": 0, "conditions": [ { "value_name": "number_of_returns", "condition_type": "greater_than", "value_target": 1 } ] }, { "filter_name": "ret2_r0_6", "ignore_nan": true, "absolute_frequency": true, "relative_frequency": true, "surface_density": false, "volume_density": false, "vertical_segments": 0, "conditions": [ { "value_name": "number_of_returns", "condition_type": "equals", "value_target": 2 } ] }, { "filter_name": "fwa1_r0_6", "ignore_nan": true, "absolute_frequency": true, "relative_frequency": true, "surface_density": false, "volume_density": false, "vertical_segments": 0, "conditions": [ { "value_name": "FWA", "condition_type": "equals", "value_target": 1 } ] } ] } }, { "miner": "SmoothFeaturesPP", "nan_policy": "replace", "neighborhood": { "type": "sphere", "radius": 0.15 }, "weighted_mean_omega": 0, "gaussian_rbf_omega": 0, "input_fnames": ["number_of_returns", "Reflectance", "FWA"], "fnames": ["mean"], "frenames": ["nor_mean_r0_15", "refl_mean_r0_15", "FWA_mean_r0_15"], "nthreads": -1 }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/2", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "SmoothFeaturesPP", "nan_policy": "replace", "neighborhood": { "type": "sphere", "radius": 0.6 }, "weighted_mean_omega": 0, "gaussian_rbf_omega": 0, "input_fnames": ["number_of_returns", "Reflectance", "FWA"], "fnames": ["mean"], "frenames": ["nor_mean_r0_6", "refl_mean_r0_6", "FWA_mean_r0_6"], "nthreads": -1 } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/3", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "SmoothFeaturesPP", "nan_policy": "replace", "neighborhood": { "type": "sphere", "radius": 1.2 }, "weighted_mean_omega": 0, "gaussian_rbf_omega": 0, "input_fnames": ["number_of_returns", "Reflectance", "FWA"], "fnames": ["mean"], "frenames": ["nor_mean_r1_2", "refl_mean_r1_2", "FWA_mean_r1_2"], "nthreads": -1 } }, { "miner": "GeometricFeatures", "radius": 0.15, "fnames": ["linearity", "planarity", "surface_variation", "verticality", "anisotropy", "omnivariance", "PCA1", "PCA2"], "frenames": ["linearity_r0_15", "planarity_r0_15", "surface_variation_r0_15", "verticality_r0_15", "anisotropy_r0_15", "omnivariance_r0_15", "PCA1_r0_15", "PCA2_r0_15"], "nthreads": -1 }, { "miner": "GeometricFeatures", "radius": 0.30, "fnames": ["linearity", "planarity", "surface_variation", "verticality", "anisotropy", "omnivariance", "PCA1", "PCA2"], "frenames": ["linearity_r0_3", "planarity_r0_3", "surface_variation_r0_3", "verticality_r0_3", "anisotropy_r0_3", "omnivariance_r0_3", "PCA1_r0_3", "PCA2_r0_3"], "nthreads": -1 }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/2", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "GeometricFeatures", "radius": 0.6, "fnames": ["linearity", "planarity", "surface_variation", "verticality", "anisotropy", "omnivariance", "PCA1", "PCA2"], "frenames": ["linearity_r0_6", "planarity_r0_6", "surface_variation_r0_6", "verticality_r0_6", "anisotropy_r0_6", "omnivariance_r0_6", "PCA1_r0_6", "PCA2_r0_6"], "nthreads": -1 } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/3", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "GeometricFeatures", "radius": 1.2, "fnames": ["linearity", "planarity", "surface_variation", "verticality", "anisotropy", "omnivariance", "PCA1", "PCA2"], "frenames": ["linearity_r1_2", "planarity_r1_2", "surface_variation_r1_2", "verticality_r1_2", "anisotropy_r1_2", "omnivariance_r1_2", "PCA1_r1_2", "PCA2_r1_2"], "nthreads": -1 } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/5", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "GeometricFeatures", "radius": 2.4, "fnames": ["linearity", "planarity", "surface_variation", "verticality", "anisotropy", "omnivariance", "PCA1", "PCA2"], "frenames": ["linearity_r2_4", "planarity_r2_4", "surface_variation_r2_4", "verticality_r2_4", "anisotropy_r2_4", "omnivariance_r2_4", "PCA1_r2_4", "PCA2_r2_4"], "nthreads": -1 } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/7", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "GeometricFeatures", "radius": 4.8, "fnames": ["linearity", "planarity", "surface_variation", "verticality", "anisotropy", "omnivariance", "PCA1", "PCA2"], "frenames": ["linearity_r4_8", "planarity_r4_8", "surface_variation_r4_8", "verticality_r4_8", "anisotropy_r4_8", "omnivariance_r4_8", "PCA1_r4_8", "PCA2_r4_8"], "nthreads": -1 } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/5", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "HeightFeaturesPP", "nthreads": -1, "neighborhood": { "type": "Cylinder", "radius": 2.5, "separation_factor": 0 }, "outlier_filter": null, "fnames": ["floor_distance", "ceil_distance"], "frenames": ["floor_dist_r2_5", "ceil_dist_r2_5"] } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/7", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "HeightFeaturesPP", "nthreads": -1, "neighborhood": { "type": "Cylinder", "radius": 5.0, "separation_factor": 0 }, "outlier_filter": null, "fnames": ["floor_distance", "ceil_distance"], "frenames": ["floor_dist_r5", "ceil_dist_r5"] } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/23", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "HeightFeaturesPP", "nthreads": -1, "neighborhood": { "type": "Cylinder", "radius": 15.0, "separation_factor": 0 }, "outlier_filter": null, "fnames": ["floor_distance", "ceil_distance"], "frenames": ["floor_dist_r15", "ceil_dist_r15"] } }, { "writer": "Writer", "out_pcloud": "*training/training_feats.las" }, { "train": "RandomForestClassifier", "fnames": ["AUTO"], "training_type": "base", "random_seed": null, "shuffle_points": false, "model_args": { "n_estimators": 120, "criterion": "entropy", "max_depth": 30, "min_samples_split": 64, "min_samples_leaf": 16, "min_weight_fraction_leaf": 0.0, "max_features": "sqrt", "max_leaf_nodes": null, "min_impurity_decrease": 0.0, "bootstrap": true, "oob_score": false, "n_jobs": -1, "warm_start": false, "class_weight": null, "ccp_alpha": 0.0, "max_samples": 0.8 }, "hyperparameter_tuning": null, "importance_report_path": "*training/RF_importance.log", "importance_report_permutation": false, "decision_plot_path": null, "decision_plot_trees": 0, "decision_plot_max_depth": 0, "training_data_pipeline": [ { "component": "ClasswiseSampler", "component_args": { "target_class_distribution": [15000000, 15000000, 15000000, 15000000, 15000000, 0], "replace": false } } ] }, { "writer": "PredictivePipelineWriter", "out_pipeline": "*pipe/rf_topobathy.pipe", "include_writer": false, "include_imputer": false, "include_feature_transformer": false, "include_miner": true, "include_class_transformer": false } ] } Stratified k-folding ----------------------- The following JSON defines a training pipeline that performs stratified k-folding on :math:`k=5` folds to evaluate the model. The selected metrics (given as percentages) are the overall accuracy (OA), the F1-score (F1), and the Matthews Correlation Coefficient (MCC). .. code-block:: json { "in_pcloud_concat": [ { "in_pcloud": "/data/topobathy/active_learning/iterative_dataset/T10/241024_093903_1_GR_mined.laz", "fnames": ["Reflectance", "FWA", "number_of_returns"], "offset": [0, 0, 0], "conditions": null, "center": [500, 0, 0] }, { "in_pcloud": "/data/topobathy/active_learning/iterative_dataset/T9/241024_094055_0_GR_mined.laz", "conditions": null, "center": [-3000, 0, 0] }, { "in_pcloud": "/data/topobathy/active_learning/iterative_dataset/T8/241024_094030_0_GR_mined.laz", "conditions": null, "center": [-2500, 0, 0] }, { "in_pcloud": "/data/topobathy/active_learning/iterative_dataset/T7/241024_092343_0_GR_mined.laz", "conditions": null, "center": [-2000, 0, 0] }, { "in_pcloud": "/data/topobathy/active_learning/iterative_dataset/T5/241024_094630_0_GR_mined.laz", "conditions": null, "center": [-1000, 0, 0] }, { "in_pcloud": "/data/topobathy/active_learning/iterative_dataset/T4/241024_094055_1_GR_mined.laz", "conditions": null, "center": [-500, 0, 0] }, { "in_pcloud": "/data/topobathy/active_learning/iterative_dataset/T3/241024_093839_0_GR_mined.laz", "conditions": null, "center": [0, 0, 0] }, { "in_pcloud": "/data/topobathy/active_learning/iterative_dataset/T1/241024_092229_0_GR_mined.laz", "conditions": null, "center": [1000, 0, 0] }, { "in_pcloud": "/data/topobathy/active_learning/iterative_dataset/T1/Pielach_20241024_topoBathy_LiDAR.laz", "conditions": null, "center": [1500, 0, 0] } ], "out_pcloud": ["/data/topobathy/vl3d/out/T10/stratkfold/*"], "sequential_pipeline": [ { "miner": "RecountPP", "nthreads": -1, "neighborhood": { "type": "sphere", "radius": 0.30 }, "input_fnames": ["number_of_returns", "FWA"], "filters": [ { "filter_name": "manyret_r0_3", "ignore_nan": true, "absolute_frequency": true, "relative_frequency": true, "surface_density": false, "volume_density": false, "vertical_segments": 0, "conditions": [ { "value_name": "number_of_returns", "condition_type": "greater_than", "value_target": 1 } ] }, { "filter_name": "ret2_r0_3", "ignore_nan": true, "absolute_frequency": true, "relative_frequency": true, "surface_density": false, "volume_density": false, "vertical_segments": 0, "conditions": [ { "value_name": "number_of_returns", "condition_type": "equals", "value_target": 2 } ] }, { "filter_name": "fwa1_r0_3", "ignore_nan": true, "absolute_frequency": true, "relative_frequency": true, "surface_density": false, "volume_density": false, "vertical_segments": 0, "conditions": [ { "value_name": "FWA", "condition_type": "equals", "value_target": 1 } ] } ] }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/2", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "RecountPP", "nthreads": -1, "neighborhood": { "type": "sphere", "radius": 0.6 }, "input_fnames": ["number_of_returns", "FWA"], "filters": [ { "filter_name": "manyret_r0_6", "ignore_nan": true, "absolute_frequency": true, "relative_frequency": true, "surface_density": false, "volume_density": false, "vertical_segments": 0, "conditions": [ { "value_name": "number_of_returns", "condition_type": "greater_than", "value_target": 1 } ] }, { "filter_name": "ret2_r0_6", "ignore_nan": true, "absolute_frequency": true, "relative_frequency": true, "surface_density": false, "volume_density": false, "vertical_segments": 0, "conditions": [ { "value_name": "number_of_returns", "condition_type": "equals", "value_target": 2 } ] }, { "filter_name": "fwa1_r0_6", "ignore_nan": true, "absolute_frequency": true, "relative_frequency": true, "surface_density": false, "volume_density": false, "vertical_segments": 0, "conditions": [ { "value_name": "FWA", "condition_type": "equals", "value_target": 1 } ] } ] } }, { "miner": "SmoothFeaturesPP", "nan_policy": "replace", "neighborhood": { "type": "sphere", "radius": 0.15 }, "weighted_mean_omega": 0, "gaussian_rbf_omega": 0, "input_fnames": ["number_of_returns", "Reflectance", "FWA"], "fnames": ["mean"], "frenames": ["nor_mean_r0_15", "refl_mean_r0_15", "FWA_mean_r0_15"], "nthreads": -1 }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/2", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "SmoothFeaturesPP", "nan_policy": "replace", "neighborhood": { "type": "sphere", "radius": 0.6 }, "weighted_mean_omega": 0, "gaussian_rbf_omega": 0, "input_fnames": ["number_of_returns", "Reflectance", "FWA"], "fnames": ["mean"], "frenames": ["nor_mean_r0_6", "refl_mean_r0_6", "FWA_mean_r0_6"], "nthreads": -1 } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/3", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "SmoothFeaturesPP", "nan_policy": "replace", "neighborhood": { "type": "sphere", "radius": 1.2 }, "weighted_mean_omega": 0, "gaussian_rbf_omega": 0, "input_fnames": ["number_of_returns", "Reflectance", "FWA"], "fnames": ["mean"], "frenames": ["nor_mean_r1_2", "refl_mean_r1_2", "FWA_mean_r1_2"], "nthreads": -1 } }, { "miner": "GeometricFeatures", "radius": 0.15, "fnames": ["linearity", "planarity", "surface_variation", "verticality", "anisotropy", "omnivariance", "PCA1", "PCA2"], "frenames": ["linearity_r0_15", "planarity_r0_15", "surface_variation_r0_15", "verticality_r0_15", "anisotropy_r0_15", "omnivariance_r0_15", "PCA1_r0_15", "PCA2_r0_15"], "nthreads": -1 }, { "miner": "GeometricFeatures", "radius": 0.30, "fnames": ["linearity", "planarity", "surface_variation", "verticality", "anisotropy", "omnivariance", "PCA1", "PCA2"], "frenames": ["linearity_r0_3", "planarity_r0_3", "surface_variation_r0_3", "verticality_r0_3", "anisotropy_r0_3", "omnivariance_r0_3", "PCA1_r0_3", "PCA2_r0_3"], "nthreads": -1 }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/2", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "GeometricFeatures", "radius": 0.6, "fnames": ["linearity", "planarity", "surface_variation", "verticality", "anisotropy", "omnivariance", "PCA1", "PCA2"], "frenames": ["linearity_r0_6", "planarity_r0_6", "surface_variation_r0_6", "verticality_r0_6", "anisotropy_r0_6", "omnivariance_r0_6", "PCA1_r0_6", "PCA2_r0_6"], "nthreads": -1 } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/3", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "GeometricFeatures", "radius": 1.2, "fnames": ["linearity", "planarity", "surface_variation", "verticality", "anisotropy", "omnivariance", "PCA1", "PCA2"], "frenames": ["linearity_r1_2", "planarity_r1_2", "surface_variation_r1_2", "verticality_r1_2", "anisotropy_r1_2", "omnivariance_r1_2", "PCA1_r1_2", "PCA2_r1_2"], "nthreads": -1 } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/5", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "GeometricFeatures", "radius": 2.4, "fnames": ["linearity", "planarity", "surface_variation", "verticality", "anisotropy", "omnivariance", "PCA1", "PCA2"], "frenames": ["linearity_r2_4", "planarity_r2_4", "surface_variation_r2_4", "verticality_r2_4", "anisotropy_r2_4", "omnivariance_r2_4", "PCA1_r2_4", "PCA2_r2_4"], "nthreads": -1 } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/7", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "GeometricFeatures", "radius": 4.8, "fnames": ["linearity", "planarity", "surface_variation", "verticality", "anisotropy", "omnivariance", "PCA1", "PCA2"], "frenames": ["linearity_r4_8", "planarity_r4_8", "surface_variation_r4_8", "verticality_r4_8", "anisotropy_r4_8", "omnivariance_r4_8", "PCA1_r4_8", "PCA2_r4_8"], "nthreads": -1 } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/5", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "HeightFeaturesPP", "nthreads": -1, "neighborhood": { "type": "Cylinder", "radius": 2.5, "separation_factor": 0 }, "outlier_filter": null, "fnames": ["floor_distance", "ceil_distance"], "frenames": ["floor_dist_r2_5", "ceil_dist_r2_5"] } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/7", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "HeightFeaturesPP", "nthreads": -1, "neighborhood": { "type": "Cylinder", "radius": 5.0, "separation_factor": 0 }, "outlier_filter": null, "fnames": ["floor_distance", "ceil_distance"], "frenames": ["floor_dist_r5", "ceil_dist_r5"] } }, { "miner": "FPSDecorated", "fps_decorator": { "num_points": "m/23", "fast": 2, "num_encoding_neighbors": 1, "num_decoding_neighbors": 1, "release_encoding_neighborhoods": false, "threads": -1, "representation_report_path": null }, "decorated_miner": { "miner": "HeightFeaturesPP", "nthreads": -1, "neighborhood": { "type": "Cylinder", "radius": 15.0, "separation_factor": 0 }, "outlier_filter": null, "fnames": ["floor_distance", "ceil_distance"], "frenames": ["floor_dist_r15", "ceil_dist_r15"] } }, { "writer": "Writer", "out_pcloud": "*training/training_feats.las" }, { "train": "RandomForestClassifier", "fnames": ["AUTO"], "training_type": "stratified_kfold", "autoval_metrics": ["OA", "F1", "MCC"], "num_folds": 5, "stratkfold_report_path": "*stratkfold_report.log", "stratkfold_plot_path": "*stratkfold_plot.svg", "random_seed": null, "shuffle_points": true, "model_args": { "n_estimators": 120, "criterion": "entropy", "max_depth": 30, "min_samples_split": 64, "min_samples_leaf": 16, "min_weight_fraction_leaf": 0.0, "max_features": "sqrt", "max_leaf_nodes": null, "min_impurity_decrease": 0.0, "bootstrap": true, "oob_score": false, "n_jobs": -1, "warm_start": false, "class_weight": null, "ccp_alpha": 0.0, "max_samples": 0.8 }, "hyperparameter_tuning": null, "importance_report_path": "*training/RF_importance.log", "importance_report_permutation": false, "decision_plot_path": null, "decision_plot_trees": 0, "decision_plot_max_depth": 0, "training_data_pipeline": [ { "component": "ClasswiseSampler", "component_args": { "target_class_distribution": [15000000, 15000000, 15000000, 15000000, 15000000, 0], "replace": false } } ] }, { "writer": "PredictivePipelineWriter", "out_pipeline": "*pipe/rf_topobathy.pipe", "include_writer": false, "include_imputer": false, "include_feature_transformer": false, "include_miner": true, "include_class_transformer": false } ] } Model outputs to raster JSON ------------------------------- The JSON below generates georeferenced rasters (as TIFF files) from the classified point clouds that can be loaded into a Geographic Information System (GIS). One TIFF represents the uncertainty of the classifications, which can be used to separate trustful predictions from unreliable ones. The other TIFF represents the mean probabilities of a cell being ground (red), vegetation (green) or water (blue). Note that, when loading the point clouds, the points labeled as outliers are filtered out. .. code-block:: json { "in_pcloud_concat": [ [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_092229_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_092229_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_092304_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_092343_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_092343_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_092423_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_092423_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_092459_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_092459_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093749_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093749_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093823_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093823_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093839_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093839_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093903_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093903_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093927_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093927_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093959_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093959_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_094030_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_094030_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_094055_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_094055_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_094130_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_094130_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_094540_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_094540_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_094630_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_094630_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 4, "action": "discard" } ] }] ], "out_pcloud": [ "/data/topobathy/vl3d/out/T10/pred/241024_092229_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_092229_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_092304_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_092343_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_092343_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_092423_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_092423_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_092459_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_092459_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093749_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093749_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093823_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093823_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093839_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093839_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093903_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093903_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093927_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093927_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093959_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093959_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_094030_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_094030_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_094055_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_094055_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_094130_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_094130_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_094540_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_094540_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_094630_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_094630_1_GR/*" ], "sequential_pipeline": [ { "eval": "RasterGridEvaluator", "crs": "+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs +type=crs", "plot_path": "*geotiff/", "xres": 0.5, "yres": 0.5, "grid_iter_step": 1024, "conditions": null, "grids": [ { "fnames": ["ClassAmbiguity"], "reduce": "relative_recount", "empty_val": "nan", "target_val": 0.5, "target_relational": "greater_than_or_equal_to", "count_threshold": 0, "oname": "uncertain" }, { "fnames": ["ground", "vegetation", "watersurf"], "reduce": "mean", "empty_val": "nan", "target_val": null, "target_relational": "equals", "count_threshold": 0, "oname": "mean_GroVegWater" } ] } ] } Water raster generation JSON ------------------------------- The JSON below generates georeferenced rasters (as TIFF files) from the classified point clouds that can be loaded into a Geogragphic Information System (GIS). One TIFF represents the height of the water points with respect to the lowest river bottom or water point in the neighborhood. The other TIFF represents the vertical distance between the lowest river bottom point and the highest point in its neighborhood. In both cases, the median is considered to represent the many points in the cell. Note that, when loading the point clouds, only the points labeled as either water or river bottom are considered (i.e., the others are filtered out). Besides, in this case linear interpolation is applied to the raster, preceded by morphological operators (2 erotions followed by 3 dilations) to deal with empty cells. .. code-block:: json { "in_pcloud_concat": [ [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_092229_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_092229_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_092304_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_092343_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_092343_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_092423_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_092423_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_092459_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_092459_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093749_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093749_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093823_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093823_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093839_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093839_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093903_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093903_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093927_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093927_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093959_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_093959_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_094030_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_094030_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_094055_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_094055_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_094130_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_094130_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_094540_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_094540_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_094630_0_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }], [{ "in_pcloud": "/data/topobathy/vl3d/out/T10/pred/241024_094630_1_GR/uncertainty/uncertainty.laz", "conditions": [ { "value_name": "Prediction", "condition_type": "not_in", "value_target": [2, 3], "action": "discard" }, { "value_name": "ClassAmbiguity", "condition_type": "greater_than_or_equal_to", "value_target": 0.5, "action": "discard" } ] }] ], "out_pcloud": [ "/data/topobathy/vl3d/out/T10/pred/241024_092229_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_092229_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_092304_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_092343_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_092343_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_092423_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_092423_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_092459_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_092459_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093749_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093749_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093823_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093823_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093839_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093839_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093903_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093903_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093927_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093927_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093959_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_093959_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_094030_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_094030_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_094055_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_094055_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_094130_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_094130_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_094540_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_094540_1_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_094630_0_GR/*", "/data/topobathy/vl3d/out/T10/pred/241024_094630_1_GR/*" ], "sequential_pipeline": [ { "miner": "HeightFeaturesPP", "nthreads": -1, "neighborhood": { "type": "Cylinder", "radius": 0.33, "separation_factor": 0 }, "outlier_filter": null, "fnames": ["floor_distance", "ceil_distance"], "frenames": ["floor_dist", "ceil_dist"] }, { "eval": "RasterGridEvaluator", "crs": "+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs +type=crs", "plot_path": "*geotiff/", "xres": 0.5, "yres": 0.5, "grid_iter_step": 1024, "conditions": null, "grids": [ { "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 3, "action": "preserve" } ], "fnames": ["floor_dist"], "reduce": "median", "empty_val": "nan", "target_val": 3, "target_relational": "equals", "count_threshold": 1, "interpolator": { "iterations": 2, "domain": { "strategy": "polygonal_contour_target", "channel": 0, "erosions": 2, "dilations": 3, "polygonal_approximation": 0, "target_val": "nan", "target_relational": "equals" }, "interpolation": { "smoothing": 0.0, "kernel": "linear", "neighbors": 64, "epsilon": null, "degree": null, "clip_interval": [0, null] } }, "oname": "water_height" }, { "conditions": [ { "value_name": "Prediction", "condition_type": "equals", "value_target": 2, "action": "preserve" } ], "fnames": ["ceil_dist"], "reduce": "median", "empty_val": "nan", "target_val": 3, "target_relational": "equals", "count_threshold": 1, "interpolator": { "iterations": 2, "domain": { "strategy": "polygonal_contour_target", "channel": 0, "erosions": 2, "dilations": 3, "polygonal_approximation": 0, "target_val": "nan", "target_relational": "equals" }, "interpolation": { "smoothing": 0.0, "kernel": "linear", "neighbors": 64, "epsilon": null, "degree": null, "clip_interval": [0, null] } }, "oname": "rivbot_depth" } ] } ] } Quantification ================= The table below represents the results of the stratified k-folding used to evaluate the model. .. csv-table:: :file: ../../csv/al_pielach_stratkfold.csv :widths: 25 25 25 25 :header-rows: 1 Visualization ================ The figure below exemplifies the results of the model applied to a point cloud that has not ben used for training (*241024_093959_0_GR*). .. figure:: ../../img/al_pielach.png :scale: 50 :alt: Figure representing the results of the model trained with active learning on the Pielach 2024 dataset. Visualization of the results yielded by the model on a point cloud that has not been included in the training dataset (*241024_093959_0_GR*). The figure below shows the geographic rasters generated from the classified point clouds. It includes the uncertainty ratio quantification (where points with a class ambiguity greater than or equal to :math:`0.5` are considered uncertain); the ground, vegetation, and water probabilities (through the red, green, and blue color channels, respectively); and the water height raster. The satellite image in the background is taken from `Google Maps `_. The image composition has been done with `the QGIS software `_. .. figure:: ../../img/al_pielach_gis.png :scale: 50 :alt: Figure representing the geographic rasters derived from the classified point clouds. Visualization of the geographic rasters derived from the classified point clouds. Application ============= Active learning is a convenient method for training machine learning models for 3D semantic segmentation because it allows the modelers to efficiently **deal with the lack of training data**. The method illustrated in this example can be easily adapted to many datasets and different classification tasks.