Skip to main content

LESS 3.0

PyPI version Python Platform License: MIT

GPU + CPU accelerated 3D radiative transfer model for remote sensing simulation

LESS 3.0 is a complete reimplementation of the LESS model — a widely-used 3D radiative transfer framework in quantitative remote sensing research. Built around NVIDIA OptiX, cross-vendor Vulkan Ray Query, Intel Embree, and a modern Python API, LESS 3.0 inherits the physical foundations of the original LESS while adding hardware acceleration, a redesigned scripting interface, and full physical coupling of energy balance, photosynthesis, and solar-induced chlorophyll fluorescence (SIF).

The original LESS remains available at lessrt.org. LESS 3.0 is the recommended path for new projects.


Key Features

  • Three compute backends — OptiX is the high-performance NVIDIA path, Vulkan Ray Query provides experimental cross-vendor GPU coverage, and Embree supplies portable CPU workflows.
  • Clean Python API — Designed for remote sensing scientists. Build a scene in 10 lines of code.
  • Digital twin architecture — Build the scene once, simulate many times. Update illumination or surface properties without rebuilding geometry.
  • Multi-sensor support — Optical, thermal infrared, LiDAR point cloud/waveform, SIF fluorescence, and passive/active microwave sensors.
  • Full physical coupling — 3D radiation field → energy balance → photosynthesis → SIF, all tightly coupled to the Monte Carlo ray tracing engine.
  • Interactive 3D viewer — scene.show() opens a browser-based viewer to inspect the scene and preview simulation results.

Installation

pip install less3d

Pre-built wheels for Windows and Linux are provided for Python 3.10–3.13. No compiler, CUDA toolkit, or additional runtime installation required.

CPU Cross-vendor GPU NVIDIA GPU
Backend Embree Vulkan Ray Query OptiX + CUDA
Hardware Modern x86-64 Vulkan 1.2 Ray Query GPU Compatible NVIDIA GPU
Memory System RAM 4 GB+ VRAM recommended 8 GB+ VRAM recommended
Best use Portable core workflows Portability and validation Production Monte Carlo
Python 3.10–3.13 3.10–3.13 3.10–3.13

Feature coverage differs by backend. Use less.can_use("feature") or scene.can_use("feature") for the final answer in the current installation.

Backend feature matrix

OK means the workflow is implemented by a non-experimental backend. Experimental means it is implemented and covered by cross-backend regression tests, but the Vulkan backend is still being optimized and may be substantially slower than OptiX. -- means that backend does not implement the workflow.

User workflow OptiX + CUDA Vulkan Ray Query Embree CPU
Optical imaging OK Experimental OK
Thermal-infrared imaging OK Experimental OK
Per-primitive thermal temperatures OK Experimental --
SIF imaging OK Experimental --
Directional BRF / albedo OK Experimental OK
3D radiation field / fPAR OK Experimental OK
Irradiance maps OK Experimental OK
LiDAR point cloud OK Experimental OK
Full-waveform LiDAR OK Experimental OK
Energy balance OK Experimental --
Per-primitive spectral radiation process OK Experimental --
Photosynthesis process OK Experimental --
SIF process OK Experimental --
Passive microwave brightness temperature OK Experimental --
Active microwave radar backscatter OK Experimental --
Dynamic instance updates OK Experimental OK
Periodic / repetitive scenes OK Experimental OK
Terrain-following sensing OK Experimental OK

The table describes code coverage, not the hardware in a particular computer. For the single user-facing answer on the current machine, call for example:

less.can_use("lidar_waveform", backend="vulkan")
scene.can_use("energy_balance")

On NVIDIA hardware, use OptiX for production simulations. Vulkan is currently intended for cross-vendor access, validation, and backend development; it is not yet a performance replacement for the CUDA kernels.


Quick Start

import less

# Create a 10 m × 10 m bare-soil scene
scene = less.Scene()
scene.size = 10.0
scene.terrain = less.Terrain(property=less.Lambertian(reflectance=0.3))
scene.illumination = less.DirectDiffuse(sun_zenith=30, sun_azimuth=150)
scene.build()

# Simulate a nadir RGB image
image = scene.simulate(less.OpticalImager(
    less.Orthographic(image_size=256),
    bands=[650, 550, 450],   # R, G, B (nm)
    quality=128,
))
image.save("output.png")

Thanks to the digital twin architecture, updating scene parameters does not require a rebuild:

# Change sun angle and re-simulate — no rebuild needed
scene.illumination = less.DirectDiffuse(sun_zenith=60, sun_azimuth=90)
image2 = scene.simulate(sensor)

Simulation Capabilities

Domain What you can simulate
Optical RGB, multispectral, and hyperspectral images; BRF / BRDF angular sampling; NDVI and vegetation indices
Thermal infrared Per-component temperature scenes (sunlit/shaded leaf, soil, trunk); thermal radiance images
LiDAR Airborne laser scanning (ALS) and terrestrial laser scanning (TLS) point clouds and full waveforms
Vegetation physiology 3D PAR radiation field, full energy balance, photosynthesis, solar-induced chlorophyll fluorescence (SIF) imaging
Microwave Passive H/V brightness temperature and active HH/HV/VH/VV radar backscatter, including vegetation and trunk-ground interactions

Forest Scene Example

import less
import numpy as np

scene = less.Scene()
scene.size = 30.0
scene.terrain = less.Terrain(property=less.Lambertian(reflectance=0.12))
scene.illumination = less.DirectDiffuse(sun_zenith=35, sun_azimuth=225)

# Broadleaf tree with PROSPECT leaf optical properties
birch = less.Object("birch", mesh="birch.obj")
birch.set_property("leaves", less.Prospect(cab=40, car=8, cw=0.012, cm=0.009, N=1.5))

# Random planting positions
xy = np.random.rand(50, 2) * 30
positions = np.c_[xy, np.zeros(50)]
scene.add(birch, positions=positions)
scene.build()

# Multispectral image (green, red, NIR)
image = scene.simulate(less.OpticalImager(
    less.Orthographic(image_size=512),
    bands=[550, 670, 800],
    quality=256,
))
image.save("forest.tif")   # GeoTIFF preserves physical radiance values

Built-in Examples and Viewer

import less

less.examples.list()                  # list all built-in scenes
less.examples.run("autumn_forest")    # launch interactive viewer
less.examples.run("maize_field")
scene.show()   # open 3D viewer in browser (Scene / Simulate / Products tabs)

Validation

LESS 3.0 is cross-validated against the original LESS on reference scenes:

Scene Description Max RRMSE
Val01 Lambertian ground 0.02%
Val02 Box canopy 0.22%
Val03 Ellipsoid forest 0.83%
Val04 Forest + diffuse sky 2.17%
Val05 PROSPECT-D leaves 0.24%
Val06 fPAR vs sun zenith angle 0.62%
Val07 Thermal IR 0.17%

Full validation reports are regenerated on each release. See tests/validation/.

Backend LiDAR throughput and CPU/GPU crossover can be reproduced with:

python benchmarks/benchmark_lidar_scaling.py

The benchmark reports fast point-cloud and full-waveform throughput at 1 thousand through 1 million pulses and checks numerical agreement against the Embree backend.


Documentation and Tutorials

Full documentation with step-by-step tutorials:

Topics covered: coordinate system · terrain and surface properties · illumination models · optical imaging · BRDF/BRF sampling · thermal infrared · LiDAR · energy balance · photosynthesis · SIF · visualization · scene serialization


Citing

If you use LESS 3.0 in your research, please cite the original LESS paper:

Qi, J., Xie, D., Yin, T., Yan, G., Gastellu-Etchegorry, J.P., Li, L., Zhang, W., Mu, X., Norford, L.K. (2019). LESS: LargE-Scale remote sensing data and image Simulation framework over heterogeneous 3D scenes. Remote Sensing of Environment, 221, 695–706.


Metadata

Release files for less3d 0.4.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for less3d 0.4.2
File
less3d-0.4.2-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
less3d-0.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details
less3d-0.4.2-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
less3d-0.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details
less3d-0.4.2-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
less3d-0.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details
less3d-0.4.2-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
less3d-0.4.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details

Total release size: 271.1 MB

Release files / less3d-0.4.2-cp313-cp313-win_amd64.whl

Download URL less3d-0.4.2-cp313-cp313-win_amd64.whl
Size 18.7 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
42130abb7d9a17252b49367f4b75b96bac7ac04c3f7301c0aab759a43fed7e3e
BLAKE2b-256 checksum
How to use checksums
8d97ed76b003a4d966dd0f36105855e9c60e8ef02afc6e56c637356b25efca7a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.12

Release files / less3d-0.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL less3d-0.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 49.0 MB
Tags CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
7513ef23298accdd70dedc2e66e24ccb117dece2df0666d28d7ca9b09d52907d
BLAKE2b-256 checksum
How to use checksums
d980b054f8a75304d3a43267fb1c7b94780edc1d552559f6e7e6c79230b3a7a1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.12

Release files / less3d-0.4.2-cp312-cp312-win_amd64.whl

Download URL less3d-0.4.2-cp312-cp312-win_amd64.whl
Size 18.7 MB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
f9b23a5c8248aa6ad9743316b5408dfabf582a806c69a2e1500b6521dcaf400d
BLAKE2b-256 checksum
How to use checksums
235f299d42ca40505957fbd6368928d02d658d237f9945bbfe693d9e2a0c70f4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.12

Release files / less3d-0.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL less3d-0.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 49.0 MB
Tags CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
ff085af3787aea5fba5c9d1aa0a5afd0dba04942b2a967eef04cab4b55c296c8
BLAKE2b-256 checksum
How to use checksums
a36592ab59d3e41191e0f0a31b17720e9b74fb67d831ebfe55f2766cafa2e533
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.12

Release files / less3d-0.4.2-cp311-cp311-win_amd64.whl

Download URL less3d-0.4.2-cp311-cp311-win_amd64.whl
Size 18.8 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
9d8d91c643fdf204c38d36372208201abe5180abf7446b9fa25f5d3d5c1d4f30
BLAKE2b-256 checksum
How to use checksums
d41e0b1bda61723176938ffcdcf9eb87bf32960f6ecd453d87bc2d01eedd0fd0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.12

Release files / less3d-0.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL less3d-0.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 49.0 MB
Tags CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
7457a7696d3252c6b324a5cb874df79414ff28c90bcedb58f61c8aeb76f76c3b
BLAKE2b-256 checksum
How to use checksums
ba927c9b12d763f7baaa464fc9953f30e87433ff7347320b834c8cf512105b13
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.12

Release files / less3d-0.4.2-cp310-cp310-win_amd64.whl

Download URL less3d-0.4.2-cp310-cp310-win_amd64.whl
Size 18.8 MB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
b518df06575826ee1273218ac04f118a031b0a036d2ddc5749b103a96e55af14
BLAKE2b-256 checksum
How to use checksums
a4e6b58041cc3e54f52dc19f5f63d4fcb5fd86b79b93ad4f2fe6edebcc9b33d3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.12

Release files / less3d-0.4.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL less3d-0.4.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 49.0 MB
Tags CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
1a2a088c9ca31df86b1afcd5ea54b51fe5845218e446e3da26ff04f8f5268f74
BLAKE2b-256 checksum
How to use checksums
d6dd90e4948b3e273aee01c5112907c09e6f71041c7fe4dcd034e810efd3dd0c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.12

Release history Release notifications | RSS feed

3.0.7

8 release files

3.0.6

8 release files

3.0.5

8 release files

3.0.4

8 release files

3.0.3

8 release files

3.0.1

8 release files

3.0.0

8 release files

0.5.0

8 release files

0.4.3

8 release files

This release

0.4.2 This release

8 release files

0.4.1

8 release files

0.4.0

8 release files

0.3.3

8 release files

0.3.2

8 release files

0.3.1

8 release files

0.3.0

8 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page