YOLO26-Bird — single-class bird-dropping detector

Fine-tuned Ultralytics YOLO26-L detector for a single class: bird-droppings on solar-panel imagery. Intended as a soiling/obstruction screen feeding the Szászberek solar-inspection pipeline.

⚠️ Read the evaluation section before using. Validation looks reasonable (mAP50 ≈ 0.60) but the held-out test mAP50 is only ≈ 0.22. There is a large val→test generalization gap. Treat this as a v0 baseline, not a production model.

Model

  • Base: yolo26l.pt (COCO-pretrained, ~24.7M params, 86.1 GFLOPs)
  • Task: detection, nc=1, names: ['bird-droppings']
  • Train config: imgsz 640, batch 16, optimizer auto, 100 epochs requested, patience 30 → early-stopped at epoch 70, best @ epoch 40.
  • Files: weights/best.pt (use this), weights/last.pt, full results/.

Data

Built by unifying three public bird-dropping detection datasets into one single-class set, with cross-dataset perceptual-hash (pHash) dedup to prevent train/val/test leakage:

Source Role
Roboflow dusty-and-bird-droppings bird-dropping boxes
Roboflow bird-drop-detection-lot2 bird-dropping boxes
GitHub IsuruMunasinghe98/solar-panel-inspection-dataset (COCO) bird-dropping boxes

All non-bird classes were dropped; all bird classes remapped to class 0. Split sizes:

Split Images
train 1,909 (723 positive / 1,186 background)
valid 189
test 106

Evaluation

Split Images Precision Recall mAP50 mAP50-95
val (best ep40) 189 0.561 0.634 0.598 0.231
test (held-out) 106 0.367 0.250 0.220 0.075

Interpretation. The ~0.38 mAP50 drop from val to test indicates the three source datasets differ in capture conditions (altitude, resolution, panel type, lighting), and the model has not learned a distribution-robust notion of "bird dropping." Recall on the held-out test is low (0.25) — it misses most droppings it hasn't seen close analogues of.

To improve: add site-specific labeled droppings from the actual Szászberek flights, harder negatives, and stronger augmentation; consider a single-source curated test set so the metric reflects deployment conditions.

Usage

from ultralytics import YOLO
model = YOLO("weights/best.pt")
results = model.predict("panel_image.jpg", conf=0.25)

Provenance

Trained on an NVIDIA L4 (CUDA), Ultralytics 8.4.81, torch 2.8.0+cu128. This is a side model for the Szászberek inspection project and is not the thermal fault detector used in the main RGB→thermal cascade.

Downloads last month
51
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support