2013-05-21 10 views
15

TinEye, Google und andere bieten eine "umgekehrte Bildersuche" an - Sie können ein Foto hochladen und innerhalb weniger Sekunden finden Sie ähnliche Fotos.Algorithmus zum Finden visuell ähnlicher Fotos aus einer Datenbank?

Gibt es eine Open-Source-Version dieser Algorithmen?


Ich weiß über „SIFT“ und andere Algorithmen für die „visuell ähnliche“ Fotos zu finden, aber sie arbeiten nur ein Foto direkt zu einem anderen zu vergleichen. d. h., um ähnliche Fotos zu einem gegebenen Foto zu finden, ist eine O(n) Operation, um alle visuell ähnlichen Fotos zu finden, wäre O(n^2) - die beide prohibitiv langsam sind.

Ich brauche einen Feature-Deskriptor, der von einer [relationalen] Datenbank indexierbar ist, um die Ergebnismenge auf etwas überschaubarer zu reduzieren.

Mit "visuell ähnlich" meine ich sehr ähnlich. h. ein Foto, das in Photoshop leicht überarbeitet/neu eingefärbt wurde, leicht beschnitten oder in der Größe verändert wurde, Fotos, die in schneller Folge derselben Szene aufgenommen wurden, oder umgedrehte oder gedrehte Bilder.

+1

Haben Sie sich die lineare Diskriminanzanalyse (LDA)/Hauptkomponentenanalyse (PCA) angesehen? Wenn ich mich richtig erinnere, wurden sie irgendwann für die Bildverarbeitung/Gesichtserkennung und so weiter verwendet.Ihre Stärke besteht genau darin, Feature Description auf etwas überschaubarer zu reduzieren :) In diesem Fall, Pixel Info –

+0

@Arthur: Ich bin gerade dabei, "eine Bildunterschrift für jede Art von Bild" zu implementieren, ich werde einen Blick darauf werfen eine nächste, wenn diese nicht klappt. Danke :-) Gesichtserkennung brauche ich allerdings nicht. – mpen

+0

Ich habe vor ein paar Jahren eine Bildähnlichkeitsmaschine gebaut. Sie können sicherlich Funktionen in relationalen Datenbanken speichern, aber meine Empfehlung wäre, einen umgekehrten Index als Abfragemodul zu verwenden. Es gibt Ihnen eine Größenordnung mehr Geschwindigkeit und Flexibilität, wenn es um die Lieferung Ihrer Daten geht. –

Antwort

15

Ein gültiger Ansatz, den Sie in Betracht ziehen können, ist der Bag-of-Words model.

Grundsätzlich können Sie eine Offline-Berechnung der Zielbilder durchführen. Sie können aus diesen Bildern eine Reihe von Funktionen extrahieren, um ein Codebuch mit Algorithmen wie k-means clustering zu erstellen. Die Suche nach den nächsten Bildern führt zu den Anwendungen eines Algorithmus wie Nearest neighbor search im Raum des Codebuchs.

Für den Nachbarn suchen Sie FLANN

Werfen Sie auch einen Blick auf verwenden können: Visual similarity search algorithm

Dies ist nur eine Möglichkeit und Wahrheit muss, sei gesagt, dieses Thema ist wirklich herausfordernd und Literatur daran ist wirklich riesig.

nur einige Referenzen:

+0

Der Teil, der mich am meisten interessiert, ist, wie wir eine Suche nach dem nächsten Nachbarn in einer relationalen Datenbank mit Vektoren von ~ 500 Dimensionen durchführen? – mpen

+0

Ich habe die Antwort aktualisiert –

+1

FLANN beantwortet den DB-Teil der Frage nicht;) Ich bin sicher, dass wäre toll, sobald alle Daten im Speicher sind, aber ich kann nicht eine Million Datensätze in den Speicher jedes Mal lesen jemand führt eine Suche durch. Es sei denn, ich behalte alle Daten im Speicher zwischen Anfragen ... meine Signaturen sind ~ 500 Bytes, denke ich, so könnte ich ziemlich viele abhängig von den Speicheranforderungen von FLANN speichern. – mpen

Verwandte Themen