Architektur auf einen Blick

ArchivBlick besteht aus mehreren Schichten, die unabhängig voneinander arbeiten. Jede Schicht kann einzeln ausgetauscht werden — das macht das System zukunftssicher.

iCloud

69.000 Fotos

SharePoint

133.000 Dateien

Ugreen NAS

GoPro-Videos, Staging

Insta360

360°-Aufnahmen

↓ Import & Synchronisation ↓
Frame-Extraktion

FFmpeg, 3 Größen

Filmstrip-Generator

Grid-Bilder aus Frames

Thumbnail-Pipeline

sm / md / lg (96–800px)

↓ Verarbeitung ↓
Vision-KI

Qwen / LLaVA / Gemini

Embedding-KI

BGE-M3 (Text) + SigLIP2 (Bild)

GPS-Extraktion

exiftool, GPX-Tracks

↓ Speicherung ↓
PostgreSQL

224k Assets + pgvector

Qdrant

224k Text + 142k Bild-Vektoren

SQLite

Filmstrip-DBs, Index

↓ Zugriff ↓
Web-UI (8877)

FastAPI + Vue.js

Backend-API (8878)

FastAPI + PostgreSQL

Bildsuche (8501)

Streamlit + SigLIP2

iPad-App

SwiftUI (geplant)

Datenquellen — woher die Medien kommen

ArchivBlick vereint Medien aus vier völlig verschiedenen Welten. Jede Quelle hat eigene Formate, eigene APIs und eigene Herausforderungen.

iCloud-Fotomediathek

Persönliche Fotos und Videos, synchronisiert über Apple-Geräte.

Dateien~69.000
Thumbnails800px, generiert auf Ugreen
Zugrifficloud_scan_thumbgen.py
StatusIndexiert

SharePoint / OneDrive

Firmenarchiv mit Fotos, Dokumenten und Scans aus über 20 Jahren.

Dateien~133.000
Thumbnailssm/md/lg (96–800px)
ZugriffSearch API (EMEA)
Besonderheit368k Items → Threshold

Ugreen NAS (DXP6800 Pro)

Lokaler Speicher für GoPro-Rohdaten, Staging und Frame-Extraktion.

GoPro-Videos538
KapazitätMehrere TB
CPUIntel i5-1235U
ZugriffTailscale SSH

Insta360 X3 / X4

360°-Aufnahmen mit Dual-Fisheye und Equirectangular-Projektion.

FilmstripsIn Aufbau
FormateDual-Fisheye, Equirectangular
AnalyseQwen2.5-VL 7B/32B
StatusPrompt optimiert

Pipelines — vom Rohvideo zur Beschreibung

Drei Pipelines arbeiten zusammen, um aus Rohmaterial durchsuchbare Inhalte zu machen.

Pipeline A: Frame-Extraktion

Schritt 1
Video erkennen

GoPro-Kapitel zusammenführen (GH010716 + GH020716)

Schritt 2
Frames extrahieren

FFmpeg zerlegt in Einzelbilder, 3 Größen

Schritt 3
GPS extrahieren

exiftool liest GPX-Tracks aus Metadaten

Schritt 4
Filmstrip erzeugen

Frames als Grid-Bild (4x4 oder 4xn)

Schritt 5
Galerie generieren

HTML mit Lightbox + SVG-Track-Karte

Performance

Auf der Ugreen NAS: ~17x Echtzeit ohne GPS, ~7–10x Echtzeit mit GPS-Extraktion (exiftool ist der Flaschenhals). 538 Videos in ~8 Stunden.

Pipeline B: KI-Beschreibung

Input
Filmstrip laden

Grid-Bild als Base64 (1–5 MB)

Prompt
Strukturierter Prompt

JSON-Schema, Anti-Hedging, Frame-für-Frame

Modell
Vision-LLM

Qwen 32B (GPU) oder 7B (lokal)

Output
JSON parsen

Szenen, Tags, Ort, Stimmung, Fahrzeug

Speichern
JSONL / SQLite

Resume-fähig, Batch-tauglich

Pipeline C: Embedding & Indexierung

Text
BGE-M3 Encoder

1024-dim Vektoren für alle Beschreibungen

Bild
SigLIP2 Encoder

1024-dim Vektoren für 142k Bilder

Index
Vektor-Datenbank

pgvector + Qdrant parallel

Volltext
BM25 Index

PostgreSQL tsvector für Keyword-Suche

Ranking
Hybrid RRF

Vektor + BM25 fusioniert

KI-Modelle — getestet und verglichen

Vier verschiedene Vision-Modelle wurden in realen Batch-Runs getestet. Jedes hat Stärken und Schwächen — die Wahl hängt von Qualität, Geschwindigkeit und Datenschutz ab.

Modell Größe Laufzeit Verarbeitete Medien Qualität Besonderheit
LLaVA 7B 7B Ollama lokal 131.283 Bilder Basis Erster Durchlauf, Bild-Tags
Gemma4:e4b ~4B Ollama lokal 1.090 Filmstrips Gut 28,5h Batch, ~1,6 Min/Video
Gemini 2.5 Flash Cloud OpenRouter API 10.374 Filmstrips Gut 1,4s/Frame, schnellstes Modell
Qwen2.5-VL 7B 7B Ollama lokal Insta360-Tests Gut 100% GPU auf Apple Silicon, 9 tok/s
Qwen2.5-VL 32B 32B AWQ vLLM (GPU-Server) 8.518 Filmstrips (läuft) Exzellent 16 Szenen/Strip, konkreteste Details

Prompt-Engineering

Der Prompt macht den Unterschied — nicht nur das Modell. Drei Iterationen waren nötig:

V1: FreitextVage Beschreibungen
V2: JSON-SchemaStrukturiert, aber Loops
V3: Anti-HedgingKonkret + stabil

Parameter-Tuning

A/B/C/D/E/F-Tests mit 5 identischen Filmstrips, systematisch verglichen:

temperature0.2 (niedrig = konsistent)
frequency_penalty0.15 (verhindert Loops)
repeat_penalty1.3 (für Ollama/7B)
max_tokens19.000 (32B) / 2.000 (7B)

RAG & Suche — zwei Systeme, ein Ziel

Zwei unabhängige Such-Systeme wurden aufgebaut und getestet. Beide nutzen den gleichen Text-Encoder, aber unterschiedliche Backends.

System A: pgvector (Hybrid)

Direkt in PostgreSQL integriert — kombiniert Vektor-Ähnlichkeit mit klassischer Volltextsuche.

Text-EncoderBGE-M3 (1024 dim)
Dokumente224.405
Vektor-SucheCosine Similarity
VolltextBM25 (tsvector)
RankingRRF (Reciprocal Rank Fusion)
VorteilKein Extra-Service nötig

System B: Qdrant (Multimodal)

Dedizierte Vektor-Datenbank mit Text- UND Bild-Embeddings — ermöglicht Suche per Bild.

Text-EncoderBGE-M3 (1024 dim)
Bild-EncoderSigLIP2 (1024 dim)
Text-Vektoren224.405
Bild-Vektoren142.256
RAM-Bedarf~9 GB
VorteilBildsuche möglich

So funktioniert die Suche

GH018526
Motorradtour durch Weinberglandschaft

Motorradfahrer mit gelber Warnweste auf Landstraße. Weinreben links und rechts, Abenddämmerung, warmes Licht. Moselregion.

98,2%
GH010716
Fahrradfahrt durch Stadtlandschaft bei Sonnenuntergang

Radfahrer auf breitem Gehweg, Kreisverkehr, moderne Gebäude. Sonne steht tief, Abenddämmerung.

74,1%
IMG_4291
Weinberg-Panorama

Weitwinkelaufnahme über Weinberge. Hügelige Landschaft, grüne Reben, blauer Himmel mit Wolken.

61,8%

Mac mini — das Rechenzentrum im Regal

Ein Mac mini mit Apple Silicon betreibt das gesamte ArchivBlick-System. Fünf Dienste laufen parallel und sind über Tailscale erreichbar.

:8877
ArchivBlick Web
FastAPI + Vue.js
151.636 Dateien, SQLite
LIVE
:8878
ArchivBlick Backend
FastAPI + PostgreSQL
224.405 Assets
LIVE
:6333
Qdrant
Vektor-Datenbank
224k Text + 142k Bild
LIVE
:8501
Bildsuche
Streamlit + SigLIP2
Semantische Suche
LIVE
:5433
PostgreSQL
Datenbank-Server
pgvector Extension
LIVE
:11434
Ollama
Lokale KI-Modelle
Qwen 7B, LLaVA, Gemma
MODELLE

Hardware

Mac mini mit Apple Silicon, 32 GB RAM, 926 GB SSD. Erreichbar über Tailscale (100.109.176.99). Alle Services laufen nativ — kein Docker, keine VMs. Ollama nutzt 100% GPU für KI-Inferenz.

Web-UI — drei Ansichtsmodi

Die Web-Oberfläche auf Port 8877 bietet verschiedene Wege, durch das Archiv zu navigieren.

Lightroom-Modus

Große Vorschau mit Filmstrip-Navigation am unteren Rand. Ideal zum Durchblättern einzelner Aufnahmen.

Klassisch-Modus

Grid-Ansicht mit Thumbnails. Effizient für schnelles Scannen großer Bestände.

Modern-Modus

Cluster-Foto-Panel mit Mini-Grid und Zoom-Slider. Gruppiert nach Ort, Zeit oder Kamera.

Vorhandene Features

Filter: Ort, Zeitraum, Kamera-Typ, Dateiformat, Bewertung
Karte: GPS-basierte Kartenansicht für GoPro-Aufnahmen mit Track-Overlay
Sammlungen: Manuelle Zusammenstellung von Favoriten
Suche: Volltextsuche über alle KI-Beschreibungen
Filmstrip360: Spezialisierte Ansicht für Insta360-Material

Datenbestand — die Zahlen

Eine Übersicht über alles, was ArchivBlick heute verwaltet, indexiert und durchsuchbar macht.

WasAnzahlSpeicherStatus
Assets insgesamt (PostgreSQL) 224.405 Indexiert
Dateien im Web-Viewer (SQLite) 151.636 Durchsuchbar
Text-Embeddings (BGE-M3) 224.405 2,2 GB Aktiv
Bild-Embeddings (SigLIP2) 142.256 ~9 GB RAM Aktiv
LLaVA-Beschreibungen 131.283 multimedia_index.db Abgeschlossen
Filmstrip-Beschreibungen (lokal) 13.653 2 SQLite-DBs Abgeschlossen
Filmstrip-Beschreibungen 32B (Trooper) ~300 / 8.518 JSONL Läuft (3,5%)
Thumbnails (sm/md/lg) ~200k+ ~16 GB 70% gemappt
GoPro-Videos 538 ~1,5 TB Frames extrahiert
GPS-Tracks (GPX) ~350 Extrahiert

Gesamtbild

1,6 TB Originaldaten → 224k Assets indexiert → 151k im Web-Viewer → 131k mit KI-Beschreibung → 142k mit Bild-Embedding → alles durchsuchbar. Die iPad-App wird das gesamte Archiv in 4,6 GB offline verfügbar machen (97% Kompression).