Machine Learning auf dem eigenen Foto-Server verstehen
Eine moderne Fotoverwaltung muss längst mehr können, als Bilder lediglich nach Datum in einer Zeitleiste anzuzeigen. Wer zehntausende Fotos besitzt, möchte nicht minutenlang durch Ordner navigieren, sondern beispielsweise nach „Hund im Schnee“, „Sonnenuntergang am Meer“ oder einer bestimmten Person suchen können.
Genau hier kommen die Machine-Learning-Funktionen von Immich ins Spiel.
Immich kann Bilder automatisch analysieren, Gesichter erkennen, Personen gruppieren und den Bildinhalt für die intelligente Suche erschließen. Besonders interessant für Self-Hosting-Anwender: Die Verarbeitung kann auf der eigenen Infrastruktur stattfinden.
In diesem sechsten Teil unserer Immich-Serie schauen wir uns an, wie die KI-Funktionen arbeiten, welche Modelle verwendet werden und wann sich eine GPU-Beschleunigung lohnt.
Was bedeutet Machine Learning bei Immich?
Immich verwendet einen eigenen Machine-Learning-Dienst.
Bei einer typischen Docker-Installation läuft dieser als separater Container:
immich-machine-learning
Der Dienst übernimmt rechenintensive Analyseaufgaben und ist bewusst vom eigentlichen Immich-Server getrennt.
Zu den Machine-Learning-Funktionen gehören insbesondere:
- Gesichtserkennung
- Face Detection
- Smart Search
- semantische Bildanalyse
- Erzeugung von Vektorrepräsentationen für die Suche
Die Verarbeitung findet im Hintergrund statt. Neue Bilder können deshalb bereits in der Bibliothek erscheinen, während die KI-Analyse noch läuft.
Ein Foto durchläuft mehrere Verarbeitungsschritte
Nach dem Import eines neuen Bildes passiert vereinfacht Folgendes:
Neues Foto
↓
Metadaten extrahieren
↓
Vorschaubild erzeugen
↓
Machine Learning
├── Gesicht erkennen
└── Bildinhalt analysieren
↓
Ergebnisse speichern
↓
Suche und Personengruppierung
Immich verwendet hierfür Hintergrundjobs. Einige Aufgaben bauen aufeinander auf. Smart Search und Gesichtserkennung sind beispielsweise von zuvor erzeugten Vorschaubildern abhängig.
Bei einem großen Erstimport können deshalb tausende oder sogar hunderttausende Jobs in den Warteschlangen landen.
Das ist normal.
Gesichtserkennung
Eine der auffälligsten KI-Funktionen ist die Gesichtserkennung.
Dabei sind eigentlich zwei Schritte zu unterscheiden:
Face Detection
Zunächst muss Immich feststellen, ob und wo sich auf einem Foto Gesichter befinden.
Facial Recognition
Anschließend wird analysiert, welche erkannten Gesichter vermutlich dieselbe Person darstellen.
Immich sendet für die Gesichtserkennung ein erzeugtes Vorschaubild an den Machine-Learning-Service. Dort werden die relevanten Bildbereiche analysiert und mathematische Repräsentationen der Gesichter erzeugt.
Diese sogenannten Embeddings ermöglichen anschließend den Vergleich verschiedener Gesichter.
Automatische Personenzuordnung
Hat Immich ausreichend Bilder analysiert, beginnt die automatische Gruppierung.
Taucht beispielsweise dieselbe Person auf 300 Fotos auf, versucht Immich diese Aufnahmen einer gemeinsamen Personengruppe zuzuordnen.
Der Anwender kann anschließend einen Namen vergeben.
Aus:
Unbekannte Person
wird beispielsweise:
Max Mustermann
Danach lässt sich gezielt nach dieser Person suchen.
Immich verwendet für die Gruppierung ein Verfahren, das von DBSCAN abgeleitet ist. Dabei werden ähnliche Gesichtsmerkmale miteinander verglichen und zu Gruppen zusammengefasst.
Personengruppen nachbearbeiten
Keine Gesichtserkennung arbeitet vollkommen fehlerfrei.
Besonders schwierig können beispielsweise sein:
- Zwillinge
- Geschwister
- sehr alte Fotos
- unscharfe Bilder
- Personen im Hintergrund
- stark unterschiedliche Altersstufen
- Sonnenbrillen
- seitliche Gesichter
- schlechte Beleuchtung
Immich stellt deshalb verschiedene Werkzeuge zur manuellen Nachbearbeitung bereit.
Personen können unter anderem:
- benannt
- zusammengeführt
- ausgeblendet
- favorisiert
werden.
Außerdem kann ein repräsentatives Foto für eine Person ausgewählt werden.
Warum die automatische Gruppierung Zeit benötigt
Nach dem Import einer großen Sammlung sollte man der Gesichtserkennung Zeit geben.
Die Gruppierung profitiert davon, wenn bereits viele Gesichter erkannt wurden. Werden Bilder nur nach und nach importiert und schneller analysiert als neue Dateien hinzukommen, kann die ursprüngliche Gruppierung weniger optimal ausfallen.
Immich führt deshalb auch regelmäßig weitere Zuordnungsarbeiten im Hintergrund durch.
Bei einem sehr großen Erstimport ist es daher sinnvoll, nicht bereits nach wenigen Minuten sämtliche erkannten Personen manuell korrigieren zu wollen.
Smart Search
Mindestens ebenso beeindruckend ist die intelligente Suche.
Bei einer klassischen Fotoverwaltung basiert eine Suche häufig auf:
- Dateinamen
- Ordnernamen
- Schlagwörtern
- EXIF-Daten
- manuellen Beschreibungen
Immich geht einen Schritt weiter.
Mit der Smart Search kann nach dem tatsächlichen Inhalt eines Bildes gesucht werden.
Beispiele:
Hund im Garten Auto im Schnee Sonnenuntergang am Meer Berge und See Fahrrad im Wald
Die entsprechenden Begriffe müssen nicht vorher als Schlagwörter eingetragen worden sein.
Wie funktioniert Smart Search?
Immich verwendet für die kontextbezogene Suche Machine-Learning-Modelle aus der CLIP-Familie beziehungsweise kompatible Modelle.
Dabei wird vereinfacht sowohl Text als auch Bildinhalt in mathematische Vektoren übersetzt.
Aus einem Foto wird also eine Art mathematische Beschreibung seines Inhalts.
Bei einer Suchanfrage geschieht etwas Ähnliches mit dem eingegebenen Text.
Vereinfacht:
Foto ↓ ML-Modell ↓ Bild-Vektor
und:
"Golden Retriever am Strand"
↓
ML-Modell
↓
Text-Vektor
Immich kann anschließend nach mathematisch ähnlichen Vektoren suchen.
Dadurch muss auf dem Bild nirgendwo tatsächlich „Golden Retriever“ oder „Strand“ als Text hinterlegt sein.
Die Suche basiert auf dem erkannten Kontext des Bildes.
PostgreSQL spielt auch bei der KI eine Rolle
Die intelligente Suche ist eng mit PostgreSQL verbunden.
Immich verwendet PostgreSQL nicht nur für klassische Metadaten, sondern auch als Suchdatenbank für die kontextbezogene Suche.
Für die Vektorsuche kommt aktuell die PostgreSQL-Erweiterung VectorChord zum Einsatz.
Dadurch können große Mengen von Vektordaten effizient durchsucht werden.
Das Zusammenspiel sieht vereinfacht so aus:
Bild ↓ Machine Learning ↓ Embedding / Vektor ↓ PostgreSQL + VectorChord ↓ Smart Search
Smart Search mit Filtern kombinieren
Die Suche ist nicht auf reine Bildinhalte beschränkt.
Immich kann Suchkriterien kombinieren.
Je nach vorhandenen Daten kann beispielsweise nach folgenden Eigenschaften gesucht werden:
- Personen
- Bildinhalt
- Dateiname
- Dateiendung
- Pfad oder Ordner
- Beschreibung
- Text in Bildern per OCR
- Orten
- Tags
- Kamera
- Objektiv
- Zeitraum
- Medientyp
- Favoriten
- Archivstatus
- Album
Damit lassen sich ausgesprochen präzise Abfragen erstellen.
Ein großes Fotoarchiv wird dadurch erheblich leichter beherrschbar.
Objekterkennung – etwas genauer betrachtet
Bei der Beschreibung von Immich wird häufig von „Objekterkennung“ gesprochen. Technisch sollte man dabei allerdings unterscheiden.
Smart Search arbeitet nicht einfach mit einer starren Liste wie:
Hund = erkannt Auto = erkannt Baum = erkannt
Stattdessen wird der visuelle Inhalt eines Bildes in einen semantischen Vektorraum übertragen.
Das ermöglicht wesentlich flexiblere Suchanfragen.
Dadurch kann Immich nicht nur konkrete Gegenstände berücksichtigen, sondern auch Szenen und Zusammenhänge.
Beispielsweise:
Menschen beim Essen
oder:
Winterlandschaft mit Bergen
Das macht Smart Search wesentlich leistungsfähiger als eine klassische Verschlagwortung.
Orte erkennen
Auch die geografische Suche ist ausgesprochen praktisch.
Besitzt ein Foto GPS-Koordinaten, kann Immich diese während der EXIF-Verarbeitung auslesen.
Aus:
51.123456 7.123456
können anschließend geografische Angaben wie:
Stadt Bundesland/Region Land
ermittelt werden.
Immich verwendet hierfür lokales Reverse Geocoding auf Basis geografischer Daten von GeoNames.
Das ist für Self-Hosting besonders interessant, da die Abfragen auf dem eigenen Server durchgeführt werden können.
Orte sind keine klassische Bilderkennung
Dabei ist eine wichtige Unterscheidung notwendig.
Wenn Immich den Aufnahmeort eines Fotos bestimmt, erkennt die KI nicht zwangsläufig anhand des Bildes, dass beispielsweise der Kölner Dom zu sehen ist.
Stattdessen werden vorhandene GPS-Koordinaten ausgewertet und über Reverse Geocoding geografischen Namen zugeordnet.
Das Ergebnis kann anschließend wiederum in der Suche verwendet werden.
Machine-Learning-Modelle
Für Smart Search und Gesichtserkennung benötigt Immich entsprechende Modelle.
Diese befinden sich nicht zwangsläufig bereits vollständig im Container.
Der Machine-Learning-Service prüft bei einer Anfrage, ob das benötigte Modell vorhanden ist. Fehlt es, wird es heruntergeladen.
Die Modelle werden anschließend zwischengespeichert.
Dadurch muss ein Modell nicht bei jeder Bildanalyse erneut heruntergeladen werden.
Der Model-Cache
In einer Docker-Installation besitzt der Machine-Learning-Service deshalb einen persistenten Cache.
Vereinfacht:
immich-machine-learning
│
▼
Model Cache
│
┌─────┴─────┐
│ │
Smart Search Face Recognition
Gerade größere Modelle benötigen sowohl Speicherplatz als auch Arbeitsspeicher.
Das sollte bei der Dimensionierung des Servers berücksichtigt werden.
Modelle wechseln
Administratoren können verschiedene Machine-Learning-Einstellungen über die Immich-Administration konfigurieren.
Dazu gehört beispielsweise das Modell für Smart Search.
Andere Modelle können unter Umständen bessere Suchergebnisse liefern, benötigen dafür aber möglicherweise:
- mehr RAM
- mehr Rechenleistung
- längere Verarbeitungszeit
- mehr GPU-Speicher
Die größte Modellvariante ist daher nicht automatisch die beste Wahl für jeden Server.
CPU oder GPU?
Grundsätzlich benötigt Immich keine dedizierte Grafikkarte.
Machine Learning funktioniert auch auf einer CPU.
Für kleinere Bibliotheken ist das häufig vollkommen ausreichend.
Ein typischer Homeserver mit moderner Mehrkern-CPU kann deshalb problemlos für Immich verwendet werden.
Der Unterschied macht sich vor allem bei großen Erstimporten bemerkbar.
Müssen beispielsweise 150.000 Fotos analysiert werden, summiert sich jede zusätzliche Sekunde Rechenzeit.
CPU-Verarbeitung
Die CPU-Variante besitzt einige Vorteile:
- keine zusätzliche Grafikkarte notwendig
- einfachere Installation
- geringerer Konfigurationsaufwand
- universelle Kompatibilität
Für einen kleinen privaten Server mit beispielsweise 10.000 oder 20.000 Fotos kann das völlig ausreichend sein.
Während einer großen Erstverarbeitung kann die CPU-Auslastung allerdings erheblich steigen.
GPU-Beschleunigung
Immich unterstützt Hardwarebeschleunigung für Machine-Learning-Aufgaben.
Nach aktuellem Stand gehören zu den unterstützten Backends unter anderem:
- CUDA für NVIDIA
- ROCm für AMD
- OpenVINO für Intel
- ARM NN für geeignete Mali-GPUs
- RKNN für unterstützte Rockchip-Systeme
Damit können unter anderem Smart Search und Face Detection beschleunigt und gleichzeitig die CPU entlastet werden.
Die Hardwarebeschleunigung wird von Immich derzeit allerdings weiterhin als experimentelle Funktion geführt.
NVIDIA und CUDA
Eine NVIDIA-Grafikkarte kann über CUDA für Machine Learning eingesetzt werden.
Dafür werden unter Linux unter anderem benötigt:
- kompatible NVIDIA-GPU
- NVIDIA-Treiber
- NVIDIA Container Toolkit
- entsprechend konfigurierte Immich-Container
Aktuell verlangt Immich für CUDA eine GPU mit mindestens Compute Capability 5.2 sowie einen ausreichend aktuellen NVIDIA-Treiber.
Besonders bei sehr großen Bibliotheken kann CUDA die Erstverarbeitung erheblich beschleunigen.
Intel-Grafik mit OpenVINO
Nicht jeder Server benötigt eine große dedizierte Grafikkarte.
Auch bestimmte Intel-GPUs können über OpenVINO für Machine Learning verwendet werden.
Das macht beispielsweise Mini-PCs mit modernen Intel-Prozessoren interessant.
Ein sparsamer Homeserver kann damit gleichzeitig:
- Immich hosten
- Fotos speichern
- Videos bereitstellen
- Machine Learning beschleunigen
ohne eine stromhungrige dedizierte Grafikkarte zu benötigen.
Zu beachten ist allerdings, dass OpenVINO mehr RAM als reine CPU-Verarbeitung beanspruchen kann und insbesondere integrierte GPUs je nach Hardware und Kernel Probleme verursachen können.
AMD mit ROCm
Auch AMD-GPUs können grundsätzlich eingesetzt werden.
Hierfür steht ROCm als Backend zur Verfügung.
Allerdings sollte vorher unbedingt geprüft werden, ob die eingesetzte GPU von der jeweiligen ROCm-Version unterstützt wird.
Zudem ist das entsprechende Immich-Image vergleichsweise groß. Die aktuelle Dokumentation weist für das ROCm-Image auf einen Bedarf von mindestens rund 35 GiB freiem Speicher hin.
GPU-Beschleunigung ist nicht zwingend erforderlich
Ein häufiger Irrtum lautet:
Immich braucht eine GPU.
Das stimmt nicht.
Eine GPU ist eine Beschleunigung, keine grundsätzliche Voraussetzung.
Für viele private Installationen genügt die CPU vollkommen.
Besonders sinnvoll wird GPU-Unterstützung bei:
- sehr großen Bibliotheken
- häufigen Massenuploads
- vielen Benutzern
- leistungsfähigen Homeservern
- professionellen Fotoarchiven
Wer dagegen einmal 20.000 Bilder importiert und anschließend täglich nur einige neue Smartphone-Fotos hochlädt, muss nicht zwangsläufig zusätzliche Hardware kaufen.
Remote Machine Learning
Eine besonders interessante Möglichkeit besteht darin, Machine Learning auf einen anderen Computer auszulagern.
Der eigentliche Immich-Server könnte beispielsweise ein sparsamer Mini-PC sein.
Im Netzwerk steht aber zusätzlich ein leistungsfähiger Rechner mit GPU.
Dann lässt sich der Machine-Learning-Container auf diesem leistungsfähigeren System betreiben.
Vereinfacht:
Immich Server
Mini-PC
│
│ Netzwerk
▼
Machine-Learning-Server
leistungsfähige GPU
Der Immich-Server sendet für entsprechende ML-Aufgaben Vorschaubilder an den entfernten Machine-Learning-Dienst.
Damit lässt sich ein stromsparender Speicherserver mit leistungsfähiger KI-Hardware kombinieren.
Wichtig: Der Machine-Learning-Dienst ist als interner Dienst konzipiert und besitzt nicht die Sicherheitsmechanismen eines öffentlich erreichbaren Webdienstes. Er sollte deshalb keinesfalls ungeschützt ins Internet gestellt werden.
Machine Learning überwachen
Administratoren können den Status der Hintergrundjobs in Immich kontrollieren.
Besonders nach einem großen Import lohnt sich ein Blick auf Aufgaben wie:
Thumbnail Generation Smart Search Face Detection Facial Recognition Metadata Extraction
Laufen dort noch tausende Jobs, ist die Verarbeitung schlicht noch nicht abgeschlossen.
Auch die Docker-Logs können helfen:
docker compose logs -f immich-machine-learning
Damit lässt sich beispielsweise nachvollziehen, ob Modelle geladen werden oder Fehler auftreten.
GPU-Auslastung kontrollieren
Bei NVIDIA-Systemen kann beispielsweise folgendes Werkzeug helfen:
nvidia-smi
Je nach Hardware stehen weitere Werkzeuge zur Verfügung, etwa nvtop, intel_gpu_top oder radeontop.
Damit lässt sich prüfen, ob die konfigurierte Hardwarebeschleunigung tatsächlich verwendet wird.
Zusätzlich geben die Logs des Machine-Learning-Containers Aufschluss darüber, welcher Beschleunigungsanbieter geladen wurde.
CPU-Last reduzieren
Gerade während des ersten Imports kann Immich einen Server stark auslasten.
Wenn gleichzeitig andere Dienste auf der Maschine laufen, kann die Parallelität der Hintergrundjobs reduziert werden.
Dadurch dauert die Verarbeitung länger, belastet das System aber weniger stark.
Das kann besonders sinnvoll sein bei:
- NAS-Systemen
- Mini-PCs
- virtuellen Maschinen
- Servern mit mehreren Diensten
- Systemen mit wenig RAM
Immich empfiehlt bei Problemen mit hoher CPU- und RAM-Auslastung unter anderem, die Parallelität besonders rechenintensiver Jobs zu reduzieren.
CPU vs. GPU – welche Variante eignet sich?
Für eine kleine private Bibliothek ist eine moderne CPU meistens vollkommen ausreichend.
Für eine mittelgroße Familienbibliothek kann eine vorhandene Intel-iGPU bereits eine interessante Beschleunigung ermöglichen.
Für sehr große Bibliotheken mit hunderttausenden Medien kann sich eine leistungsfähige GPU deutlich bemerkbar machen.
Für einen stromsparenden Server mit schwacher CPU bietet sich Remote Machine Learning auf einem stärkeren Rechner an.
Entscheidend ist also nicht allein die Geschwindigkeit eines einzelnen Analysejobs, sondern wie viele neue Medien regelmäßig verarbeitet werden müssen.
Datenschutz und Machine Learning
Gerade bei Gesichtserkennung spielt Datenschutz eine wichtige Rolle.
Bei einer normalen lokalen Installation findet die Machine-Learning-Verarbeitung innerhalb der eigenen Immich-Infrastruktur statt.
Damit müssen Bilder für Smart Search oder Gesichtserkennung nicht an einen kommerziellen Foto-Cloud-Anbieter übertragen werden.
Das ist einer der größten Vorteile eines selbst gehosteten Systems.
Beim Einsatz von Remote Machine Learning muss allerdings berücksichtigt werden, dass Bildvorschauen an den entfernten Machine-Learning-Server übertragen werden.
Dieser sollte daher ebenfalls unter eigener Kontrolle und in einem vertrauenswürdigen Netzwerk betrieben werden.
Die Machine-Learning-Funktionen gehören zu den größten Stärken von Immich. Gesichtserkennung, automatische Personengruppierung und Smart Search verwandeln selbst riesige Fotoarchive in eine komfortabel durchsuchbare Bibliothek.
Besonders interessant ist die technische Umsetzung. Die rechenintensive Analyse läuft in einem separaten Machine-Learning-Dienst, während PostgreSQL unter anderem die für die intelligente Suche benötigten Daten verwaltet. Modelle werden bei Bedarf geladen und anschließend zwischengespeichert.
Eine dedizierte GPU ist dabei keine Voraussetzung. Für kleinere und mittlere Bibliotheken genügt häufig eine moderne CPU. Wer dagegen hunderttausende Bilder analysieren möchte, kann mit CUDA, OpenVINO, ROCm oder anderen unterstützten Beschleunigern erheblich mehr Leistung aus dem System holen.
Damit nähert sich Immich beim Komfort immer stärker kommerziellen Cloud-Fotodiensten an – mit einem entscheidenden Unterschied: Server, Datenbank, Machine Learning und vor allem die eigenen Fotos können vollständig unter eigener Kontrolle bleiben.
Im nächsten Teil unserer Serie beschäftigen wir uns mit Benutzern, Alben und Freigaben. Wir zeigen, wie mehrere Familienmitglieder Immich verwenden können, wie gemeinsame Alben funktionieren und wie Fotos sicher mit anderen Personen geteilt werden.