Skip to content

Sezzo/cat-detector-demo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🐱 Bildklassifizierungs-Projekt

Ein einfaches Machine Learning Projekt zum Trainieren eines Modells, das Bilder in verschiedene Kategorien einteilt (z.B. Katze vs. Hund).


📚 Überblick

Dieses Projekt verwendet Deep Learning (künstliche neuronale Netze) um Bilder automatisch zu klassifizieren.

Unterstützte Systeme:

  • 🖥️ Windows mit NVIDIA GPU (CUDA)
  • 🐧 Linux mit NVIDIA GPU (CUDA)
  • 💻 Windows/Linux mit CPU
  • 🍎 MacBook Pro mit Apple Silicon (M1, M2, M3) - nutzt GPU automatisch! ✨

Was ist das Ziel?

Ein Modell trainieren, das neue Bilder sieht und automatisch erkennt, welche Kategorie sie gehören.

Wie funktioniert es?

  1. Training: Zeige dem Modell hunderte von Bildern mit Kategorien-Beschriftungen
  2. Lernen: Das Modell passt seine "Gehirngewichte" an, um Muster zu erkennen
  3. Vorhersage: Neue Bilder können sofort klassifiziert werden

GPU-Beschleunigung:

  • Scripts erkennen automatisch ob GPU vorhanden ist
  • NVIDIA GPU (10-100x schneller als CPU)
  • Apple Silicon GPU (4-5x schneller als CPU)

🚀 Quick Start

0. Installation

Abhängigkeiten installieren

pip install torch torchvision sklearn pillow

Spezial für MacBook Pro mit Apple Silicon (M1/M2/M3):

# PyTorch mit Metal Performance Shaders (GPU-Beschleunigung)
pip install torch torchvision torchaudio

# Überprüfe dass alles funktioniert
python -c "import torch; print('MPS available:', torch.backends.mps.is_available())"

Die Scripts erkennen automatisch ob eine GPU vorhanden ist und nutzen sie! ✨

1. Daten vorbereiten

Erstelle diese Ordnerstruktur:

data/
├── train/
│   ├── katze/
│   │   ├── foto1.jpg
│   │   ├── foto2.jpg
│   │   └── ...
│   └── hund/
│       ├── foto1.jpg
│       ├── foto2.jpg
│       └── ...
└── val/
    ├── katze/
    │   └── ...
    └── hund/
        └── ...

Tipps:

2. Trainieren

python train.py

Das Script wird:

  • 📂 Bilder laden und vorbereiten
  • 🧠 Ein neuronales Netzwerk erstellen
  • 🚀 Mit Trainingsdaten trainieren (15 Epochen)
  • 📊 Nach jeder Epoche die Genauigkeit testen
  • ✅ Das beste Modell speichern

Beispiel-Ausgabe:

📂 Lade Trainingsdaten...
Klassen gefunden: ['katze' 'hund']

🧠 Erstelle Modell...

🚀 Starte Training für 15 Epochen...

[Epoche 01/15] Training: Loss=0.6543, Accuracy=0.658 | Validierung: Loss=0.4321, Accuracy=0.782
✅ Neues bestes Modell! (Accuracy: 0.782)

[Epoche 02/15] Training: Loss=0.4123, Accuracy=0.789 | Validierung: Loss=0.3210, Accuracy=0.821
✅ Neues bestes Modell! (Accuracy: 0.821)

...

3. Vorhersagen machen (Command Line)

python predict.py foto_einer_katze.jpg

Beispiel-Ausgabe:

🤔 Analysiere Bild...
📷 Bild geladen: foto_einer_katze.jpg

============================================================
🎯 VORHERSAGE-ERGEBNIS
============================================================

✨ Das Bild zeigt wahrscheinlich: katze
   Sicherheit: 94.5%

📊 Wahrscheinlichkeiten für alle Klassen:
   katze           | ███████████████████████████░░ | 94.5%
   hund            | ██░░░░░░░░░░░░░░░░░░░░░░░░░░ | 5.5%

4. Webserver starten (für interaktive Nutzung)

Du kannst auch einen Webserver starten, um Vorhersagen über eine Web-API zu machen!

Installation (nur beim ersten Mal nötig)

pip install uvicorn fastapi python-multipart

Webserver starten

uvicorn serve_model:app --reload --host 0.0.0.0 --port 8000

Ausgabe:

INFO:     Uvicorn running on http://0.0.0.0:8000

🚀 WEBSERVER STARTET
============================================================

Um den Server zu starten, führe aus:
  uvicorn serve_model:app --reload --host 0.0.0.0 --port 8000

Dann öffne im Browser:
  http://localhost:8000/docs

Im Browser testen (interaktive API)

Öffne: http://localhost:8000/docs

Du siehst eine interaktive Dokumentation (Swagger UI):

  1. Klicke auf POST /predict
  2. Klicke auf "Try it out"
  3. Klicke auf "Choose File" und wähle ein Bild
  4. Klicke "Execute"
  5. Sehe das Ergebnis!

Beispiel-Antwort:

{
  "label": "katze",
  "confidence": 0.945,
  "probabilities": {
    "katze": 0.945,
    "hund": 0.055
  }
}

Mit Python nutzen

import requests

# Bild hochladen und klassifizieren
response = requests.post(
    'http://localhost:8000/predict',
    files={'file': open('foto.jpg', 'rb')}
)

# Ergebnis anschauen
print(response.json())
# Ausgabe: {'label': 'katze', 'confidence': 0.945, ...}

Mit curl nutzen (Terminal)

curl -X POST -F '[email protected]' http://localhost:8000/predict

API Dokumentation

5. Web-Oberfläche nutzen (schöne Grafische Oberfläche)

Es gibt auch eine HTML-Seite mit grafischer Oberfläche statt nur der API!

Webserver starten (falls noch nicht laufen)

uvicorn serve_model:app --reload --host 0.0.0.0 --port 8000

Im Browser öffnen

Öffne die HTML-Datei im Browser:

file:///C:/Users/sezgin/PycharmProjects/cat/web/index.html

Oder starte einen einfachen HTTP-Server:

# Python 3
python -m http.server 8080 --directory web

# Dann öffne im Browser:
# http://localhost:8080

Wie die Web-Oberfläche funktioniert

  1. Öffne die Seite im Browser
  2. Klicke auf "Choose File"
  3. Wähle ein Bild (JPG, PNG, etc.)
  4. Das Bild wird sofort analysiert
  5. Sehe die Vorhersage und die Konfidenz!

🍎 MacBook Pro (Apple Silicon) - GPU Beschleunigung

Automatische GPU-Erkennung

Alle Scripts (train.py, predict.py, serve_model.py) erkennen automatisch:

1. Ist eine NVIDIA GPU vorhanden? → Nutze CUDA (schnellste Option)
2. Ist Apple Silicon vorhanden? → Nutze MPS (sehr schnell auf Mac)
3. Sonst → Nutze CPU (langsamer)

Ausgabe beim Starten

$ python train.py

🖥️  Trainiere auf: Apple Silicon GPU (MPS)
   Device: mps

📂 Lade Trainingsdaten...

Performance-Vergleich auf MacBook Pro M2

Device Epoche 1-2 Speedup
CPU (8-core) ~3 Minuten 1x (Baseline)
Apple Silicon GPU (MPS) ~45 Sekunden 4x schneller 🚀

Häufige Fragen

F: Warum ist mein Mac manchmal langsamer?

Beim ersten Run kompiliert PyTorch den GPU-Code. Das dauert extra 10-20 Sekunden. Danach ist es viel schneller!

F: Kann ich GPU-Memory Fehler beheben?

Ja! Reduziere BATCH_SIZE in train.py:

BATCH_SIZE = 32  # statt 128

F: Funktioniert auch auf Intel Mac?

Intel Macs können nur CPU nutzen (kein Metal Performance Shaders). Überlege auf einem neueren Mac zu trainieren oder nutze GPU Cloud Services.

F: Was ist Metal Performance Shaders (MPS)?

Apples GPU-API für schnelle Berechnungen. Ähnlich wie CUDA von NVIDIA, aber für Apple Silicon. PyTorch nutzt es automatisch wenn torch.backends.mps.is_available() True ist.


📖 Detaillierte Erklärungen

🧠 Was ist ein neuronales Netzwerk?

Ein neuronales Netzwerk ist ein "Gehirn" aus vielen verbundenen Neuronen:

Eingabe (Bild)  →  [Neuron-Schichten]  →  Ausgabe (Kategorie)
                    • Schicht 1
                    • Schicht 2
                    • ...
                    • Output-Schicht

Jedes Neuron hat eine Gewicht (wie wichtig ist dieser Input?). Beim Training passen wir diese Gewichte an.

🔄 Was ist eine Epoche?

Eine Epoche = Das Modell sieht ALLE Trainingsdaten einmal.

  • Epoche 1: Schaut alle Bilder an → passt Gewichte an
  • Epoche 2: Schaut alle Bilder NOCHMAL an → passt wieder an
  • ...
  • Epoche 15: Zum 15. Mal alle Bilder anschauen

Mit jeder Epoche wird das Modell hoffentlich besser!

📊 Was ist die Confusion Matrix?

Die Confusion Matrix zeigt, wo das Modell Fehler macht:

                     Vorhersage: Katze   Vorhersage: Hund
Echte: Katze                    95                     5
Echte: Hund                     10                    90

Interpretation:

  • Diagonal (95, 90): Richtige Vorhersagen ✅
  • Nebendiagonal (5, 10): Fehler ❌

In diesem Beispiel:

  • ✅ 95 Katzen richtig erkannt
  • ❌ 5 Katzen fälschlicherweise als Hund erkannt
  • ❌ 10 Hunde fälschlicherweise als Katze erkannt
  • ✅ 90 Hunde richtig erkannt

📈 Was sind Precision, Recall und F1-Score?

Diese Metriken messen verschiedene Arten von Genauigkeit:

Precision (Präzision):

"Wenn das Modell sagt 'Katze', wie oft hat es Recht?" Precision = Richtige Katzen / (Richtige Katzen + Falsche Katzen)

Recall (Empfindlichkeit):

"Von allen echten Katzen, wie viele erkannte das Modell?" Recall = Richtige Katzen / (Richtige Katzen + Übersehene Katzen)

F1-Score:

Der Durchschnitt von Precision und Recall (ausgewogenes Maß)

🎯 Was ist Transfer Learning?

Statt das Modell von Null zu trainieren, verwenden wir ein vortrainiertes Modell (ResNet18):

Vortrainiertes Modell (von Millionen Bildern gelernt)
    ↓
    ├─ Erste Schichten: Bleiben unverändert ❄️
    │   (Können bereits Kanten, Farben, Formen erkennen)
    │
    └─ Letzte Schichten: Wir trainieren neu 🔥
        (Spezialisiert für unsere Aufgabe: Katze vs. Hund)

Vorteile:

  • ⚡ Viel schneller (statt Tage nur Minuten)
  • 📈 Bessere Ergebnisse (brauchen weniger Daten)
  • 💰 Weniger Rechenpower nötig

🎛️ Einstellungen

In train.py kannst du diese Parameter anpassen:

BATCH_SIZE = 128      # Wie viele Bilder auf einmal? (64-256 ist normal)
EPOCHS = 15           # Wie oft trainieren? (mehr = potenziell besser, aber längere Zeit)
LR = 3e-4            # Lerngeschwindigkeit (zu hoch = instabil, zu niedrig = langsam)
PATIENCE = 6         # Early Stopping: Nach wie vielen Epochen ohne Verbesserung stoppen?
IMG_SIZE = 224       # Bildgröße (224x224 ist Standard für ResNet)

📁 Dateien erklärt

train.py

Trainiert das Modell mit deinen Bildern.

Was es tut:

  1. Lädt Bilder aus dem data/ Ordner
  2. Bereitet sie vor (verkleinern, normalisieren)
  3. Erstellt ein neuronales Netzwerk
  4. Trainiert es für 15 Epochen
  5. Speichert das beste Modell in artifacts/model.pt
  6. Zeigt Metriken und Confusion Matrix

Output:

  • artifacts/model.pt - Das trainierte Modell
  • artifacts/classes.json - Die Klassennamen

predict.py

Nutzt das trainierte Modell um neue Bilder vorherzusagen (Command Line).

Wie zu nutzen:

python predict.py /pfad/zu/bild.jpg

Output:

  • Beste Vorhersage (z.B. "Katze")
  • Konfidenz/Sicherheit (0-100%)
  • Wahrscheinlichkeiten für alle Klassen
  • Visualisierter Balken pro Klasse

serve_model.py

Startet einen Webserver, der die Vorhersagen über eine API anbietet.

Was es tut:

  1. Lädt das trainierte Modell
  2. Startet einen FastAPI-Webserver (Port 8000)
  3. Bietet zwei Wege zur Klassifizierung:

Wie zu nutzen:

# Webserver starten
uvicorn serve_model:app --reload --host 0.0.0.0 --port 8000

# Im Browser öffnen
# http://localhost:8000/docs

# Oder mit Python
import requests
response = requests.post('http://localhost:8000/predict',
  files={'file': open('bild.jpg', 'rb')})
print(response.json())

Output:

  • JSON mit Vorhersage, Konfidenz und Wahrscheinlichkeiten
  • Interaktive Web-Oberfläche mit Dokumentation

web/index.html

Eine grafische Web-Oberfläche zum Testen des Modells im Browser.

Was es tut:

  1. Zeigt ein File-Upload Feld
  2. Sendet das Bild zum Webserver (serve_model.py)
  3. Zeigt die Vorhersage und Konfidenz direkt an
  4. Zeigt Vorschau des hochgeladenen Bildes

Wie zu nutzen:

# Option 1: Direkt öffnen (lokal)
# Doppelklick auf web/index.html

# Option 2: Mit HTTP-Server
python -m http.server 8080 --directory web
# Dann Browser: http://localhost:8080

Vorrausetzungen:

  • serve_model.py muss auf Port 8000 laufen
  • Browser muss auf http://localhost:8000 zugreifen können

⚡ Schnellstart Kommandos

# 1️⃣  MODELL TRAINIEREN
python train.py

# 2️⃣  EINZELNES BILD KLASSIFIZIEREN (Command Line)
python predict.py foto.jpg

# 3️⃣  WEBSERVER STARTEN
uvicorn serve_model:app --reload --host 0.0.0.0 --port 8000

# 4️⃣  INTERAKTIVE API IM BROWSER
# Öffne: http://localhost:8000/docs

# 5️⃣  WEB-OBERFLÄCHE NUTZEN
# Öffne: file:///C:/Users/sezgin/PycharmProjects/cat/web/index.html

# 6️⃣  MIT PYTHON API NUTZEN
python << 'EOF'
import requests
r = requests.post('http://localhost:8000/predict',
  files={'file': open('foto.jpg', 'rb')})
print(r.json())
EOF

# 7️⃣  MIT CURL API NUTZEN
curl -X POST -F '[email protected]' http://localhost:8000/predict

🔧 Troubleshooting

Problem: "FileNotFoundError: data/train"

Lösung: Erstelle die data/ Ordnerstruktur wie oben beschrieben.

Problem: Training ist sehr langsam

Lösungen:

  • Nutze eine GPU (NVIDIA CUDA): Model trainiert 10-100x schneller
  • Reduziere Bildanzahl (weniger Daten = schnelleres Training)
  • Reduziere BATCH_SIZE (weniger RAM nötig)

Problem: Modell hat schlechte Genauigkeit

Lösungen:

  • Mehr Bilder sammeln (mindestens 100-200 pro Klasse)
  • Unterschiedlichere Bilder (verschiedene Winkel, Lichtverhältnisse)
  • Trainiere mehr Epochen (erhöhe EPOCHS)
  • Überprüfe ob Bilder richtig beschriftet sind

Problem: "CUDA out of memory"

Lösungen:

  • Reduziere BATCH_SIZE (z.B. von 128 auf 64)
  • Reduziere Bildanzahl
  • Starte andere Programme, die GRAM nutzen

Problem: Webserver startet nicht / "ModuleNotFoundError: No module named 'fastapi'"

Lösung: Installiere die fehlenden Dependencies:

pip install fastapi uvicorn python-multipart

Problem: "Address already in use" (Port 8000 ist besetzt)

Lösungen:

  • Nutze einen anderen Port:
    uvicorn serve_model:app --reload --host 0.0.0.0 --port 8001
  • Oder beende das andere Programm das Port 8000 nutzt

Problem: Webserver lädt bei http://localhost:8000/docs nicht

Lösungen:

  • Überprüfe dass der Server wirklich läuft (sollte "Uvicorn running on..." anzeigen)
  • Warte 2-3 Sekunden nach dem Start
  • Versuche http://127.0.0.1:8000/docs statt localhost
  • Überprüfe Firewall-Einstellungen

Problem (Mac): "Kann MPS nicht nutzen" oder "Device mps not available"

Lösungen:

  • Überprüfe dass PyTorch korrekt installiert ist:

    python -c "import torch; print(torch.backends.mps.is_available())"

    Sollte True ausgeben

  • Aktualisiere PyTorch:

    pip install --upgrade torch torchvision torchaudio
  • Achte darauf dass es ein Apple Silicon Mac ist (M1, M2, M3)

    uname -m
    # Sollte "arm64" ausgeben (nicht "x86_64")

Problem (Mac): Training ist langsam oder friert ein

Lösungen:

  • Erste 1-2 Epochen sind langsamer (JIT-Kompilation)
  • Reduziere BATCH_SIZE wenn zu viel Memory genutzt wird
  • Überprüfe Ressourcennutzung (Activity Monitor)
  • Schließe andere Apps um RAM freizumachen

📚 Konzepte für Anfänger

Was ist Machine Learning?

Ein Computer lernt von Beispielen statt dass man ihm jede Regel vorprogrammiert.

Beispiel: Statt "wenn Bild hat spitze Ohren → Katze" schreiben, zeigen wir dem Computer 1000 Katzen und 1000 Hunde. Er findet selbst heraus, was Katzen sind!

Was ist Deep Learning?

Machine Learning mit tiefen neuronalen Netzen (viele Schichten). Ideal für Bilder und Text!

Was ist eine Loss-Funktion?

Misst "wie falsch" die Vorhersagen sind.

  • Loss = 0: Perfekt! ✨
  • Loss = hoch: Sehr falsch ❌

Das Training versucht den Loss zu minimieren.

Was ist ein Optimizer?

Der "Lernalgorithmus". Passt die Gewichte an um den Loss zu reduzieren. Adam ist ein beliebter Optimizer (funktioniert in den meisten Fällen gut).

Was ist eine API?

API = Application Programming Interface

Eine API ermöglicht es anderen Programmen (nicht Menschen) mit deiner Anwendung zu kommunizieren.

Beispiel:

  • Ohne API: Du musst python predict.py bild.jpg manuell im Terminal aufrufen
  • Mit API: Ein anderes Programm kann automatisch dein Modell aufrufen und Bilder klassifizieren

HTTP API: Nutzt das gleiche Protokoll wie Webseiten (HTTP). Perfekt für Web-Anwendungen!

Was ist FastAPI und Swagger?

FastAPI = Modernes Python-Framework um Web-APIs zu bauen (schnell, einfach, dokumentiert)

Swagger UI = Interaktive Dokumentation deiner API

  • Du kannst direkt im Browser APIs testen (keine separaten Tools nötig!)
  • Zeigt alle verfügbaren Endpunkte und Parameter
  • Gibt automatisch Beispiel-Requests und Responses

Öffne http://localhost:8000/docs um Swagger selbst auszuprobieren!


🎓 Nächste Schritte

  1. Experimentieren: Probiere verschiedene Klassifizierungsaufgaben
  2. Mehr Klassen: Erweitere das Projekt auf 3+ Kategorien
  3. Fine-Tuning: Experimentiere mit Einstellungen
  4. Andere Modelle: Probiere andere Architekturen (ResNet50, EfficientNet, etc.)

📝 Verwendete Technologien

  • PyTorch: Deep Learning Framework
  • TorchVision: Bildverarbeitung und vortrainierte Modelle
  • scikit-learn: Metriken (Confusion Matrix, Classification Report)
  • PIL: Bildladen und -verarbeitung

💡 Tipps für beste Ergebnisse

DO:

  • Unterschiedliche Bilder sammeln (verschiedene Winkel, Lichter, Größen)
  • Train/Val Split beachten (Modell nie mit Validierungsdaten trainieren!)
  • Genug Daten sammeln (mindestens 100 pro Klasse)
  • Bilder vorher anschauen und prüfen (sind sie richtig beschriftet?)

DON'T:

  • Zu viele Klassen mit wenig Daten (3-5 Klassen mit 100+ Bildern ist gut)
  • Sehr schlechte Bildqualität nutzen (zu dunkel, verschwommen, irrelevant)
  • Zu lange trainieren (Overfitting: Modell merkt sich Daten statt zu lernen)
  • Trainings- und Validierungsdaten vermischen

🤝 Support

Wenn etwas nicht funktioniert:

  1. Lies die Fehlermeldung genau
  2. Überprüfe deine Datenstruktur
  3. Schau im "Troubleshooting" oben nach

📄 Lizenz

Dieses Projekt ist für Lehr- und Demonstrationszwecke gedacht.


Viel Spaß beim Trainieren! 🚀

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors