Assignment 03

Automatic classification of a point cloud

Deadline is 2026-01-16@18:00

Late submission? 10% will be removed for each day that you are late (3 days max)

This is a group assignment (teams of 3–4 members). You are free to form your own teams and must register them here.



Overview

In this assignment, you will classify a point cloud into four main classes (ground, buildings, vegetation, and unclassified) and generate a raster digital terrain model (DTM).

As input, you will take a LAZ point cloud that is unclassified and has no RGB-values, and you will output: (1) a classified LAZ file, and (2) a gridded DTM.

You are not allowed to use machine learning or deep learning classifiers. You have to use geometric methods such as the ones described in the book (eg RANSAC, region-growing, PCA, eigenvalues+eigenvectors).

Because point clouds can be very large, we expect you to crop the input file and process only a 500mX500m part of it.

The starting code

The help code is in the /hw/03/ folder of the GitLab repository of the course.

Your program should have the same behaviour as the one given, but you are allowed to add extra arguments, eg for a tolerance that you want to expose (please document it in the README.md and in the report).

Example:

python geo1015_hw03.py myfile.laz --csf_r 15

You may use any packages from the Python Standard Library and the following:

  1. numpy
  2. startinpy
  3. SciPy (provides efficient kd-tree for nearest-neighbour queries)
  4. rasterio

If you choose to use RANSAC, you must implement it yourself (it is more straightforward than you might expect).

This command outputs two files in the current directory:

  1. out.laz
  2. dtm.tiff

Input Datasets

While your code should theoretically handle any LAZ file, we will test it only with AHN4/5/6 files, which you can download from the AHN Dataroom.

Tile for testing: You are requested to provide parameters and the result for the following AHN5 tile, see below for details.

Important: Input files must have no classification or RGB values. Use the provided wipecls.py script to preprocess your data if necessary.

Since LAZ files can be very large, you need only process a 500 m Γ— 500 m area defined as the tile center Β±250 m in each direction.

For this AHN5 tile (1kmX1km), you must output:

  1. A new LAZ file with the four requested classes (see below)
  2. A gridded 1 m Γ— 1 m DTM (500 Γ— 500 cells)

What algorithms to use?

Ground filtering

To classify the ground (ground=2), you need to filter it by implementing yourself the CSF algorithm, as described in the book in Section 11.3.2.

Notice that if you apply the CSF algorithm to a region you will effectively extract the water as the ground, but for this assignment this is acceptable.

Once you have extracted the ground points, you need to create and export a gridded DTM 1mX1m using the Laplace interpolation method (you can use startinpy’s implementation)

The output should be submitted as the file dtm.tiff (a GeoTIFF file).

Buildings + Vegetation + others

To classify the buildings (building=6), the trees/vegetation (high vegetation=5), and others (park benches, cars, bridges, statues, lampposts, etc., which will become unclassified=1) you need to investigate how geometric methods (RANSAC, eigenvalues, etc.) could help you achieve your goal.

All vegetation should be classified as high vegetation=5, but small shrubs will be nearly impossible to identify so you should mostly focus on trees.

You can also look at the number of returns or the intensity of the points.

Important: You are not allowed to use ML/DL classifiers (which would potentially give better results but are not in scope for this course).

Using rerun as a viewer/logger

rerun is a great logger and visualiser that I highly recommend for this assignment (and for when developing geometric algorithms in general). It allows you to visualise the different steps of your implementation, and thus is really helpful for debugging. The starting code has a simple example.

The report to submit

The report should be at most 15 pages and be in PDF format (no Word please). Include the following in the report:

Additionally, include a section describing each team member’s contributions. We will verify this against git commits to ensure an equitable distribution of work, with all team members actively participating.

And finally, summarise how LLMs or external help were used.

Marking

Criterion Points
report quality 3.5
CSF for ground filtering 2
DTM 0.5
buildings 2
trees 2

What to submit and how to submit it

The submission process will be significantly different from the other assignments: you have to create a private GitHub repository where all the code and the report go.

Before the deadline, you need to invite both @hugoledoux and @HideBa as collaborators to the repository (how to do this).

After that email me (h.ledoux@tudelft.nl) with (one email per team):

  1. the URL of the repository,
  2. the name and student number of each member.

Do not add or modify anything after the deadline! You will get penalised for late submission.

The structure of your repository should be as follows (if you have more files before submission, just delete them from the final version please):

β”œβ”€β”€ report
β”‚   └── report.pdf 
β”‚   └── (report.ipynb if used)
β”‚   └── (report.tex if used)
β”‚   └── (report.docx if used)
β”œβ”€β”€ data
β”‚   └── out.laz (for specific AHN5 tile)
β”‚   └── dtm.tiff (for specific AHN5 tile)
β”œβ”€β”€ code
β”‚   └── geo1015_hw03.py
β”‚   └── mycode.py
β”‚   └── ... (any code goes in that folder)
└── README.md

The /data folder should contain your output files generated by running your code on this AHN5 file.

In README.md, include:

[last updated: 2025-12-16 08:31]