Sent from Hauptstadt!

ein Blog für den geneigten Leser

Vibe Coding Session an der intelligenten Fotodatenbank PhotoAIdent (mit KI generiert)

PhotoAIdent – Vibe Coding einer intelligenten Fotodatenbank

Am in Software Engineering | 5 Kommentare »

Tags: , ,

Schon seit Jahren möchte ich meine Fotosammlung nach Personen durchsuchen können. Eine manuelle Verschlagwortung ist aber zu aufwendig und einem Datenkraken wie Google Photos möchte ich meine Bilder nicht anvertrauen. Eine gute Gelegenheit, um mittels Vibe Coding eine für mich passende Anwendung zu erzeugen…

Was ist PhotoAIdent?

PhotoAIdent ist eine lokale Desktopanwendung für die Personensuche in Fotos mittels KI Unterstützung. Nachdem ich für meine liebsten Personen einige Fotos mit ihren Gesichtern verschlagwortet habe, soll PhotoAIdent alle weiteren Fotos finden, auf denen das selbe Gesicht auftaucht. Später möchte ich die Fotos auch nach weiteren Kriterien wie Szenerie, Jahreszeit, etc. durchsuchen können.

Tatsächlich ist PhotoAIdent noch nicht fertig, sondern der geneigte Leser kann in den nächsten Wochen die Weiterentwicklung verfolgen. So sieht es aktuell aus:

PhotoAIdent Startseite

Technischer Hintergrund

Ich habe schon seit einiger Zeit mit verschiedenen Technologien experimentiert, um ähnliche Gesichter in Bildern zu erkennen. Das ist heute auch kein Hexenwerk mehr. Es gibt verschiedenste KI Modelle, die auf genau diesen Anwendungsfall optimiert sind. Der Prozess ist zweistufig:

  1. Alle Gesichter in einem Bild finden.
  2. Fingerabdruck für jedes gefundene Gesicht erstellen.

Der Fingerabdruck von einem Gesicht ist eine Kolonne von zum Beispiel 512 Fließkommazahlen:

  • -9.46730841e-03
  • 6.73014149e-02
  • 1.27341524e-02
  • -2.99047157e-02

Die Zahlenkolonne nennt man Embedding bzw. Embedding Vektor.

Wenn alles gut läuft, dann haben 2 Fotos der gleichen Personen eine sehr ähnliche Kolonne von Zahlen. Ähnlich bedeutet hier, dass die mathematische Distanz der Vektoren möglichst klein ist. Es gibt spezialisierte Datenbanken, um in einer großen Liste von Vektoren diejenigen zu finden, die die kleinste Distanz zum Suchvektor haben.

Ich habe eine Reihe von Modellen wie Deepface und Yunet ausprobiert, bin aber dann bei dem OpenSource Model InsightFace gelandet. InsightFace bietet auch hervorragende Unterstützung für Nvidia Grafikkarten, damit die Analyse eines Bildes möglichst schnell geht. Für mich ist das wichtig, da meine Bildersammlung ca. 80.000 Fotos aus 30 Jahren umfasst.

Als Datenbank für die schnelle Vektorensuche bietet sich Faiss an, ursprünglich von Meta (Facebook) Research entwickelt. Diese Datenbank lässt sich als lokale Datei speichern und wurde für die Ähnlichkeitssuche entwickelt.

Damit habe ich alle Zutaten, um eine Anwendung zu programmieren. Einzig fehlen tut mir Zeit…

Vibe Coding mit Coding Agenten

Auch wenn die notwendigen Technologien klar sind, ist es doch etwas anderes, diese in einer schönen Anwendung zu integrieren. Hinzu kommt, dass ich gefühlt seit 20 Jahren keine Desktopanwendung mehr entwickelt habe und mich in diesem Bereich erst komplett einlesen müsste.

Doch endlich gibt es eine Rettung: Ich schreibe PhotoAIdent nicht selbst, sondern lass es mir von einer KI generieren! Glaubt man dem KI Hype, sollte das inzwischen sehr gut funktionieren.

Beim Vibe Coding bzw. der agentengetriebenen Softwareentwicklung ändert sich meine Rolle als Entwickler: Ich definiere was ich will und die KI übernimmt die eigentliche Entwicklung.

Da ich als Nutzer von Jetbrains IDEs ein monatliches Nutzungskontigent für deren Coding Agent Junie inklusive habe, habe ich die Entwicklung mit Junie gestartet. Junie selbst nutzt im Hintergrund verschiedene Large Language Model von allen bekannten Anbietern wie OpenAI, Anthropic and Google. Ich habe Junie entscheiden lassen, welches Model es verwenden will.

Nach ca. 8 Stunden intensiver Nutzung war dann mein Guthaben für Junie für diesen Monat verbraucht. Kurzerhand habe ich 21€ in ein monatliches Claude Code Pro Abo von Anthropic investiert, da Claude Code der momentane Hypeführer im Bereich Coding Agenten ist.

Bei Claude Code gibt es je nach Abostufe ein tägliches Nutzungslimit. Dieses hatte ich dann schon nach ca. 2 Stunden für heute ausgereizt. Da mich meine digitalen Unterstützer für heute im Stich gelassen haben, muss ich nun gezwungenermaßen diesen Blogbeitrag schreiben…

Funktionsumfang nach 10 Stunden

Ich habe die Entwicklung am Anfang etwas beschleunigt, indem ich das Projektsetup aus einem anderen aktuellen eigenem Projekt übernommen und angepasst habe. Auch die GitHub Actions Build Pipeline stammt aus einem früheren Projekt.

Anschließend habe ich mit verschiedenen Chatbots (ChatGPT, Co-Pilot, Gemini, Claude) die Architektur, die zu verwendenden Technologien, das Datenbankschema und das Projektsetup diskutiert und die Erkenntnisse in einer zentralen Richtliniendatei abgelegt. Dieses Markdown-Dokument hat aktuell grob folgende Struktur:

  • Projektbeschreibung
  • Verbot: Bilder in der Fotodatenbank dürfen niemals von PhotoAIdent geschrieben werden
  • Schritte, die der Agenten immer ausführen muss, bevor er fertig ist. Dazu zählt etwa das Ausführen aller Tests.
  • Hinweis, dass das UI übersetzbar sein muss
  • Hinweise zu den zu erwartenden Datenmengen (80.000 Bilder, ein paar hundertausend Gesichter)
  • Hinweis, dass die Anwendung den Linux Desktop Standards folgen soll (etwa Speicherort von Konfigdateien)
  • Arbeitsweise des Nutzers
  • Mehrere Embedding Vektoren pro Person, da sich die Personen in 30 Jahren etwas verändert haben
  • Projektstruktur (Dateisystem)
  • Aktueller Umsetzungsstatus
  • Datenbankschema als Entity Relationship Model (mittels Mermaid Syntax in Markdown eingebettet)
  • Datenbankmigrationen
  • Möglichkeit Bilder nochmal zu indizieren (etwa mit besserem Model)
  • Suchstrategie von ähnlichen Gesichtern
  • Testautomatisierung
  • Wichtige Entwicklungskommandos
  • GPU / CUDA Hinweise
  • Bundling der Anwendung

Diese Datei habe ich natürlich nicht händisch geschrieben, sondern mir von den Chatbots generieren lassen. Das Logo der Anwendung stammt von Gemini Nano Banana.

Logo von PhotoAIdent

Nach 10 Stunden Arbeit hat PhotoAIdent schon folgende Funktionen:

  • eine funktionierende Desktop Anwendung
  • Rekursives Finden aller Bilddateien in einem Verzeichnis
  • Generierung von Embeddings für gefundene Gesichter mittels InsightFace
  • Speicherung Metadaten der Bilder in einer SQLite Datenbank
  • Speicherung Embeddings in einer Faiss Index Datei
  • Einstellungsdialog, um Verzeichnis der Fotodatenbank zu ändern
  • Anzeige aller Bilder
  • Filtermöglichkeit der Bilder nach Bildern mit und ohne Gesichter
  • Detailfenster zu einem Bild inklusive farblicher Hervorhebung der gefundenen Bilder
  • Anlegen von Personen
  • Dialog zur Verknüpfung von Person zu Gesicht
  • vollständige Testautomatisierung
  • Oberfläche in Deutsch und Englisch

Beim Versuch eine Filterung der Bilder nach Personen zu implementieren, hat Claude leider für heute die Arbeit eingestellt.

Hier noch ein paar Bildschirmfotos, etwa vom Dialog, um eine neue Person anzulegen:

PhotoAIdent neue Person anlege

Einmal angelegt, kann man diese Person natürlich mit weiteren Gesichtern verknüpfen:

PhotoAIdent Person direkt zuweisen

Auf der Hauptseite werden momentan alle Bilder angezeigt und diese kann ich dann filtern, um zum Beispiel nur Bilder ohne erkannte Gesichter zu sehen.

PhotoAIdent Schnellfilter

Ein Klick auf ein Foto öffnet eine Detailansicht. In dieser sind alle erkannten Gesichter farblich hervorgehoben.

PhotoAIdent - Detailansicht mit Markierung gefundener Gesichter

Prompting

Neben der Richtliniendatei kommt es natürlich auf den konkreten Prompt an, damit der Coding Agent weiß, was er tun soll. Hier hilft enorm, dass ich doch über etwas Erfahrung in der Softwareentwicklung verfüge und ziemlich genau beschreiben kann, was ich möchte. Ich habe die bei Junie verwendeten Prompts in den Commit Messages gespeichert.

Mit folgenden 2 Prompts habe ich zum Beispiel Junie veranlasst, den Dateipfad für die Fotosammlung nach JPG Dateien zu durchsuchen und diese in die interne Datenbank aufzunehmen.

When the image database is reset, first scan the new folder recursively to find all jpg and jpeg files. This search should be case insentive. Add each image to the sql database table Images with base attributes available from file system like file size. Do not open the files yet, just create an inventory of all possible files. This initial scan should run in a modal dialog and show a progress bar or progress spinner. The user should see a message like „Searching for photos…“. After all files are committed to the database, close the progress dialog.

Where are the tests for the indexer and the progress dialog?

Das führte dann zu immerhin 445 neuen Zeilen Code, die genau diese Sache sauber erledigen.

Ein erstes Fazit

Claude Code meinte, bereits 50% meines Projekts sind umgesetzt. Ganz so optimistisch bin ich nicht, aber das Ergebnis kann sich auf alle Fälle sehen lassen! Junie hat erstaunlich gut funktioniert, auch wenn es diverse kleine Bugs in der Junie UI gibt. Aus einigen Situationen hat Junie sich nicht rausgefunden, etwa der Erstellung eines Skripts, um sicherzustellen, dass die Übersetzungsdateien immer aktuell sind.

Das tägliche Claude Code Budget war anschließend sehr schnell aufgebraucht. Die Ergebnisse von Claude Code wirken umfassender und durchdachter. Den Dialog zur Erstellung von Personen und zur Zuordnung von Personen zu Bildern hat Claude mit nur einem Prompt generiert.

Ich bin gespannt, wie es die nächsten Tage weitergeht. Vermutlich habe ich ab Donnerstag wieder Zeit und Agenten Budget, um die nächsten Features entwickeln zu lassen.

Zählpixel

5 Kommentare to “PhotoAIdent – Vibe Coding einer intelligenten Fotodatenbank”

  1. Matthias sagt:

    Ja, klingt gut.
    Ich wünsche mir noch eine Open Street View Integration. Eine Anzeige des Ortes aus dem Bild. Ein Verlauf der Orte einer Person über einen Zeitraum hinweg. Eine Vorgabe eines Ortes und es werden alle Bilder und alle Menschen angezeigt, die dort waren.

  2. Matin sagt:

    Diese zentrale Richtliniendatei ist die für mich hervorstechenste Information in dem Artikel. Eine solche Datei sollte eigentlich immer für jedes Softwareprojekt existieren, auch wenn nur Menschen und keine KI an der Entwicklung beteiligt ist.

    Wenn ich sie richtig gelesen habe, „lebt“ sie ja auch, da sie nicht nur ein initiales Dokument ist, sondern auch immer den aktuellen Projektstand festhält.

    Was ich jetzt cool fände, wäre die Möglichkeit, dass ich einer KI ein existierendes Softwareprojekt vor die Füße werfe und sie mir daraus dann im Nachhinein eine solche Richtliniendatei daraus erzeugt, mit entsprechenden Markern, wo ich was ergänzen muss oder sie nachfragt, wenn sie weitere Informationen baucht.

  3. Sebastian sagt:

    @Matin: Natürlich musst du die Datei nicht von Hand schreiben, sondern gerade zum Anfang bei einer existierenden Code-Basis reicht ein „/init“, damit Claude erst mal alles ergründet und sich die CLAUDE.md Datei selbst anlegt. Die kannst du dann von Hand erweitern. Ich bin mir aber nicht sicher, ob er die Datei wirklich immer beachtet. Ich muss ihn zum Beispiel auffordern, sie zu aktualisieren, etwa, wenn ich das Datenbankschema geändert habe.

  4. […] habe ich weitere rund 10 Stunden in die Entwicklung von PhotoAIdent mittels Claude Code investiert. Wobei ich die meiste Zeit natürlich keine aktive Aufgabe hatte, sondern mich auf […]

  5. Sebastian sagt:

    @Matthias Ja, eine Suche auf einer Karte oder von anderen Fotos aus der Gegend ist angedacht. Ein Tracking einer Person sehe ich aber nicht.

Schreiben sie ein Kommentar