SFLNet-like model for point-wise aneurysm detection
Data
The point clouds used in this example are from the IntrA dataset which can be downloaded from Google drive. The point clouds were converted from ASCII to LAS format using the LASTools inside the bash script below:
#!/bin/bash
# AUTHOR: Alberto M. Esmoris Pena
# BRIEF: Script to generate .laz point clouds from .ad point clouds
for adf in $(ls ad/*.ad); do
outf=$(sed 's/\.ad/\.laz/g' <<< $adf | sed 's/ad\//las\//g');
txt2las64 -itxt $adf \
-add_attribute 9 "nx" "normal x" \
-add_attribute 9 "ny" "normal y" \
-add_attribute 10 "nz" "normal z" \
-iparse xyz012c -o ${outf};
done
The training dataset was composed by merging the following point cloud using the CloudCompare software: AN1, AN11, AN116, AN117, AN119-1, AN119-2, AN128, AN129, AN134, AN135, AN136, AN138, AN140, AN142, AN149, AN152, AN153, AN155, AN157, AN158, AN159, AN160, AN162, AN164, AN165, AN166, AN167, AN168-1, AN170, AN172, AN175, AN178, AN180, AN181, AN182-1, AN182-2, AN182-3, AN183, AN185, AN186-1, AN186-2, AN187, AN188, AN189, AN19, AN190, AN192, AN193-1, AN193-2, AN194, AN195, AN196-1, AN196-2, AN197, AN198-1, AN198-2, AN199, AN2, AN200, AN201, AN202, AN203, AN205, AN206, AN207, AN208, AN209, AN210, AN211, AN212, AN213, AN214, AN215, AN216, AN217, AN218, AN219, AN23, AN25, AN26, AN27, AN28, AN3, AN31, AN32, AN34, AN42-1, AN42-2, AN42-3, AN44, AN54-1, AN54-2, AN58, AN6, AN9-1, AN9-2. The resulting training point cloud looks as shown in the image below:
Visualization of the training point cloud. The healthy vessel is represented with blue color and the aneurysm with red color. Note that the vessels can experiment dramatic changes of geometric scale.
The validation of the model was computed on the following point clouds (that were not used to train the model): AN121, AN125, AN40, AN204, AN55, AN120, AN191, AN144-2, AN148, AN151, AN161, AN163-1, AN137, AN139, AN163-2, AN168-2, AN171, AN173, AN174, AN177.
JSON
Training JSON
The JSON below was used to train the model:
{
"in_pcloud": [
"/ext4/medical_data/IntrA/annotated/training007.laz"
],
"out_pcloud": [
"/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/*"
],
"sequential_pipeline": [
{
"train": "ConvolutionalAutoencoderPwiseClassifier",
"training_type": "base",
"fnames": ["ones"],
"random_seed": null,
"model_args": {
"fnames": ["ones"],
"num_classes": 3,
"class_names": ["vessel", "aneurysm", "perimeter"],
"pre_processing": {
"pre_processor": "hierarchical_fpspp",
"support_strategy_num_points": 16384,
"to_unit_sphere": false,
"support_strategy": "fps",
"support_strategy_fast": false,
"receptive_field_oversampling": {
"min_points": 64,
"strategy": "knn",
"k": 16,
"radius": 0.5
},
"center_on_pcloud": true,
"neighborhood": {
"type": "sphere",
"radius": 100.0,
"separation_factor": 0.8
},
"num_points_per_depth": [4096, 1024, 512, 256, 64],
"fast_flag_per_depth": [false, false, false, false, false],
"num_downsampling_neighbors": [1, 32, 32, 32, 32],
"num_pwise_neighbors": [32, 32, 32, 32, 32],
"num_upsampling_neighbors": [1, 32, 32, 32, 32],
"nthreads": -1,
"training_receptive_fields_distribution_report_path": "*/training_eval/training_receptive_fields_distribution.log",
"training_receptive_fields_distribution_plot_path": "*/training_eval/training_receptive_fields_distribution.svg",
"training_receptive_fields_dir": null,
"receptive_fields_distribution_report_path": "*/training_eval/receptive_fields_distribution.log",
"receptive_fields_distribution_plot_path": "*/training_eval/receptive_fields_distribution.svg",
"_receptive_fields_dir": "*/training_eval/receptive_fields/",
"training_support_points_report_path": "*/training_eval/training_support_points.las",
"support_points_report_path": "*/training_eval/support_points.las"
},
"feature_extraction": {
"type": "LightKPConv",
"operations_per_depth": [2, 1, 1, 1, 1],
"feature_space_dims": [64, 64, 128, 256, 512, 1024],
"bn": true,
"bn_momentum": 0.98,
"activate": true,
"sigma": [100.0, 100.0, 125.0, 150.0, 175.0, 200.0],
"kernel_radius": [100.0, 100.0, 100.0, 100.0, 100.0, 100.0],
"num_kernel_points": [15, 15, 15, 15, 15, 15],
"deformable": [false, false, false, false, false, false],
"W_initializer": ["glorot_uniform", "glorot_uniform", "glorot_uniform", "glorot_uniform", "glorot_uniform", "glorot_uniform"],
"W_regularizer": [null, null, null, null, null, null],
"W_constraint": [null, null, null, null, null, null],
"A_trainable": [true, true, true, true, true ,true],
"A_regularizer": [null, null, null, null, null, null],
"A_constraint": [null, null, null, null, null, null],
"A_initializer": ["ones", "ones", "ones", "ones", "ones", "ones"],
"_unary_convolution_wrapper": {
"activation": "relu",
"initializer": "glorot_uniform",
"bn": true,
"bn_momentum": 0.98,
"feature_dim_divisor": 2
},
"hourglass_wrapper": {
"internal_dim": [2, 2, 4, 16, 32, 64],
"parallel_internal_dim": [8, 8, 16, 32, 64, 128],
"activation": ["relu", "relu", "relu", "relu", "relu", "relu"],
"activation2": [null, null, null, null, null, null],
"regularize": [true, true, true, true, true, true],
"W1_initializer": ["glorot_uniform", "glorot_uniform", "glorot_uniform", "glorot_uniform", "glorot_uniform", "glorot_uniform"],
"W1_regularizer": [null, null, null, null, null, null],
"W1_constraint": [null, null, null, null, null, null],
"W2_initializer": ["glorot_uniform", "glorot_uniform", "glorot_uniform", "glorot_uniform", "glorot_uniform", "glorot_uniform"],
"W2_regularizer": [null, null, null, null, null, null],
"W2_constraint": [null, null, null, null, null, null],
"loss_factor": 0.1,
"subspace_factor": 0.125,
"feature_dim_divisor": 4,
"bn": false,
"bn_momentum": 0.98,
"out_bn": true,
"out_bn_momentum": 0.98,
"out_activation": "relu"
}
},
"features_alignment": null,
"downsampling_filter": "strided_lightkpconv",
"upsampling_filter": "mean",
"upsampling_bn": true,
"upsampling_momentum": 0.98,
"upsampling_hourglass": {
"activation": "relu",
"activation2": null,
"regularize": true,
"W1_initializer": "glorot_uniform",
"W1_regularizer": null,
"W1_constraint": null,
"W2_initializer": "glorot_uniform",
"W2_regularizer": null,
"W2_constraint": null,
"loss_factor": 0.1,
"subspace_factor": 0.125
},
"conv1d": false,
"conv1d_kernel_initializer": "glorot_normal",
"output_kernel_initializer": "glorot_normal",
"model_handling": {
"summary_report_path": "*/model_summary.log",
"training_history_dir": "*/training_eval/history",
"_features_structuring_representation_dir": "*/training_eval/feat_struct_layer/",
"kpconv_representation_dir": "*/training_eval/kpconv_layers/",
"skpconv_representation_dir": "*/training_eval/skpconv_layers/",
"lkpconv_representation_dir": "*/training_eval/lkpconv_layers/",
"slkpconv_representation_dir": "*/training_eval/slkpconv_layers/",
"class_weight": [1.0, 1.0, 0.0],
"training_epochs": 400,
"batch_size": 64,
"training_sequencer": {
"type": "DLSequencer",
"random_shuffle_indices": true,
"augmentor": {
"transformations": [
{
"type": "Rotation",
"axis": [0, 0, 1],
"angle_distribution": {
"type": "uniform",
"start": -3.141592,
"end": 3.141592
}
},
{
"type": "Rotation",
"axis": [0, 1, 0],
"angle_distribution": {
"type": "uniform",
"start": -3.141592,
"end": 3.141592
}
},
{
"type": "Rotation",
"axis": [1, 0, 0],
"angle_distribution": {
"type": "uniform",
"start": -3.141592,
"end": 3.141592
}
},
{
"type": "Scale",
"scale_distribution": {
"type": "uniform",
"start": 0.98,
"end": 1.02
}
},
{
"type": "Jitter",
"noise_distribution": {
"type": "normal",
"mean": 0,
"stdev": 0.03
}
}
]
}
},
"prediction_reducer": {
"reduce_strategy" : {
"type": "MeanPredReduceStrategy"
},
"select_strategy": {
"type": "ArgMaxPredSelectStrategy"
}
},
"checkpoint_path": "*/checkpoint.weights.h5",
"checkpoint_monitor": "loss",
"learning_rate_on_plateau": {
"monitor": "loss",
"mode": "min",
"factor": 0.1,
"patience": 2000,
"cooldown": 5,
"min_delta": 0.01,
"min_lr": 1e-6
}
},
"compilation_args": {
"optimizer": {
"algorithm": "Adam",
"learning_rate": {
"schedule": "exponential_decay",
"schedule_args": {
"initial_learning_rate": 1e-2,
"decay_steps": 512,
"decay_rate": 0.96,
"staircase": false
}
}
},
"loss": {
"function": "class_weighted_categorical_crossentropy"
},
"metrics": [
"categorical_accuracy"
]
},
"architecture_graph_path": "*/model_graph.png",
"architecture_graph_args": {
"show_shapes": true,
"show_dtype": true,
"show_layer_names": true,
"rankdir": "TB",
"expand_nested": true,
"dpi": 300,
"show_layer_activations": true
}
},
"autoval_metrics": null,
"training_evaluation_metrics": null,
"training_class_evaluation_metrics": null,
"training_evaluation_report_path": null,
"training_class_evaluation_report_path": null,
"training_confusion_matrix_report_path": null,
"training_confusion_matrix_plot_path": null,
"training_class_distribution_report_path": null,
"training_class_distribution_plot_path": null,
"training_classified_point_cloud_path": null,
"training_activations_path": null
},
{
"writer": "PredictivePipelineWriter",
"out_pipeline": "*/pipe/SFLNET.pipe",
"include_writer": false,
"include_imputer": false,
"include_feature_transformer": false,
"include_miner": false,
"include_class_transformer": false,
"include_clustering": false,
"ignore_predictions": false
}
]
}
Preparation JSON
The JSON below was used to modify the model before using it for final predictions. The rationale behind this is that the model operates point cloud by point cloud, while it is trained on a merged point cloud. Thus, it does not require \(16384\) input neighborhoods, in this case \(256\) input neighborhoods are enough.
{
"in_pcloud": [
"/ext4/medical_data/IntrA/annotated/training007.laz"
],
"out_pcloud": [
"/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/*"
],
"sequential_pipeline": [
{
"train": "ConvolutionalAutoencoderPwiseClassifier",
"pretrained_model": "/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/pipe/SFLNET.model",
"training_type": "base",
"fnames": ["ones"],
"random_seed": null,
"model_args": {
"fnames": ["ones"],
"num_classes": 3,
"class_names": ["vessel", "aneurysm", "perimeter"],
"pre_processing": {
"pre_processor": "hierarchical_fpspp",
"support_strategy_num_points": 256,
"to_unit_sphere": false,
"support_strategy": "fps",
"support_strategy_fast": false,
"receptive_field_oversampling": {
"min_points": 64,
"strategy": "knn",
"k": 16,
"radius": 0.5
},
"center_on_pcloud": true,
"neighborhood": {
"type": "sphere",
"radius": 100.0,
"separation_factor": 0.8
},
"num_points_per_depth": [4096, 1024, 512, 256, 64],
"fast_flag_per_depth": [false, false, false, false, false],
"num_downsampling_neighbors": [1, 32, 32, 32, 32],
"num_pwise_neighbors": [32, 32, 32, 32, 32],
"num_upsampling_neighbors": [1, 32, 32, 32, 32],
"nthreads": -1,
"training_receptive_fields_distribution_report_path": null,
"training_receptive_fields_distribution_plot_path": null,
"training_receptive_fields_dir": null,
"receptive_fields_distribution_report_path": null,
"receptive_fields_distribution_plot_path": null,
"_receptive_fields_dir": null,
"training_support_points_report_path": null,
"support_points_report_path": null
},
"feature_extraction": {
"type": "LightKPConv",
"operations_per_depth": [2, 1, 1, 1, 1],
"feature_space_dims": [64, 64, 128, 256, 512, 1024],
"bn": true,
"bn_momentum": 0.98,
"activate": true,
"sigma": [100.0, 100.0, 125.0, 150.0, 175.0, 200.0],
"kernel_radius": [100.0, 100.0, 100.0, 100.0, 100.0, 100.0],
"num_kernel_points": [15, 15, 15, 15, 15, 15],
"deformable": [false, false, false, false, false, false],
"W_initializer": ["glorot_uniform", "glorot_uniform", "glorot_uniform", "glorot_uniform", "glorot_uniform", "glorot_uniform"],
"W_regularizer": [null, null, null, null, null, null],
"W_constraint": [null, null, null, null, null, null],
"A_trainable": [true, true, true, true, true ,true],
"A_regularizer": [null, null, null, null, null, null],
"A_constraint": [null, null, null, null, null, null],
"A_initializer": ["ones", "ones", "ones", "ones", "ones", "ones"],
"_unary_convolution_wrapper": {
"activation": "relu",
"initializer": "glorot_uniform",
"bn": true,
"bn_momentum": 0.98,
"feature_dim_divisor": 2
},
"hourglass_wrapper": {
"internal_dim": [2, 2, 4, 16, 32, 64],
"parallel_internal_dim": [8, 8, 16, 32, 64, 128],
"activation": ["relu", "relu", "relu", "relu", "relu", "relu"],
"activation2": [null, null, null, null, null, null],
"regularize": [true, true, true, true, true, true],
"W1_initializer": ["glorot_uniform", "glorot_uniform", "glorot_uniform", "glorot_uniform", "glorot_uniform", "glorot_uniform"],
"W1_regularizer": [null, null, null, null, null, null],
"W1_constraint": [null, null, null, null, null, null],
"W2_initializer": ["glorot_uniform", "glorot_uniform", "glorot_uniform", "glorot_uniform", "glorot_uniform", "glorot_uniform"],
"W2_regularizer": [null, null, null, null, null, null],
"W2_constraint": [null, null, null, null, null, null],
"loss_factor": 0.1,
"subspace_factor": 0.125,
"feature_dim_divisor": 4,
"bn": false,
"bn_momentum": 0.98,
"out_bn": true,
"out_bn_momentum": 0.98,
"out_activation": "relu"
}
},
"features_alignment": null,
"downsampling_filter": "strided_lightkpconv",
"upsampling_filter": "mean",
"upsampling_bn": true,
"upsampling_momentum": 0.98,
"upsampling_hourglass": {
"activation": "relu",
"activation2": null,
"regularize": true,
"W1_initializer": "glorot_uniform",
"W1_regularizer": null,
"W1_constraint": null,
"W2_initializer": "glorot_uniform",
"W2_regularizer": null,
"W2_constraint": null,
"loss_factor": 0.1,
"subspace_factor": 0.125
},
"conv1d": false,
"conv1d_kernel_initializer": "glorot_normal",
"output_kernel_initializer": "glorot_normal",
"model_handling": {
"summary_report_path": "*/model_summary.log",
"training_history_dir": null,
"_features_structuring_representation_dir": "*/training_eval/feat_struct_layer/",
"kpconv_representation_dir": null,
"skpconv_representation_dir": null,
"lkpconv_representation_dir": null,
"slkpconv_representation_dir": null,
"class_weight": [1.0, 1.0, 0.0],
"training_epochs": 0,
"batch_size": 64,
"training_sequencer": {
"type": "DLSequencer",
"random_shuffle_indices": true,
"augmentor": {
"transformations": [
{
"type": "Rotation",
"axis": [0, 0, 1],
"angle_distribution": {
"type": "uniform",
"start": -3.141592,
"end": 3.141592
}
},
{
"type": "Rotation",
"axis": [0, 1, 0],
"angle_distribution": {
"type": "uniform",
"start": -3.141592,
"end": 3.141592
}
},
{
"type": "Rotation",
"axis": [1, 0, 0],
"angle_distribution": {
"type": "uniform",
"start": -3.141592,
"end": 3.141592
}
},
{
"type": "Scale",
"scale_distribution": {
"type": "uniform",
"start": 0.98,
"end": 1.02
}
},
{
"type": "Jitter",
"noise_distribution": {
"type": "normal",
"mean": 0,
"stdev": 0.03
}
}
]
}
},
"prediction_reducer": {
"reduce_strategy" : {
"type": "MeanPredReduceStrategy"
},
"select_strategy": {
"type": "ArgMaxPredSelectStrategy"
}
},
"checkpoint_path": "*/checkpoint.weights.h5",
"checkpoint_monitor": "loss",
"learning_rate_on_plateau": {
"monitor": "loss",
"mode": "min",
"factor": 0.1,
"patience": 2000,
"cooldown": 5,
"min_delta": 0.01,
"min_lr": 1e-6
}
},
"compilation_args": {
"optimizer": {
"algorithm": "Adam",
"learning_rate": {
"schedule": "exponential_decay",
"schedule_args": {
"initial_learning_rate": 1e-2,
"decay_steps": 512,
"decay_rate": 0.96,
"staircase": false
}
}
},
"loss": {
"function": "class_weighted_categorical_crossentropy"
},
"metrics": [
"categorical_accuracy"
]
},
"architecture_graph_path": "*/model_graph.png",
"architecture_graph_args": {
"show_shapes": true,
"show_dtype": true,
"show_layer_names": true,
"rankdir": "TB",
"expand_nested": true,
"dpi": 300,
"show_layer_activations": true
}
},
"autoval_metrics": null,
"training_evaluation_metrics": null,
"training_class_evaluation_metrics": null,
"training_evaluation_report_path": null,
"training_class_evaluation_report_path": null,
"training_confusion_matrix_report_path": null,
"training_confusion_matrix_plot_path": null,
"training_class_distribution_report_path": null,
"training_class_distribution_plot_path": null,
"training_classified_point_cloud_path": null,
"training_activations_path": null
},
{
"writer": "PredictivePipelineWriter",
"out_pipeline": "*/prepared_pipe/SFLNET.pipe",
"include_writer": false,
"include_imputer": false,
"include_feature_transformer": false,
"include_miner": false,
"include_class_transformer": false,
"include_clustering": false,
"ignore_predictions": false
}
]
}
Validation JSON
The following JSON was used to validate the model on unseen data:
{
"in_pcloud": [
"/ext4/medical_data/IntrA/annotated/las/AN121-_norm.laz",
"/ext4/medical_data/IntrA/annotated/las/AN125-_norm.laz",
"/ext4/medical_data/IntrA/annotated/las/AN40-_norm.laz",
"/ext4/medical_data/IntrA/annotated/las/AN204-_norm.laz",
"/ext4/medical_data/IntrA/annotated/las/AN55-_norm.laz",
"/ext4/medical_data/IntrA/annotated/las/AN120-_norm.laz",
"/ext4/medical_data/IntrA/annotated/las/AN191-_norm.laz",
"/ext4/medical_data/IntrA/annotated/las/AN144-2-_norm.laz",
"/ext4/medical_data/IntrA/annotated/las/AN148-_norm.laz",
"/ext4/medical_data/IntrA/annotated/las/AN151-_norm.laz",
"/ext4/medical_data/IntrA/annotated/las/AN161-_norm.laz",
"/ext4/medical_data/IntrA/annotated/las/AN163-1-_norm.laz",
"/ext4/medical_data/IntrA/annotated/las/AN137-_norm.laz",
"/ext4/medical_data/IntrA/annotated/las/AN139-_norm.laz",
"/ext4/medical_data/IntrA/annotated/las/AN163-2-_norm.laz",
"/ext4/medical_data/IntrA/annotated/las/AN168-2-_norm.laz",
"/ext4/medical_data/IntrA/annotated/las/AN171-_norm.laz",
"/ext4/medical_data/IntrA/annotated/las/AN173-_norm.laz",
"/ext4/medical_data/IntrA/annotated/las/AN174-_norm.laz",
"/ext4/medical_data/IntrA/annotated/las/AN177-_norm.laz"
],
"out_pcloud": [
"/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/preds/AN121/*",
"/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/preds/AN125/*",
"/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/preds/AN40/*",
"/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/preds/AN204/*",
"/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/preds/AN55/*",
"/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/preds/AN120/*",
"/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/preds/AN191/*",
"/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/preds/AN144-2/*",
"/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/preds/AN148/*",
"/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/preds/AN151/*",
"/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/preds/AN161/*",
"/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/preds/AN163-1/*",
"/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/preds/AN137/*",
"/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/preds/AN139/*",
"/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/preds/AN163-2/*",
"/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/preds/AN168-2/*",
"/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/preds/AN171/*",
"/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/preds/AN173/*",
"/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/preds/AN174/*",
"/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/preds/AN177/*"
],
"sequential_pipeline": [
{
"predict": "PredictivePipeline",
"model_path": "/ext4/medical_data/IntrA/vl3d/out/DL_SFLNETPP_X/T1/prepared_pipe/SFLNET.pipe"
},
{
"writer": "ClassifiedPcloudWriter",
"out_pcloud": "*predicted.las"
},
{
"eval": "ClassificationEvaluator",
"class_names": ["vessel", "aneurysm", "perimeter"],
"ignore_classes": ["perimeter"],
"metrics": ["OA", "P", "R", "F1", "IoU", "wP", "wR", "wF1", "wIoU", "MCC", "Kappa"],
"class_metrics": ["P", "R", "F1", "IoU"],
"report_path": "*report/global_eval.log",
"class_report_path": "*report/class_eval.log",
"confusion_matrix_report_path" : "*report/confusion_matrix.log",
"confusion_matrix_plot_path" : "*plot/confusion_matrix.svg",
"confusion_matrix_normalization_strategy": "row",
"class_distribution_report_path": "*report/class_distribution.log",
"class_distribution_plot_path": "*plot/class_distribution.svg"
},
{
"eval": "ClassificationUncertaintyEvaluator",
"class_names": ["vessel", "aneurysm", "perimeter"],
"ignore_classes": ["perimeter"],
"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": 256,
"report_path": "*uncertainty/uncertainty.las",
"plot_path": "*uncertainty/"
}
]
}
Quantification
The table below shows the evaluation metrics for each validation point cloud.
NUBE |
OA |
P |
R |
F1 |
IoU |
wP |
wR |
wF1 |
wIoU |
MCC |
Kappa |
|---|---|---|---|---|---|---|---|---|---|---|---|
AN120 |
99.808 |
99.863 |
99.682 |
99.772 |
99.545 |
99.809 |
99.808 |
99.808 |
99.617 |
99.545 |
99.543 |
AN121 |
98.308 |
94.516 |
99.02 |
96.604 |
93.536 |
98.494 |
98.308 |
98.349 |
96.802 |
93.427 |
93.212 |
AN125 |
96.897 |
98.283 |
87.812 |
92.187 |
86.096 |
97.004 |
96.897 |
96.709 |
93.901 |
85.457 |
84.412 |
AN137 |
99.36 |
99.183 |
99.318 |
99.25 |
98.512 |
99.362 |
99.36 |
99.361 |
98.731 |
98.5 |
98.5 |
AN139 |
97.504 |
93.261 |
98.514 |
95.633 |
91.775 |
97.84 |
97.504 |
97.575 |
95.344 |
91.624 |
91.275 |
AN144-2 |
99.725 |
99.419 |
99.82 |
99.618 |
99.239 |
99.728 |
99.725 |
99.725 |
99.452 |
99.238 |
99.235 |
AN148 |
97.399 |
98.194 |
94.047 |
95.941 |
92.304 |
97.461 |
97.399 |
97.341 |
94.891 |
92.148 |
91.889 |
AN151 |
96.723 |
97.387 |
95.961 |
96.554 |
93.348 |
96.894 |
96.723 |
96.698 |
93.617 |
93.337 |
93.116 |
AN161 |
99.299 |
99.041 |
99.27 |
99.154 |
98.325 |
99.302 |
99.299 |
99.3 |
98.611 |
98.31 |
98.309 |
AN163-1 |
97.955 |
95.41 |
98.591 |
96.893 |
94.033 |
98.126 |
97.955 |
97.989 |
96.097 |
93.946 |
93.789 |
AN163-2 |
94.147 |
94.319 |
91.544 |
92.783 |
86.697 |
94.169 |
94.147 |
94.053 |
88.908 |
85.818 |
85.582 |
AN168-2 |
93.456 |
95.58 |
89.937 |
92.093 |
85.517 |
94.035 |
93.456 |
93.241 |
87.491 |
85.331 |
84.268 |
AN171 |
99.287 |
98.193 |
99.56 |
98.859 |
97.752 |
99.313 |
99.287 |
99.292 |
98.599 |
97.743 |
97.717 |
AN173 |
99.69 |
99.016 |
99.283 |
99.149 |
98.322 |
99.691 |
99.69 |
99.69 |
99.385 |
98.299 |
98.298 |
AN174 |
99.918 |
99.948 |
99.806 |
99.877 |
99.754 |
99.918 |
99.918 |
99.918 |
99.835 |
99.754 |
99.754 |
AN177 |
98.953 |
99.271 |
98.205 |
98.719 |
97.476 |
98.968 |
98.953 |
98.947 |
97.921 |
97.471 |
97.439 |
AN191 |
94.381 |
94.296 |
94.414 |
94.348 |
89.304 |
94.403 |
94.381 |
94.385 |
89.37 |
88.71 |
88.697 |
AN204 |
99.692 |
99.675 |
99.709 |
99.691 |
99.384 |
99.694 |
99.692 |
99.692 |
99.386 |
99.384 |
99.382 |
AN40 |
98.046 |
98.697 |
94.309 |
96.338 |
93.048 |
98.08 |
98.046 |
98 |
96.142 |
92.903 |
92.681 |
AN55 |
99.242 |
98.184 |
99.456 |
98.804 |
97.647 |
99.266 |
99.242 |
99.247 |
98.512 |
97.631 |
97.609 |
Visualization
The figure below shows the results of the model on validation data never seen before.
Visualization of the reference, predictions, errors, and point-wise probabilities on some validation point clouds never seen before. The red color represents an aneurysm, the blue one a healthy vessel.
Application
This example has two main applications:
Baseline model for point-wise aneurysm detection in 3D point clouds with deep learning.
Show how to apply deep learning models for 3D medical point clouds.