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).
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).
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.
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.