Projekt edukacyjny demonstrujący uczenie transferowe z TensorFlow i EfficientNetB0. Realizowany w ramach programu Lekcja AI.
tf.dataEfficientNetB0 to sieć konwolucyjna zaprojektowana przez Google (2019). Osiąga doskonałą dokładność przy zaledwie ~5,3 M parametrów dzięki compound scaling — jednoczesnego skalowania głębokości, szerokości i rozdzielczości wejścia.
Dense(512) → Dropout → Dense(1486)LR = 1e-3LR = 1e-5 (100× mniejsza!)Projekt używa zbioru iNaturalist Birds dostępnego na Kaggle. Zdjęcia przesłane przez obserwatorów przyrody z całego świata, zweryfikowane przez ekspertów ornitologów.
archive/birds_train_small/<gatunek>/03111_Animalia_Chordata_Aves_Rząd_Rodzina_Rodzaj_gatunekOpenVINO (Open Visual Inference and Neural Network Optimization) to biblioteka Intel optymalizująca modele AI do inferencji na CPU, iGPU i NPU.
Pełne instrukcje konwersji i wizualizacji w zakładce Architektura.
Uruchom poniższy skrypt po wytrenowaniu modelu Keras:
import openvino as ov
import tensorflow as tf
# 1. Wczytaj wytrenowany model Keras
model = tf.keras.models.load_model("www/public/bird_model.keras")
# 2. Konwertuj do formatu OpenVINO IR
ov_model = ov.convert_model(
model,
input=[1, 224, 224, 3] # stały batch=1 przyspiesza inferencję
)
# 3. Zapisz jako .xml (topologia) + .bin (wagi)
ov.save_model(ov_model, "bird_model_ov/bird_model.xml")
Netron to przeglądarka modeli sieci neuronowych. Kliknięcie dowolnej warstwy pokazuje jej parametry: typ operacji, rozmiar kernela, stride, padding oraz kształty wejścia i wyjścia.
bird_model.xml do okna Netron
lub File → Open Model…
| Metoda | Endpoint | Opis |
|---|---|---|
| GET | / |
Strona główna (ta aplikacja) |
| POST | /predict |
Klasyfikacja zdjęcia lub wideo — zwraca Top-5 gatunków |
| GET | /health |
Status serwera — Nginx i monitoring |
| GET | /backend |
Backend (OpenVINO / Keras), dostępne urządzenia |
| GET | /model/info |
Statystyki modelu — warstwy, typy, kształty |
| GET | /model/xml |
Pobierz topologię modelu XML (do Netron) |
| POST | /translate |
Tłumaczenie łacińskich nazw na język potoczny (PL / EN) |
curl -X POST http://localhost/predict \
-F "file=@kos.jpg"
Odpowiedź JSON:
{
"top": [
{ "gatunek": "Turdus merula", "pewnosc": 87.32 },
{ "gatunek": "Turdus philomelos", "pewnosc": 6.14 },
{ "gatunek": "Turdus viscivorus", "pewnosc": 3.21 },
{ "gatunek": "Turdus iliacus", "pewnosc": 1.88 },
{ "gatunek": "Turdus torquatus", "pewnosc": 0.97 }
],
"backend": "openvino"
}
curl -X POST http://localhost/translate \
-H "Content-Type: application/json" \
-d '{"names": ["Turdus merula", "Parus major", "Aquila chrysaetos"]}'
Odpowiedź JSON:
{
"Turdus merula": "Kos",
"Parus major": "Sikora bogatka",
"Aquila chrysaetos": "Orzeł Przedni"
}
Wyniki są cachowane lokalnie w common_names.json.
Kolejne zapytania o te same gatunki są natychmiastowe.
import requests
with open("kos.jpg", "rb") as f:
resp = requests.post(
"http://localhost/predict",
files={"file": ("kos.jpg", f, "image/jpeg")}
)
data = resp.json()
for i, wynik in enumerate(data["top"], 1):
print(f"{i}. {wynik['gatunek']}: {wynik['pewnosc']:.1f}%")