Skip to main content

Detekcja ptaków — CNN na Raspberry Pi 5

Cel projektu #

Zbudowanie systemu, który automatycznie wykrywa obecność ptaków przy karmnikach ogrodowych. Projekt łączy kilka warstw:

  • automatyczne zbieranie zdjęć (Raspberry Pi 5 + kamera HQ)
  • ręczne labelowanie datasetu
  • trening binarnej sieci CNN (ptak obecny / brak ptaka)
  • deployment modelu z powrotem na urządzeniu brzegowym
  • dokumentacja procesu jako materiał edukacyjny

Projekt jest realizowany wspólnie przez dwie rodziny: Team Ewelina i Team Robert. Ewelina zbiera dane, ja trenuję model, mój syn Gabriel tworzy materiały wideo z wyników.

Ten projekt nie powstałby bez zaangażowania Eweliny i jej rodziny. To oni przygotowali karmnik, przez wiele tygodni przyciągali różne gatunki ptaków, zrobili wszystkie 4363 zdjęcia i wykonali pierwszą, ręczną klasyfikację całego zbioru — czyli najbardziej pracochłonną część projektu. Bez tego datasetu nie byłoby czego trenować. Dziękujemy — i zapraszamy do kolejnych edycji projektu w przyszłych sezonach!

Szczygieł

Architektura systemu #

Karmnik (~10m)
     │
     ▼
Raspberry Pi 5
  + Kamera HQ (IMX477)
  + Obiektyw 8–50mm
     │
     ▼  (rsync / scp)
Dell XPS (stacja robocza)
  + PyTorch — trening CNN
     │
     ▼
Model → deploy na RPi5
  + inference w czasie rzeczywistym

Status projektu # #

Etap Status
Konfiguracja sprzętu ✅ Gotowe
Automatyczne zbieranie zdjęć ✅ Gotowe
Zbieranie datasetu (4363 zdjęcia) ✅ Gotowe
Weryfikacja i korekta etykiet (1,1% błędów) ✅ Gotowe
Trening modelu (EfficientNet-B0, transfer learning) ✅ Gotowe (99,1% accuracy)
Analiza GradCAM (weryfikacja decyzji sieci) ✅ Gotowe
Deployment na RPi5 + trigger aparatu ⏳ Planowane — szczegóły pipeline’u →

Wyniki treningu # #

Model wytrenowano dwuetapowo: najpierw tylko głowica klasyfikatora przy zamrożonych warstwach konwolucyjnych, potem fine-tuning całej sieci z bardzo małym learning rate. Widać to wyraźnie na krzywych uczenia — w epoce 9 (start fine-tuningu) accuracy skokowo rośnie, a loss spada:

Krzywe uczenia

Krzywe uczenia EfficientNet-B0 — accuracy i loss dla obu faz treningu.

Na zbiorze testowym (431 zdjęć) model osiągnął 99,1% accuracy, z bardzo wysoką precyzją i recallem w obu klasach:

Macierz pomyłek

Macierz pomyłek na zbiorze testowym — tylko 3 błędy na 431 zdjęć.

Przegląd błędnych klasyfikacji ujawnił jednak coś ciekawszego niż błąd samego modelu:

Błędne klasyfikacje

Trzy przypadki błędnej klasyfikacji względem oryginalnego zdjęcia.

Dwie z trzech pomyłek miały wspólną przyczynę: zdjęcia do treningu były przycinane (crop) do mniejszego kadru, natomiast oryginalna klasyfikacja manualna wykonywana była na pełnym, nieprzyciętym zdjęciu. W tych dwóch przypadkach ptak siedział z boku kadru — na gałęzi obok karmnika lub w locie, tuż przed lądowaniem — czyli w obszarze, który przycinanie usuwało. Względem oryginalnego zdjęcia etykieta “Birds” była poprawna, ale względem faktycznie przyciętego kadru, na którym trenowała się sieć, ptaka już nie było — sieć sklasyfikowała go więc poprawnie względem tego, co realnie widziała.

Trzeci przypadek ma inną przyczynę: ptak jest widoczny na oryginalnym kadrze, ale w dużej części zasłonięty przez słupek konstrukcji karmnika — klasyczny przypadek częściowej okluzji, trudny nawet dla ludzkiego oka.

To ważny wniosek metodologiczny: rzeczywista skuteczność modelu jest prawdopodobnie wyższa niż wskazuje surowa macierz pomyłek, bo dwa z trzech “błędów” to w istocie niespójność między formatem zdjęcia etykietowanego a formatem zdjęcia, na którym trenowano — nie faktyczna pomyłka sieci. Na przyszłość: albo etykietowanie wykonywać już na docelowym, przyciętym formacie zdjęcia, albo zachować pełny format zdjęcia od etykietowania aż po trening, żeby oba etapy operowały na tym samym kadrze.

Pełny opis architektury treningu i weryfikacji GradCAM: Trening modelu →

Następne kroki # #

  • Generowanie heatmap Grad-CAM — weryfikacja czy sieć patrzy na ptaka → gotowe, zobacz Trening modelu
  • Ocena wizualna błędnych klasyfikacji → gotowe, zidentyfikowano problem niespójności formatu kadru (etykietowanie vs. trening)
  • Integracja wytrenowanego modelu z pipeline’em na RPi5bird_trigger.py korzysta obecnie z placeholdera (ogólny model ImageNet), do podmiany na docelowy model; zobacz Pipeline detekcji
  • Ujednolicenie formatu kadru między etykietowaniem, treningiem i inferencją na RPi
  • Rozszerzenie datasetu o nowe zdjęcia z kolejnego sezonu
  • Poprawa augmentacji — większy zakres brightness/contrast dla zdjęć zimowych
  • Testy triggerowania Sony a6100 w warunkach terenowych
  • Publikacja materiałów na YouTube i w mediach społecznościowych

2026