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 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 \(532\,\text{nm}\) and near-infrarred laser with a wavelength of \(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.

{
    "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.

{
    "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.

{
    "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.

{
    "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 \(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).

{
    "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.

{
    "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.

{
    "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.

OA

F1

MCC

mean

98.226

96.346

97.521

stdev

0.005

0.009

0.006

Q1

98.222

96.340

97.516

Q3

98.226

96.350

97.522

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 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 \(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 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.