- Solar PV Segmentation on German Orthophotos (Brandenburg DOP)
- Model 1:
regnety_rgb_s44— the compatible entry point - Model 2:
regnety_rgbi_s42— the tile-robust workhorse (recommended default) - Model 3:
regnety_rgb_lu— the full-tile champion - Discarded variants (documented for transparency, not published)
- Summary
- Roof / ground-mounted performance (pixel-weighted IoU, same best runs)
- Usage in QGIS (deepness plugin)
- Intended use
- Out-of-scope / limitations
- Roof vs. ground-mounted evaluation
- Training details
- Inference
- License
- Citation
- Model 1:
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:
- QGIS → Plugins → install deepness
- Add the DOP tile as raster layer (or a 4-band RGBI+LU merged raster for model 3)
- deepness → processing settings: model file, tiling 256 px / overlap 24 px
- 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
GebauedeBauwerklayer, 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