Skip to content

antosiowsky/OSNet-reidentification

Repository files navigation

🎯 System Re-identyfikacji Osób (Person ReID)

Zaawansowany system do re-identyfikacji osób w nagraniach wideo CCTV łączący:

  • YOLOv8 (Ultralytics) - wykrywanie osób
  • OSNet (torchreid) - ekstrakcja cech i identyfikacja

📋 Spis Treści


🏗️ Architektura

┌─────────────────┐
│  Wideo Input    │
│   (CCTV)        │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│    YOLOv8       │  ← Detekcja osób (bbox)
│   Detector      │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  Crop Person    │  ← ROI extraction
│    (ROI)        │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│    OSNet        │  ← Ekstrakcja cech (512-d)
│ Feature Extract │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  Cosine Sim.    │  ← Porównanie z galerią
│   Matching      │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  Assign ID      │  ← Istniejące lub nowe ID
└─────────────────┘

🚀 Instalacja

1. Wymagania wstępne

  • Python 3.8 lub nowszy
  • CUDA 11.8+ (opcjonalnie, dla GPU)
  • FFmpeg (dla lepszego wsparcia video)

2. Klonowanie repozytorium

git clone https://github.com/antosiowsky/OSNet-reidentification.git
cd OSNet-reidentification

3. Instalacja zależności

Opcja A: Z GPU (CUDA)

# Zainstaluj PyTorch z CUDA
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118

# Zainstaluj pozostałe zależności
pip install -r requirements.txt

Opcja B: CPU Only

pip install -r requirements.txt

4. Weryfikacja instalacji

python -c "import torch; import torchreid; from ultralytics import YOLO; print('✅ Wszystko OK!')"

💡 Użycie

Podstawowe użycie

python main.py --input video.mp4

Tryb na żywo (kamera)

Uruchom przetwarzanie na żywo z kamery podłączonej do systemu:

# Przetwarzanie z domyślnej kamery (index 0)
python main.py --live

# Wybierz kamerę (np. 1) i zapisz wynik
python main.py --live --camera 1 --output live_output.mp4

# Użycie na CPU i bez wyświetlania okna
python main.py --live --device cpu --no-display

Naciśnij ESC w oknie podglądu aby zakończyć przetwarzanie.

Przetwarzanie z zapisem wyniku

python main.py --input video.mp4 --output wynik.mp4

Dostosowane parametry

python main.py \
    --input video.mp4 \
    --output wynik.mp4 \
    --threshold 0.7 \
    --confidence 0.6 \
    --skip 2

Przykłady dla różnych scenariuszy

🏢 Monitoring biura (wysoka jakość)

python main.py -i biuro.mp4 -o biuro_reid.mp4 --threshold 0.7 --confidence 0.6

🏬 Centrum handlowe (tłum ludzi)

python main.py -i sklep.mp4 -o sklep_reid.mp4 --threshold 0.5 --confidence 0.4 --skip 2

🚇 Dworzec (szybki ruch)

python main.py -i dworzec.mp4 -o dworzec_reid.mp4 --threshold 0.6 --yolo-model yolov8m.pt

💻 Praca tylko na CPU

python main.py -i video.mp4 --device cpu --skip 3 --no-display

🔬 Jak to działa

1. Detekcja osób (YOLOv8)

# YOLO wykrywa bounding boxy osób na każdej klatce
detections = yolo(frame)
# Filtrujemy tylko klasę 'person' (ID: 0 w COCO)
persons = [d for d in detections if d.class_id == 0]

2. Ekstrakcja ROI (Region of Interest)

# Wycinamy każdą wykrytą osobę z klatki
x1, y1, x2, y2 = bbox
person_crop = frame[y1:y2, x1:x2]

3. Preprocessing dla OSNet

⚠️ KLUCZOWY KROK dla dokładności!

transform = transforms.Compose([
    transforms.Resize((256, 128)),    # OSNet wymaga H=256, W=128
    transforms.ToTensor(),
    transforms.Normalize(
        mean=[0.485, 0.456, 0.406],   # ImageNet statistics
        std=[0.229, 0.224, 0.225]
    )
])

Dlaczego te wartości?

  • (256, 128) - standardowy input size dla OSNet
  • mean/std - OSNet trenowany na ImageNet, wymaga tej normalizacji
  • RGB, nie BGR! (OpenCV używa BGR, trzeba konwertować)

4. Ekstrakcja cech (Feature Embedding)

# OSNet generuje 512-wymiarowy wektor cech
features = osnet_model(person_crop)  # shape: (512,)

# KLUCZOWE: Normalizacja L2
features = features / np.linalg.norm(features)

Dlaczego normalizacja?

  • Cosine similarity dla znormalizowanych wektorów: sim = dot(A, B)
  • Bez normalizacji musielibyśmy: sim = dot(A, B) / (||A|| * ||B||)
  • Normalizacja = szybsze obliczenia + stabilność numeryczna

5. Matching z galerią (Cosine Similarity)

# Porównaj z każdą osobą w galerii
for person in gallery:
    similarity = np.dot(embedding, person['embedding'])
    
    if similarity > threshold:
        return person['id']  # Znaleziono dopasowanie!

# Brak dopasowania - nowa osoba
new_id = create_new_person()
gallery.append({'id': new_id, 'embedding': embedding})

Interpretacja threshold:

  • 0.9+ - Prawie identyczne (bardzo restrykcyjne)
  • 0.7-0.8 - Wysokie podobieństwo (zalecane)
  • 0.5-0.6 - Umiarkowane (więcej False Positives)
  • <0.5 - Niskie (dużo błędnych dopasowań)

⚙️ Parametry

Parametr Typ Domyślnie Opis
--input, -i str wymagany Ścieżka do pliku wideo
--output, -o str None Ścieżka zapisu wyniku
--yolo-model str yolov8n.pt Model YOLO (n/s/m/l/x)
--osnet-model str osnet_x1_0 Model OSNet
--threshold, -t float 0.6 Próg podobieństwa ReID
--confidence, -c float 0.5 Próg pewności YOLO
--device str cuda GPU/CPU
--skip int 1 Co ile klatek
--no-display flag False Bez okna preview

Wybór modelu YOLO

Model Rozmiar Prędkość Dokładność Użycie
yolov8n.pt 6 MB ⚡⚡⚡ ★★☆ Szybkie testy
yolov8s.pt 22 MB ⚡⚡ ★★★ Zalecany
yolov8m.pt 52 MB ★★★★ Produkcja
yolov8l.pt 87 MB 🐌 ★★★★★ Maksymalna dokładność

Wybór modelu OSNet

Model Parametry Prędkość Dokładność
osnet_x0_25 0.2M ⚡⚡⚡ ★★☆
osnet_x0_5 0.9M ⚡⚡ ★★★
osnet_x0_75 1.5M ⚡⚡ ★★★★
osnet_x1_0 2.2M ★★★★★

💻 Wymagania sprzętowe

Minimalne (CPU)

  • Procesor: Intel Core i5 / AMD Ryzen 5
  • RAM: 8 GB
  • Dysk: 5 GB wolnego miejsca
  • Prędkość: ~2-5 FPS (1080p video)

Zalecane (GPU)

  • GPU: NVIDIA GTX 1060 6GB lub lepszy
  • RAM: 16 GB
  • VRAM: 6 GB+
  • Prędkość: ~15-30 FPS (1080p video)

Optymalne (Produkcja)

  • GPU: NVIDIA RTX 3060/4060 lub lepszy
  • RAM: 32 GB
  • VRAM: 8 GB+
  • Prędkość: ~30-60 FPS (1080p video)

📊 Struktura projektu

OSNet-reidentification/
├── main.py              # Główny skrypt aplikacji
├── reid_engine.py       # Silnik ReID (OSNet + matching)
├── requirements.txt     # Zależności
├── README.md           # Dokumentacja
└── examples/           # Przykładowe nagrania (opcjonalnie)

🔧 Rozwiązywanie problemów

Problem: "CUDA out of memory"

Rozwiązanie:

# Użyj mniejszego modelu YOLO
python main.py -i video.mp4 --yolo-model yolov8n.pt

# Lub pomiń klatki
python main.py -i video.mp4 --skip 3

# Lub użyj CPU
python main.py -i video.mp4 --device cpu

Problem: Zbyt wiele False Positives (nieprawidłowe ID)

Rozwiązanie:

# Zwiększ threshold
python main.py -i video.mp4 --threshold 0.75

Problem: Osoby nie są rozpoznawane (za dużo nowych ID)

Rozwiązanie:

# Zmniejsz threshold
python main.py -i video.mp4 --threshold 0.5

# Zwiększ confidence YOLO (lepsze detekcje)
python main.py -i video.mp4 --confidence 0.6

Problem: Wolne przetwarzanie

Rozwiązanie:

# Pomiń co drugą klatkę
python main.py -i video.mp4 --skip 2

# Użyj mniejszego modelu
python main.py -i video.mp4 --yolo-model yolov8n.pt --osnet-model osnet_x0_5

📚 Referencje


📝 Licencja

MIT License - zobacz plik LICENSE


👨‍💻 Autor

Senior Computer Vision Engineer
Projekt stworzony: 2025-12-02


🤝 Współpraca

Pull requests mile widziane! Dla większych zmian, najpierw otwórz issue.


⭐ Wsparcie

Jeśli projekt Ci pomógł, zostaw gwiazdkę! ⭐

About

CCTV Person Re-Identification System using OSNet

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages