2025 Winter School
Welcome to the winter school 2025 Data Analysis session!
The session aims to introduce photogrammetry from drone imagery. For this we use an Open-Source software: OpendroneMap This tutorial contains all the step-by-step information to create a first orthomosaic and a 3D DEM (Digital Elevation Model) using ODM.
Getting started
Given that photogrammetry requires significant computing resources, particularly in terms of RAM, the processing will be carried out on the UQAR high performance computing infrastructure which hosts a cluster named Pelerin.
Accessing the dataset
The Dataset is stored on a Network storage. First you need to connect to the storage.
In the file explorer, right-click on Network
and go to map a network.
In Folder write:
\\sabre.uqar.ca\ecole_hiver_ismer
and click on Finish
Connecting to Pelerin
To access the cluster, we will use the client SSH MobaXterm. Please click on this link to download the client: mobaxterm or (if link doesn't work), download the portable edition from https://mobaxterm.mobatek.net/download-home-edition.html . Une fois le dossier .zip décompressé, lancez le programme .exe
Now open a new SSH session by clicking on the tab session
→ SSH
.
- Remote host is : calculs.uqar.ca
- the username is: formation
- The password is : *************
From now on, all the processing will be carried out using linux commands. (If you're new to linux commands here are some few help for basic commands you would need.) You are now on the computing infrastructure. to access the cluster:
ssh pelerin
You are now connected to the cluster. It contains 27 nodes (computers). Each of these node contains between 40 and 512 cpus as well as 80MB to 2.5TB of RAM. For the purposes of training, each participant will be assigned a node (e.g. calcul-6) on which t to perform the analyses. To access it:
ssh <my_node>
User guide
The same storage that have been mounted locally is also mount on pelerin. it is the directory h25
. So that all the treatment done on pelerin will be directly accessible from your computer locally.
- create a new directory under
/home/formation/h25/WORKDIR/
:
mkdir ~/h25/WORKDIR/<my_directory>
(note: as you are using a shared directory, please use a name different from the others, this can be your last name for example)
The directory ~/h25/DATASET/ contains all the images that have been taken during the field work and there are classed in different experiences called exp1,exp2 etc..
- create a symbolic link from the data experience of your choice to a subdirectory that should be named
images
under your working directory:
ln -s ~/h25/DATASET/exp1 ~/h25/WORKDIR/<my_directory>/images
- You are now ready to create your first orthomosaic using singularity and ODM.
singularity run --bind ~/h25/WORKDIR/<my_directory>/:/datasets/code ~/odm.sif --project-path /datasets --fast-orthophoto
This command is just an example of using ODM. The general syntax is:
singularity run [arguments for singularity] <path_to_odm>.sif [arguments for ODM]
The command singularity run
executes odm.sif
with arguments, the main ones of which are listed below.
-v $(pwd)/:/datasets/code
allows you to make a link between the local directory and the virtual location in the container. This syntax will execute the script on the disk containing your local directory. Here, ~/h25/WORKDIR/<my_directory>/ .
All the arguments and detailed informations for ODM can be found in the ODM documentation. The more useful are showed below:
--project-path /datasets
creates the directory tree needed for the project, in the local directory. It is important to use this syntax to be able to restart a process midway (--rerun-from odm_meshing
par exemple) while the treatment has finished.
--fast-orthophoto
creates an orthomosaic without 3D DEM. Results are less accurate but the computing time is reduced.
--dtm
compute the 3D DEM
Outputs=
project/
├── images/
│ ├── img-1234.jpg
│ └── ...
├── opensfm/ # Tie Points and camera positions here in JSON format
│ ├── config.yaml
│ ├── images/
│ ├── masks/
│ ├── gcp_list.txt
│ ├── metadata/
│ ├── features/
│ ├── matches/
│ ├── tracks.csv
│ ├── reconstruction.json
│ ├── reconstruction.meshed.json
│ ├── undistorted/
│ ├── undistorted_tracks.json
│ ├── undistorted_reconstruction.json
│ └── depthmaps/
│ └── merged.ply # Dense Point Cloud
├── odm_meshing/
│ ├── odm_mesh.ply # A 3D mesh
│ └── odm_meshing_log.txt # Output of the meshing task. May point out errors.
├── odm_texturing/
│ ├── odm_textured_model.obj # Textured mesh
│ ├── odm_textured_model_geo.obj # Georeferenced textured mesh
│ └── texture_N.jpg # Associated textured images used by the model
├── odm_georeferencing/
│ ├── odm_georeferenced_model.ply # A georeferenced dense point cloud
│ ├── odm_georeferenced_model.laz # LAZ format point cloud
│ ├── odm_georeferenced_model.csv # XYZ format point cloud
│ ├── odm_georeferencing_log.txt # Georeferencing log
│ └── odm_georeferencing_utm_log.txt # Log for the extract_utm portion
├── odm_orthophoto/
│ ├── odm_orthophoto.png # Orthophoto image (no coordinates)
│ ├── odm_orthophoto.tif # Orthophoto GeoTiff
│ ├── odm_orthophoto_log.txt # Log file
│ └── gdal_translate_log.txt # Log for georeferencing the png file
└── odm_dem/
| ├── dsm.tif # Digital Surface Model Geotiff - the tops of everything
| └── dtm.tif # Digital Terrain Model Geotiff - the ground.
Visualizing output
Open google earth pro on your desktop and drag the orthophoto in it to visualize it