gnomon
1 m height maps of 26 lunar south-polar landing sites, solved from LRO photos lit from thirty directions. This repository holds the network weights, the scores, and the site list. The maps themselves (GeoTIFFs, 1 m) are in a separate dataset repository.

700 m of the IM-2 landing site, sun 3° above the horizon and circling. Left, NASA's 10 m map. Right, ours.
The polar sun circles the horizon, so a shadow cast from thirty directions is a thirty-way constraint on the ground. A differentiable renderer casts shadows from a height map; a self-supervised UNet is trained with that renderer as its only loss, no labels, no NASA elevation products. The only external height input is the LOLA 10 m laser grid, which anchors the low frequencies.

A photo the network never saw. LOLA rendered under that sun. Ours rendered under that sun.
Files
| path | contents |
|---|---|
weights/<site>/unet/<run>/net.pt |
UNet state dict, PyTorch. 198 checkpoints: 7 to 8 seeds per 6 km site (unet1 …), 3 per 16 km site, one long run, 20 MB each |
weights/<site>/unet/<run>/params.json |
the per-sun-bin exposure and floor fitted with that network |
weights/<site>/split.json |
the frozen train/test split of sun bins for that site |
weights/<site>/sun_fit.csv |
sun direction per bin, nominal and refined |
results/<site>.csv |
held-out scores for every map at that site, plain column names |
sites.csv |
every site: place, mission, coordinates, box size, status |
The weights are site-specific. The network input is the stack of that site's training sun bins plus the LOLA base, so the channel count differs between sites and a checkpoint cannot be applied to another site. Each one reproduces its site's map from the public inputs; it is not a general lunar terrain model.
Scores
Every fifth sun direction was hidden before fitting. Sixteen 300 m blocks of laser heights were removed from the fit. One site has an independent stereo DTM.
| LOLA 10 m | NASA 5 m SfS | ours 1 m | |
|---|---|---|---|
| correlation with hidden photos, NASA's 16 km tile | 0.68 | 0.81 | 0.90 |
| shadow overlap (IoU), same tile | 0.82 | 0.82 | 0.86 |
| relative brightness error, same tile (lower is better) | 0.277 | 0.203 | 0.205 |
| RMSE against the stereo DTM, IM-2 | 0.50 m | 0.40 m | |
| sites beating LOLA on hidden photos | 26 of 26, median gain 0.23 |
Left: two hidden suns from opposite sides of the sky. Right: height error against the stereo DTM, and a 4 m crater LOLA draws as a flat line.
Using a checkpoint
Reproduce a site's map from the public inputs with the pipeline in the code repository:
export MOONDEM_DATA=data/sites/haworth MOONDEM_BOX=haworth
python pipeline/step1_cut_photos.py && python pipeline/step2_get_laser_heights.py && python pipeline/step3_check_sun_angles.py
cp weights/haworth/split.json $MOONDEM_DATA/
python pipeline/step5_fit_terrain_network.py --infer-only weights/haworth/unet/unet1/net.pt --tag from_checkpoint
The architecture is a five-level UNet (widths 32, 64, 128, 256, 256) that takes 2·N+1 channels (N training bins, their valid masks, the LOLA base) and outputs a height residual scaled by 5 m. Input stacks, LOLA windows and the solver are in the code repository.
Not proven
- Only one site has independent truth, a 4 m-post stereo DTM at IM-2 that is band-limited near 20 m.
- Hidden suns have trained neighbours about 15° away. The two-sun shadow test is what rules out appearance interpolation.
- The correlation metric is close to what the network optimises. NASA's 5 m map keeps lower brightness error at one site and is closer at the LOLA points it was fit to.
- The sun-bin filter was applied before the split, so it touched the test bins.
- Fine relief is in the right places but about a third too strong: the renderer has no albedo term. Slopes at baselines under 20 m are an upper bound until an albedo refit.
- Permanently shadowed floors produce no map.
- Multi-image shape-from-shading is an established method, run at 1 to 2 m on some sites by NASA Ames. What is new here is scale and cost (26 sites, one night, about $150), the held-out validation, the self-supervised network, and full release.
Training data
LROC controlled NAC south-polar mosaics (PDS type BDRNPL), 1 m per pixel, one mosaic per 10° of sub-solar longitude, 23 to 36 per tile. LOLA 10 m south-polar DEM from PGDA. Evaluation only: LROC NAC stereo DTM NOBILE03 and NASA PGDA 5 m shape-from-shading DEM of the Leibnitz Beta plateau.
Citation
@misc{gnomon2026, title={gnomon: 1 m height maps of lunar south-polar landing sites from multi-sun photos}, year={2026}, howpublished={Hugging Face}}