Solar PV Segmentation on German Orthophotos (Brandenburg DOP)

DeepLabV3+ models for detecting ground-mounted and roof-mounted photovoltaic installations on 20 cm GSD aerial orthophotos (1 km × 1 km tiles, 4-band RGBI) from the Land Surveying Office of Brandenburg (LGB).

Three checkpoints are provided, each best-in-class for a different use case:

Model 1: regnety_rgb_s44 — the compatible entry point

RegNetY-080 encoder (SMP DeepLabV3+), input: RGB (3 channels).

Runs on any RGB aerial image without additional data — ImageNet-normalized, ready to use. On the PV-rich patch subset it matches the strongest patch-level model (Selected-Test IoU 0.859), and unlike transformer-based RGB models it does not collapse on full tiles (full-tile-validation IoU 0.773). Best run selected on full-tile validation IoU. Use-case: easiest entry, RGB-only imagery.

Model 2: regnety_rgbi_s42 — the tile-robust workhorse (recommended default)

RegNetY-080 encoder (SMP DeepLabV3+), input: RGBI (4 channels: R, G, B, NIR).

Input is the recommanded1 format (4-band RGBI GeoTIFF) — no extra data required. NIR helps most on rooftop PV (full-tile-test roof IoU 0.68 vs 0.56 for RGB-only) and strongly stabilizes training across seeds (±0.005 vs ±0.015). Best run selected on full-tile validation IoU (0.838, only 0.02 below the land-use model) without any ALKIS dependency. Use-case: default recommendation for large-area inference.

Model 3: regnety_rgb_lu — the full-tile champion

RegNetY-080 encoder (SMP DeepLabV3+), input: RGB + ALKIS land-use (4 channels, channel order R, G, B, LU).

Channel 4 is an ALKIS-derived land-use raster (consolidated per-pixel land-use class, normalized 0.5 ± 0.25, rasterized from Nutzung geometries aligned to the DOP grid). The channel suppresses rural background false positives exactly where the other models collapse: full-tile-validation ground IoU 0.90 (thesis reference 0.93). Requirement: the user must obtain ALKIS data themselves (dl-de/by-2-0) and rasterize the geometries to the tile extent using rasterize_alkis.py (included in this repository).

Land-use classes: 1=Residential, 2=Industrial, 3=Mixed Use, 4=Other Settlement, 5=Traffic, 6=Agriculture, 7=Other Vegetation, 8=Water; 0=no object/background. Unknown ALKIS nutzart values (future data revisions) map to 0 as well. The full mapping (35 German land-use names → 8 classes) lives in rasterize_alkis.py and matches the thesis's consolidated class table. Use-case: maximum accuracy when ALKIS is available.

Discarded variants (documented for transparency, not published)

Variant Reason for rejection
SegFormer MiT-B3, RGB Dominated by regnety_rgb_s44: identical RGB input, equal Selected-Test IoU (0.859 vs 0.858), but full-tile IoU collapses (0.513 vs 0.773, prevalence shift on rural background). Retained only as thesis-internal patch-level baseline.
RegNetY RGBI+GNDVI (5ch) Requires GNDVI preprocessing on top of the RGBI delivery format; no benefit over regnety_rgbi_s42 (full-tile 0.827 vs 0.838 in the thesis pipeline).
PBIA (XGBoost / Decision Tree ± GLCM) Not deep-learning checkpoints; far below DL accuracy (≤ 0.759 full-tile IoU) and tied to the exact GLCM feature pipeline. Published as code instead of weights.

Summary

Checkpoint Backbone Input Selected-Test IoU Full-Tile-Val IoU
regnety_rgb_s44 RegNetY-080 (SMP DeepLabV3+) RGB (3ch) 0.859 0.773
regnety_rgbi_s42 RegNetY-080 (SMP DeepLabV3+) RGBI (4ch: R,G,B,NIR) 0.848 0.838
regnety_rgb_lu RegNetY-080 (SMP DeepLabV3+) RGB + ALKIS land-use (4ch) 0.868 0.860

Pixel-weighted IoU, identity post-processing (no morphological enhancement), best run per configuration selected on full-tile validation IoU (6 seeds per configuration; see mean ± std below).

Roof / ground-mounted performance (pixel-weighted IoU, same best runs)

Selected-Test Roof Selected-Test Ground Full-Val Roof Full-Val Ground Full-Test Roof Full-Test Ground
regnety_rgb_s44 0.755 0.893 0.695 0.806 0.564 0.519
regnety_rgbi_s42 0.738 0.885 0.804 0.852 0.676 0.574
regnety_rgb_lu 0.764 0.904 0.766 0.900 0.592 0.827

Reading: NIR helps most on rooftops (RGBI roof +0.08 over RGB on full tiles, with half the seed variance); the ALKIS land-use channel suppresses rural background false positives — visible on full-tile ground IoU (0.83 vs 0.52–0.57) where the other models lose accuracy to vegetation/field false positives. On the PV-rich selected patches all three models are close.

Why Full-Val ground differs from Full-Test ground: the splits differ in composition (see metadata/plants_mastr.csv). Validation is ground-dominated — only 28% of its PV area is roof-mounted, prevalence is highest (14% of selected-patch pixels) — so full-tile background false positives hit the ground class hardest (0.83–0.85 here). Testing is roof-dominated (51%) with smaller tracking installations, yielding a higher ground IoU but the lowest roof IoU. Training sits in between (44% roof). This split composition is inherited from the tile selection protocol, not tuned.

Usage in QGIS (deepness plugin)

The ONNX exports (*.onnx, next to each checkpoint) run in the QGIS plugin deepness without any Python setup:

  1. QGIS → Plugins → install deepness
  2. Add the DOP tile as raster layer (or a 4-band RGBI+LU merged raster for model 3)
  3. deepness → processing settings: model file, tiling 256 px / overlap 24 px
  4. Set normalization in the deepness UI per the table below, run
Model Raster bands (in order) deepness mean / std (per band) Output
regnety_rgb_s44.onnx R, G, B R 0.485/0.229 · G 0.456/0.224 · B 0.406/0.225 PV probability map (0–1)
regnety_rgbi_s42.onnx R, G, B, NIR (LGB delivery format) RGB as above, NIR 0.5 / 0.25 PV probability map
regnety_rgb_lu.onnx R, G, B, LU (requires merged RGBI+LU raster) RGB as above, LU 0.5 / 0.25 PV probability map

The ONNX graph bakes in the sigmoid: output = single-channel PV probability (0–1, float32, 256×256 per window). Recommended threshold in deepness: 0.5.

Intended use

  • Detect PV installations on DOP imagery of Brandenburg / comparable German aerial imagery (0.2 m GSD, RGB or RGBI).
  • The RGBI checkpoint requires the standar delivery format (4-band RGBI GeoTIFF).
  • The land-use checkpoint additionally requires an ALKIS-derived land-use raster aligned to the DOP (channel order: R, G, B, LU).

Out-of-scope / limitations

  • Trained on 50 hand-annotated 1 km tiles from Brandenburg (2021–2024 recordings); no guarantee outside this domain.
  • Performance degrades on full tiles vs. PV-centered patches (prevalence shift); the land-use channel mitigates this.
  • Patch-level metrics on PV-containing patches overstate full-tile performance — see evaluation table.

Roof vs. ground-mounted evaluation

All reported metrics are split by installation type:

  • Roof-mounted: PV pixels inside building footprints (ALKIS GebauedeBauwerk layer, buffered by 3.2 m). Buildings are classified by the land surveying authority; a panel on a building footprint is by definition roof-mounted.
  • Ground-mounted: all remaining PV pixels (open-space installations, tracking systems, carports outside building footprints).

Both classes are evaluated only where the corresponding ground truth is present: per-tile confusion counts (tp/fp/fn) are accumulated within the building mask (roof) and its inverse (ground), then IoU is computed pixel-weighted over all tiles. Tiles without building geometry count entirely as ground.

Reported numbers are pixel-weighted (confusion counts accumulated over all tiles/patches before computing IoU), not the unweighted mean of per-tile IoUs — per-tile means are dominated by tiles with few PV pixels and are 0.3–0.6 lower on ground-mounted evaluation.

Training details

  • Loss: focal (α=0.4, γ=2.0); AdamW, lr 3e-4 (RegNetY), wd 1e-5, bs 8
  • Data augmentation, ImageNet-pretrained encoders, 6 seeds per configuration
  • Checkpoint selection: best validation IoU (selected patch subset); for the RegNetY variants, the run with the best full-tile validation IoU is published here
  • Seed variance (Selected-Test, pixel-weighted): RegNetY RGBI 0.851 ± 0.005, RegNetY RGB 0.840 ± 0.015 (n=6)
  • Ground-truth: hand-corrected annotations (corrected classes), ≥ 1.6 m² PV per patch

Inference

Inputs are normalized per channel: RGB with ImageNet statistics (mean 0.485/0.456/0.406, std 0.229/0.224/0.225), additional channels with mean 0.5, std 0.25. Threshold 0.5. The checkpoints store their full config dict; loading requires the training code (see repository link below).

License

  • Model weights: CC BY 4.0
  • Training imagery: © GeoBasis-DE/LGB (2021–2024), dl-de/by-2-0, Daten geändert (Datenlizenz Deutschland — Namensnennung 2.0; compatible with CC BY 4.0)
  • ALKIS land-use data: © GeoBasis-DE/LGB, dl-de/by-2-0

Citation

Master thesis: Validation of Photovoltaic Data in the German Core Energy Market Register via Aerial Image Segmentation, Hochschule Harz (2026). Ground-truth dataset (archived): DOI 10.5281/zenodo.22715506 — https://zenodo.org/records/22715506 Model repository: https://huggingface.co/Muemmel/solar-pv-segmentation-brandenburg

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Dataset used to train Muemmel/solar-pv-segmentation-brandenburg