web-dev-qa-db-de.com

Nahezu doppelte Bilderkennung

Was ist ein schneller Weg, um eine bestimmte Menge von Bildern nach ihrer Ähnlichkeit zu sortieren.

Im Moment habe ich ein System, das eine Histogrammanalyse zwischen zwei Bildern durchführt, aber dies ist eine sehr teure Operation und scheint zu übertrieben.

Optimalerweise suche ich einen Algorithmus, der jedem Bild eine Bewertung gibt (zum Beispiel eine ganzzahlige Bewertung, wie der RGB-Durchschnitt), und ich kann einfach nach dieser Bewertung sortieren. Identische Scores oder Scores nebeneinander sind mögliche Duplikate.

0299393
0599483
0499994 <- possible dupe
0499999 <- possible dupe
1002039
4995994
6004994 

RGB-Durchschnitt pro Bild saugt, gibt es etwas Ähnliches?

90
The Unknown

Es wurde viel über Bildsuche und Ähnlichkeitsmessungen geforscht. Das ist kein einfaches Problem. Im Allgemeinen reicht ein einzelnes int nicht aus, um festzustellen, ob die Bilder sehr ähnlich sind. Sie werden eine hohe False-Positive-Rate haben.

Da jedoch viel recherchiert wurde, sollten Sie sich einige davon ansehen. Beispiel: dieses Dokument (PDF) gibt einen kompakten Algorithmus für den Fingerabdruck von Bildern an, mit dem doppelte Bilder schnell und ohne Speicherung vieler Daten gefunden werden können. Es scheint, als wäre dies der richtig Ansatz, wenn Sie etwas Robustes wollen.

Wenn Sie auf der Suche nach etwas Einfacherem, aber definitiv mehr Ad-hoc sind, hat diese SO Frage ein paar anständige Ideen.

68
Naaff

Ich würde empfehlen, nicht nur ein RGB-Histogramm zu verwenden.

Eine bessere Übersicht über Ihr Bild erhalten Sie, wenn Sie ein 2d-Haar-Wavelet des Bildes aufnehmen (es ist viel einfacher als es sich anhört, es ist nur eine Menge Mittelwertbildung und einige Quadratwurzeln, die zum Gewichten Ihrer Koeffizienten verwendet werden) und einfach das k-größte beibehalten gewichtete Koeffizienten im Wavelet als spärlicher Vektor, normalisieren Sie ihn und speichern Sie ihn, um seine Größe zu verringern. Sie sollten R G und B mindestens vorher mit Wahrnehmungsgewichten neu skalieren, da ich empfehlen würde, auf YIQ (oder YCoCg, um Quantisierungsrauschen zu vermeiden) zu wechseln, damit Sie Chrominanzinformationen mit verringerter Wichtigkeit abtasten können.

Sie können nun das Skalarprodukt von zwei dieser spärlich normierten Vektoren als Maß für die Ähnlichkeit verwenden. Die Bildpaare mit den größten Punktprodukten werden in der Struktur sehr ähnlich sein. Dies hat den Vorteil, dass es leicht unempfindlich gegen Größenänderung, Farbtonverschiebung und Wasserzeichen ist und sehr einfach zu implementieren und zu kompaktieren ist.

Sie können die Speicherung und Genauigkeit durch Erhöhen oder Verringern von k beeinträchtigen.

Das Sortieren nach einer einzelnen numerischen Punktzahl wird für diese Art von Klassifizierungsproblem nicht möglich sein. Wenn Sie darüber nachdenken, müssten Bilder nur entlang einer Achse „wechseln“ können, aber dies ist nicht der Fall. Aus diesem Grund benötigen Sie einen Vektor von Features. Im Haar-Wavelet-Fall treten ungefähr dort die schärfsten Diskontinuitäten im Bild auf. Sie können einen Abstand zwischen Bildern paarweise berechnen, aber da Sie nur eine Abstandsmetrik haben, kann eine lineare Reihenfolge kein "Dreieck" von drei Bildern ausdrücken, die alle gleich weit voneinander entfernt sind. (Stellen Sie sich ein Bild vor, das nur grün ist, ein Bild, das nur rot ist, und ein Bild, das nur blau ist.)

Das bedeutet, dass für jede echte Lösung Ihres Problems O (n ^ 2) -Operationen in der Anzahl der vorhandenen Bilder erforderlich sind. Wenn es möglich gewesen wäre, die Kennzahl zu linearisieren, könnten Sie nur O (n log n) oder O(n) benötigen, wenn die Kennzahl beispielsweise für eine Radix-Sortierung geeignet wäre gesagt, Sie müssen nicht O (n ^ 2) ausgeben, da Sie in der Praxis nicht den gesamten Satz durchsehen müssen, sondern nur das Material finden müssen, das näher als eine bestimmte Schwelle ist Um Ihren spärlichen Vektorraum zu partitionieren, können Sie viel schnellere Asymptotik für das Problem "Finden von Bildern, die ähnlicher als ein vorgegebener Schwellenwert sind" erhalten, als wenn Sie naiv jedes Bild mit jedem Bild vergleichen, was Sie wahrscheinlich benötigen ... wenn nicht genau das, wonach du gefragt hast.

Auf jeden Fall habe ich das vor ein paar Jahren persönlich genutzt, um die Anzahl der gespeicherten Texturen zu minimieren, aber es gab auch viele Forschungsgeräusche in diesem Bereich, die die Wirksamkeit (und in diesem Fall den Vergleich) belegen es zu einer ausgefeilteren Form der Histogrammklassifizierung):

http://www.cs.princeton.edu/cass/papers/spam_ceas07.pdf

Wenn Sie eine genauere Erkennung benötigen, können die Algorithmen minHash und tf-idf mit dem Haar-Wavelet (oder dem Histogramm) verwendet werden, um Bearbeitungen robuster zu verarbeiten:

http://cmp.felk.cvut.cz/~chum/papers/chum_bmvc08.pdf

Schließlich bietet Stanford eine Bildsuche an, die auf einer exotischeren Variante dieses Ansatzes basiert und darauf, dass mehr Features aus den Wavelets extrahiert werden, um gedrehte oder skalierte Bildabschnitte usw. zu finden. Dies geht jedoch wahrscheinlich weit über den Arbeitsaufwand hinaus würde tun wollen.

http://wang14.ist.psu.edu/cgi-bin/zwang/regionsearch_show.cgi

49
Edward KMETT

Ich habe dafür einen sehr zuverlässigen Algorithmus namens Fast Multiresolution Image Querying implementiert. Mein (alter, nicht gepflegter) Code dafür ist hier .

Bei der schnellen Bildabfrage mit mehreren Auflösungen wird das Bild auf der Grundlage des YIQ-Farbraums in drei Teile aufgeteilt (besser zum Anpassen von Unterschieden als bei RGB). Dann wird das Bild im Wesentlichen unter Verwendung eines Wavelet-Algorithmus komprimiert, bis nur die hervorstechendsten Merkmale von jedem Farbraum verfügbar sind. Diese Punkte werden in einer Datenstruktur gespeichert. Abfrageabbilder durchlaufen denselben Prozess, und die hervorgehobenen Funktionen im Abfrageabbild werden mit denen in der gespeicherten Datenbank abgeglichen. Je mehr Übereinstimmungen vorhanden sind, desto ähnlicher sind die Bilder.

Der Algorithmus wird häufig für die Funktion "Abfrage nach Skizze" verwendet. Meine Software erlaubte nur das Eingeben von Abfragebildern über eine URL, sodass es keine Benutzeroberfläche gab. Ich fand jedoch, dass es außergewöhnlich gut funktionierte, um Thumbnails an die große Version dieses Bildes anzupassen.

Viel beeindruckender als meine Software ist retrievr , mit dem Sie den FMIQ-Algorithmus mit Flickr-Bildern als Quelle ausprobieren können. Sehr cool! Probieren Sie es per Skizze oder mit einem Quellbild aus und Sie können sehen, wie gut es funktioniert.

15
Luke Francl

Ein Bild hat viele Funktionen. Wenn Sie sich also nicht auf eine beschränken, wie die durchschnittliche Helligkeit, haben Sie es mit einem n-dimensionalen Problemraum zu tun.

Wenn ich Sie bitten würde, den Städten der Welt eine einzelne Ganzzahl zuzuweisen, damit ich feststellen kann, welche nahe beieinander liegen, wären die Ergebnisse nicht großartig. Sie können beispielsweise die Zeitzone als einzelne Ganzzahl auswählen und mit bestimmten Städten gute Ergebnisse erzielen. Eine Stadt in der Nähe des Nordpols und eine andere Stadt in der Nähe des Südpols können sich jedoch auch in derselben Zeitzone befinden, obwohl sie sich an entgegengesetzten Enden des Planeten befinden. Wenn ich Sie zwei ganze Zahlen verwenden lasse, könnten Sie sehr gute Ergebnisse mit Breiten- und Längengraden erzielen. Das Problem ist das gleiche für die Bildähnlichkeit.

Trotzdem gibt es Algorithmen, die versuchen, ähnliche Bilder zu gruppieren, was genau das ist, wonach Sie fragen. Dies ist der Fall, wenn Sie mit Picasa eine Gesichtserkennung durchführen. Noch bevor Sie Gesichter identifizieren, werden diese in Gruppen zusammengefasst, sodass Sie auf einfache Weise eine Reihe ähnlicher Gesichter durchgehen und den meisten den gleichen Namen geben können.

Es gibt auch eine Technik namens Prinzipielle Komponentenanalyse, mit der Sie n-dimensionale Daten auf eine kleinere Anzahl von Dimensionen reduzieren können. So kann ein Bild mit n Merkmalen auf ein Merkmal reduziert werden. Dies ist jedoch immer noch nicht der beste Ansatz zum Vergleichen von Bildern.

10
Neil

Es gibt eine C-Bibliothek ("libphash" - http://phash.org/ ), die einen "Wahrnehmungs-Hash" eines Bildes berechnet und es Ihnen ermöglicht, ähnliche Bilder durch Vergleichen von Hashes zu erkennen (also ziehen Sie diese an) Ich muss nicht jedes Bild direkt mit jedem anderen vergleichen, aber leider schien es nicht sehr genau zu sein, als ich es ausprobierte.

8
Andrew Medico

Sie müssen sich entscheiden, was "ähnlich" ist. Kontrast? Farbton?

Ist ein Bild "ähnlich" wie das andere?

Ich wette, Sie können eine Menge "enger Anrufe" finden, indem Sie Bilder in 4x4-Teile aufteilen und eine durchschnittliche Farbe für jede Gitterzelle erhalten. Sie würden sechzehn Punkte pro Bild haben. Um die Ähnlichkeit zu beurteilen, würden Sie nur eine Summe der Quadrate der Unterschiede zwischen den Bildern erstellen.

Ich denke nicht, dass ein einzelner Hash Sinn macht, es sei denn, er widerspricht einem einzigen Konzept wie Farbton, Helligkeit oder Kontrast.

Hier ist deine Idee:

0299393
0599483
0499994 <- possible dupe
0499999 <- possible dupe
1002039
4995994
6004994

Zunächst gehe ich davon aus, dass dies Dezimalzahlen sind, die R * (2 ^ 16) + G * (2 ^ 8) + B oder so ähnlich sind. Offensichtlich ist das nicht gut, weil Rot übermäßig gewichtet ist.

mzug in den HSV-Raum wäre besser. Sie könnten die Teile von HSV ausbreiten in den Hash, oder Sie könnten einfach H oder S oder V einzeln regeln, oder Sie könnten drei Hashes pro Bild haben.


Eine Sache noch. Wenn Sie R, G und B gewichten, wird Grün am höchsten gewichtet, dann Rot und dann Blau, um der menschlichen Sehempfindlichkeit zu entsprechen.

5
Nosredna

Im Zeitalter der Webdienste könnten Sie versuchen http://tineye.com

5
zproxy

Die Frage Gute Möglichkeit, ähnliche Bilder zu identifizieren? scheint eine Lösung für Ihre Frage zu bieten.

2
Alix Axel

ich nahm an, dass andere Software für die Suche nach doppelten Bildern eine FFT für die Bilder ausführt und die Werte der verschiedenen Frequenzen als Vektoren speichert:

Image1 = (u1, u2, u3, ..., un)
Image2 = (v1, v2, v3, ..., vn)

und dann können Sie zwei Bilder auf Gleichheit vergleichen, indem Sie den Abstand zwischen den Gewichtsvektoren zweier Bilder berechnen:

distance = Sqrt(
     (u1-v1)^2 +
     (u2-v2)^2 +
     (u2-v3)^2 +
     ...
     (un-vn)^2);
1
Ian Boyd

Die meisten modernen Ansätze zur Erkennung von nahezu doppelten Bildern verwenden die Erkennung interessanter Punkte und Deskriptoren, die den Bereich um solche Punkte herum beschreiben. Oft wird SIFT verwendet. Dann können Sie Deskriptoren quatifizieren und Cluster als visuelles Wortvokabular verwenden.

Wenn wir also das Verhältnis gemeinsamer visueller Wörter von zwei Bildern zu allen visuellen Wörtern dieser Bilder sehen, schätzen Sie die Ähnlichkeit zwischen Bildern. Es gibt viele interessante Artikel. Eines davon ist Near Duplicate Image Detection: minHash und tf-idf Weighting

1
ton4eg

Mit der IMMI-Erweiterung und IMMI können Sie beispielsweise auf viele verschiedene Arten die Ähnlichkeit zwischen Bildern messen: http://spl.utko.feec.vutbr.cz/en/component/content/article/46-image- Verarbeitungserweiterung für rapidminer 5

Indem Sie einen Schwellenwert definieren und eine Methode auswählen, können Sie die Ähnlichkeit messen.

1
Radim Burget

Eine Lösung ist die Durchführung eines RMS/RSS - Vergleichs für jedes Bildpaar, das für eine Blasensortierung erforderlich ist. Zweitens können Sie ein FFT für jedes Bild ausführen und eine Achsenmittelung durchführen, um eine einzelne Ganzzahl für jedes Bild abzurufen, nach der Sie als Index sortieren möchten . Abhängig davon, wie gering der zu ignorierende Unterschied ist und wie viel Geschwindigkeit Sie benötigen, können Sie einen Vergleich mit einer verkleinerten (25%, 10%) Version des Originals in Betracht ziehen. Lassen Sie mich wissen, ob diese Lösungen interessant sind, und wir können diskutieren oder ich kann Beispielcode bereitstellen.

1
Paul