Library / SDK
zae-bayern/elpv-dataset avatar
zae-bayern/elpv-dataset

elpv-dataset is 2,624 normalised solar cell images labelled with a defect probability

A dataset of functional and defective solar cells extracted from EL images of solar modules

310 stars85 forksPythonNOASSERTION

At a glance

What is it?
The elpv-dataset repository is a small, deliberately narrow artefact: solar cells cropped out of high-resolution electroluminescence images of photovoltaic modules, normalised for size and perspective, and labelled with a floating point defect probability plus the module technology. It ships as a two-dependency Python package whose main job is one loader function, and the images are licensed separately from the code.
Who is it for?
This dataset fits someone building or evaluating visual inspection of photovoltaic modules, since it gives you a fixed, already normalised cell-level corpus with a continuous defect score rather than raw module photographs you would have to segment yourself. It does not fit a project that needs defect class labels, because the annotation is a probability and a module type and nothing more, and it does not fit commercial use under the image licence.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository last received commits 82 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 4, 2026, and from our analysis. They are not legal advice.

Editorial analysis

2,624 cells from 44 modules, normalised before cropping

The size of the corpus is stated exactly: 2,624 samples, each a 300 by 300 pixel 8-bit grayscale image, extracted from 44 different solar modules.

The images are single cells, not modules. What the repository provides is the crop, not the electroluminescence frame, which means a model is trained on cell-level appearance rather than having to learn to find cells first.

Two normalisations are applied and both matter for what the data can be used for. All images are normalised with respect to size and perspective, so a cell is the same scale and orientation regardless of how the module was mounted and photographed. And any distortion induced by the camera lens used to capture the EL images was eliminated prior to solar cell extraction, so the geometry is corrected before the crop rather than after it.

That preprocessing is what distinguishes this from a set of screenshots. Without it, a classifier can score well by learning the camera and the mounting rig rather than the degradation.

The defects in the annotated images are described as either intrinsic or extrinsic in type, and are known to reduce the power efficiency of solar modules, so the target of the benchmark is a real loss rather than a cosmetic blemish.

The label is a probability and a module type, not a defect class

Every image carries two annotations, and neither of them is a category name.

The first is a defect probability, a floating point value between 0 and 1. The second is the type of the solar module the cell was originally extracted from, either mono- or polycrystalline.

That label design has direct consequences for modelling. A continuous score supports ranking, threshold tuning against a chosen operating point, and regression-style evaluation, and it supports cutting the corpus at whatever false-positive rate you can live with. It does not support asking which kind of defect is present, which is a question the labels cannot answer because the information is not there.

The module type is the stratification variable. Keeping it lets you check whether a detector is picking up on crystallinity rather than on damage, which is a reasonable sanity check since the two technologies have visibly different cell texture.

The combination is a benchmark for scoring rather than a labelling scheme, and the citation list explains why: the three papers behind the dataset cover the benchmark itself, cell segmentation in uncalibrated images, and automatic classification, in that order.

The images are share-alike non-commercial, the code is Apache 2.0

The licensing is split, and it is the first thing to check before anything else.

All the images are licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International licence. The accompanying Python source code is distributed under the Apache License 2.0. For commercial use, the repository asks you to contact the authors for further information.

The package metadata expresses the same arrangement as a compound licence string, `CC-BY-NC-SA-4.0 AND Apache-2.0`, and the repository carries both a `LICENSE` file and a `LICENSE.Apache-2.0` file so the two terms are physically separate. A `CITATION.cff` file sits alongside them.

Two of those clauses have teeth. NonCommercial means a company training an inspection model on this data is outside what the licence covers without an agreement, and ShareAlike means derivatives of the images inherit that obligation. Automated licence scanners also frequently flag this repository because its licence is not asserted in the metadata, which is a tooling artefact rather than a sign that the terms are unclear: the terms are stated in the readme and in the files.

For research use the arrangement is straightforward. For anything commercial it is a conversation, not a download.

The package has two dependencies and one loader function

The usage section is four lines long.

bash
pip install elpv-dataset
python
from elpv_dataset.utils import load_dataset
images, proba, types = load_dataset()

That is the entire public surface: a function returning three values in the documented order, images, then defect probabilities, then module types. Note that the package is not named with underscores on the command line and is imported with one, which is normal Python packaging rather than something to trip over.

The dependency list is correspondingly small, `numpy` and `pillow`, and nothing else. No deep learning framework, no dataset manager, no configuration file. The build backend is hatchling, the version is dynamic and read from `src/elpv_dataset/__about__.py`, and the package requires Python 3.10 or newer.

The classifier list is broader than that floor, running from Python 3.10 through 3.14 and listing both CPython and PyPy, with the development status marked as beta and the operating system as independent, which follows from a package that only reads image files.

Everything the dataset knows lives in the package; there is no download step to run and no cache to prime.

Three papers sit behind the corpus, in a deliberate order

The citation section asks for references when the dataset is used in a scientific context, and lists three publications rather than one.

The first is the benchmark paper itself, A Benchmark for Visual Identification of Defective Solar Cells in Electroluminescence Imagery, presented at the European PV Solar Energy Conference and Exhibition in 2018, with a DOI in the EU PVSEC proceedings.

The second is a 2021 paper on segmentation of photovoltaic module cells in uncalibrated electroluminescence images, published in Machine Vision and Applications. The word uncalibrated is the connection to the lens distortion correction: if the camera is not calibrated, segmentation has to cope with geometry error, and that paper is about solving the crop problem the dataset then bakes in.

The third is a 2019 paper on automatic classification of defective photovoltaic module cells in electroluminescence images, in Solar Energy.

Read as a sequence, they describe the path from establishing that the task matters, to solving the geometry, to classifying the crops. The dataset is the accumulated output of that work rather than a side artefact, which is the usual reason a research corpus stays stable enough to build on.

A BibTeX block is provided behind a details element for citation tooling, and the repository also ships a `doc/` directory alongside `src/` and `tests/`.

Tooling is configured for branch coverage and a mypy environment

The development configuration is short and aimed at two specific checks rather than at a general framework.

Type checking runs through Hatch environments. There is a `types` environment with `mypy>=1.0.0` as an extra dependency and a script that runs `mypy --install-types --non-interactive` over `src/elpv_dataset` and `tests`. The non-interactive flag matters in automation, since the alternative is a prompt waiting for input when a stub package is missing.

Coverage is configured with `source_pkgs` set to the `elpv_dataset` package and `branch = true`, which means the coverage report distinguishes branches rather than only lines. For a loader package that is the more useful number, since almost every interesting behaviour is a conditional about which files exist or what shape an annotation has.

The dev extra is three packages: coverage, pytest at 6.0.0 or newer, and ruff. That is the whole lint and test story, and the presence of a `tests/` directory at the top level means the behaviour is exercised somewhere.

For a dataset package this is proportionate. The interesting risk is not the code but the licensing and the label semantics, and neither is something a test suite settles.

Editorial conclusion

This dataset fits someone building or evaluating visual inspection of photovoltaic modules, since it gives you a fixed, already normalised cell-level corpus with a continuous defect score rather than raw module photographs you would have to segment yourself. It does not fit a project that needs defect class labels, because the annotation is a probability and a module type and nothing more, and it does not fit commercial use under the image licence. Before using it, check that the non-commercial share-alike term on the images is compatible with what you are building, and remember the citation requirement, since the dataset is the artefact of three published papers.

Frequently asked questions

What is an EL test and what is its purpose?

EL refers to electroluminescence imagery of photovoltaic modules, which is what this dataset is built from: 2,624 cell images extracted from 44 modules, covering intrinsic and extrinsic defects that reduce module power efficiency. The repository documents how those images were captured, normalised, and cropped, but it does not document the electroluminescence test procedure itself.

How do I load the elpv-dataset images and annotations?

Install the package with pip install elpv-dataset, then import load_dataset from elpv_dataset.utils. Calling it returns three values: images, proba, and types. The only runtime dependencies are numpy and pillow, and Python 3.10 or newer is required.

How many images are in the elpv-dataset?

2,624 samples of 300 by 300 pixel 8-bit grayscale images, extracted from 44 different solar modules and normalised with respect to size and perspective, with camera lens distortion eliminated before cell extraction.

What annotation does each elpv-dataset image carry?

Two values: a defect probability as a floating point between 0 and 1, and the type of module the cell came from, either mono- or polycrystalline. There are no defect class labels, so the data supports scoring and threshold tuning rather than defect type classification.

Can I use the elpv-dataset images commercially?

Not under the published terms. The images are licensed under Creative Commons Attribution-NonCommercial-ShareAlike 4.0, the accompanying Python code is under Apache 2.0, and the repository asks you to contact the authors for commercial use.

Official sources

  1. Issues
  2. README
  3. Releases
  4. zae-bayern/elpv-dataset on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/zae-bayern-elpv-dataset.svg)](https://hysenlabs.com/projects/zae-bayern-elpv-dataset)