The Lunar Radio Map Dataset
The dataset is distributed through Kaggle, and the challenge runs as a Kaggle Code Competition: participants submit a notebook that performs inference, and the organizers execute it against the withheld test set. This is what allows the per-map runtime limit to be verified uniformly for every team.
Dataset download and submission:
Kaggle competition page
Challenge repository (dataloader, baseline, scoring script):
GitHub repository
Full dataset documentation: ships inside every archive as README.md
The archives unpack into a single LunarRM/ tree. Download only the bands you intend to work on; the
index files describe both bands in every archive. Verify what you downloaded against the published
SHA256SUMS.txt.
The dataset includes diverse lunar radio maps generated over synthetic topographic models. Participants receive a training split and a frozen validation split with full ground truth; the test inputs are released without their ground truth, which is withheld by the organizers to select the top-performing teams.
The challenge dataset comprises 66,000 PL radio maps generated over synthetic lunar terrains using Sionna-RT. Due to the limited amount of high-resolution lunar Digital Terrain Models (DTMs), we utilized a procedural pipeline to synthesize 256 × 256 meter landscapes at 1 m/px resolution. These were statistically validated against actual lunar DTMs to ensure realistic crater distributions and surface ages. Electromagnetic properties of lunar regolith were applied to ensure accurate propagation modeling across two frequency bands (415 MHz and 5.775 GHz, hereafter referred to as 5.8 GHz). The dataset is split 85/15 into a provided development set and a withheld test set; the development set is further divided into a training and a frozen validation split, structured as follows:
| Dataset Split | Terrains (51 TX) | Terrains (1 TX) | RMs per Freq. | Total RMs |
| Training | 392 | 5,728 | 25,720 | 51,440 |
| Validation (frozen) | 33 | 647 | 2,330 | 4,660 |
| Testing (15%, withheld) | 75 | 1,125 | 4,950 | 9,900 |
| Total | 500 | 7,500 | 33,000 | 66,000 |
Splitting is at the terrain level and stratified by transmitter count, so no terrain — and therefore no heightmap — appears on more than one side. A terrain carrying 51 transmitters keeps all 51 of its samples together, because those samples share a heightmap and separating them would leak.
Validation Split
The validation split ships as its own directory, already separated from the training data. It is a 10% slice of the development terrains, frozen, and identical for everyone. Report validation numbers from this split — because every entrant measures on the same 2,330 maps per band, those numbers are directly comparable. Re-splitting the training data for your own model selection is perfectly fine; just do not report that as your validation score.
The split is defined on terrains, so it is band-independent: the same terrains are held out at 415 MHz, at
5.8 GHz, and for a model trained jointly on both. The file val_terrains.txt lists the 680 validation terrain
ids and travels with the data as provenance; you do not need to apply it yourself, since the directories are already
separated. Note that 10% of terrains is 8.3% of samples, because terrains carry unequal transmitter counts.
Simulation Details
Simulations modeled line-of-sight paths, specular reflection, diffuse (Lambertian) scattering, and refraction. Diffraction was explicitly disabled due to the exponential computational complexity of applying models like UTD to continuous, high-resolution terrain micro-edges. To mitigate ray-tracing null pixels, we applied Monte Carlo averaging over incrementing solver seeds. Remaining gaps were resolved using linear interpolation (415 MHz) or a static fill of exactly 145.0 dB (5.8 GHz), which left much larger contiguous voids than interpolation could sensibly bridge. Gap-filled pixels are excluded from scoring — see Validity Masks and Scoring below. For all simulations, the TX height is set at 3 m above the local terrain contour. The RX is measured as an isotropic probe sampled on a mesh surface exactly 1 m above the terrain contour, which is then linearly interpolated onto a regular 256 × 256 grid. We trace the ray path up to a maximum depth of 100 interactions, simulating 4 × 109 rays per transmitter. The TX parameters were set as a single isotropic antenna element with vertical polarization.
Specifically, the dataset includes:
- The target PL RMs saved as .npy files (float16). Each image pixel value represents the positive pathloss of the
wireless signal, measured in dB, at the corresponding lunar geometry location. Pathloss is independent of transmit
power; the simulation used a fixed 20 dBm isotropic transmitter, so received power is
RSS_dBm = 20 − pathloss_dB. - Each PL RM is associated with input physical features, including a continuous height map image (float32, metres above that tile's own minimum elevation) representing the topological elevation of the lunar terrain and a one-hot encoded spatial map (uint8) indicating the exact coordinate location of the transmitter, both also saved as .npy files. Heightmaps are stored once per terrain and shared by all of that terrain's transmitters.
- Validity masks (.npy, one per sample per band) marking which pixels the ray tracer actually resolved: 1 = ray-traced, 0 = gap-filled. These masks define the evaluation metric. They ship with the training and validation splits; test masks are withheld and are not needed.
index.csv, listing one row per (terrain, transmitter) sample with the paths to every array, andmask_index.csv, giving the mask paths and the valid-pixel fraction per sample so you can filter or stratify by fill level.metadata.jsonwith units, value ranges, normalization bounds and the full simulation parameters, andlunar_dataset.py, a reference PyTorch dataloader.
Validity Masks and Scoring
Ray tracing with finite samples leaves some cells unresolved, and those cells were gap-filled. At 415 MHz they were linearly interpolated and take continuous values. At 5.8 GHz they were set to a static 145.0 dB, which is substantial and very unevenly distributed:
| Share of 5.8 GHz pixels that are gap-filled | Overall | Median map | 90th pct. map | Worst map |
| 11.4% | 4.1% | 32.6% | 78.7% |
Note that 145.0 dB is not an out-of-range sentinel — real 5.8 GHz pathloss runs to roughly 228 dB, so the fill sits inside the physical range and cannot be identified by thresholding.
These pixels are excluded from scoring. They are placeholders rather than simulated values, and the challenge metric is RMSE over valid (ray-traced) pixels only, computed separately per band and weighted 50/50. Predict real propagation everywhere: you submit full 256 × 256 maps and the mask is applied at scoring time.
Exact masks are supplied with the training and validation splits, recovered from the pre-fill simulation output, where
1 means the ray tracer produced the value and 0 means it was filled. Coverage is complete for
both bands, so masking removes pixels, never samples. Typical valid-pixel fractions:
| Band | Mean valid | Median | Minimum |
| 415 MHz | 99.27% | 99.35% | 74.31% |
| 5.8 GHz | 89.57% | 96.23% | 7.47% |
You can approximate the filled region with pl58 == 145.0, but prefer the supplied masks: pathloss is
stored as float16, whose spacing at 145 dB is 0.125, so genuine values within ±0.0625 dB of the fill quantize onto
it. Measured against the exact masks, that test mislabels about 0.02% of real pixels. Small, but the masks are exact and
cost nothing.
The masks are also what you want in the training loss, so that the placeholder regions do not pull your model toward a constant. All-pixel RMSE is reported alongside the ranking metric as a diagnostic only.
Guidelines for Participants
- Download the dataset from the Kaggle competition page and the provided example code, e.g., the data loaders and modules of the presented baseline methods.
- Develop data-driven PL inference methods using the presented dataset. Participants can make use of the input images to extract additional features. The authors are encouraged to use data augmentation techniques, and a default augmentation pipeline is provided with the dataset. Train against the validity masks so that gap-filled pixels do not influence your loss, and report validation results on the frozen validation split that ships with the data.
- Teams submit through the Kaggle Code Competition: a notebook that loads your trained model, predicts full 256 × 256 pathloss maps for the test inputs, and writes them in the documented submission format. The organizers execute the notebook, apply the validity masks, and compute the ranking metric. The notebook must also satisfy the per-map runtime limit. Participants have the flexibility to submit either a single unified model that predicts both frequency bands (e.g., using a boolean image flag as a condition, as demonstrated in RadioLunaDiff) or two distinct models trained separately for the 415 MHz and 5.8 GHz tasks.
References
[1] J. Hoydis, S. Cammerer, F. Ait Aoudia, M. Nimier-David, L. Maggi, G. Marcus, A. Vem, and A. Keller, “Sionna,” 2022.
[2] P. Torrado, A. Pearson, J. Klein, A. Moscibroda, and J. Smith, “RadioLunaDiff: Estimation of wireless network signal strength in lunar terrain,” in ICASSP 2026 — 2026 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP), 2026, pp. 21231–21235.
[3] R. Levie, Ç. Yapar, G. Kutyniok, and G. Caire, “RadioUNet: Fast radio map estimation with convolutional neural networks,” IEEE Transactions on Wireless Communications, vol. 20, no. 6, pp. 4001–4015, 2021.