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_pathangegeben ist, wird direkt dieprocess_images-Funktion aufgerufen. - Web-Modus: Wenn kein
folder_pathangegeben ist, startet die Flask-App auf dem angegebenen Host/Port (Standard: 127.0.0.1:5000). Die App wartet auf Web-Anfragen.
- Konsolenmodus: Wenn ein
- 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 (fallsskip_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).
- Überprüfung auf
- 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-clizu 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 (austemplate.html)./start_processing(POST): Startet die Verarbeitung mit übergebenen Parametern (Ordner, Optionen). Validiert Eingaben und startet einen Thread fürprocess_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.