1. Initialisierung und Konfiguration

  • Imports und Abhängigkeiten laden: Das Skript importiert Module wie Flask, pandas, threading, queue und eine Utility-Datei (ai_rating_utils.py), die gemeinsame Funktionen enthält.
  • Konfiguration setzen: Eine globale CONFIG-Variable wird mit Standardwerten (z. B. Bildgröße 896×896, Temperatur 0.1) initialisiert und kann durch Argumente oder Web-Eingaben überschrieben werden.
  • Globale Variablen initialisieren: Queues für Logging, Progress-Tracking, Threads für parallele Verarbeitung und Sperren für Thread-Sicherheit werden eingerichtet.
  • Prompts laden: System- und User-Prompts werden aus Dateien oder Standardwerten geladen.

2. Modus-Auswahl und Start

  • Argumente parsen: Über die Kommandozeile (argparse) werden Optionen wie Ordnerpfad, Host/Port, API-URL, Modell-Tag, Unterordner-Einbeziehung, Skip-Optionen und Ausgabeformate (CSV/XMP) eingelesen.
  • Entscheidung Konsolen- vs. Web-Modus:
    • Konsolenmodus: Wenn ein folder_path angegeben ist, wird direkt die process_images-Funktion aufgerufen.
    • Web-Modus: Wenn kein folder_path angegeben ist, startet die Flask-App auf dem angegebenen Host/Port (Standard: 127.0.0.1:5000). Die App wartet auf Web-Anfragen.
  • Validierung: Im Konsolenmodus wird geprüft, ob der Ordnerpfad gültig ist und mindestens ein Ausgabeformat (CSV oder XMP) gewählt wurde.

3. Hauptverarbeitung (process_images-Funktion)

Dies ist der zentrale Ablauf für die Bildbewertung. Die Funktion läuft in einem separaten Thread (im Web-Modus) und verarbeitet Bilder schrittweise.

  • Vorbereitung:
    • Überprüfung auf darktable-cli: Falls nicht gefunden, wird der Prozess abgebrochen (fataler Fehler).
    • Logging starten: Statusmeldungen werden über eine log_func (Konsole oder Web-Queue) ausgegeben.
    • CSV-Vorbereitung: Wenn CSV-Ausgabe aktiviert, wird der Dateiname generiert (z. B. ai_rating_results_{model_tag}.csv). Bestehende CSV-Dateien werden gelesen, um bereits verarbeitete Bilder zu überspringen (falls skip_existing=True).
    • Bilder sammeln: Der Ordner wird durchsucht (mit oder ohne Unterordner). Unterstützte Formate (z. B. JPG, PNG) werden gefiltert. Bilder werden nur hinzugefügt, wenn sie noch nicht verarbeitet wurden (basierend auf XMP/CSV-Existenz).
  • Hauptverarbeitungsschleife (für jedes Bild):
    • Progress-Update: Im Web-Modus wird der Fortschritt aktualisiert (z. B. „Verarbeite Bild X von Y“).
    • Bildkonvertierung: Das Bild wird mit darktable-cli zu einem JPEG konvertiert (Größe: 896×896, Qualität aus CONFIG). Falls fehlgeschlagen, wird übersprungen.
    • KI-API-Aufruf: Das konvertierte JPEG wird als Base64-Data-URL an die KI-API (z. B. LM Studio) gesendet. Die Antwort enthält Bewertungen, Keywords und Metadaten (Tokens, Dauer).
    • Antwort parsen: Die KI-Antwort wird in ein Dictionary (Ratings pro Kriterium), Keywords und Gesamtrating zerlegt.
    • Logging und Anzeige: Detaillierte Logs werden erstellt (z. B. „Gesamt-Rating: X“, Kriterien-Liste, Keywords). Im Web-Modus werden diese als JSON an die Queue gesendet; in der Konsole direkt ausgegeben.
    • Ergebnis-Dictionary erstellen: Ein Dictionary mit allen Daten (Pfad, Rating, Keywords, Timestamp, Modell-Tag, API-Metriken, Prompts) wird zusammengestellt.
    • Speichern:
      • XMP: Falls aktiviert, wird eine XMP-Sidecar-Datei neben dem Originalbild geschrieben.
      • CSV: Falls aktiviert und das Bild neu ist, wird das Ergebnis zur Liste hinzugefügt (nicht sofort geschrieben, um Performance zu sparen).
  • Nachbearbeitung:
    • CSV-Schreiben: Nach der Schleife wird die CSV-Datei geschrieben oder aktualisiert (mit pandas). Bestehende Daten werden beibehalten und neue angehängt.
    • Abschluss: Status auf „Abgeschlossen“ setzen, Thread beenden. Im Web-Modus wird „###END_OF_PROCESS###“ gesendet.

4. Web-Modus (Flask-App)

  • Routen und Funktionen:
    • /: Zeigt das HTML-Template (aus template.html).
    • /start_processing (POST): Startet die Verarbeitung mit übergebenen Parametern (Ordner, Optionen). Validiert Eingaben und startet einen Thread für process_images.
    • /stop_processing (POST): Stoppt die laufende Verarbeitung.
    • /status: Gibt aktuellen Progress und CSV-Status zurück.
    • /log: Holt neue Log-Nachrichten aus der Queue.
    • /get_prompts / /save_prompts: Lädt/speichert Prompts aus/in Dateien.
    • /download_last_csv: Lädt die letzte generierte CSV herunter.
    • /image_proxy: Proxy für Bildanzeige (z. B. konvertierte JPEGs).
  • Threading: Verarbeitung läuft in einem Daemon-Thread, um die Web-App nicht zu blockieren. Sperren verhindern Race-Conditions.

5. Fehlerbehandlung und Abschluss

  • Ausnahmen: Fehler (z. B. API-Fehler, Datei-Leseprobleme) werden geloggt und führen zum Überspringen des Bildes oder Abbruch.
  • Ressourcen: Threads und Queues werden sauber beendet.
  • Ausgabe: Im Konsolenmodus endet das Skript mit einer Bestätigung; im Web-Modus läuft die App weiter.