English
File size: 1,864 Bytes
24d4ff7
4a48212
24d4ff7
 
 
 
4a48212
24d4ff7
4a48212
 
 
24d4ff7
 
4a48212
 
 
 
24d4ff7
4a48212
 
 
24d4ff7
4a48212
 
 
24d4ff7
4a48212
 
 
 
24d4ff7
4a48212
 
24d4ff7
 
 
4a48212
24d4ff7
4ccb60a
24d4ff7
 
 
4a48212
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import argparse
import logging
from pathlib import Path

import h5py
import numpy as np
import yaml

from dataset_generation.gridnet_hd_batch_generation import load_las_points
from dataset_generation.gridnet_hd_manifest import load_or_build_manifest
from utils.visibility_criteria import compute_normals_open3d


def compute_normals_for_tile(tile_info, output_dir, overwrite=False):
    output_dir = Path(output_dir) / tile_info["split"]
    output_dir.mkdir(parents=True, exist_ok=True)
    output_path = output_dir / f"{tile_info['tile']}.h5"

    if output_path.exists() and not overwrite:
        logging.info("Skipping normals for %s", tile_info["tile"])
        return output_path

    points, _, _, pts_for_normals = load_las_points(tile_info["lidar_path"])
    normals = compute_normals_open3d(pts_for_normals)
    coords = np.vstack((points["X"], points["Y"], points["Z"])).T.astype(np.float32)

    with h5py.File(output_path, "w") as handle:
        group = handle.create_group("points")
        group.create_dataset("coordinates", data=coords, dtype="float32")
        group.create_dataset("normals", data=normals.astype(np.float32), dtype="float32")

    logging.info("Wrote normals to %s", output_path)
    return output_path


def compute_normal_main():
    logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
    parser = argparse.ArgumentParser()
    parser.add_argument("--config", type=Path, default="configs/config_gridnet_hd_dataset_generation.yaml")
    args = parser.parse_args()
    cfg = yaml.safe_load(args.config.read_text())

    manifest = load_or_build_manifest(cfg)
    overwrite = cfg.get("runtime", {}).get("overwrite_existing", False)
    normals_dir = cfg["data"]["normals_dir"]

    for tile_info in manifest:
        compute_normals_for_tile(tile_info, normals_dir, overwrite=overwrite)