Immichs Smart Search #
Ich nutze Immich inzwischen seit mehreren Jahren, aber habe bisher nie dessen Suchfunktion verwendet. Meine Bilder sind nach Alben sortiert, sodass ich die Suche nicht wirklich brauche, sondern immer weiß, wo ich was finde.
Aber als ich heute Immich aktualisiert habe, habe ich gelesen, dass neue Such-Modelle hinzugefügt wurden, also dachte ich mir, warum nicht, ich probiere es mal aus.
Maschinelles Lernen #
Bevor ich auf meine Eindrücke von diesem Suchsystem eingehe, müssen wir erst einmal über die verwendeten Modelle fürs Maschinelle (ML-Modelle) Lernen reden, und was diese mit sich bringen.
Die Suche verwendet ein vortrainiertes ML-Model, welches lokal läuft und auch lokal mit den eigenen Bildern weiter trainiert wird. Es findet Assoziationen zwischen einer Textabfrage und einer Menge an Bildern, um festzustellen, welche am besten passen.
Es kann zwischen verschiedenen vortrainierten CLIP Modellen gewählt werden. CLIP steht dabei für Constrastive Language-Image Pre-training und wurde 2021 ursprünglich von OpenAI entwickelt. Inzwischen existieren aber verschiedene Implementation von CLIP, bspw. die OpenCLIP und Multilingual-CLIP Projekte. Sie alle werden mit unterschiedlich viel Rechenzeit und -leistung, sowie unterschiedlichen Datensätzen trainiert. So weit ich es feststellen konnte, basieren alle Datensätze auf einer Untermenge des öffentlichen Internets. Ich habe mich durch die Paper einiger Datensätze durchgelesen, und alle von denen nutzen eine Untermenge von Common Crawl.
Common Crawl ist ein gigantisches Web-Crawling Projekt, welches bereits seit 2008 existiert und jedes Jahr mehrere Datensätze erzeugt. Laut der Projektwebseite, übersetzt ins Deutsche: “Das Korpus enthält Webseiten-Rohdaten, Metadaten-Extrakte und Textextrakte.” Um einen Datensatz für CLIP Modelle zu erstellen, werden diese Daten gefiltert nach Bildern mit ausreichend hoher Auflösung und ausreichend langem Alt-Text. Duplikate werden entfernt und Bilder werden weiter klassifiziert. Darunter zählen bspw. die Auflösung, die Sprache des Textes, oder ob sie tauglich sind für den Arbeitsplatz. Die Klassifizierung enthält außerdem Stichwort-Tagging und Transformationen: Sagen wir eine Bildbeschreibung lautet: “Fotografie eines pinken Gebäudes in Tokyo.” Dann könnten die extrahierten Tags sein: Fotografie, pink, Gebäude und Tokyo. Transformationen des Bildes und der extrahierten Tags könnten dann zusätzlich enthalten: realistisches Bild, ästhetisches Bild, Architektur und Japan.
Diese Assoziationen können dann genutzt werden, um ein CLIP Modell zu trainieren, welches lernt wie sehr ein Bild mit einer gegebenen Textabfrage assoziiert werden kann. Dieser Wert kann dann genutzt werden, um eine Liste an Bildern nach ihrer Assoziation zu sortieren.
Mein Problem Damit #
Dies ist eine wirklich gute Anwendung für maschinelles Lernen, da es echt schwer ist, klassische Algorithmen hierfür zu programmieren. Aber ich habe ein großes Problem hiermit: Diese Datensätze basieren auf öffentlich verfügbaren Daten im öffentlichen Internet, aber sie beachten nicht die Lizenzen der Daten. Nicht alles, was öffentlich verfügbar ist, ist auch öffentliches Eigentum oder unter einer freien Lizenz.
Ich bin strikt gegen die Methodik hinter Large Language Models (LLMs) und Generativer KI (GenAI), weil sie “neue” Dinge aus geklauter Arbeit anderer erschaffen halluzinieren, enorme Mengen an Strom für Training und Betrieb benötigen, und anderen ihre Jobs klauen, dabei aber einen schlechteren Job erledigen.
Aber für diese Art von Algorithmus (also Bildklassifizierung) bin ich geteilter Meinung. Auf der einen Seite wird die Arbeit von Menschen ohne ihre Erlaubnis verwendet, aber auf der anderen Seite werden die Daten nicht genutzt um etwas Neues zu Erzeugen, und im Betrieb benötigen viele dieser Modelle nur ziemlich wenig Strom. Und niemandes Jobs werden gestohlen. Im Gegenteil, es macht das Leben deutlich leichter, da eine gesamte Sammlung an tausenden Fotos und hunderten Videos nicht manuell beschriftet werden muss.
Und wenn wir OpenAI und Google einmal kurz ignorieren, nutzen die meisten alternativen CLIP Modelle existierende Web-Crawling Datenbanken, anstatt durchgehend jede einzelne Webseite die es gibt erneut zu crawlen. Common Crawl respektiert tatsächlich die eigene robots.txt, sowohl den Disallow, als auch den Crawl-delay Parameter.
Am Ende glaube ich für mich entschieden zu haben, dass ich mit dem Crawling von Common Crawl und den Modellen, welche darauf gebaut werden und welche nicht versuchen etwas Neues zu halluzinieren, sondern tatsächlich versuchen, stumpfsinnige Aufgaben wie Bildklassifizierung erreichbarer und einfacher zu machen, einverstanden bin.
Suchergebnisse #
Reden wir nun aber mal über meine tatsächlichen Erfahrungen mit der Nutzung der sogenannten Smart Search Funktion von Immich. Ich verwende das Modell ViT-B-32__laion2b-s34b-b79k; ein OpenCLIP Modell welches die englischsprachige Untermenge des laion2b Datensatzes verwendet, welche insgesamt 2,3 Milliarden Einträge von Common Crawl enthält. Allerdings konnte ich nicht herausfinden, welcher Snapshot von Common Crawl verwendet wird.
Das System läuft auf einem zehn Jahre alten Intel i7-4790 Prozessor mit 24 GB DDR3 RAM und ohne extra Beschleunigung neben der integrierten Grafikeinheit des Prozessors.
Meine Immich Instanz enthält einige tausend Fotos von meiner Familie, Freunden und persönlichen Ereignissen und Ausflügen. Ich habe speziell Suchanfragen probiert, bei denen ich mir dachte, dass sie eine Chance haben sollten, etwas zu finden. Ich werde hier nicht alle Anfragen auflisten, die ich probiert habe (aus Datenschutz Gründen), und ich habe auch nicht versucht eine wissenschaftliche Methodik zu verfolgen. Hier geht es einfach nur darum, dass ich eine Funktion ausprobieren und schauen wollte, ob ich sagen würde, dass sie gut funktioniert. Ich werde die Anfragen im folgenden auf Deutsch auflisten, aber habe sie auf Englisch in die Suche eingegeben.
Zunächst habe ich mit einzelnen Wörtern als Anfragen angefangen, bspw. rot, Katze, Hut, Berg, Klippe oder Geländer. Sofern ich genug Bilder hatte, welche mit den Begriffen assoziiert werden konnten, hat die Smart Search Funktion diese auch finden können, so gut wie ohne False Positives.
Nachdem mir keine weiteren einzelnen Wörter eingefallen sind, die ich ausprobieren wollte, bin ich zu abstrakteren Konzepten übergegangen. Dazu gehörten unter anderem ein Geburtstag, Schulausflug, eine Zugfahrt, Übernachtung oder Tierpark. Und auch hier waren die ersten paar dutzend Ergebnisse Bilder, auf welche die Kriterien zutrafen. Ich habe ein paar Fotos von ein paar verschiedenen Geburtstagen, Übernachtungen und Schulausflügen aus verschiedenen Jahren meiner Kindheit in Immich und die Suchergebnisse haben sich über diese Jahre erstreckt. Das System war also in der Lage verschiedene Altersstufen von jungen Menschen als SchülerInnen zu erkennen.
Zufrieden habe ich mich noch komplexeren Anfragen zugewandt. Sätze, welche aus Kombinationen verschiedener Kriterien bestanden, um den Kontext einer bestimmten Art von Veranstaltung oder Ausflug zu erzeugen. Ich war sehr überrascht als die Suche erfolgreich Fotos einer Zugfahrt mit einer alten Dampflokomotive fand, oder den Unterschied zwischen einem Kindergeburtstag im Innenraum und draußen oder im Sommer. Es war in der Lage mir Fotos aufzulisten, welche ein Feld vor einem Wald an einem wolkigen Tag oder eine Ruine eines Betongebäudes in einem Wald darstellten.
Insgesamt bin ich echt zufrieden hiermit. Ich wäre nicht in der Lage, diese Anzahl an Fotos und Videos mit dem benötigten Detailgrad zu beschriften, um diese Tiefe an Anfragen-Spezifität zu erreichen. Ich weiß noch nicht, wie sehr ich diese Funktion in der Zukunft verwenden werde, aber ich bin nichtsdestotrotz froh, dass es möglich ist, vollständig lokal mit einem zehn Jahre alten Prozessor.