LESS
3D Radiative Transfer Model
Version 3.0.7
LESS is a GPU- and CPU-accelerated 3D radiative transfer model for quantitative remote sensing. It combines a Python interface with NVIDIA OptiX, Vulkan Ray Query, and Intel Embree native backends for optical, thermal, solar-induced fluorescence (SIF), vegetation photosynthesis, energy-balance, and LiDAR simulations.
LESS 3.x is a completely new native implementation of the original LESS model. The original LESS 2.x implementation remains available at lessrt.org.
Highlights
- Remote-sensing-oriented Python API — describe a scene using terrain, objects, optical properties, illumination, sensors, and products.
- Three native backends — OptiX for NVIDIA GPUs, Vulkan Ray Query for supported GPUs, and Embree for CPU execution to accelerate simulations for various platforms .
- Persistent scenes — geometry is prepared automatically on the first simulation and reused when only illumination, spectra, or properties change.
- Mesh and turbid vegetation — simulate explicit geometry, volume canopies, or mixed scenes.
- Imaging and biophysical products — optical and thermal imagery, BRF, radiation fields, irradiance maps, SIF, photosynthesis, energy balance, and LiDAR.
- Sensor effects — pushbroom geometry, spectral response, PSF/MTF, detector noise, ADC quantisation, and geolocation.
- Interactive inspection — use
scene.show()to explore scenes and products in a browser-based viewer.
Installation
pip install less3d
Prebuilt wheels are provided for Windows and Linux with Python 3.10–3.13. A compiler and CUDA toolkit are not required. Compatible graphics drivers are still required for GPU backends.
| Backend | Typical hardware | Recommended memory | Suggested use |
|---|---|---|---|
| Embree | x86-64 CPU | System RAM | CPU simulation and comparison |
| Vulkan Ray Query | Vulkan 1.2 Ray Query GPU | 4 GB+ VRAM | Supported non-CUDA GPU workflows |
| OptiX + CUDA | Compatible NVIDIA GPU | 8 GB+ VRAM | High-throughput Monte Carlo simulation |
Check whether a feature can run with a particular backend on the current computer:
import less
less.can_use("optical_imaging", backend="optix")
less.can_use("irradiance_map", backend="embree")
After creating a scene, scene.can_use("feature") performs the same check using that scene's selected backend.
Available in 3.0.7
The following workflows are available with OptiX, Vulkan, and Embree when the selected backend meets its hardware and driver requirements:
| Domain | Capabilities |
|---|---|
| Optical | Mesh and turbid-medium imaging, BRF, radiation fields, and irradiance maps |
| Water | Wind-roughened deep-water surfaces with optional prescribed Rrs or IOPs |
| Spatial properties | UV and georeferenced textures for optical, thermal, LiDAR, and physiology |
| Scene layout | Dynamic instances, repetitive scenes, and terrain-following placement |
| Thermal | Thermal imaging and per-primitive temperatures |
| Scene components | Sunlit/shaded leaf and soil classification with per-component area |
| Vegetation physiology | SIF imaging and processes, photosynthesis, and energy balance |
| LiDAR | Point clouds, full waveforms, and turbid-volume returns |
Repetitive scenes require flat, statistically homogeneous terrain and cannot be combined with terrain_following=True. Moving a TurbidBoundary instance requires scene.rebuild(); ordinary property and illumination changes do not.
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.Illumination(
source=less.Sun(zenith=30, azimuth=150),
atmosphere=less.NoAtmosphere(),
)
# Simulate a nadir RGB image.
sensor = less.OpticalImager(
less.Orthographic(image_size=256),
bands=[650, 550, 450],
quality=128,
)
image = scene.simulate(sensor)
image.save("output.png")
Change the illumination and simulate again; the prepared geometry is reused automatically:
scene.illumination = less.Illumination(
source=less.Sun(zenith=60, azimuth=90),
atmosphere=less.NoAtmosphere(),
)
image2 = scene.simulate(sensor)
Forest 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.Illumination(
source=less.Sun(zenith=35, azimuth=225),
atmosphere=less.NoAtmosphere(),
)
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),
)
xy = np.random.default_rng(42).random((50, 2)) * 30
scene.add(birch, positions=np.c_[xy, np.zeros(50)])
image = scene.simulate(less.OpticalImager(
less.Orthographic(image_size=512),
bands=[550, 670, 800],
quality=256,
))
image.save("forest.tif")
GeoTIFF output preserves the physical values of the simulated product.
Examples and viewer
import less
less.examples.list()
less.examples.run("autumn_forest")
less.examples.run("maize_field")
scene.show()
Validation
LESS is cross-validated against LESS 2.x on reference scenes:
| Scene | Description | Maximum RRMSE |
|---|---|---|
| Val01 | Lambertian ground | 0.02% |
| Val02 | Box canopy | 0.22% |
| Val03 | Ellipsoid forest | 0.83% |
| Val04 | Forest with diffuse sky | 2.17% |
| Val05 | PROSPECT-D leaves | 0.24% |
| Val06 | fPAR versus solar zenith angle | 0.62% |
Documentation
Start with the public tutorials:
- 中文:安装
- 中文:核心概念与场景生命周期
- 中文:API 参考
- English: Installation
- English: Concepts and scene lifecycle
- English: API reference
Building LESS from source, running the test suites, or extending it with new sensors, products or backends is covered in DEVELOPMENT.md. None of it is needed to use the published wheel.
Citation
If you use LESS in your research, please cite:
Qi, J., Xie, D., Yin, T., Yan, G., Gastellu-Etchegorry, J.-P., Li, L., Zhang, W., Mu, X., and 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.
License
LESS is free for academic teaching and qualifying non-commercial research. Use is governed by the current LICENSE. Commercial use requires a separate written license.
Commercial use includes company use, commercial consulting or services, commissioned research, commercial synthetic-data generation, and integration into commercial products, platforms, or services. University or non-profit projects performed for a company, or projects that give a company confidential deliverables, preferential access, publication control, or intellectual- property rights, are commercial use. An unrestricted donation or public research grant does not by itself make qualifying academic research commercial; use by a company remains commercial regardless of its funding source.
Third-party components remain subject to their respective license terms. See the LICENSE file for details. Earlier LESS releases remain governed by the license terms that accompanied those releases; those earlier grants are not revoked.
For commercial licensing or clarification, contact the LESS Development Team through the project homepage.
Metadata
Release files for less3d 3.0.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| less3d-3.0.7-cp313-cp313-win_amd64.whl | CPython 3.13 | CPython 3.13 | Windows x86-64 | Details |
| less3d-3.0.7-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.13 | CPython 3.13 | Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 | Details |
| less3d-3.0.7-cp312-cp312-win_amd64.whl | CPython 3.12 | CPython 3.12 | Windows x86-64 | Details |
| less3d-3.0.7-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.12 | CPython 3.12 | Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 | Details |
| less3d-3.0.7-cp311-cp311-win_amd64.whl | CPython 3.11 | CPython 3.11 | Windows x86-64 | Details |
| less3d-3.0.7-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-3.0.7-cp310-cp310-win_amd64.whl | CPython 3.10 | CPython 3.10 | Windows x86-64 | Details |
| less3d-3.0.7-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: 579.7 MB
Release files / less3d-3.0.7-cp313-cp313-win_amd64.whl
| Download URL | less3d-3.0.7-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 56.9 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
cfc198376cadc9b258ce2d3d7ef611183f7d8c3fb048ea0335cdfad2ade65dc7
|
|
BLAKE2b-256 checksum How to use checksums |
54cb0c375509b0a0e18403d644a04636b8d55d9531313f5a89feba85eeedc9be
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|
Release files / less3d-3.0.7-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | less3d-3.0.7-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 88.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 |
05127b633494792ef2a13e4d4b79f081bd3c7c1775c416c44fc826126df8c8fe
|
|
BLAKE2b-256 checksum How to use checksums |
bb790d707780490bdb5b42dd795e864ddd8d10c34b7e9b8c134cfcc2b4dab8e2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|
Release files / less3d-3.0.7-cp312-cp312-win_amd64.whl
| Download URL | less3d-3.0.7-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 56.9 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
f60b6fdc1ccce77d8f9687096c12812964e90114b9eb4e2efbb273eac1bb38fa
|
|
BLAKE2b-256 checksum How to use checksums |
657bae0829bbb21e974b341c6a2af614bce0df796e5805f6c521c6ef54367bbb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|
Release files / less3d-3.0.7-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | less3d-3.0.7-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 88.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 |
0c0b0036fa68baf564fee0e87b575aa9c7c93408db917b99d7e8dee91387044a
|
|
BLAKE2b-256 checksum How to use checksums |
fc08b25bcdcdf48eb39bcc846b490219025d177fe7efa8b5e51cafb0f1827c3b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|
Release files / less3d-3.0.7-cp311-cp311-win_amd64.whl
| Download URL | less3d-3.0.7-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 56.9 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
b9ca77e5b2f4756d5017a214df99ed0e68c3450a0053e05ffb2ff00d2dd230f0
|
|
BLAKE2b-256 checksum How to use checksums |
6b96aa374a8e82586762e1f1785b5a47e5b2afa6a36f5afc8c42429dd0b01fa1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|
Release files / less3d-3.0.7-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | less3d-3.0.7-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 88.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 |
738f3c04ef3d061224f5616b7c39923515652b1a9e19a7c6be1fd8572dfa5868
|
|
BLAKE2b-256 checksum How to use checksums |
02f0112757f8ec3e486cfff6a834834300ce8e8ed727ddf63877920ea40c9d56
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|
Release files / less3d-3.0.7-cp310-cp310-win_amd64.whl
| Download URL | less3d-3.0.7-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 56.9 MB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
625ae1ef00c2dd51dc859d760cf7bb321eefdc3265401e4dcee1eef9ba491dc8
|
|
BLAKE2b-256 checksum How to use checksums |
623ff07045f115be538100e9614f279cbb150d05a03682b55021cf49c7c4b168
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|
Release files / less3d-3.0.7-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | less3d-3.0.7-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 88.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 |
e89d893f6ffc90aedb3a279fd82c1230300e71eab1b92d2d02179875c12e9bdd
|
|
BLAKE2b-256 checksum How to use checksums |
ab5ed4c2fb139d384cbde529cc49e3c9f02e07cf2fb38843ce7de23c92d87429
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|