Keeping PV data current¶
A PV inventory starts going out of date the day it is published. Where solar is booming, a register or a one-off survey cannot keep up: Pakistan's growth map shows how much of today's rooftop fleet appeared after 2022. EarthPV is built so that updating a country is a re-run of the same pipeline on new imagery, not a new project, and so that every round leaves the next one better informed: more of the map verified by people, more local training data, and a calibration measured against a larger reference.
One round of maintenance¶
- New imagery. Sentinel-2 revisits every place every five days, free.
composebuilds a dry-season composite for each 0.1° cell. A country's grid is pinned (grid_origininconfigs/aoi.yaml), so a cell keeps its name from one round to the next and two rounds compare cell by cell. A new epoch is written beside the old one (--index 1), never over it. - Detect.
inferscores every cell with the current checkpoint. Both steps resume cell by cell, so an interrupted run loses nothing. - See what changed.
growthdiffs two epochs scored by the same checkpoint, so the difference is new panels rather than a new model. Diffing across checkpoints was the first growth map's core flaw. - Hand out only what is new.
export --exclude-mappeddrops every detection within 100 m of an installation already in OpenStreetMap and ranks the rest as mapping leads, with a ready-made MapRoulette challenge. - Verify. Mappers check each lead against high-resolution imagery in the OpenStreetMap editor and map what is real. That is the only step that needs people, and it is where the map improves.
- Learn. The next label pull contains their work. The detector is retrained on the country's own labels, and the new checkpoint replaces the old one only if it scores better on a held-out region of the same country.
- Publish.
density,check-densityandatlasrebuild the country page, andscripts/build_atlas_data_pack.pypackages the per-cell table as a dated release, so every round stays citable and comparable with the last.
earthpv compose --aoi <aoi> --window 2027-04-01:2027-09-30 --index 1 # new epoch
earthpv infer --aoi <aoi> --checkpoint <ckpt> --index 1 --out-dir data/predictions_2027
earthpv growth --aoi <aoi> --current-pred-dir data/predictions_2027 \
--preboom-pred-dir data/predictions ... # see `growth --help`
earthpv export --aoi <aoi> --exclude-mapped --min-distance-m 100
Setting up a new country has the full command sequence.
What one round costs¶
Measured on the 2026 runs, on one desktop with a 6 GB GTX 1060 and a home connection:
| Step | Rate | South Africa (3,647 cells) |
|---|---|---|
| Compose | about 85 cells an hour, network-bound | about 2 days |
| Inference | about 1,300 cells an hour | 2 h 47 min |
| Building join, density, atlas | CPU only | about 1 h 15 min |
| Localized retrain | GPU | 16 h (only when new labels warrant it) |
The imagery is the long pole, and it is free. Nothing else needs re-downloading: label tiles, building footprints and per-cell building counts are cached, and an atlas rebuild from finished outputs takes seconds.
Why each round is better than the last¶
- The verified layer grows. Hand-mapped installations count in Verified at their own outlines. Every lead a mapper confirms moves capacity from "model estimate" to "verified", and Best never falls below Verified in any cell.
- The calibration sharpens. The precision table is re-derived against a larger mapped reference each round. A guard refuses to overwrite a table carrying evidence the new one lacks, so a careless re-run cannot quietly downgrade it.
-
Localization pays off as labels accumulate. With 452 held-out positive chips, South Africa's own model beat the general one clearly (pixel IoU 0.671 against 0.364); with seven and nine, Egypt's and Yemen's holdouts decided on four installations and on none. Mapping is what turns a country from the second case into the first.
-
What is measured widens. Each newly completed calibration area refits the small-installation classifier and can widen the building-density band a figure is published in, and each local dataset found adds a register or statistic the atlas is drawn beside. Those are stations 4 and 5 of the flywheel, and neither waits for new imagery.
Checks that keep an update honest¶
- The ship rule. A retrained model ships only if it beats the current one on a held-out region; a tie goes to the local model.
- The ground-perimeter screen. A mapped park above 5 km² that the imagery shows unbuilt is not counted as capacity.
- The plausibility gate.
check-densityflags regions where ground-mount dwarfs rooftop or one cell carries a whole region. - Clean labels. Each pull is clipped to the national border and stripped of solar-thermal plants, which share OpenStreetMap's solar tag but are not photovoltaic.
- People in the loop. After a national
roofclfscoring, 20 random cells are checked against high-resolution imagery, and calibration areas are dated by the imagery they were mapped on.
What is still manual¶
Verifying leads, mapping and certifying calibration areas, and signing off the random-cell review all need people, by design. Each round is a per-country snapshot: there is no combiner yet that merges countries or rounds into one global time series.