Spaces:
Sleeping
Sleeping
| title: Bahngleis-Detektor | |
| emoji: 🚉 | |
| colorFrom: blue | |
| colorTo: gray | |
| sdk: docker | |
| sdk_version: "1.0" | |
| app_file: app.py | |
| pinned: false | |
| # 🚆 Bahngleiserfassung – Video Frame Analyzer (Streamlit + HF + Ontologie) | |
| [](#) | |
| [](#) | |
| [](#) | |
| Kurzerklärung: Dieses Projekt extrahiert Videoframes (Bahnsteigkamera) und bewertet die Szene **ontologie-basiert** – z. B. „**Person befindet sich im Gleis**“ ⇒ **kritische** Meldung. | |
| Die Bewertung ist **erklärbar** (Regeln + RDF-artige Tripel). | |
| > 📘 **Detailseite (Extra-Tab):** [Ontologie & Regeln – Deep Dive](docs/ONTOLOGIE.md) | |
| --- | |
| ## 🧭 Inhalt | |
| - [🚆 Bahngleiserfassung – Video Frame Analyzer (Streamlit + HF + Ontologie)](#-bahngleiserfassung--video-frame-analyzer-streamlit--hf--ontologie) | |
| - [🧭 Inhalt](#-inhalt) | |
| - [✨ Features](#-features) | |
| - [🏗️ Projektstruktur](#️-projektstruktur) | |
| - [🚀 Schnellstart](#-schnellstart) | |
| - [⚙️ Konfiguration](#️-konfiguration) | |
| - [🖥️ Nutzung](#️-nutzung) | |
| - [🧠 Was ist eine Ontologie?](#-was-ist-eine-ontologie) | |
| - [🧪 Tests \& Tripel-Export](#-tests--tripel-export) | |
| - [🛡️ Sicherheit (Secrets)](#️-sicherheit-secrets) | |
| - [🧰 Troubleshooting](#-troubleshooting) | |
| - [📄 Lizenz](#-lizenz) | |
| - [🔌 Integration](#-integration) | |
| - [🧩 Erweiterung](#-erweiterung) | |
| --- | |
| ## ✨ Features | |
| - 📼 **Video-Upload** (MP4/AVI/MOV/MKV), auto-Frame-Extraktion | |
| - 🤖 **HF-Modelle** (Vision/Language) zur Szeneninterpretation | |
| - 🧩 **Ontologie-Bewertung** (Regeln wie `befindetSichIn(Gleis)`) | |
| - 🧾 **Erklärungen** (welche Regeln ausgelöst haben) | |
| - 🧷 **Tripel-Export** (Turtle-ähnlich) zur Weiterverarbeitung | |
| --- | |
| ## 🏗️ Projektstruktur | |
| ``` | |
| . | |
| ├─ app.py # Streamlit-App (UI ohne Freitext-Prompts) | |
| ├─ ontology\_eval.py # Regeln + Ontologie-Tripel-Export | |
| ├─ test\_ontology\_triples.py # Mini-Test + Turtle-Ausgabe | |
| ├─ detect\_person\_on\_tracks.py # Beispiel-Analyse (einbinden/erweitern) | |
| ├─ requirements.txt | |
| ├─ settings.json.example | |
| ├─ .env.example | |
| └─ docs/ | |
| └─ ONTOLOGIE.md # Detaildoku (Extra-Tab) | |
| ```` | |
| --- | |
| ## 🚀 Schnellstart | |
| ```bash | |
| python -m venv venv | |
| # Windows: | |
| venv\Scripts\activate | |
| # macOS/Linux: | |
| source venv/bin/activate | |
| python -m pip install --upgrade pip setuptools wheel | |
| pip install -r requirements.txt | |
| ```` | |
| --- | |
| ## ⚙️ Konfiguration | |
| **Hugging Face Token** (nicht committen): | |
| ```powershell | |
| # Windows (Session) | |
| $env:HF_TOKEN="hf_xxx_dein_token" | |
| # Optional dauerhaft: | |
| setx HF_TOKEN "hf_xxx_dein_token" | |
| ``` | |
| Optionale App-Settings: | |
| ```bash | |
| cp settings.json.example settings.json | |
| ``` | |
| --- | |
| ## 🖥️ Nutzung | |
| ```bash | |
| streamlit run app.py | |
| ``` | |
| * 📤 Video hochladen → **Analyse startet automatisch** (keine Freitext-Prompts). | |
| * 🧯 Ergebnis als **Meldung** mit Icon: | |
| * ✅ NONE / 🟢 LOW / 🟠 MEDIUM / ⚠️ HIGH / 🚨 CRITICAL | |
| * 🔗 Button „Details im neuen Fenster“ öffnet die Ergebnisansicht in **neuem Tab**. | |
| --- | |
| ## 🧠 Was ist eine Ontologie? | |
| Eine **Ontologie** beschreibt die Domäne formal (Klassen/Beziehungen/Eigenschaften), z. B.: | |
| * **Klassen:** `Person`, `Gleis`, `Bahnsteig`, `Zug`, `Gefahr`, `Sensor`, `Videoüberwachung`, `Alarmsystem`, `Maßnahme`, `Ereignis`, `Objekt` | |
| * **Objekt-Properties:** `befindetSichIn`, `erkennt`, `stehtAuf`, `beobachtet`, `überwacht`, `löstAus`, `führtZu`, `meldet` | |
| * **Daten-Properties:** `hatKonfidenz (xsd:float)`, `hatZeitstempel (xsd:dateTime)`, `hatPosition (xsd:string)`, `hatBeschreibung (xsd:string)` | |
| So wird aus ML-Signalen **bedeutungsvolle** Logik: | |
| „Person im Gleis“ ⇒ **Gefahr** ⇒ **Alarm** ⇒ **Maßnahme**. | |
| > 🔎 Mehr Details inkl. Regeln (R1–R6) und Turtle-Beispielen: | |
| > **[docs/ONTOLOGIE.md](docs/ONTOLOGIE.md)** | |
| --- | |
| ## 🧪 Tests & Tripel-Export | |
| Schneller Test der Bewertung & Tripel: | |
| ```bash | |
| python test_ontology_triples.py | |
| ``` | |
| Ausgabe: Severity/Score/Labels/Erklärungen + Turtle-Tripel. | |
| --- | |
| ## 🛡️ Sicherheit (Secrets) | |
| * **Keine** Tokens/Passwörter in Code/Repo einchecken. | |
| * `.env` ist ignoriert (`.gitignore`). | |
| * Bei Leak: **Token sofort revoken/rotieren** (HF-Settings). | |
| --- | |
| ## 🧰 Troubleshooting | |
| * ❗ **Kein HF\_TOKEN gefunden** → Token setzen (s. o.). | |
| * 🧩 **FFmpeg fehlt** → installieren und zum `PATH` hinzufügen (für robuste Video-Extraktion). | |
| * 🔁 **Zeilenende-Warnungen (CRLF/LF)** → harmlos; ggf. `git config --global core.autocrlf true`. | |
| --- | |
| ## 📄 Lizenz | |
| tbd (z. B. MIT) | |
| ```` | |
| --- | |
| ### `docs/ONTOLOGIE.md` | |
| ```markdown | |
| # 📘 Ontologie & Regeln – Deep Dive | |
| Diese Seite beschreibt die Ontologie, das Regelwerk und die erzeugten Tripel. | |
| ## 🧠 Ontologie (Auszug) | |
| **Klassen:** `Person`, `Gleis`, `Bahnsteig`, `Zug`, `Gefahr`, `Sensor`, `Videoüberwachung`, `Alarmsystem`, `Maßnahme`, `Ereignis`, `Objekt` | |
| **Objekt-Properties:** `befindetSichIn`, `erkennt`, `überwacht`, `beobachtet`, `stehtAuf`, `löstAus`, `führtZu`, `meldet` | |
| **Daten-Properties:** `hatKonfidenz (xsd:float)`, `hatZeitstempel (xsd:dateTime)`, `hatPosition (xsd:string)`, `hatBeschreibung (xsd:string)` | |
| ## ⚖️ Bewertungslogik (R1–R6) | |
| - **R1 – Person im Gleis** → `CRITICAL` | |
| `on_track_person ≥ Schwelle` ⇒ Tripel: `ex:person ex:befindetSichIn ex:gleis` | |
| - **R2 – Nahe Kante + Zug** → `HIGH` | |
| `distance_to_edge ≤ 0.5m` ∧ `train_approaching ≥ Schwelle` | |
| - **R3 – Gestürzte Person nahe Kante/auf Gleis** → `HIGH/CRITICAL` | |
| - **R4 – Objekt im Gleis** → `MEDIUM` | |
| - **R5 – Rauch/Feuer** → `HIGH` | |
| - **R6 – Menschenmenge im Gleisbereich** → `CRITICAL` | |
| **Recall-Bias:** Standard-Schwelle `0.35` (Sicherheitsdomäne → lieber einmal zu viel melden). | |
| ## 🧾 Tripel-Export (Turtle-ähnlich) | |
| Beispielauszug: | |
| ```turtle | |
| ex:person42 rdf:type ex:Person . | |
| ex:gleis_3 rdf:type ex:Gleis . | |
| ex:person42 ex:befindetSichIn ex:gleis_3 . | |
| ex:gef1 rdf:type ex:Gefahr . | |
| ex:gef1 ex:löstAus ex:alarm_4711 . | |
| ex:alarm_4711 ex:führtZu ex:massnahme_stop . | |
| ex:event_utc ex:hatZeitstempel "2025-09-06T14:32:10Z"^^xsd:dateTime . | |
| ```` | |
| ## 🔌 Integration | |
| Im Code (Beispiel): | |
| ```python | |
| from ontology_eval import Observation, evaluate, OntologyContext, decision_to_triples, triples_to_turtle | |
| obs = Observation(on_track_person=0.88, distance_to_edge_m=0.3, train_approaching=0.9) | |
| dec = evaluate(obs) | |
| ctx = OntologyContext(person_id="person42", track_id="gleis_3", platform_id="bahnsteig_3") | |
| print(triples_to_turtle(decision_to_triples(dec, obs, ctx))) | |
| ``` | |
| ## 🧩 Erweiterung | |
| * Neue Klassen/Properties ergänzen (z. B. `Kinderwagen`, `Warnweste`) | |
| * Weitere Regeln (z. B. „Sperrbereich aktiv“ ⇒ höhere Schwere) | |
| * Export als **TTL/JSON-LD/CSV** für Downstream-Systeme | |
| test |