Skip to main content

Pipeline detekcji i triggerowania

·2 mins

Dwa niezależne serwisy na Raspberry Pi #

System na docelowym RPi5 składa się z dwóch osobnych, niezależnych usług systemd:

Serwis Rola Status
bird-camera (camera_server.py) Serwer Flask do zbierania danych treningowych — podgląd live, serie zdjęć co 3s, zarządzanie z telefonu ✅ Działa, używany do zbierania datasetu
bird_trigger (bird_trigger.py) Docelowy pipeline detekcji: CNN → trigger aparatu 🔄 Szkielet gotowy, integracja wytrenowanego modelu w toku

Rozdzielenie na dwa serwisy jest celowe — zbieranie danych i produkcyjna detekcja to różne tryby pracy systemu, które nie muszą (i nie powinny) działać jednocześnie.

Docelowy pipeline detekcji #

Po pełnym wdrożeniu bird_trigger.py będzie działał następująco:

  1. Zdjęcie poglądowe — kamera RPi HQ robi zdjęcie 1280×960px co 3 sekundy (libcamera-jpeg)
  2. Inferencja CNN — wytrenowany model EfficientNet-B0 klasyfikuje zdjęcie lokalnie, na CPU (RPi nie ma GPU)
  3. Decyzja — jeśli wykryto ptaka i minął cooldown 10 sekund od ostatniego triggera, system przechodzi do kroku 4
  4. Trigger aparatu — Sony a6100 podłączony przez USB robi serię 3 zdjęć w odstępach 0,5s (gphoto2 --capture-image-and-download)
  5. Zapis — zdjęcia trafiają na dysk USB, logi (liczba sprawdzeń, wykrytych ptaków, zdjęć z Sony) zapisują się do pliku

Cały proces uruchamia się automatycznie po starcie RPi (systemctl enable bird_trigger) i działa bez monitora — restart automatyczny w razie awarii (Restart=on-failure).

Stan wdrożenia i otwarte zadania #

Szkielet pipeline’u (kamera → inferencja → trigger USB → zapis) jest gotowy i przetestowany. Pozostają dwa kluczowe zadania przed uruchomieniem produkcyjnym:

  1. Integracja wytrenowanego modelu. Obecna wersja skryptu korzysta z ogólnego modelu EfficientNet-B0 z wagami ImageNet (klasyfikacja przez sumę prawdopodobieństw klas “ptasich” w 1000-klasowym zbiorze ImageNet) — to placeholder do testów sprzętowych, nie docelowy klasyfikator. Do podmiany na model dotrenowany na własnym datasecie (99,1% accuracy, opisany w Trening modelu).
  2. Spójność formatu kadru. Jak opisano przy okazji analizy błędnych klasyfikacji, ważne jest zachowanie tego samego przycinania (CenterCrop) na etapie inferencji na RPi co na etapie treningu — inaczej model zobaczy inny kadr niż ten, na którym się uczył.

Zobacz też: Sprzęt · Trening modelu

Author
Robert
Zajmuję się zastosowaniami geometrii różniczkowej i topologii w inżynierii oraz budową systemów ML na urządzeniach wbudowanych. Projektuję systemy detekcji obrazu oparte o CNN i Raspberry Pi.