Files
OnlyFrames/docs/superpowers/specs/2026-04-07-foto-kurator-design.md
Ferdinand 3d22b41bf2 feat: duplicate detection via perceptual hashing
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07 13:23:01 +02:00

5.4 KiB
Raw Blame History

Foto-Kurator — Design Spec

Datum: 2026-04-07
Status: Genehmigt

Überblick

Eine lokale Webanwendung, die den manuellen Foto-Culling-Prozess automatisiert. Das Tool analysiert einen Ordner voller Fotos und sortiert unbrauchbare Bilder (unscharf, über-/unterbelichtet, Duplikate) automatisch in einen Unterordner _aussortiert/ aus.

Architektur

┌─────────────────────────────────┐
│        Browser (Frontend)       │
│  HTML/CSS/JS — Single Page App  │
│  - Ordner auswählen             │
│  - Einstellungen / Toggles      │
│  - Fortschrittsanzeige          │
│  - Review-Ansicht               │
└────────────┬────────────────────┘
             │ HTTP (localhost)
┌────────────▼────────────────────┐
│     Python FastAPI Backend      │
│  - /analyze  → Fotos analysieren│
│  - /move     → Dateien verschieben│
│  - Pillow + OpenCV              │
│  - optional: Claude Vision API  │
└─────────────────────────────────┘
             │ Dateisystem
┌────────────▼────────────────────┐
│  Lokaler Ordner (z.B. /Fotos/)  │
│  ├── foto001.jpg                │
│  ├── foto002.jpg                │
│  └── _aussortiert/              │
│       └── foto003.jpg           │
└─────────────────────────────────┘

Stack

  • Backend: Python 3.10+, FastAPI, Pillow, OpenCV, imagehash, anthropic SDK (optional)
  • Frontend: Vanilla HTML/CSS/JS (eine einzelne index.html)
  • Start: python server.py → öffnet automatisch den Browser

Projektstruktur

foto-kurator/
├── server.py          # FastAPI Backend + Startup
├── analyzer.py        # Bildanalyse-Logik (lokal + KI)
├── index.html         # Frontend (Single Page App)
├── requirements.txt
└── .env               # ANTHROPIC_API_KEY (optional)

Analysekriterien

Lokale Analyse (immer verfügbar)

Kriterium Methode Standardschwellenwert
Unschärfe Laplacian Variance (OpenCV) < 100
Überbelichtung Durchschnittliche Helligkeit > Schwellenwert (Pillow) > 240
Unterbelichtung Durchschnittliche Helligkeit < Schwellenwert (Pillow) < 30
Duplikate Perceptual Hash (pHash, imagehash) Hamming-Distanz ≤ 8

Alle Schwellenwerte sind in der UI per Schieberegler einstellbar.

KI-Analyse (optional, Toggle)

Sendet Fotos batchartig an die Claude Vision API mit einem Qualitäts-Bewertungsprompt. Erkennt auch subtilere Probleme (schlechter Bildaufbau, störende Elemente, etc.).

  • Kosten: ca. 0,0020,005 € pro Foto
  • Anforderung: Internetverbindung + ANTHROPIC_API_KEY in .env
  • Fallback: Bei API-Fehler wird automatisch auf lokale Analyse zurückgefallen

UI & Workflow

Startseite

  • Ordner-Auswahl: Texteingabe für den lokalen Pfad (z.B. /Fotos/Shooting-2026-04) + Button zum Bestätigen. Optional: nativer Ordner-Dialog via tkinter im Backend, der den Pfad zurückgibt.
  • Toggle: Überprüfung vor dem Verschieben (an/aus)
  • Toggle: KI-Analyse (an/aus) + Hinweis zu Kosten & Internetanforderung
  • Schieberegler für alle Schwellenwerte
  • Button: "Analyse starten"

Während der Analyse

  • Fortschrittsbalken mit aktuellem Dateinamen
  • Abbruch-Button

Review-Ansicht (wenn Toggle aktiv)

  • Liste aller vorgeschlagenen Ausschüsse
  • Pro Foto: Vorschaubild + Begründung (z.B. "unterbelichtet", "Duplikat von foto002.jpg")
  • Jedes Foto einzeln bestätigen oder von der Liste entfernen
  • Button: "Alle bestätigen & verschieben"

Ohne Review (Toggle deaktiviert)

  • Direktes Verschieben nach Analyse
  • Kurze Zusammenfassung: "23 Fotos aussortiert"

Ergebnisseite

  • Anzahl analysierter Fotos
  • Anzahl aussortierter Fotos, aufgeteilt nach Grund
  • Hinweis auf _aussortiert/-Unterordner

Datenfluss

  1. Frontend schickt Ordnerpfad an POST /analyze
  2. Backend iteriert über alle .jpg/.jpeg/.png im Ordner
  3. Pro Foto: Unschärfe + Belichtung berechnen, pHash für Duplikatvergleich
  4. Optional: Fotos batchartig an Claude Vision API senden
  5. Antwort: JSON-Liste [{ path, reasons: ["unscharf", ...] }]
  6. Frontend zeigt Review-Ansicht oder schickt direkt POST /move
  7. Backend verschiebt Dateien in _aussortiert/

Fehlerbehandlung

  • Korrupte oder nicht lesbare Dateien werden übersprungen und in einem Log festgehalten
  • API-Fehler (Claude Vision) fallen automatisch auf lokale Analyse zurück
  • Kein Foto wird ohne expliziten /move-Aufruf verschoben — die Analyse ist immer nicht-destruktiv

Unterstützte Formate

  • Primär: .jpg, .jpeg, .png
  • Selten: RAW-Formate (.CR2, .NEF, .ARW) — in Phase 1 nicht unterstützt, für spätere Version vorgesehen

Setup

pip install -r requirements.txt
python server.py
# Browser öffnet automatisch http://localhost:8000

Erweiterbarkeit

Die Architektur ist so ausgelegt, dass das Tool später als echter Webserver mit mehreren Nutzern betrieben werden kann. Der einzige erforderliche Schritt ist die Umstellung der Ordnerpfad-Logik auf nutzerspezifische Upload-Verzeichnisse.