Trening modelu
Architektura i strategia treningu #
Do treningu użyto EfficientNet-B0 z wagami pretrenowanymi na ImageNet, w technice transfer learning z dwufazowym procesem:
- Faza 1 — trening głowicy klasyfikatora. Warstwy konwolucyjne zamrożone, trenowana tylko nowa warstwa wyjściowa (2562 parametry z ok. 4 milionów). Learning rate:
1e-3. - Faza 2 — fine-tuning. Cała sieć odmrożona, trening z bardzo małym learning rate (
1e-4), żeby dostroić wagi do ptaków karmnikowych bez utraty wiedzy z ImageNet.
Trening odbywał się na Kaggle (GPU, darmowe godziny obliczeniowe), po wcześniejszej migracji z Google Colab.
Krzywe uczenia EfficientNet-B0 — wyraźny skok accuracy i spadek loss w momencie startu fine-tuningu (epoka 9).
Wyniki na zbiorze testowym #
Na zbiorze testowym (431 zdjęć) model osiągnął 99,1% accuracy:
| Metryka | Birds | NoBirds |
|---|---|---|
| Precision | 1.00 | 0.98 |
| Recall | 0.98 | 1.00 |
| F1-score | 0.99 | 0.99 |
Macierz pomyłek — tylko 3 błędy na 431 zdjęć.
Recall dla klasy Birds (0.98) to kluczowa metryka dla tego systemu — model wyzwala profesjonalny aparat fotograficzny, więc lepiej zrobić jedno zdjęcie za dużo niż przeoczyć ptaka.
Przegląd tych trzech błędów ujawnił dodatkowo ważną obserwację metodologiczną. Dwa z nich wynikały z niespójności między formatem zdjęcia użytym do ręcznej klasyfikacji (pełny kadr) a formatem, na którym trenowała się sieć (kadr przycięty) — ptak siedział z boku, na gałęzi lub w locie tuż przed lądowaniem, czyli w obszarze usuwanym przez przycinanie. Względem oryginalnego zdjęcia etykieta była poprawna, względem faktycznego kadru treningowego — już nie. Trzeci przypadek to inna sytuacja: ptak widoczny na zdjęciu, ale w dużej mierze zasłonięty przez słupek karmnika — częściowa okluzja, a nie problem z kadrowaniem.
Realna skuteczność modelu jest więc prawdopodobnie nieco wyższa niż wskazuje sama macierz pomyłek, przynajmniej dla dwóch z tych trzech przypadków.
Weryfikacja GradCAM #
Wysoka accuracy sama w sobie nie mówi, na czym sieć się skupia — może “oszukiwać”, np. korzystając z tła czy samej konstrukcji karmnika zamiast faktycznie rozpoznawać ptaka. Żeby to zweryfikować, wygenerowano heatmapy Grad-CAM, pokazujące które obszary zdjęcia miały największy wpływ na decyzję sieci.
Grad-CAM — aktywacja skupiona wyraźnie na sylwetce ptaka.
Grad-CAM dla innej pozycji ptaka w kadrze — ten sam wzorzec: uwaga sieci podąża za ptakiem, nie za tłem.
We wszystkich sprawdzonych przypadkach aktywacja konsekwentnie pokrywa się z sylwetką ptaka, niezależnie od jego pozycji w kadrze czy tła. To potwierdza, że wysoki wynik accuracy nie jest efektem przypadkowej korelacji (np. z charakterystycznym tłem konkretnego karmnika), tylko realnego rozpoznawania ptaka.
Wnioski #
Model w obecnej formie jest gotowy do testów wdrożeniowych na Raspberry Pi. Dwa kierunki dalszej pracy wynikające z tego etapu:
- Spójność formatu zdjęć między etykietowaniem a treningiem — do uwzględnienia przy zbieraniu danych z kolejnego sezonu.
- Zachowanie tej samej strategii przycinania (crop) na etapie inferencji na Raspberry Pi, co na etapie treningu — inaczej model zobaczy inny kadr niż ten, na którym się uczył.