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.
| Metric | Value | Split | Source |
|---|---|---|---|
| Balanced accuracy | 0.724 | validation | model_registry.json:165 |
| Plain accuracy | 0.815 | validation | model_registry.json:165 |
| Recall, Diode | 0.969 | validation | model_registry.json:165 |
| Recall, Diode-Multi | 0.957 | validation | model_registry.json:165 |
| Recall, No-Anomaly | 0.926 | validation | model_registry.json:165 |
| Recall, Shadowing | 0.809 | validation | model_registry.json:165 |
| Recall, Vegetation | 0.722 | validation | model_registry.json:165 |
| Recall, Hot-Spot-Multi | 0.719 | validation | model_registry.json:165 |
| Recall, Offline-Module | 0.707 | validation | model_registry.json:165 |
| Recall, Hot-Spot | 0.65 | validation | model_registry.json:165 |
| Recall, Cracking | 0.646 | validation | model_registry.json:165 |
| Recall, Cell | 0.635 | validation | model_registry.json:165 |
| Recall, Cell-Multi | 0.537 | validation | model_registry.json:165 |
| Recall, Soiling | 0.367 | validation (30 samples) | model_registry.json:165 |
| Precision, Soiling | 0.344 | validation (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 key | solar_thermal_anomaly_classifier |
|---|---|
| Architecture | ResNet18 (run solar_thermal_cls, 26 epochs, early-stopped) |
| Input size | 96 px |
| Labels | Cell, Cell-Multi, Cracking, Diode, Diode-Multi, Hot-Spot, Hot-Spot-Multi, No-Anomaly, Offline-Module, Shadowing, Soiling, Vegetation |
| Status | installed (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.
| Source | github.com/RaptorMaps/InfraredSolarModules |
|---|---|
| Licence | Catalogue says: "MIT" registry.py:268 |
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 6933a09abff99bf8d4e2619a50a64498432d2877b9abd55ccab7a87ac357fd42Tests 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