Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
# CHANGELOG
- Update environment:
- match pdal==2.10
- ign-pdal-tools : match v1.16.0 + add missing dependency
- Add missing tests

- Fix lidar_hd_pre_transform to support missing RGB channels #138 (contrib from @CEZERT)

- Add a github action workflow to run a trained model on the lidar-prod thresholds optimisation dataset
Expand Down
53 changes: 27 additions & 26 deletions environment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,21 @@ channels:
- pyg
- comet_ml
- conda-forge
- anaconda
dependencies:
- python=3.9.*
- python=3.12
- pip
# --------- Deep Learning --------- #
- pytorch::pytorch=2.1
- pytorch::pytorch-cuda=11.8
- pytorch::torchvision=0.16
- conda-forge::lightning=2.0
- conda-forge::torchmetrics=0.11
- pyg::pyg=2.4
- pytorch::pytorch==2.4.1
- pytorch::pytorch-cuda
- pytorch::torchvision
- conda-forge::lightning
- conda-forge::torchmetrics
- pyg::pyg
- pyg::pytorch-cluster
- pyg::pytorch-scatter
- pyg::pytorch-sparse
- anaconda:mkl==2022.*
# Troubleshooting: if libcusparse.so.11. errors occur, run
# export LD_LIBRARY_PATH="/home/${USER}/miniconda/envs/lib:$LD_LIBRARY_PATH"
# ou
Expand All @@ -29,46 +31,45 @@ dependencies:
- numpy
- h5py
# --------- geo --------- #
- pdal==2.6.*
- pdal==2.10.*
- python-pdal
- conda-forge:gdal
- conda_forge:pyproj
# --------- Visualization --------- #
- pandas
- matplotlib
- laspy
# --------- loggers --------- #
- comet_ml::comet_ml=3.35
- comet_ml::comet_ml
- conda-forge::urllib3<2 # To solve for https://github.com/GeneralMills/pytrends/issues/591
# --------- Visualization --------- #
- pandas
- matplotlib
- seaborn # used in some callbacks
# --------- parameters handling --------- #
- hydra-core
- hydra-colorlog
# --------- linters --------- #
- pre-commit # hooks for applying linters on commit
- black # code formatting
- isort # import sorting
- flake8 # code analysis
# --------- tests --------- #
- pytest==7.1.*
- coverage==6.3.*
- pytest-cov==3.0.*
- pytest
- coverage
- pytest-cov
# --------- others --------- #
- python-dotenv # loading env variables from .env file
- rich # beautiful text formatting in terminal
- sh # for running bash commands in some tests
- pudb # debugger
- twine # to publish pip package
# # --------- Documentation --------- #
- sphinx==4.5.*
- recommonmark==0.7.*
- sphinx_rtd_theme==1.0.*
- docutils==0.17
- rstcheck==3.3.* # RST Linter
- sphinx
- recommonmark
- sphinx_rtd_theme
- docutils
- rstcheck
- pip:
- hydra-core==1.1.*
- hydra-colorlog==1.1.*
# --------- Documentation --------- #
- myst_parser==0.17.*
- sphinxnotes-mock==1.0.0b0 # still a beta
- sphinx_paramlinks==0.5.*
- ign-pdal-tools>=1.5.2
- myst_parser
- sphinxnotes-mock
- sphinx_paramlinks
- ign-pdal-tools==1.16.0
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ testpaths = [
"tests/myria3d/",
]
# Add coverage
addopts = "--cov ./myria3d/ --cov-report html --cov-fail-under 75 --cov-config pyproject.toml"
addopts = "--cov ./myria3d/ --cov-report html --cov-fail-under 72 --cov-config pyproject.toml"

filterwarnings = [
"ignore::DeprecationWarning",
Expand Down
12 changes: 6 additions & 6 deletions run.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,19 @@
"Warning: package comet_ml not found. This may break things if you use a comet callback."
)

from enum import Enum

import os
import sys
from enum import Enum
from glob import glob

import dotenv
import hydra
from omegaconf import DictConfig
from tqdm import tqdm

from myria3d.utils import utils
from myria3d.pctl.dataset.hdf5 import create_hdf5
from myria3d.pctl.dataset.utils import get_las_paths_by_split_dict
from myria3d.utils import utils

TASK_NAME_DETECTION_STRING = "task.task_name="
DEFAULT_DIRECTORY = "trained_model_assets/"
Expand All @@ -40,7 +40,7 @@ class TASK_NAMES(Enum):
log = utils.get_logger(__name__)


@hydra.main(config_path="configs/", config_name="config.yaml")
@hydra.main(config_path="configs/", config_name="config.yaml", version_base="1.1")
def launch_train(
config: DictConfig,
): # pragma: no cover (it's just an initialyzer of a class/method tested elsewhere)
Expand All @@ -57,7 +57,7 @@ def launch_train(
return train(config)


@hydra.main(config_path=DEFAULT_DIRECTORY, config_name=DEFAULT_CONFIG_FILE)
@hydra.main(config_path=DEFAULT_DIRECTORY, config_name=DEFAULT_CONFIG_FILE, version_base="1.1")
def launch_predict(config: DictConfig):
"""Infer probabilities and automate semantic segmentation decisions on unseen data."""
# Imports should be nested inside @hydra.main to optimize tab completion
Expand All @@ -80,7 +80,7 @@ def launch_predict(config: DictConfig):
predict(config)


@hydra.main(config_path="configs/", config_name="config.yaml")
@hydra.main(config_path="configs/", config_name="config.yaml", version_base="1.1")
def launch_hdf5(config: DictConfig):
"""Build an HDF5 file from a directory with las files."""

Expand Down
File renamed without changes.
30 changes: 30 additions & 0 deletions tests/myria3d/pctl/dataset/test_iterable.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import numpy as np

from myria3d.pctl.dataset.toy_dataset import TOY_LAS_DATA
Comment thread
leavauchier marked this conversation as resolved.
from myria3d.pctl.dataset.utils import split_cloud_into_samples


def test_test_get():
"""Check that default sample indices are a numpy array with size > 0"""
for sample_idx, sample_points in split_cloud_into_samples(
TOY_LAS_DATA, tile_width=1000, subtile_width=50, epsg="2154", subtile_overlap=0
):
assert isinstance(sample_idx, np.ndarray)
assert sample_idx.size > 0


def test_split_cloud_into_samples_single_point_batch():
"""Check that sample indices are a numpy array with size > 0 when we have small batches with 1 point only"""
single_point_batch_found = False
for sample_idx, _ in split_cloud_into_samples(
TOY_LAS_DATA, tile_width=1000, subtile_width=1, epsg="2154", subtile_overlap=0
):
if len(sample_idx) == 1:
single_point_batch_found = True
assert isinstance(sample_idx, np.ndarray)
assert sample_idx.size > 0
break

assert (
single_point_batch_found
), "Test is not meaningfull as we could not isolate any batch with one point only"
17 changes: 17 additions & 0 deletions tests/myria3d/pctl/transforms/test_transforms.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

from myria3d.pctl.transforms.transforms import (
DropPointsByClass,
MaximumNumNodes,
MinimumNumNodes,
TargetTransform,
subsample_data,
Expand Down Expand Up @@ -174,3 +175,19 @@ def test_MinimumNumNodes(input_nodes, min_nodes):
# Check that "idx_in_original_cloud" key is not modified
assert isinstance(transformed_data.idx_in_original_cloud, np.ndarray)
assert transformed_data.idx_in_original_cloud.shape[0] == input_nodes


@pytest.mark.parametrize("input_nodes,max_nodes", [(5, 10), (1, 10), (15, 10)])
def test_MaximumNumNodes(input_nodes, max_nodes):
x = torch.rand((input_nodes, 3))
idx = np.arange(input_nodes) # Not a tensor
data = torch_geometric.data.Data(x=x, idx_in_original_cloud=idx)
transform = MaximumNumNodes(max_nodes)
transformed_data = transform(data)
expected_nodes = min(input_nodes, max_nodes)
assert transformed_data.num_nodes == expected_nodes
assert isinstance(transformed_data.x, torch.Tensor)
assert transformed_data.x.size(0) == expected_nodes
# Check that "idx_in_original_cloud" key is not modified
assert isinstance(transformed_data.idx_in_original_cloud, np.ndarray)
assert transformed_data.idx_in_original_cloud.shape[0] == input_nodes
18 changes: 8 additions & 10 deletions tests/myria3d/test_train_and_predict.py
Original file line number Diff line number Diff line change
@@ -1,26 +1,24 @@
import os.path as osp
from pathlib import Path
from typing import List

import numpy as np
import pytest
from lightning.pytorch.accelerators import find_usable_cuda_devices
from pathlib import Path
from pdaltools import las_info


from myria3d.pctl.dataset.toy_dataset import TOY_LAS_DATA
from myria3d.pctl.dataset.utils import pdal_read_las_array
from myria3d.predict import predict
from myria3d.train import train
from tests.conftest import (
DEFAULT_EPSG,
SINGLE_POINT_CLOUD,
make_default_hydra_cfg,
run_hydra_decorated_command,
run_hydra_decorated_command_with_return_error,
SINGLE_POINT_CLOUD,
DEFAULT_EPSG,
)
from tests.runif import RunIf

from myria3d.pctl.dataset.toy_dataset import TOY_LAS_DATA
from myria3d.pctl.dataset.utils import pdal_read_las_array
from myria3d.predict import predict
from myria3d.train import train

"""
Sanity checks to make sure the model train/val/predict/test logics do not crash.
Expand Down Expand Up @@ -68,7 +66,7 @@ def test_FrenchLidar_RandLaNetDebug_with_gpu(toy_dataset_hdf5_path, tmpdir_facto
overrides=[
"experiment=RandLaNetDebug",
"trainer.accelerator=gpu",
f"trainer.devices=[{gpu_id}]",
f"trainer.devices={gpu_id}",
]
+ tmp_paths_overrides
)
Expand Down
Loading