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 .
quelle
Antworten:
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 :
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.
quelle
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.
quelle
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:
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.
quelle