India: the localized detector lost, and a compose defect hid a 750 MW park¶
India was composed and run between 23 September and 11 October 2026, the largest
country this pipeline has attempted: 25,576 cells of 0.1°, about four times Nigeria.
Like Zambia, Nigeria and Vietnam it started with no
calibration quadrats, no national register and no third-party PV dataset to check against.
It was run under the owner's standing instruction to localize the segmentation on the
country's own OpenStreetMap labels and to ship whichever checkpoint scores better on a
held-out region. Here, unlike Vietnam, the localized checkpoint lost, so this page runs on
v5_combined_france. It supersedes the earlier state-level Gujarat page.
Interactive: India PV evidence atlas.
Headline¶
| Verified | 67,592.6 MWp (90% 47,486 to 97,145) |
| Best estimate | 72,271.1 MWp (90% 63,487 to 98,370) |
| Grid | 25,576 of 25,590 selected cells of 0.1°, 35 of 36 states and union territories (geoBoundaries) |
| Imagery | Sentinel-2 L2A, November 2025 to March 2026 |
| Model | v5_combined_france epoch 25 (the localized v10_combined_india lost; see below) |
Revised the day it was published
This page first went out on 11 October with Best at 75,855.7 MWp (90% 66,332 to 99,761). Later that day two defects in how mapped park outlines enter Best were fixed, both described in the screen section: the Khavda outlines the screen rejects had come back into Best whole, and 101 park outlines had been placed on rooftops. Best fell by 3,584.6 MWp; Verified did not move.
A precision floor, not an estimate
India has no calibration quadrats, so there is no roofclf half and no instrument
at all below the 400 m² segmentation floor. It has no glint sample, so
p_unmapped is 0 and p_real collapses to the OpenStreetMap-mapped fraction. Recall
was deliberately skipped (--recall-reference none). For scale, MNRE puts India's
installed solar at 171.05 GW, of which 125.65 GW is ground-mounted and 33.41 GW
grid-connected rooftop
(MNRE physical progress; the page's heading
says 31 August 2026 and its table 30 September). The household rooftop programme alone
had installed about 14.07 GW across 39.38 lakh systems by 20 July 2026, about 3.6 kW
each
(Energetica India).
A 3.6 kW system is about 20 m² of panel, a fifth of one Sentinel-2 pixel: the same
size regime in which France showed this sensor cannot see rooftop PV.
Localizing the detector, and why v5 ships¶
Labels. 24,810 OpenStreetMap solar features inside India (3,751 rooftop, 20,887 ground, 172 unclassified), out of 53,138 in the country's bounding box. Like Vietnam's, the mapped population is dominated by utility parks.
Holdout, inherited rather than re-picked. Gujarat's Surat-Bharuch-Vadodara box (lon 72.7 to 73.9, lat 21.0 to 23.0), 240 cells. v5 held this box out of its own Gujarat corpus, so both checkpoints are scored out of sample on it, and inheriting it left no free choice. Training chips in the one-cell ring around it were dropped (13 chips).
Corpus and recipe. 5,167 train and 82 val chips (3,872 with PV). India's chips replace
the Gujarat corpus in v5's mix, since they already cover Gujarat, and were weighted x1
(round(7000 / 5,167)), giving 29,740 rows with India at 17.7%. The recipe is v5's
verbatim. Best epoch 13, early-stopped at epoch 21, 6.4 hours on the GTX 1060.
The ship decision, scripts/compare_local_vs_v5.py on the 82 held-out chips:
| v5 | v10 (localized) | |
|---|---|---|
| recall, installations at or above 500 m² | 0.938 (241 of 257) | 0.911 (234 of 257) |
| pixel IoU | 0.686 | 0.663 |
| pixel F1 | 0.814 | 0.798 |
The rule compares recall first, and a difference above 0.02 decides: v5 ships. The margin is seven installations of 257 on one holdout, which is not strong evidence that localization hurts in India. It is evidence that it did not help: v5 already carries Gujarat's chips from outside this box, and India's labels are 84% ground-mount, the population every earlier corpus already covers well. Vietnam's localized checkpoint won on outline quality (IoU 0.724 to 0.762) with recall tied; India's lost on both.
The whole-country comparison, after the atlas (compare_checkpoints_vs_mapped.py, both
checkpoints inferred over all 25,576 cells, scored against the 4,010 dissolved mapped
installations of 400 m² and up that both imaged), finished on 13 October:
| v5 (ships) | v10 (localized) | |
|---|---|---|
| pooled recall over mapped installations | 0.501 (2,011) | 0.441 (1,767) |
| recall, 500 to 50,000 m² | 0.698 (1,314 of 1,883) | 0.606 (1,141) |
| recall above 50,000 m², counting candidates above the cap | 0.937 | 0.936 |
| candidates below the 100,000 m² merge cap | 92,139 | 33,454 |
| median candidate area | 1,601 m² | 5,104 m² |
| total candidate area below the cap | 528.1 km² | 505.5 km² |
| candidates above the cap | 3,242 (2,081 km²) | 4,485 (2,472 km²) |
| rooftop share below the cap | 35.2% | 30.7% |
The script drops candidates above the merge cap, as density does, and India's parks are
mostly found by exactly such candidates, so its own recall for the 2,066 installations above
50,000 m² reads 0.32 and 0.29. Counting them, both checkpoints find 94% of the parks; the
difference is in the arrays between 500 and 50,000 m². This recall favours v10 and v10
still loses: it trained on every Indian label outside the Gujarat box, so it is scored here
largely in-sample, while v5's only Indian training data is Gujarat's chips. 338 installations are found by v5
alone against 94 by v10 alone (McNemar p < 0.001). In Vietnam the localized checkpoint drew
fewer, larger candidates and kept its recall; v10 draws 64% fewer candidates at three times
the median area, holds about the same total area below the cap, merges about 1,250 more
model-drawn blobs above it and finds fewer mapped arrays. The diagnostic confirms the
holdout decision rather than qualifying it.
A compose defect, found here and fixed for every later country¶
Rewa Ultra Mega Solar (750 MW, fully mapped) came out of the ground-perimeter screen as
0% imaged. Its two cells were 87% empty. annual_composite kept the twelve scenes with
the lowest eo:cloud_cover, a property of the whole MGRS tile, and in India's dry season
dozens of scenes tie at 0.0%. For Rewa's cell all twelve came from tile 44QNM, which covers
11% of the cell, while equally cloud-free 44RNN scenes covering all of it ranked 15th and
below. A second defect shows up in the same composites: about 33,000 failed range requests
during India's compose, silently turned into zeros, left 1.3% of cells with at least one band
entirely missing, and on such a cell the model mostly detects nothing.
On a random sample of 3,000 Indian composites, 1.3% of cells have a tile-edge gap above 5%
and together they lose 0.79% of imaged area. Nationally that is small; for Rewa it removed a
750 MW park from Verified, because the ground cap described below keeps a perimeter above
5 km² only on imaging evidence. Both defects are fixed in imagery.py for every
composite built from 2026-10-10 on, and Rewa's cell recomposed with the fix is 0.0% empty.
India was not recomposited; the affected cells are listed as
open question 22.
The ground-perimeter screen and the 5 km² cap¶
3,481 OSM ground perimeters of 50,000 m² or more (2,221 km² together): 98.5% of their area is imaged, and the model detects PV over a median 98.5% of each. 3,365 screen as detected, 75 as worth a look, 41 as insufficiently imaged.
56 perimeters exceed the 5 km² cap (751 km²). The evidence gate introduced for Vietnam keeps a feature above the cap only when it is imaged and at least 50% detected: 47 are kept, among them Bhadla (48.3 km²), Pavagada (42.9), Kurnool (23.9), Ananthapuramu (20.8) and Charanka (14.8). Nine are dropped, and the gate is visibly doing its job on the two largest: the Khavda Renewable Energy Park outline (88.3 km², tagged 1,000 MW) and NTPC Khavda (62.0 km², 397.7 MW) are 19% and 22% detected, and their own capacity tags imply 0.011 and 0.006 kWp/m², i.e. outlines drawn around a planned zone that is mostly still desert. So are a third Khavda outline (23.3 km², 16% detected) and a 7.9 km² outline in Rajasthan with 0.06% detected. The other five are wrong drops, all on imaging rather than on evidence of absence: Rewa's two overlapping outlines, for the reason above, and three parks of 5.1 to 5.9 km² that are 76 to 94% detected where imaged but only 24 to 77% imaged.
Best now applies the same gate. As first published, the gate covered Verified only and
its drops came back through the model: postprocess substitutes a mapped outline for the
model candidate it matches, and density exempts OSM geometry from the 100,000 m²
cap, so the Khavda RE Park and NTPC Khavda outlines entered Best whole, 3,789 MWp in their
two cells (5.0% of that day's Best) against zero in Verified. density now applies the
gate's evidence rule on the model side as well: an outline above 5 km² that fails it
is credited at its area times the share of its imaged part the model detects, and an
outline with nothing imaged earns nothing. The two Khavda cells fall to 796.4 MWp
(30.7 of 150.2 km² credited) and the Rajasthan outline from 199.4 MWp to zero. The
three partly imaged parks keep 76 to 94% of their area, since an unimaged part is a
compose gap, not evidence of absence. Refusing the exemption outright would have been wrong
the other way: the model's own polygons at Khavda are merged blobs above the cap, so a zone
with several GW operating would have dropped to almost nothing.
A mapped park outline is never rooftop. postprocess places a candidate by its overlap
with VIDA footprints, and VIDA traces a park's panel rows as buildings, so 101 of the
exempt outlines (50.5 km²) had been placed rooftop, converted at the module
constant and priced at the rooftop p_real. They held 2,891 of the 4,109 MWp the model
reported as rooftop, and they had also set the largest rooftop bin's p_real (0.318; 0.171
without them). The OSM layer already reclassified a rooftop feature this large as ground;
the candidate side now does the same, and the precision table was re-derived on the
corrected population.
The land constant holds here. Of the kept parks above 5 km², eleven carry a capacity tag: 9,658 MW on 214.7 km², 0.045 kWp/m² pooled (median 0.047, IQR 0.042 to 0.049) against the 0.05 the atlas assumes, which was calibrated on two Pakistani plants. Indian parks usually quote AC capacity, so the DC figure is somewhat higher, closer to the constant. This is the measurement Vietnam's page listed as missing; Germany's register put German plants at 0.081 and Zambia's two measured plants at 0.085, so the constant is not universal, but it fits the Indian utility-scale fleet.
Plausibility gate¶
earthpv check-density reports 17 fail and 9 suspect of 35 regions. Sixteen of the
seventeen fail the ground-to-rooftop ratio above 5x, from Punjab (7.8x) to Rajasthan
(108x); nationally the model's estimate is 32,025 MWp ground against 843 MWp rooftop, 38x.
MNRE's own split is 3.8x (125.65 GW against 33.41 GW). As in France, the gate
is firing on the missing rooftop denominator: the household programme's 3.6 kW systems are
below what this sensor can see, so every regional ratio is inflated. The ratios read worse
than on the first version of this page (12 fail, national 8.1x) because most of what the
model then called rooftop was park outlines (see the screen section above).
Six regions also fail the single-cell check, and each flagged cell holds a mapped plant: Pavagada in Karnataka (26% of the state), the Ananthapuramu park at NP Kunta in Andhra Pradesh (30%, 44.3 km² of OSM outline), and mapped plants in Chhattisgarh, Kerala, Assam and Jharkhand (1.3 to 5.1 km² each). Jharkhand fails on concentration alone. Gujarat no longer does: the Khavda outlines were 29% of the state before they were credited at their detected share. The check exists to catch ground-mount false positives on bright bare land; here 1,073 of the 1,433 km² of capacity-relevant ground candidate area is a mapped plant's outline, and the screen above shows the model detecting PV over a median 98.5% of those perimeters. Published with the flags stated, per this project's precedent for a checked-genuine failure.
Candidate population¶
95,381 candidates: 32,541 rooftop, 25,214 ground-adjacent, 37,626 with no building, median
1,798 m². 1,911 model-drawn candidates exceed the 100,000 m² merge cap and are
excluded from capacity: 33.7% of candidate area, the largest 30.27 km². A further 1,331
oversize candidates carry an OSM-verified plant geometry and are exempt, all counted as
ground, six of them at their detected share (44.7 of 174.3 km²). The model's own
estimate (est_mwp_rc) is 32,868.2 MWp (90% 21,838 to 47,921), 843.0 rooftop and
32,025.3 ground; with no recall reference it equals the precision-weighted
est_mwp_cal_total. 27.8 GW of it is the 1,331 OSM-outline candidates, each weighted by the
largest ground bin's p_real of 0.518. The probability-weighted est_mwp_exp, which
does not use the candidate population, is 29,520.5 MWp.
Verified is almost all ground-mount. It is the hand-mapped layer at the two constants: 1,331 km² of dissolved ground perimeters against 9.3 km² of rooftop polygons. Best adds 4,678.5 MWp on top, model detections outside anything Verified counts, 796.4 MWp of it at Khavda (see the screen section above).
Solar-thermal is counted as PV on this page. OpenStreetMap tags concentrated-solar plants
and rooftop water heaters with the same generator:source=solar the label pull selects,
and India's labels were built before that was noticed (Morocco's, run next, turned out to
be half solar-thermal). It was measured the day after publication, by looking the label
elements up by OSM id (scripts/drop_solar_thermal.py --by-id), since the area scans the
other countries use failed on every public mirror at India's size: 253 of the 24,810 label
features are solar-thermal, 9.4 km² once dissolved, among them the Dhirubhai Ambani
(100 MW), Megha (50 MW) and Godawari (50 MW) concentrated-solar plants. Ten features of the
hand-mapped layer lie mostly inside them and carry 473 MWp at the two constants, about 0.7%
of Verified and of Best. They are not removed on this page: dropping the four model
candidates that sit on the same plants rewrites the candidate file, which rebuilds the
density stage over all 25,576 cells (about 31 hours) for a change well inside either
interval. Every country run after India filters it (scripts/drop_solar_thermal.py).
Against the old Gujarat page¶
The Gujarat page reported 812.6 MWp (est_mwp_rc) over its bounding box,
of which Gujarat state was 765.0 (168.7 rooftop, 596.3 ground). The same estimator here
gives the state 4,554.1 MWp (93.3 rooftop, 4,460.9 ground), and the atlas puts it at
Verified 5,852.3 and Best 7,492.9 MWp over 1,423 cells.
Almost all of the rise is one rule. The Gujarat run (2026-08-07) excluded every candidate
above 100,000 m², including those carrying a mapped plant's outline; density began
exempting OSM geometry from the cap three days later. Those 135 candidates (142.1
km² credited) are about 3.7 GW of the new state figure, 0.8 GW of it the two Khavda
outlines at their detected share. The rest is a different checkpoint (v5, where the old
page used one since deleted) and a national precision table in place of Gujarat's own (the
largest ground bin's p_real is 0.518 here against 0.309).
Operational notes¶
Compose built 25,576 of 25,590 selected cells between 25 September and 8 October, about 83 cells per hour sustained, with the network hardening described on the Vietnam page in place from the start. systemd-oomd killed the compose unit about once a day at its 12 GB cap (20 times in all) and the queue restarted it each time; a stretch of DNS failures on 1 October (the router's rotating IPv6 resolver) cost about 1,100 cell attempts that later passes recovered.
Training ran at a milestone (every label cell plus 3,000 density cells composited), and v5
inference then ran every six hours behind the still-running compose, so only the last
cells remained when compose finished. Postprocess needed --stream-buildings (per
0.25° chunk instead of a national building table) and took 23.7 hours. The host was
rebooted at 89% of the density stage, 28 hours in; density now records its candidate
fingerprint at the start of a first run, so an interrupted run resumes instead of starting
over.
What India needs next¶
A calibration quadrat in a rooftop-dense area. Almost all of India's rooftop capacity is below this page's floor. Gujarat leads the household programme by state, so a box there is the obvious first one. Check the imagery date before drawing it; see the quadrat protocol.
Recomposite the affected cells (open question 22), Rewa first.
Reproducing¶
pixi run python scripts/overpass_labels_chunked.py --bbox 68.0,6.7,97.5,37.1 \
--iso3 IND --name india --tiles 14x14 --timeout 300 --retries 8
systemd-run --user --collect --unit=earthpv-vn-in-queue -p WorkingDirectory="$PWD" \
-p LimitNOFILE=65536:65536 -p MemoryMax=4G bash scripts/run_vn_in_queue.sh
The queue composes India behind Vietnam and hands it to scripts/run_country_compute.sh
india (chips at the training milestone, training, the v5 comparison, incremental inference
and the atlas chain, behind marker files).