Neuronale Netze - Finden Sie die ähnlichsten Bilder

11

Ich arbeite mit Python, Scikit-Learn und Keras. Ich habe 3000 Tausend Bilder von Frontuhren wie die folgenden: Watch_1 , Watch_2 , Watch_3 .

Ich möchte ein Programm schreiben, das als Eingabe ein Foto einer echten Uhr empfängt, das möglicherweise unter weniger idealen Bedingungen als die obigen Fotos (andere Hintergrundfarbe, dunklerer Blitz usw.) aufgenommen wurde, und unter den 3000 Uhren die ähnlichsten finden. Mit Ähnlichkeit meine ich, wenn ich als Eingabe ein Foto einer runden, braunen Uhr mit dünner Spitze gebe, dann erwarte ich als Ausgabe Uhren von runder Form, dunkler Farbe und mit dünner Spitze.

Was ist der effizienteste Algorithmus für maschinelles Lernen, um dies zu tun?

Wenn ich zum Beispiel diesem Link folge, habe ich zwei verschiedene Lösungen im Kopf:

1) Verwenden Sie einen CNN als Merkmalsextraktor und vergleichen Sie die Abstände zwischen diesen Merkmalen für jedes Bildpaar mit Bezug auf das Eingabebild.

2) Verwenden von zwei CNNs in einem siamesischen neuronalen Netzwerk zum Vergleichen der Bilder.

Sind diese beiden Optionen die besten für diese Aufgabe oder würden Sie etwas anderes vorschlagen?

Kennen Sie ein vorab trainiertes neuronales Netzwerk (mit vordefinierten Hyperparametern) für diese Aufgabe?

Ich habe auf StackOverflow einige interessante Beiträge dazu gefunden, aber sie sind ziemlich alt: Post_1 , Post_2 , Post_3 .

Penseur
quelle
Willkommen auf der Seite! Lernen Sie eine Einbettung (ich empfehle einen binären Hash zum schnellen Abrufen in der Größenordnung von tausend Bit) und führen Sie dann eine Ähnlichkeitssuche durch.
Emre
Es ist mir eine Freude, hier zu sein ... haha! ... Ja, das ist eine gute Idee und ich hatte dieses Papier bereits gelesen ...
Penseur

Antworten:

4

Ich denke nicht, dass eine Architektur auf hoher Ebene als solche am besten passt, sondern sie hängt vielmehr von vielen Faktoren und Details ab. Soweit mir bekannt ist, ist der erste Ansatz vielversprechend, insbesondere wenn er um zusätzliche Schritte erweitert wird, wie sie in der TiefVision ausgeführt werden :

  1. Ein zusätzliches Bounding-Box-Netzwerk wird verwendet, um den relevanten Teil des Bildes vom Rest zu unterscheiden
  2. Die Merkmalsvektoren werden nicht einfach direkt verglichen, sondern zum Trainieren eines Vergleichsnetzwerks unter Verwendung von Tripletts verwendet (Lernen von Ähnlichkeit basierend auf Merkmalsvektoren und Beispielen für mehr und weniger ähnliche Instanzen).

Diese Arbeit ist viel aktueller (2016/17) als das, was Sie gepostet haben, und enthält ein schönes Tool-Set und ein detaillierteres Papier .

Warum Drillinge, auch bekannt als Deep Ranking?

Wie in den Kommentaren angegeben: Warum sollte man Tripletts für die Bildähnlichkeit verwenden, anstatt Merkmalsvektoren zu lernen und deren Entfernung zu berechnen? Triplets sind eine Möglichkeit, die Ähnlichkeitsfrage als Lernproblem zu formulieren, anstatt Merkmalsvektoren zu lernen, die sich im Grunde nicht um Ähnlichkeit kümmern. Dieser Ansatz ist besonders in Fällen sinnvoll, in denen vom Menschen wahrgenommene Ähnlichkeit wichtig ist, die von der Wahrnehmung durch die Maschine abweichen kann.

Drillinge funktionieren folgendermaßen: Sie liefern 3 Bilder. Ein zu vergleichendes, ein ähnliches (nahes) und ein nicht so ähnliches (entferntes) Bild. Dies sind Ihre Trainings- / Test- / Validierungsdaten. Wenn Sie Ihr Netzwerk anhand dieser Beispiele schulen und die richtige Reihenfolge vorhersagen (ähnliche von nicht ähnlichen Bildern klassifizieren), lernt das Netzwerk insgesamt, wie Bilder anhand ihrer Ähnlichkeit sortiert werden.

Alles in allem ist dieser Ansatz vergleichsweise komplex. Es könnte überarbeitet sein, aber Sie haben auch nach dem besten Weg gefragt, dies zu tun, und Deep Ranking erzielt sehr hohe Präzisionswerte.

Gegenwind
quelle
Danke für Ihre Antwort. Dies ist eine interessante (ich habe sie positiv bewertet). Die Idee zum Triplett ist gut, obwohl ich nicht genau weiß, warum die Verwendung von Tripletts von Bildern notwendigerweise besser ist als die Verwendung von Bildpaaren für meine Aufgabe. Wenn Sie möchten, können Sie dies in Ihrem Beitrag näher erläutern. Ich werde mir auch TiefVision ansehen.
Penseur
@Universalis danke für den Hinweis (und die positive Bewertung). Ich habe meine Antwort mit einigen weiteren Details zu Drillingen und der Begründung aktualisiert. Das Papier ist auch sehr gut geschrieben, schauen Sie also nach allen Details. Es könnte jedoch neue ausgefallene Möglichkeiten geben, dies zu tun, seit TiefVision und DeepRanking aufgetaucht sind.
Gegenwind
Nochmals vielen Dank für Ihre Antwort. Ja, ich habe mir das Papier angesehen und es war ziemlich klar, was Sie zu Ihrer Antwort hinzugefügt haben. In diesem Sinne hatte ich bereits verstanden, was Sie Ihrer Antwort hinzugefügt haben, und meine Frage lautete wie folgt: Warum nicht 2 Bilder (ein Paar) anstelle von 3 Bildern (ein Triplett) verwenden, um die Bilder nach ihrer Ähnlichkeit zu ordnen? Was ist der zusätzliche Vorteil der Verwendung von Drillingen anstelle von Paaren?
Penseur
Hmm, vielleicht habe ich deinen Ansatz falsch verstanden. Das Triplett liefert vergleichende Informationen darüber, dass Bild 1 näher an Bild 2 als an Bild 3 liegt. Wenn nur 2 Bilder vorhanden sind und "diese 2 sind ähnlich" angegeben ist, fehlt ein Vergleichsfaktor "in welcher Hinsicht ähnlich", da Sie bei diesem Ansatz davon ausgehen, dass der einfache Abstand des Merkmalsvektors sagt Ihnen nicht genug. Mit anderen Worten: Sie lernen Ähnlichkeit auf Bestellung und es fehlt Ihnen, ohne mindestens 2 Artikel zu bestellen.
Gegenwind
Nochmals vielen Dank für Ihre Antwort. Aber selbst jetzt und nachdem ich das Papier etwas genauer gelesen habe, ist mir nicht klar, warum Sie für diesen unbeaufsichtigten Ansatz unbedingt Drillinge und keine Bildpaare benötigen. Wenn Sie Beschriftungen verwenden, ist es klar, dass Sie durch die Verwendung von Triplets eine vollständige Ähnlichkeitsrangfolge der Bilder erhalten, die Sie mit Paaren nicht erhalten können. Aber in diesem (Art) unbeaufsichtigten Ansatz, den Sie dann vorschlagen, warum nicht die Werte der Verlustfunktion für jedes Bildpaar vergleichen (immer ist ein Bild des Paares das Eingabebild), um z. B. die 5 ähnlichsten zu finden Eingabebild?
Penseur
2

Ich würde einen Klassifikator wie VGG-16 auswählen, der in den Imagenet-Klassen gut funktioniert. Führen Sie dann Ihre Uhrenbilder durch. Mit Sicherheit können Sie davon ausgehen, dass die Ausgabe mit hoher Wahrscheinlichkeit größtenteils "beobachtet" wird.

Sie erhalten dann jedoch zusätzliche Funktionen: die Aktivierungsstufe aller anderen Kategorien. Das ergibt einen Vektor von tausend Werten zwischen 0 und 1.

Sie können die Aktivierung auch an verschiedenen Stellen im Netzwerk extrahieren. Dann sollte die Ähnlichkeit dieser Aktivierungen und Ausgaben zwischen zwei Fällen nur dann ähnlich sein, wenn die Bilder ähnlich sind.

Jeffrey unterstützt Monica
quelle
Vielen Dank für Ihre Antwort (positive Bewertung). Ja, ich hatte dies im Kopf und in gewissem Sinne hängt es mit der ersten Option zusammen, die ich auf meinem Posten bereitgestellt habe. Also habe ich auch darüber nachgedacht, andere Detektoren wie SURF zu verwenden ... Ich werde sehen, ob diese ausreichend erfolgreich sind ...
Penseur
2

Ich würde mich zuerst auf die Datenerweiterung konzentrieren. Da Ihre Bilder einen weißen Hintergrund haben, ist es für Sie etwas einfacher. Verwandeln Sie den weißen Hintergrund in einen transparenten Hintergrund, verkleinern Sie das Bild, drehen Sie es und fügen Sie es in einen ähnlichen Hintergrund wie Ihre Zieldaten ein.

Tun Sie dies einige Male mit einer anderen Kombination und haben Sie ein Etikett für jede Uhr. Dann würde ich vorschlagen, dass Sie ein reguläres Faltungs-Neuronales Netzwerk für die Klassifizierung verwenden. Jedes Etikett hat eine Punktzahl, wählen Sie das mit dem höchsten Vertrauen aus und das sollte am ähnlichsten sein .

Angenommen, Sie führen den Klassifizierer mit einem Bild aus und erhalten das folgende Ergebnis:

Watch1: 0.51

Watch2: 0.30

Watch3: 0.25

Das CNN sagt, dass es eine 51% ige Sicherheit hat, dass Watch1 die Uhr im Eingabebild ist. Aber was auch wahr ist, ist, dass es das ist, von dem es glaubt, dass es ähnlicher aussieht, Watch2 wäre das nächste, das ähnlicher ist und so weiter.

Wenn Sie keine guten Ergebnisse erzielen, gehen Sie wie gewohnt vor. Experimentieren Sie mit den Parametern und / oder fügen Sie weitere Ebenen hinzu. Versuchen Sie herauszufinden, wo es fehlschlägt. Nachdem Sie diese Einsicht erhalten haben, können Sie damit einen spezielleren Typ eines Faltungsnetzwerks für Ihr spezielles Problem auswählen. Das zu suchen, ohne vorher zu wissen, wie es funktionieren würde, ist nicht der richtige Ansatz. Ich würde vorschlagen, dass Sie mit einem grundlegenden Faltungsmodell beginnen und dann von dort aus arbeiten.

zimio
quelle
1
Vielen Dank für Ihre Antwort (positive Bewertung). Ja, ich hatte bereits eine Datenerweiterung im Kopf. Ihre Antwort ist jedoch ziemlich unklar. Was meinst du mit "ein Etikett für jede Uhr haben"? Meinen Sie damit, jede Uhr einzeln zu kennzeichnen oder als Paar mit einer anderen zu kennzeichnen, je nachdem, ob sie ähnlich sind oder nicht? (Wenn es das erstere ist, dann erklären Sie bitte, warum dies effizient ist)
Penseur
Es ist der frühere Vorschlag, ich ging davon aus, dass Sie bereits eine praktische Möglichkeit hatten, alle zu kennzeichnen. Dies ist im Grunde die grundlegendste Lösung, daher ist sie nicht effizient. Mein Vorschlag war, dass das Grundmodell Ihnen vielleicht genug Informationen geben könnte, um ein spezialisierteres Modell zu verfolgen. Ein tiefes Ranking zu sehen scheint sehr vielversprechend, wie @Gegenwind sagte. Ich habe meine Antwort aktualisiert, um sie etwas klarer zu machen.
Zimio
Hm, ja, jetzt ist klarer, was Sie gemeint haben ... Dies ist sicherlich ein guter allgemeiner Vorschlag: Beginnen Sie mit den Grundlagen und gehen Sie Schritt für Schritt zu komplexeren Dingen über ... Danke auf jeden Fall ...
Penseur