streamware

🎬 Live Narrator - Architektura i Optymalizacje

PrzeglΔ…d Systemu

Live Narrator to komponent Streamware do analizy strumieni wideo w czasie rzeczywistym z wykorzystaniem AI (LLM).

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   RTSP      │────▢│  FastCapture │────▢│ SmartDetect │────▢│  Vision LLM  β”‚
β”‚   Stream    β”‚     β”‚  (FFmpeg/CV) β”‚     β”‚ (HOG+Motion)β”‚     β”‚  (moondream) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚                    β”‚                    β”‚
                           β–Ό                    β–Ό                    β–Ό
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚   RAM Disk   β”‚     β”‚   Cache     β”‚     β”‚  Guarder LLM β”‚
                    β”‚ /dev/shm/    β”‚     β”‚  (images)   β”‚     β”‚  (gemma:2b)  β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                                    β”‚
                                                                    β–Ό
                                                             β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                                             β”‚    TTS       β”‚
                                                             β”‚  (pyttsx3)   β”‚
                                                             β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Pipeline Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                           LIVE NARRATOR PIPELINE                             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

1. CAPTURE STAGE
   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   β”‚  RTSP    │───▢│ FastCapture  │───▢│  RAM Disk    β”‚
   β”‚  Stream  β”‚    β”‚ (OpenCV/FFmpeg)β”‚   β”‚ /dev/shm/   β”‚
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                          β”‚
                          β–Ό
2. DETECTION STAGE        
   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   β”‚   Frame      │───▢│ Motion Detect│───▢│ HOG Person   β”‚
   β”‚   Buffer     β”‚    β”‚  (diff %)    β”‚    β”‚  Detection   β”‚
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                  β”‚
                                                  β–Ό
3. TRACKING STAGE (NEW)
   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   β”‚ Motion       │───▢│ Object       │───▢│ Tracked      β”‚
   β”‚ Regions      β”‚    β”‚ Tracker      β”‚    β”‚ Objects      β”‚
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚                    β”‚                    β”‚
         β”‚              β”Œβ”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”              β”‚
         β”‚              β”‚ IoU Match β”‚              β”‚
         β”‚              β”‚ ID Assign β”‚              β”‚
         β”‚              β”‚ Direction β”‚              β”‚
         β”‚              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β”‚
         β–Ό                                         β–Ό
4. ANALYSIS STAGE
   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   β”‚ Movement     │───▢│ Vision LLM   │───▢│ Description  β”‚
   β”‚ Context      β”‚    β”‚ (moondream)  β”‚    β”‚ (verbose)    β”‚
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                  β”‚
                                                  β–Ό
5. FILTER STAGE
   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   β”‚ Verbose      │───▢│ Guarder LLM  │───▢│ Short        β”‚
   β”‚ Description  β”‚    β”‚ (gemma:2b)   β”‚    β”‚ Summary      β”‚
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                  β”‚
                                                  β–Ό
6. OUTPUT STAGE
   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   β”‚  Filtered    │───▢│    TTS       │───▢│    Log       β”‚
   β”‚  Response    β”‚    β”‚  (pyttsx3)   β”‚    β”‚  (CSV/TXT)   β”‚
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Komponenty

1. FastCapture (fast_capture.py)

Zoptymalizowany moduΕ‚ przechwytywania klatek z RTSP.

Cechy:

WydajnoΕ›Δ‡: | Przed | Po | |β€”β€”-|—–| | ~4000ms/klatkΔ™ | 0ms (z bufora) |

2. SmartDetector (smart_detector.py)

Inteligentna detekcja obiektΓ³w z YOLO i fallback na HOG.

Pipeline:

Frame β†’ Motion Detection β†’ YOLO Detection β†’ [fallback] HOG β†’ [opcjonalnie] Small LLM
              ↓                  ↓                ↓                    ↓
          <0.5% change?     Auto-installed    No YOLO?          Not vision model?
              ↓                  ↓                ↓                    ↓
            SKIP          Fast & Accurate    Use HOG            ASSUME PRESENT

YOLO Detection (NEW - domyΕ›lnie wΕ‚Δ…czone):

Kluczowe optymalizacje:

PorΓ³wnanie detektorΓ³w: | Detektor | Czas | DokΕ‚adnoΕ›Δ‡ | Wymaga GPU | |β€”β€”β€”-|β€”β€”|β€”β€”β€”β€”|β€”β€”β€”β€”| | YOLO (yolov8n) | ~10ms | β˜…β˜…β˜…β˜…β˜… | Nie (szybszy z) | | HOG (OpenCV) | ~100ms | β˜…β˜…β˜… | Nie | | Small LLM | ~500ms | β˜…β˜…β˜…β˜… | Nie |

3. Vision LLM (moondream)

GΕ‚Γ³wny model do analizy obrazu.

WybΓ³r modelu: | Model | Czas | JakoΕ›Δ‡ | RAM | |β€”β€”-|β€”β€”|——–|—–| | moondream | ~1.5s | β˜…β˜…β˜… | 2GB | | llava:7b | ~2-3s | β˜…β˜…β˜…β˜… | 4GB | | llava:13b | ~4-5s | β˜…β˜…β˜…β˜…β˜… | 8GB |

Prompt optymalizacje:

4. Guarder LLM (gemma:2b)

Filtr i sumaryzator odpowiedzi tekstowych.

Funkcje:

UWAGA: gemma:2b NIE jest modelem wizyjnym - nie używać do analizy obrazów!

Prompt dla guardera:

Summarize in max 8 words. Focus: person.
Input: [verbose LLM response]
Output format: "Person: [what they're doing]" or "No person visible"

5. Object Tracker (object_tracker.py) πŸ†•

ModuΕ‚ Ε›ledzenia wielu obiektΓ³w miΔ™dzy klatkami.

Architektura:

Motion Regions β†’ Extract Detections β†’ IoU Association β†’ Track Objects
                                            ↓
                              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                              β”‚    Tracked Object #1      β”‚
                              β”‚    - ID: 1                β”‚
                              β”‚    - Position: (0.3, 0.5) β”‚
                              β”‚    - Direction: moving_right β”‚
                              β”‚    - State: tracked       β”‚
                              β”‚    - History: [...]       β”‚
                              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Cechy:

Kierunki ruchu: | Direction | Opis | |———–|β€”β€”| | entering | Obiekt pojawiΕ‚ siΔ™ w kadrze | | exiting | Obiekt wychodzi z kadru | | moving_left | Ruch w lewo | | moving_right | Ruch w prawo | | approaching | ZbliΕΌa siΔ™ do kamery | | leaving | Oddala siΔ™ od kamery | | stationary | Brak ruchu |

Stany obiektu: | State | Opis | |β€”β€”-|β€”β€”| | new | WΕ‚aΕ›nie pojawiΕ‚ siΔ™ | | tracked | Aktywnie Ε›ledzony | | lost | Tymczasowo zgubiony (max 5 klatek) | | gone | OpuΕ›ciΕ‚ kadr |

PrzykΕ‚ad wyjΕ›cia:

2 objects tracked. #1: Person moving right in center_middle. #2: Person stationary in left_bottom. Person #3 left.

6. Cache System

DescriptionCache (pamiΔ™Δ‡ RAM):

Frame Cache (ramdisk /dev/shm/streamware):

Optymalizacje WydajnoΕ›ci

Zaimplementowane βœ…

  1. FastCapture - persistent RTSP connection
    • Przed: 4000ms/klatkΔ™
    • Po: 0ms (z bufora)
  2. RAM Disk - /dev/shm/streamware
    • Eliminuje I/O na dysk
    • ~10x szybszy zapis/odczyt
  3. Szybki model wizyjny - moondream
    • 2-3x szybszy niΕΌ llava:13b
    • WystarczajΔ…ca jakoΕ›Δ‡ dla real-time
  4. Szybki guarder - gemma:2b
    • ~200-300ms zamiast ~2-3s
    • Tylko do tekstu, nie obrazΓ³w
  5. Image optimization
    • Resize do 384px dla moondream
    • JPEG quality 75%
    • ~50ms przetwarzania
  6. Smart caching
    • Cache opisΓ³w podobnych klatek
    • Unika powtΓ³rnych wywoΕ‚aΕ„ LLM
  7. Parallel processing
    • 8 workerΓ³w dla zadaΕ„ I/O
    • Capture + process w pipeline

Zaimplementowane βœ… (Nowe)

  1. Animal Detector (animal_detector.py)
    • Wykrywanie ptakΓ³w, kotΓ³w, psΓ³w, dzikich zwierzΔ…t
    • YOLO z optymalizacjΔ… dla maΕ‚ych obiektΓ³w (ptaki)
    • Klasyfikacja zachowaΕ„ (eating, flying, resting)
    • Bird Feeder Monitor - liczenie wizyt, statystyki

Planowane πŸ“‹

  1. DeepSORT/ByteTrack - zaawansowane trackery z re-identyfikacjΔ…
  2. GPU batching - przetwarzanie wielu klatek jednoczeΕ›nie na GPU
  3. Streaming inference - strumieniowe odpowiedzi z LLM
  4. ONNX/TensorRT - zoptymalizowane modele detekcji
  5. WebSocket output - real-time streaming wynikΓ³w
  6. Multi-camera - rΓ³wnolegΕ‚e strumienie z wielu kamer
  7. Zone alerts - alerty przy przekroczeniu linii/strefy
  8. Bird species identification - rozpoznawanie gatunkΓ³w ptakΓ³w

Konfiguracja

Wymagane modele (auto-instalacja)

# Instalowane automatycznie przy pierwszym uruchomieniu
ollama pull moondream    # Vision model (~1.7GB)
ollama pull gemma:2b     # Guarder model (~1.7GB)

Zmienne Ε›rodowiskowe (.env)

# Modele
SQ_MODEL=moondream
SQ_GUARDER_MODEL=gemma:2b

# Stream
SQ_STREAM_MODE=track
SQ_STREAM_FOCUS=person
SQ_STREAM_INTERVAL=3

# Optymalizacje
SQ_FAST_CAPTURE=true
SQ_RAMDISK_ENABLED=true
SQ_RAMDISK_PATH=/dev/shm/streamware

UΕΌycie

Podstawowe

sq live narrator --url "rtsp://user:pass@ip:554/stream" --mode track --focus person --tts

Z peΕ‚nym logowaniem

sq live narrator --url "rtsp://..." --mode track --focus person --tts --verbose

Z zapisem do pliku

sq live narrator --url "rtsp://..." --file report.html --frames-dir ./frames

Metryki WydajnoΕ›ci

Typowy cykl (z optymalizacjami)

capture:      ~0ms (FastCapture buffer)
smart_detect: ~300ms (HOG + motion)
vision_llm:   ~1500ms (moondream)
guarder_llm:  ~250ms (gemma:2b)
─────────────────────────────────
Total:        ~2s/frame
Throughput:   ~0.5 FPS

PorΓ³wnanie przed/po

| Etap | Przed | Po | Poprawa | |β€”β€”|β€”β€”-|—–|β€”β€”β€”| | capture | 4000ms | 0ms | 100% | | vision_llm | 4000ms | 1500ms | 62% | | guarder_llm | 2700ms | 250ms | 91% | | Total | 10s | 2s | 80% |

Troubleshooting

Problem: llm_no_person mimo osoby na obrazie

Przyczyna: Guarder model (gemma:2b) nie jest wizyjny RozwiΔ…zanie: Zaktualizuj do najnowszej wersji - naprawione automatycznie

Problem: LLM zwraca [Action]. [Direction/Position]

Przyczyna: Stary cache z przykΕ‚adami z promptu RozwiΔ…zanie: rm -f /dev/shm/streamware/*.jpg

Problem: Wolny capture (~4000ms)

Przyczyna: Fallback do subprocess FFmpeg RozwiΔ…zanie: SprawdΕΊ czy FastCapture dziaΕ‚a: SQ_FAST_CAPTURE=true

Autorzy