Dokumentacja badania lekkich głębokich sieci CNN do wieloklasowej klasyfikacji obrazów owoców (10 klas)
Jakub Iwicki
Celem projektu jest stworzenie systemu rozpoznawania obrazów owoców przy użyciu metod głębokiego uczenia, ze szczególnym naciskiem na klasyfikację wieloklasową (10 klas owoców). Projekt realizuje porównanie skuteczności różnych podejść do klasyfikacji obrazów:
-
Własny model CNN – zbudowany od podstaw, z warstwami konwolucyjnymi, normalizacją, dropoutem i augmentacją danych.
-
Transfer learning z EfficientNetB0 – wykorzystanie gotowego, wytrenowanego modelu jako ekstraktora cech, połączonego z własnymi warstwami gęstymi.
-
Transfer learning z MobileNetV3Large – analogicznie, użycie innego lekkiego modelu Keras jako ekstraktora cech.
-
Model połączony (ensemble) – łączenie cech wyekstrahowanych równolegle przez EfficientNetB0 i MobileNetV3Large, co pozwala na uzyskanie bogatszej reprezentacji obrazu i lepszą dokładność.
-
Przygotowanie i optymalizację zbioru danych (podział na treningowy, walidacyjny, testowy, augmentacja, cache, prefetch).
-
Budowę i trening modeli, z zastosowaniem mechanizmów zapobiegających przeuczeniu (EarlyStopping).
-
Analizę wyników: wizualizację historii treningu, macierzy pomyłek, prezentację błędnie sklasyfikowanych obrazów.
-
Porównanie skuteczności wszystkich modeli oraz ranking według dokładności na zbiorze testowym. Zapis najlepszego modelu i predykcję na nowych obrazach.
Każdy z 4 modeli został zaprojektowany w celu maksymalizacji skuteczności klasyfikacji przy zachowaniu niskiej złożoności obliczeniowej:
-
Własny model CNN
Składa się z kilku bloków konwolucyjnych (Conv2D + BatchNormalization + ReLU), warstw MaxPooling oraz Dropout. Na końcu zastosowano warstwy gęste (Dense) z aktywacją softmax. Model wykorzystuje augmentację danych (np. obrót, przesunięcie, zmiana jasności) w celu poprawy generalizacji. -
EfficientNetB0 (transfer learning)
Wykorzystuje pretrenowaną sieć EfficientNetB0 (bez warstw klasyfikacyjnych) jako ekstraktor cech. Dołączono własne warstwy gęste, Dropout oraz warstwę wyjściową softmax. Warstwy EfficientNetB0 mogą być zamrożone lub częściowo odblokowane do dalszego treningu. -
MobileNetV3Large (transfer learning)
Analogicznie do EfficientNetB0, użyto pretrenowanego modelu MobileNetV3Large jako ekstraktora cech. Dodano własne warstwy klasyfikujące, Dropout i softmax. Model cechuje się bardzo niską liczbą parametrów i szybkim działaniem. -
Model połączony (ensemble)
Równoległe wykorzystanie EfficientNetB0 i MobileNetV3Large do ekstrakcji cech z tego samego obrazu. Wyjścia obu modeli są łączone (np. przez konkatenację), a następnie przekazywane do wspólnych warstw gęstych i warstwy wyjściowej softmax. Pozwala to na uzyskanie bogatszej reprezentacji i lepszych wyników klasyfikacji.
Każda architektura została dostosowana do zadania klasyfikacji 10 klas owoców, a ich parametry (liczba warstw, dropout, liczba neuronów) były dobierane eksperymentalnie na podstawie wyników walidacji.
Każdy model trenowano w możliwie zbliżonych warunkach, aby zapewnić rzetelne porównanie. Proces uczenia obejmował następujące etapy:
-
Podział danych: Zbiór obrazów został podzielony na część treningową (
80%), walidacyjną (20%) i testową. Dane były zbalansowane względem klas. -
Augmentacja danych: W fazie treningu stosowano augmentację (obrót, przesunięcie, zmiana jasności, zoom), aby zwiększyć różnorodność próbek i poprawić generalizację modeli.
-
Optymalizator: Użyto optymalizatora Adam.
-
Funkcja straty: Dla klasyfikacji wieloklasowej zastosowano
categorical crossentropy(sparse). -
Batch size: Ustalono rozmiar batcha
32 -
Early stopping: Wprowadzono mechanizm wczesnego zatrzymania treningu na podstawie braku poprawy w generalizacji (np. patience=
8). -
Checkpointing: Najlepszy model (na podstawie dokładności walidacyjnej) był zapisywany do pliku.
-
Liczba epok: Trening prowadzono maksymalnie przez
30epok, jednak zwykle kończył się wcześniej dzięki early stopping.
Po zakończeniu treningu każdy model był oceniany na zbiorze testowym, a wyniki (dokładność, macierz pomyłek) były analizowane i porównywane. Dodatkowo, przeprowadzono predykcje na nowych, nieznanych obrazach w celu sprawdzenia praktycznej użyteczności modeli.
Źródło danych: Fruit Classification (10-class) – Kaggle
Zbiór danych zawiera zdjęcia 10 różnych gatunków owoców, wykonane w różnych warunkach oświetleniowych i na różnych tłach, co pozwala na realistyczną ocenę skuteczności modeli. Każda klasa reprezentuje inny owoc, a obrazy są pogrupowane w odpowiednie foldery:
- train – obrazy używane do uczenia modeli (największa część zbioru, zbalansowana względem klas).
- test – obrazy przeznaczone do końcowej oceny skuteczności modeli, niewykorzystywane podczas treningu.
- predict – dodatkowe obrazy do sprawdzenia działania wytrenowanych modeli na nowych, nieznanych danych.
Każdy folder oprócz predict zawiera podfoldery odpowiadające poszczególnym klasom owoców (np. apple, banana, orange itd.), a w nich znajdują się pliki graficzne (.jpg, .png). Obrazy mają różne rozdzielczości, dlatego przed treningiem zostały przeskalowane do jednolitego rozmiaru (np. 128x128 pikseli).
Dane zostały poddane wstępnej analizie i weryfikacji pod kątem jakości oraz równomiernego rozkładu klas. W oryginalnym zbiorze danych dokonano jedynie korekty wielkości liter w nazwach folderów, aby zapewnić spójność i poprawność działania skryptów na różnych systemach operacyjnych.
Przygotowano prosty skrypt terminalowy umożliwiający klasyfikację pojedynczych zdjęć na podstawie podanej ścieżki do pliku graficznego. Skrypt ładuje wytrenowany model, przetwarza obraz (skalowanie, normalizacja) i wyświetla przewidywaną klasę owocu wraz z prawdopodobieństwem. Dzięki temu możliwe jest szybkie przetestowanie działania modelu na nowych, własnych zdjęciach bez konieczności uruchamiania całego notebooka.
-
Python 3.x
-
Wszystkie biblioteki (requirements.txt)
-
Notebook
- tensorflow
- numpy
- pandas
- matplotlib
-
main.py (aplikacja do testowania pojedyńczych zdjęć)
- tensorflow
Trening sieci wykonywany jest na dostarczonym zbiorze przez wszystkie cztery modele.
Cały proces od przygotowania danych do prezentacji wyników końcowych znajdują się w pliku notebook.ipynb