From 860bed7950ec0011a33d378e52f4b7d288ab90a6 Mon Sep 17 00:00:00 2001 From: Lea Vauchier Date: Thu, 30 Apr 2026 12:49:14 +0200 Subject: [PATCH 1/2] Use Fractal-trained model --- .github/workflows/cicd.yaml | 12 +- CHANGELOG.md | 2 + run.py | 4 +- tests/myria3d/test_train_and_predict.py | 5 +- ..._7cl_randlanet-inference-Myria3DV3.8.yaml} | 151 +++--------------- ...kpt => FRACTAL-LidarHD_7cl_randlanet.ckpt} | Bin 13591323 -> 13631452 bytes 6 files changed, 36 insertions(+), 138 deletions(-) rename trained_model_assets/{proto151_V2.0_epoch_100_Myria3DV3.1.0_predict_config_V3.7.0.yaml => FRACTAL-LidarHD_7cl_randlanet-inference-Myria3DV3.8.yaml} (55%) mode change 100644 => 100755 rename trained_model_assets/{proto151_V2.0_epoch_100_Myria3DV3.1.0.ckpt => FRACTAL-LidarHD_7cl_randlanet.ckpt} (61%) mode change 100644 => 100755 diff --git a/.github/workflows/cicd.yaml b/.github/workflows/cicd.yaml index 93611a83..41465b58 100644 --- a/.github/workflows/cicd.yaml +++ b/.github/workflows/cicd.yaml @@ -40,8 +40,8 @@ jobs: - name: Example inference run via Docker with default config and checkpoint run: > docker run - -v /var/data/cicd/CICD_github_assets/myria3d_V3.7.0/inputs/:/inputs/ - -v /var/data/cicd/CICD_github_assets/myria3d_V3.7.0/outputs/:/outputs/ + -v /var/data/cicd/CICD_github_assets/myria3d_V3.9.0/inputs/:/inputs/ + -v /var/data/cicd/CICD_github_assets/myria3d_V3.9.0/outputs/default/:/outputs/ --ipc=host --shm-size=2gb myria3d @@ -55,15 +55,15 @@ jobs: - name: Example inference run via Docker with inference-time subtiles overlap to smooth-out results. run: > docker run - -v /var/data/cicd/CICD_github_assets/myria3d_V3.7.0/inputs/:/inputs/ - -v /var/data/cicd/CICD_github_assets/myria3d_V3.7.0/outputs/:/outputs/ + -v /var/data/cicd/CICD_github_assets/myria3d_V3.9.0/inputs/:/inputs/ + -v /var/data/cicd/CICD_github_assets/myria3d_V3.9.0/outputs/overlap/:/outputs/ --ipc=host --shm-size=2gb myria3d python run.py --config-path /inputs/ - --config-name proto151_V2.0_epoch_100_Myria3DV3.1.0_predict_config_V3.7.0 - predict.ckpt_path=/inputs/proto151_V2.0_epoch_100_Myria3DV3.1.0.ckpt + --config-name FRACTAL-LidarHD_7cl_randlanet-inference-Myria3DV3.8 + predict.ckpt_path=/inputs/FRACTAL-LidarHD_7cl_randlanet.ckpt datamodule.epsg=2154 predict.src_las=/inputs/792000_6272000_subset_buildings.las predict.output_dir=/outputs/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d49b208..97b5c0a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ - Add a github action workflow to run a trained model on the lidar-prod thresholds optimisation dataset (in order to automate thresholds optimization) +- new model weights: Deploy model trained on Fractal dataset (cf. https://huggingface.co/IGNF/FRACTAL-LidarHD_7cl_randlanet) + ### 3.8.4 - fix: move IoU appropriately to fix wrong device error created by a breaking change in torch when using DDP. diff --git a/run.py b/run.py index 69af4e21..d010e2a4 100755 --- a/run.py +++ b/run.py @@ -22,8 +22,8 @@ TASK_NAME_DETECTION_STRING = "task.task_name=" DEFAULT_DIRECTORY = "trained_model_assets/" -DEFAULT_CONFIG_FILE = "proto151_V2.0_epoch_100_Myria3DV3.1.0_predict_config_V3.7.0.yaml" -DEFAULT_CHECKPOINT = "proto151_V2.0_epoch_100_Myria3DV3.1.0.ckpt" +DEFAULT_CONFIG_FILE = "FRACTAL-LidarHD_7cl_randlanet-inference-Myria3DV3.8.yaml" +DEFAULT_CHECKPOINT = "FRACTAL-LidarHD_7cl_randlanet.ckpt" DEFAULT_ENV = "placeholder.env" diff --git a/tests/myria3d/test_train_and_predict.py b/tests/myria3d/test_train_and_predict.py index 285fee57..7921708c 100644 --- a/tests/myria3d/test_train_and_predict.py +++ b/tests/myria3d/test_train_and_predict.py @@ -96,8 +96,8 @@ def test_predict_as_command(one_epoch_trained_RandLaNet_checkpoint, tmpdir): run_hydra_decorated_command(command) output_path = Path(tmpdir) / Path(abs_path_to_toy_LAS).name metadata = las_info.las_info_metadata(output_path) - out_pesg = las_info.get_epsg_from_header_info(metadata) - assert out_pesg == DEFAULT_EPSG + out_epsg = las_info.get_epsg_from_header_info(metadata) + assert out_epsg == DEFAULT_EPSG def test_command_without_epsg(one_epoch_trained_RandLaNet_checkpoint, tmpdir): @@ -116,6 +116,7 @@ def test_command_without_epsg(one_epoch_trained_RandLaNet_checkpoint, tmpdir): f"predict.ckpt_path={one_epoch_trained_RandLaNet_checkpoint}", f"predict.src_las={abs_path_to_toy_LAS}", f"predict.output_dir={tmpdir}", + "datamodule.epsg=null", "+predict.interpolator.probas_to_save=[building,unclassified]", "task.task_name=predict", ] diff --git a/trained_model_assets/proto151_V2.0_epoch_100_Myria3DV3.1.0_predict_config_V3.7.0.yaml b/trained_model_assets/FRACTAL-LidarHD_7cl_randlanet-inference-Myria3DV3.8.yaml old mode 100644 new mode 100755 similarity index 55% rename from trained_model_assets/proto151_V2.0_epoch_100_Myria3DV3.1.0_predict_config_V3.7.0.yaml rename to trained_model_assets/FRACTAL-LidarHD_7cl_randlanet-inference-Myria3DV3.8.yaml index a9970595..df3ac6d7 --- a/trained_model_assets/proto151_V2.0_epoch_100_Myria3DV3.1.0_predict_config_V3.7.0.yaml +++ b/trained_model_assets/FRACTAL-LidarHD_7cl_randlanet-inference-Myria3DV3.8.yaml @@ -3,47 +3,15 @@ work_dir: ${hydra:runtime.cwd} debug: false print_config: true ignore_warnings: true -trainer: - _target_: pytorch_lightning.Trainer - min_epochs: 100 - max_epochs: 150 - log_every_n_steps: 1 - num_sanity_val_steps: 2 - accumulate_grad_batches: 3 - strategy: ddp - accelerator: gpu - devices: 2 datamodule: transforms: preparations: - train: - TargetTransform: - _target_: myria3d.pctl.transforms.transforms.TargetTransform - _args_: - - ${dataset_description.classification_preprocessing_dict} - - ${dataset_description.classification_dict} - DropPointsByClass: - _target_: myria3d.pctl.transforms.transforms.DropPointsByClass - GridSampling: - _target_: torch_geometric.transforms.GridSampling - _args_: - - 0.25 - MinimumNumNodes: - _target_: myria3d.pctl.transforms.transforms.MinimumNumNodes - _args_: - - 300 - MaximumNumNodes: - _target_: myria3d.pctl.transforms.transforms.MaximumNumNodes - _args_: - - 40000 - Center: - _target_: torch_geometric.transforms.Center eval: TargetTransform: _target_: myria3d.pctl.transforms.transforms.TargetTransform _args_: - - ${dataset_description.classification_preprocessing_dict} - - ${dataset_description.classification_dict} + - ${dataset_description.classification_preprocessing_dict} + - ${dataset_description.classification_dict} DropPointsByClass: _target_: myria3d.pctl.transforms.transforms.DropPointsByClass CopyFullPos: @@ -53,15 +21,15 @@ datamodule: GridSampling: _target_: torch_geometric.transforms.GridSampling _args_: - - 0.25 + - 0.25 MinimumNumNodes: _target_: myria3d.pctl.transforms.transforms.MinimumNumNodes _args_: - - 300 + - 300 MaximumNumNodes: _target_: myria3d.pctl.transforms.transforms.MaximumNumNodes _args_: - - 40000 + - 40000 CopySampledPos: _target_: myria3d.pctl.transforms.transforms.CopySampledPos Center: @@ -74,30 +42,19 @@ datamodule: GridSampling: _target_: torch_geometric.transforms.GridSampling _args_: - - 0.25 + - 0.25 MinimumNumNodes: _target_: myria3d.pctl.transforms.transforms.MinimumNumNodes _args_: - - 300 + - 300 MaximumNumNodes: _target_: myria3d.pctl.transforms.transforms.MaximumNumNodes _args_: - - 40000 + - 40000 CopySampledPos: _target_: myria3d.pctl.transforms.transforms.CopySampledPos Center: _target_: torch_geometric.transforms.Center - augmentations: - x_flip: - _target_: torch_geometric.transforms.RandomFlip - _args_: - - 0 - p: 0.5 - y_flip: - _target_: torch_geometric.transforms.RandomFlip - _args_: - - 1 - p: 0.5 normalizations: NullifyLowestZ: _target_: myria3d.pctl.transforms.transforms.NullifyLowestZ @@ -106,28 +63,25 @@ datamodule: subtile_width: ${datamodule.subtile_width} StandardizeRGBAndIntensity: _target_: myria3d.pctl.transforms.transforms.StandardizeRGBAndIntensity - augmentations_list: '${oc.dict.values: datamodule.transforms.augmentations}' - preparations_train_list: '${oc.dict.values: datamodule.transforms.preparations.train}' - preparations_eval_list: '${oc.dict.values: datamodule.transforms.preparations.eval}' - preparations_predict_list: '${oc.dict.values: datamodule.transforms.preparations.predict}' - normalizations_list: '${oc.dict.values: datamodule.transforms.normalizations}' + preparations_eval_list: "${oc.dict.values: datamodule.transforms.preparations.eval}" + preparations_predict_list: "${oc.dict.values: datamodule.transforms.preparations.predict}" + normalizations_list: "${oc.dict.values: datamodule.transforms.normalizations}" _target_: myria3d.pctl.datamodule.hdf5.HDF5LidarDataModule + epsg: 2154 data_dir: null - epsg: null split_csv_path: null - hdf5_file_path: /var/data/cgaydon/data/20220607_151_dalles_proto.myria3d-V2.4.hdf5 + hdf5_file_path: null points_pre_transform: _target_: functools.partial _args_: - - ${get_method:myria3d.pctl.points_pre_transform.lidar_hd.lidar_hd_pre_transform} + - ${get_method:myria3d.pctl.points_pre_transform.lidar_hd.lidar_hd_pre_transform} pre_filter: _target_: functools.partial _args_: - - ${get_method:myria3d.pctl.dataset.utils.pre_filter_below_n_points} + - ${get_method:myria3d.pctl.dataset.utils.pre_filter_below_n_points} min_num_nodes: 1 tile_width: 1000 subtile_width: 50 - subtile_overlap_train: 0 subtile_overlap_predict: ${predict.subtile_overlap} batch_size: 10 num_workers: 3 @@ -137,29 +91,7 @@ dataset_description: classification_preprocessing_dict: 3: 5 4: 5 - 160: 64 - 161: 64 - 162: 64 - 0: 1 - 7: 1 - 46: 1 - 47: 1 - 48: 1 - 49: 1 - 50: 1 - 51: 1 - 52: 1 - 53: 1 - 54: 1 - 55: 1 - 56: 1 - 57: 1 - 58: 1 - 66: 1 - 67: 1 - 77: 1 - 155: 1 - 204: 1 + 66: 65 classification_dict: 1: unclassified 2: ground @@ -168,14 +100,6 @@ dataset_description: 9: water 17: bridge 64: lasting_above - class_weights: - - 0.25 - - 0.1 - - 0.1 - - 0.5 - - 2.0 - - 2.0 - - 2.0 d_in: 9 num_classes: 7 callbacks: @@ -188,9 +112,6 @@ callbacks: _target_: pytorch_lightning.callbacks.LearningRateMonitor logging_interval: step log_momentum: true - log_iou_by_class: - _target_: myria3d.callbacks.logging_callbacks.LogIoUByClass - classification_dict: ${dataset_description.classification_dict} model_checkpoint: _target_: pytorch_lightning.callbacks.ModelCheckpoint monitor: val/loss_epoch @@ -208,27 +129,11 @@ callbacks: patience: 6 min_delta: 0 model: - optimizer: - _target_: functools.partial - _args_: - - ${get_method:torch.optim.Adam} - lr: ${model.lr} - lr_scheduler: - _target_: functools.partial - _args_: - - ${get_method:torch.optim.lr_scheduler.ReduceLROnPlateau} - mode: min - factor: 0.5 - patience: 20 - cooldown: 5 - verbose: true - criterion: - _target_: torch.nn.CrossEntropyLoss - label_smoothing: 0.0 _target_: myria3d.models.model.Model d_in: ${dataset_description.d_in} num_classes: ${dataset_description.num_classes} - ckpt_path: null + classification_dict: ${dataset_description.classification_dict} + ckpt_path: FRACTAL-LidarHD_7cl_randlanet.ckpt neural_net_class_name: PyGRandLANet neural_net_hparams: num_features: ${model.d_in} @@ -238,37 +143,27 @@ model: return_logits: true interpolation_k: ${predict.interpolator.interpolation_k} num_workers: 4 - iou: - _target_: functools.partial - _args_: - - ${get_method:torchmetrics.JaccardIndex} - - ${model.num_classes} - absent_score: 1.0 - momentum: 0.9 - monitor: val/loss_epoch - lr: 0.003933709606504788 logger: comet: _target_: pytorch_lightning.loggers.comet.CometLogger api_key: ${oc.env:COMET_API_TOKEN} workspace: ${oc.env:COMET_WORKSPACE} project_name: ${oc.env:COMET_PROJECT_NAME} - experiment_name: '[V3.0.2-BS10xMAX40000pts] RandLaNet_base_run_FR_pyg_randla_net_NoRS' + experiment_name: DATAPAPER-LidarHD-20240416_100k_fractal-6GPUs auto_log_co2: false disabled: false task: task_name: predict - auto_lr_find: false predict: src_las: /path/to/input.las output_dir: /path/to/output_dir/ - ckpt_path: trained_model_assets/proto151_V2.0_epoch_100_Myria3DV3.1.0.ckpt - subtile_overlap: 0 + ckpt_path: trained_model_assets/FRACTAL-LidarHD_7cl_randlanet.ckpt gpus: 0 + subtile_overlap: 0 interpolator: _target_: myria3d.models.interpolation.Interpolator interpolation_k: 10 classification_dict: ${dataset_description.classification_dict} - probas_to_save: [building,ground] - predicted_classification_channel: confidence + probas_to_save: [building, ground] + predicted_classification_channel: PredictedClassification entropy_channel: entropy diff --git a/trained_model_assets/proto151_V2.0_epoch_100_Myria3DV3.1.0.ckpt b/trained_model_assets/FRACTAL-LidarHD_7cl_randlanet.ckpt old mode 100644 new mode 100755 similarity index 61% rename from trained_model_assets/proto151_V2.0_epoch_100_Myria3DV3.1.0.ckpt rename to trained_model_assets/FRACTAL-LidarHD_7cl_randlanet.ckpt index e1bbdf462990a922e406402fb9add34adebda827..db1af7c79dca5260f1eb9da8ca42cb78f84c0b20 GIT binary patch literal 13631452 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