OpenDroneKit

Solar thermal anomalies model card

Per-module classification of aerial infrared crops of single PV modules into 12 classes. It is not a localiser and cannot find modules in a survey image.

Updated 2026-10-02Figures from docs/features/registry.py and models/model_registry.json at 1ef6351

0.724Balanced accuracy · validationsolar_thermal_anomaly_classifier

Measured, not promised

Every figure below is copied from the project’s registry, with the split it was measured on. Nothing here is a benchmark against another product, and nothing was re-measured for this page.

MetricValueSplitSource
Balanced accuracy0.724validationmodel_registry.json:165
Plain accuracy0.815validationmodel_registry.json:165
Recall, Diode0.969validationmodel_registry.json:165
Recall, Diode-Multi0.957validationmodel_registry.json:165
Recall, No-Anomaly0.926validationmodel_registry.json:165
Recall, Shadowing0.809validationmodel_registry.json:165
Recall, Vegetation0.722validationmodel_registry.json:165
Recall, Hot-Spot-Multi0.719validationmodel_registry.json:165
Recall, Offline-Module0.707validationmodel_registry.json:165
Recall, Hot-Spot0.65validationmodel_registry.json:165
Recall, Cracking0.646validationmodel_registry.json:165
Recall, Cell0.635validationmodel_registry.json:165
Recall, Cell-Multi0.537validationmodel_registry.json:165
Recall, Soiling0.367validation (30 samples)model_registry.json:165
Precision, Soiling0.344validation (30 samples)model_registry.json:165

The headline figure was last changed in the repository on 2026-08-16.

Known weaknesses

Model and threshold

Registry keysolar_thermal_anomaly_classifier
ArchitectureResNet18 (run solar_thermal_cls, 26 epochs, early-stopped)
Input size96 px
LabelsCell, Cell-Multi, Cracking, Diode, Diode-Multi, Hot-Spot, Hot-Spot-Multi, No-Anomaly, Offline-Module, Shadowing, Soiling, Vegetation
Statusinstalled (registry status; the weights file is not in the Git repository)

History

  • Balanced accuracy selected the checkpoint; plain accuracy would have chosen a model that answers No-Anomaly to everything.

What was it trained on?

Raptor Maps InfraredSolarModules: 20,000 infrared PV-module crops across 11 anomaly classes plus normal (20,000 images). Source crops are 24x40 px, upsampled to 96. The corpus is 10,000 No-Anomaly against 249 Hot-Spot and 204 Soiling. Metrics are on the validation split; balanced accuracy selected the checkpoint.

Weights trained on a dataset carry that dataset’s terms, which can be stricter than the code licence. The weights are not in the Git repository.

What happens when it cannot answer?

Expects one module per image (a crop). On main the registry scope note says it is not a localiser. An explicit refusal of a whole thermal frame is integration-branch behaviour only.

Sources: model_registry.json:165

Provenance

The registry records the SHA-256 of the weights file whose metrics were measured. At load, the installed file is hashed and compared; a different file is reported as a mismatch, so these figures are never attached to weights they do not describe.

sha256  6933a09abff99bf8d4e2619a50a64498432d2877b9abd55ccab7a87ac357fd42

Tests named for this capability in the registry: tests/test_trained_defect_models.py::TestTheWeightsAreReallyThere, tests/test_trained_defect_models.py::TestTheNumbersArePublished, tests/test_trained_defect_models.py::TestLabelsMatchTheModel.

Other model cards: Crack segmentation · Corrosion severity · Solar cell defects (electroluminescence) · AI defect detection