Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?


Failed to load latest commit information.
Latest commit message
Commit time
July 13, 2020 21:32
June 3, 2020 22:46
December 1, 2020 22:47
December 28, 2020 18:25
February 20, 2020 17:07
March 17, 2020 14:20
February 6, 2020 17:13
December 23, 2020 21:41
April 3, 2020 13:15
February 26, 2020 16:05
February 20, 2020 14:02
November 2, 2020 17:06
December 23, 2020 21:41
January 26, 2020 17:49
January 16, 2020 10:51
February 19, 2020 14:26
January 16, 2020 10:51
September 11, 2020 13:08
July 19, 2020 18:21
January 21, 2020 19:36
January 17, 2023 10:43
July 3, 2020 14:20
February 20, 2020 13:41
February 25, 2020 22:18
February 4, 2020 17:48
February 4, 2020 17:48
December 23, 2020 21:41
December 23, 2020 21:41
February 6, 2020 10:21
February 6, 2020 16:47
March 25, 2020 18:23
September 3, 2022 16:13
February 25, 2020 22:18
February 25, 2020 22:18

Photovoltaic Fault Detector

GitHub Contributor Covenant Open Source Helpers Coverage Status


This project is part of the UNICEF Innovation Fund Discourse community. You can post comments or questions about each category of Open-Source Initiative algorithms. We encourage users to participate in the forum and to engage with fellow users.


Model-definition is a deep learning application for fault detection in photovoltaic plants. In this repository you will find trained detection models that point out where the panel faults are by using radiometric thermal infrared pictures. In Web-API contains a performant, production-ready reference implementation of this repository.

Data Flow

To do list:

  • Import model detection (SSD & YOLO3)
  • Example use Trained Model
  • Train and Evaluate Model with own data
  • Model Panel Detection (SSD7)
  • Model Panel Detection (YOLO3)
  • Model Soiling Fault Detection (YOLO3)
  • Model Diode Fault Detection (YOLO3)
  • Model Other Fault Detection
  • Model Fault Panel Disconnect


  • Python 3.x
  • Numpy
  • TensorFlow 2.x
  • Keras 2.x (in TensorFlow)
  • OpenCV
  • Beautiful Soup 4.x


In the root project execute the following command to install all dependencies project

pip install -r requirements.txt

You need install Jupyter notebook to see the code example. You can find the installation documentation for the Jupyter platform, on ReadTheDocs or in github page here.

For a local installation, make sure you have pip installed and run:

pip install notebook

Example to use trained model

In 'Example_Prediction' this is the example of how to implement an already trained model, it can be modified to change the model you have to use and the image in which you want to detect faults.

In 'Example Prediction AllInOne' this is the example of how implement all trained model, you can use this code for predict a folder of images and have a output image with detection boxes.

In 'Example_Prediction_Orthophoto' this is the example of how implement all trained model, you can use this code for predict a Orthophot and have a output image with detection boxes.


Help improve our software! We welcome contributions from everyone, whether to add new features, improve speed, fix existing bugs or add support. Check our code of conduct, the contributing guidelines and how decisions are made.

Any code contributions are welcomed as long as they are discussed in Github Issues with maintainers. Be aware that if you decide to change something and submit a PR on your own, it may not be accepted.

Creating an issue

You can open a new issue based on code from an existing pull request. For more information, see the template for filling issues

Model Detection

The models used for detection are SSD SSD: Single Shot MultiBox Detector and YOLOv3 [YOLOv3: An Incremental Improvement] (, they are imported from the following repositories:

Grab the pretrained weights of SSD and YOLO3 from Drive_Weights

Model Pretrained Weights
SSD7/SSD300 Weight VGG16
YOLO3 Weight Full Yolo3

Type of Data

The images used for the design of this model were extracted by air analysis, specifically: FLIR aerial radiometric thermal infrared pictures, taken by UAV (R-JPEG format). Which were converted into .jpg images for the training of these detection models. Example FLIR image:


Same image in .jpg format:



1. Data preparation

View folder Train&Test_A/ and Train&Test_S/, example of panel anns and soiling fault anns.

Organize the dataset into 4 folders:

  • train_image_folder <= the folder that contains the train images.

  • train_annot_folder <= the folder that contains the train annotations in VOC format.

  • valid_image_folder <= the folder that contains the validation images.

  • valid_annot_folder <= the folder that contains the validation annotations in VOC format.

There is a one-to-one correspondence by file name between images and annotations. For create own data set use LabelImg code from :

2. Edit the configuration file

The configuration file for YOLO3 is a json file, which looks like this (example soiling fault ):

    "model" : {
        "min_input_size":       400,
        "max_input_size":       400,
        "anchors":              [5,7, 10,14, 15, 15, 26,32, 45,119, 54,18, 94,59, 109,183, 200,21],
        "labels":               ["1"],
	"backend": 		"full_yolo_backend.h5"

    "train": {
        "train_image_folder":   "../Train&Test_S/Train/images/",
        "train_annot_folder":   "../Train&Test_S/Train/anns/",
	"cache_name":           "../Experimento_fault_1/Resultados_yolo3/full_yolo/experimento_fault_1_gpu.pkl",

        "train_times":          1,

        "batch_size":           2,
        "learning_rate":        1e-4,
        "nb_epochs":            200,
        "warmup_epochs":        15,
        "ignore_thresh":        0.5,
        "gpus":                 "0,1",

	"grid_scales":          [1,1,1],
        "obj_scale":            5,
        "noobj_scale":          1,
        "xywh_scale":           1,
        "class_scale":          1,

	"tensorboard_dir":      "log_experimento_fault_gpu",
	"saved_weights_name":   "../Experimento_fault_1/Resultados_yolo3/full_yolo/experimento_yolo3_full_fault.h5",
        "debug":                true

    "valid": {
        "valid_image_folder":   "../Train&Test_S/Test/images/",
        "valid_annot_folder":   "../Train&Test_S/Test/anns/",
        "cache_name":           "../Experimento_fault_1/Resultados_yolo3/full_yolo/val_fault_1.pkl",

        "valid_times":          1
   "test": {
        "test_image_folder":   "../Train&Test_S/Test/images/",
        "test_annot_folder":   "../Train&Test_S/Test/anns/",
        "cache_name":          "../Experimento_fault_1/Resultados_yolo3/full_yolo/test_fault_1.pkl",

        "test_times":          1

The configuration file for SSD300 is a json file, which looks like this (example soiling fault ) and .txt with name of images (train.txt):

    "model" : {
        "backend":      "ssd300",
        "input":        400,
        "labels":               ["1"]

    "train": {
        "train_image_folder":   "Train&Test_S/Train/images",
        "train_annot_folder":   "Train&Test_S/Train/anns",
        "train_image_set_filename": "Train&Test_S/Train/train.txt",

        "train_times":          1,
        "batch_size":           12,
        "learning_rate":        1e-4,
        "warmup_epochs":        3,
        "nb_epochs":            100,
	       "saved_weights_name":     "Result_ssd300_fault_1/experimento_ssd300_fault_1.h5",
        "debug":                true
    "valid": {
            "valid_image_folder":   "../Train&Test_D/Test/images/",
            "valid_annot_folder":   "../Train&Test_D/Test/anns/",
            "valid_image_set_filename":   "../Train&Test_D/Test/test.txt"

"test": {
        "test_image_folder":   "Train&Test_S/Test/images",
        "test_annot_folder":   "Train&Test_S/Test/anns",
        "test_image_set_filename":   "Train&Test_S/Test/test.txt"

3. Start the training process

python -c config.json -o /path/to/result

or python -c config.json -o /path/to/result

By the end of this process, the code will write the weights of the best model to file best_weights.h5 (or whatever name specified in the setting "saved_weights_name" in the config.json file). The training process stops when the loss on the validation set is not improved in 20 consecutive epoches.

4. Perform detection using trained weights on image, set of images

python -c config.json -i /path/to/image/or/video -o /path/output/result or python -c config.json -i /path/to/image/or/video -o /path/output/result

It carries out detection on the image and write the image with detected bounding boxes to the same folder.


The evaluation is integrated into the training process, if you want to do the independent evaluation you must go to the folder ssd_keras-master or keras-yolo3-master and use the following code

python -c config.json Example: python keras-yolo3-master/ -c config_full_yolo_fault_1_infer.json

Compute the mAP performance of the model defined in saved_weights_name on the validation dataset defined in valid_image_folder and valid_annot_folder.

Model mAP Config
YOLO3 Soiling 0.7302 config
YOLO3 Diode 0.6127 config
YOLO3 Affected Cell 0.7230 config

Weights of Trained Models

All of weights of this trained model grab from Drive_Weights

Model Weights Trained Config
SSD7 Panel weight config
SSD300 Soiling weight config
YOLO3 Panel weight config
YOLO3 Soiling weight config
YOLO3 Diode weight config
YOLO3 Affected Cell weight config

The image used are specified in Table images. You can see some examples in Summary of results.


Contributions are welcome and will be fully credited. We accept contributions via Pull Requests on GitHub.

Pull Request Checklist

Before sending your pull requests, make sure you followed this list.


Model Photovoltaic Fault Detector based in model detector YOLOv.3, this repository contains four detector model with their weights and the explanation of how to use these models.




Code of conduct





No releases published


No packages published

Contributors 4