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.0

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.0
File
less3d-0.4.0-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
less3d-0.4.0-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.0-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
less3d-0.4.0-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.0-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
less3d-0.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
less3d-0.4.0-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
less3d-0.4.0-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: 267.5 MB

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

Download URL less3d-0.4.0-cp313-cp313-win_amd64.whl
Size 18.3 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
6da71e1516738351701edaea1a71a36fba25b3d75b19421272f68f3fd85d92bc
BLAKE2b-256 checksum
How to use checksums
567765ce02c495718aae305a3fa0d8842914f854338999f16724f1238d803afb
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.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL less3d-0.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 48.6 MB
Tags CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
fc57028e75885523ab37f2ac13301db351b5cd607139081f770f00d90f0692f3
BLAKE2b-256 checksum
How to use checksums
af5bb2b2241373d16fd5405b47759b0f2f66b5b08d75aa5556e7906aa689ec5a
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.0-cp312-cp312-win_amd64.whl

Download URL less3d-0.4.0-cp312-cp312-win_amd64.whl
Size 18.3 MB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
4bdd9b8e8da09cbcf58852e02e89b07f2b3739dbe4dae4cddca804f1762c93fa
BLAKE2b-256 checksum
How to use checksums
26418f86016d3169828a19b74c4b93b2e615a2c4066101564dce1b492efe4ee4
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.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL less3d-0.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 48.6 MB
Tags CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
2e1124a9374ee9a8ce1f0d50e2a7a7b6124e82aabd51480cb43b2a2f84e5e16a
BLAKE2b-256 checksum
How to use checksums
179aab37dd553d04e71b45ccc6cf2f599ed8edc51902728c923d95562be0ee12
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.0-cp311-cp311-win_amd64.whl

Download URL less3d-0.4.0-cp311-cp311-win_amd64.whl
Size 18.3 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
33a6eb789aa4dc7f6a3ea24e481c5401ee4aed2469aa15a90d685b67545b07e8
BLAKE2b-256 checksum
How to use checksums
7ccc4865ded773b69e59f274463fce658368e9f50b44f95a021f214aeaf3333d
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.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL less3d-0.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 48.6 MB
Tags CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
210bccfba057f5a55f64d4f0cd04d21fe54b8600379101edfc6df3a36499664b
BLAKE2b-256 checksum
How to use checksums
efaae77b054c244ee9e07199b921bf2859183b4ae5284deb272f97bb29c6affd
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.0-cp310-cp310-win_amd64.whl

Download URL less3d-0.4.0-cp310-cp310-win_amd64.whl
Size 18.3 MB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
40298f45343168c60b8e0337556bbe1ed983ebe7887ce273a91dfb8b2e141444
BLAKE2b-256 checksum
How to use checksums
2903bb7ebe51257c55bd9d2abf0117709055104e4cddceb276667adb6ab2f2bb
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.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL less3d-0.4.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 48.6 MB
Tags CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
812b07d55564b5c1277105e51125da13ec55e2be89d6d2cecb4fd62dcb743ceb
BLAKE2b-256 checksum
How to use checksums
22be74679a130993ae87889947e4e8d4f17cb7153fa39760b93bd9cdf235ff01
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

0.4.2

8 release files

0.4.1

8 release files

This release

0.4.0 This release

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