No description
Find a file
2026-03-23 19:17:54 +01:00
assets Dateien nach „assets“ hochladen 2026-03-23 19:10:47 +01:00
systemd Dateien nach „systemd“ hochladen 2026-03-23 19:10:18 +01:00
.gitignore Dateien nach „/“ hochladen 2026-03-23 19:11:32 +01:00
capture.py Dateien nach „/“ hochladen 2026-03-23 19:10:01 +01:00
LICENSE Dateien nach „/“ hochladen 2026-03-23 19:13:19 +01:00
README.md README.md aktualisiert 2026-03-23 19:17:54 +01:00
setup.sh Dateien nach „/“ hochladen 2026-03-23 19:10:01 +01:00
webserver.py Dateien nach „/“ hochladen 2026-03-23 19:10:01 +01:00

🐧 Messe-Zeitraffer mit KI-Personenerkennung

Zeitraffer-Kamera für Messestände. Macht regelmäßig Fotos, erkennt Personen per KI direkt auf dem Gerät und legt ein Emoji über jeden Kopf — DSGVO-freundlich, ohne Cloud, komplett lokal.

Was es macht

  1. Alle N Sekunden ein Foto mit der Raspberry Pi Kamera
  2. Personen im Bild erkennen (YOLOv11 auf Hailo AI HAT+ 2)
  3. Pinguin-Emoji 🐧 über jeden erkannten Kopf legen
  4. Original + Emoji-Version speichern
  5. Webinterface zeigt live das letzte verarbeitete Bild

Die Originalbilder (ohne Emoji) bleiben für den Zeitraffer erhalten. Die Emoji-Versionen sind DSGVO-konform veröffentlichbar.

Hardware

  • Raspberry Pi 5 (8 GB)
  • Raspberry Pi AI HAT+ 2 (Hailo-10H, 40 TOPS)
  • Raspberry Pi Kamera (CSI-Flachbandkabel)
  • Raspberry Pi OS Lite (64-bit, Trixie)

Architektur

┌─────────────┐     Queue      ┌──────────────────┐
│ CAPTURE     │───────────────▶│  PROCESSING      │
│ alle Ns     │   (LIFO)       │  eigenes Tempo   │
│ Foto machen │                │  Hailo-Inferenz  │
│ Original    │                │  Emoji-Overlay   │
│ speichern   │                │  Web-Update      │
└─────────────┘                └──────────────────┘

Zwei entkoppelte Threads: Capture macht pünktlich Fotos (kein Bild geht verloren), Processing arbeitet die Queue ab und priorisiert immer das neueste Bild fürs Webinterface.

Erkennungsstrategie

Modell Erkennt Empfehlung
yolov5s_personface Personen + Gesichter Beste Wahl
yolov11m / yolov8m Personen (COCO) Gut mit Head-Fallback
scrfd_2.5g Nur Gesichter Schnell, robust
OpenCV Haar-Cascade Gesichter + Oberkörper Fallback ohne Hailo

Head-Fallback: Wenn eine Person erkannt wird aber kein Gesicht (weggedreht, verdeckt, zu weit weg), wird der geschätzte Kopfbereich trotzdem mit Emoji überdeckt.

Das Skript erkennt automatisch die Hailo-Architektur (H10/H8/H8L) und wählt nur kompatible Modelle.

Installation

Voraussetzungen

Raspberry Pi OS Lite (64-bit) mit Hailo-Software:

sudo apt install -y hailo-h10-all   # Für AI HAT+ 2
# ODER
sudo apt install -y hailo-all       # Für AI HAT+
sudo reboot

# Prüfen
hailortcli fw-control identify

Projekt einrichten

git clone https://code.nerdzoom.media/Marius/Messe-Zeitraffer.git
cd Messe-Zeitraffer
sudo apt install -y python3-picamera2 python3-opencv python3-pil fonts-noto-color-emoji

Setup (Autostart + Netzwerk)

sudo bash setup.sh --user $(whoami)
sudo reboot

Das Setup-Skript:

  • Konfiguriert eine statische IP (10.42.0.1) auf eth0 für Direktverbindung per LAN-Kabel
  • Richtet Systemd-Services mit Autostart ein
  • Erkennt automatisch NetworkManager, dhcpcd oder Netplan
  • DHCP bleibt parallel aktiv

Manuell testen

python3 capture.py --interval 10
# In einem zweiten Terminal:
python3 webserver.py --port 8080

Nutzung

Automatisch (nach Setup)

Strom anschließen → Pi bootet → Capture + Webserver starten automatisch.

Webinterface

Verbindung Adresse
LAN-Kabel direkt http://10.42.0.1
Netzwerk (DHCP) http://<ip> oder http://<hostname>.local

Bilder abholen

# Per rsync
rsync -avz pi@<ip>:~/Messe-Zeitraffer/originals/ ./originals/
rsync -avz pi@<ip>:~/Messe-Zeitraffer/penguins/ ./penguins/

Zeitraffer-Video erstellen (auf einem anderen Rechner)

# Aus Originalbildern (NICHT veröffentlichen — Gesichter sichtbar)
ffmpeg -framerate 24 -pattern_type glob -i 'originals/*.jpg' \
       -c:v libx264 -pix_fmt yuv420p -crf 18 timelapse_original.mp4

# Aus Pinguin-Bildern (für Veröffentlichung)
ffmpeg -framerate 24 -pattern_type glob -i 'penguins/*.jpg' \
       -c:v libx264 -pix_fmt yuv420p -crf 18 timelapse_penguin.mp4

Konfiguration

python3 capture.py --interval 30        # Sekunden zwischen Aufnahmen
                   --width 2592         # Bildbreite (Standard: voller Sensor)
                   --height 1944        # Bildhöhe
                   --model-path X.hef   # Expliziter Modellpfad
                   --no-head-fallback   # Kopfbereich-Schätzung deaktivieren
                   --max-queue 100      # Max Bilder in Warteschlange

Intervall ändern (im laufenden Betrieb)

sudo sed -i 's/--interval [0-9]*/--interval 20/' /etc/systemd/system/timelapse-capture.service
sudo systemctl daemon-reload
sudo systemctl restart timelapse-capture

Eigenes Emoji

Eigenes PNG mit transparentem Hintergrund (min. 128×128 px) nach assets/penguin.png kopieren und Service neustarten.

Ordnerstruktur

Messe-Zeitraffer/
├── capture.py          # Hauptskript (Producer/Consumer)
├── webserver.py        # Webinterface
├── setup.sh            # Einrichtungsskript
├── LICENSE
├── README.md
├── systemd/
│   ├── timelapse-capture.service
│   └── timelapse-web.service
├── assets/
│   └── penguin.png     # Emoji-Overlay (austauschbar)
├── originals/          # Originalfotos (unverpixelt!)
├── penguins/           # Fotos mit Emoji über Köpfen
└── web/
    ├── latest.jpg      # Aktuelles Bild für Webinterface
    └── meta.json       # Metadaten

Performance

Schritt Dauer
Foto aufnehmen ~200 ms
Hailo-Inferenz (YOLOv11m) ~100150 ms
Emoji-Overlay (PIL) ~50100 ms
JPEG speichern ~100200 ms
Gesamt ~0.51 s

Speicherplatz: ~900 KB pro Bild bei 2592×1944. Bei 10s Intervall und 10h Messetag: ~6,4 GB (Original + Pinguin).

Hinweise

  • DSGVO: Hinweisschild am Messestand aufstellen. Originalbilder enthalten unverpixelte Gesichter — nur die Pinguin-Version veröffentlichen.
  • Kamera: Etwas erhöht aufstellen für besseren Überblick. Voller Sensor-Modus nutzt das komplette Sichtfeld.
  • Offline: Funktioniert komplett ohne Netzwerk. LAN-Kabel nur fürs Webinterface.
  • Powerbank: Pi 5 + AI HAT+ 2 braucht ein USB-PD-Netzteil mit 5V/5A Profil. Manche Powerbanks liefern das nicht — PSU_MAX_CURRENT=5000 im EEPROM kann helfen.

Lizenz

MIT — siehe LICENSE.