Angenommen, ein Bild enthält zwei Autos. Wie kann es diese Autos erkennen, wenn es ein einzelnes Auto in einem Bild erkennen kann?
quelle
Angenommen, ein Bild enthält zwei Autos. Wie kann es diese Autos erkennen, wenn es ein einzelnes Auto in einem Bild erkennen kann?
Obwohl viele Lösungen in Produktionssystemen immer noch ein Schiebefenster verwenden, wie unten in dieser Antwort beschrieben, bewegt sich das Gebiet der Computer Vision schnell. Zu den jüngsten Fortschritten auf diesem Gebiet gehören R-CNN und YOLO .
Das Erkennen von Objektübereinstimmungen in einem Bild, wenn Sie bereits einen Objektklassifizierer trainiert haben, ist normalerweise eine Frage des Brute-Force-Scannens durch Bildfelder.
Beginnen Sie mit der größten erwarteten Patchgröße. Wenn Ihr Bild beispielsweise 1024 x 768 ist, aber immer eine Fernaufnahme einer Straße, erwarten Sie möglicherweise nicht, dass ein Auto mehr als 80 x 80 Pixel im Bild einnimmt. Sie nehmen also einen 80x80-Pixelblock aus einer Ecke des Bildes und fragen Ihren Klassifizierer, wie wahrscheinlich es ist, dass sich in dieser Ecke ein Auto befindet. Nehmen Sie dann den nächsten Patch - vielleicht um 20 Pixel.
Wiederholen Sie diesen Vorgang für alle möglichen Positionen und entscheiden Sie, welche Patches am wahrscheinlichsten Autos enthalten.
Nehmen Sie als Nächstes eine Blockgröße (möglicherweise 60 x 60, wobei jeweils 15 Pixel verschoben werden) und wiederholen Sie die gleiche Übung erneut. Wiederholen Sie diesen Vorgang, bis Sie die erwartete kleinste Blockgröße für Ihr Ziel erreicht haben.
Schließlich haben Sie eine Liste von Bereichen innerhalb des Bildes, mit der Wahrscheinlichkeit, dass jeder ein Auto enthält.
Überlappende Blöcke, beide mit hoher Wahrscheinlichkeit, sind höchstwahrscheinlich dasselbe Auto. Daher muss die Logik Schwellenwerte für das Zusammenführen von Blöcken haben - normalerweise wird der überlappende Bereich mit der höchsten Wahrscheinlichkeitsbewertung verwendet - und es muss angegeben werden, dass sich nur ein Auto in diesem Bereich befindet.
Wie bei ML-Ansätzen üblich, müssen Sie mit korrekten Meta-Parametern experimentieren - in diesem Fall Blockgrößen, Schrittgrößen und Regeln zum Zusammenführen / Teilen von Bereichen -, um die genauesten Ergebnisse zu erhalten.
Ich möchte die Antwort von @ Neil_Slater hinzufügen, indem ich meine Bewerbung teile.
In meiner Anwendung möchte ich ein Modell trainieren, das automatisch eine Schachposition aus einem Schachbuch wie folgt laden kann:
Es war kein schweres Problem, denn es war, als würde man die MINST-Ziffern trainieren. Ich habe genug Samples gesammelt und diesen Samples zufällig etwas Rauschen hinzugefügt. Mein Modell war ein 2-lagiges Faltungs-Deep-Learning.
Da ist Schachbrett immer ein Quadrat. Ich verwende die in OpenCV verfügbare Quadraterkennung, um eine Liste der Kandidaten zu erhalten. Ich würde jedes Quadrat wegwerfen, das zu klein, zu groß oder nicht durch 64 teilbar ist (da es 64 Quadrate gibt).
Als nächstes würde ich das Bild wie folgt zuschneiden:
Jetzt habe ich ein weiteres mehrschichtiges Faltungsnetzwerk, um jedes Quadrat auf der Platine zu überprüfen. Die Schrittlänge ist die Dimension des Bildes geteilt durch 8 (da jede Dimension acht Quadrate enthält). Die Patchgröße entspricht der Schrittlänge.
Meine Rohrleitungen funktionierten, da ich zwei verschiedene Klassifikatoren kombinieren konnte . Ich persönlich bevorzuge es, zwei Klassifikatoren zu trainieren, da es einfacher zu trainieren und zu verifizieren wäre, als alles in einem einzigen Modell zusammenzufassen.
Die Frage selbst ist nicht ganz klar, da Sie nicht angeben, dass Sie ein Modell haben, das ein Auto pro Lauf für ein Bild erkennen kann, oder nur fragen, welche Tools, Algorithmen oder Frameworks zum Erkennen von Autos (oder anderen Objekten) verwendet werden sollen. in einem Bild.
Bei der Beantwortung der zweiten Variante sollten Sie entwickelte Algorithmen zur Objekterkennung verwenden, die entweder Haar Cascades (die in OpenCV eingebettet sind und klare Tutorials zum Trainieren Ihres benutzerdefinierten Objektdetektors, z. B. ein Bananentutorial ) oder CNNs enthalten Ich persönlich bin die Wahl für die Objekterkennung mithilfe neuronaler Netze und arbeite gerne mit dieser Implementierung - einfachem und umfassendem Code und erstaunlichen Ergebnissen.
Beide Ansätze (Haar Cascades und CNNs) finden im Wesentlichen Muster von miteinander verbundenen und nebeneinander angeordneten Formen, die Ihr bestimmtes Objekt beschreiben (sei es Gesicht, Banane, Auto oder UFO), und verwenden diese Muster, um Objekte auf einem neuen Bild zu finden. Die gegenseitige Einbeziehung erkannter Objekte (wenn sich die Grenzen von Objekten überschneiden oder eines von einem anderen eingeschlossen wird) wird verwendet, um die beste Übereinstimmung für jede Region zu finden.
In Ihrer Frage heißt es ausdrücklich, dass Sie nur nach mehreren Autos und nicht nach mehreren Objekten suchen. Die Antwort liegt also in der Frage. Sie suchen nicht nach mehreren Objekten, sondern nach mehreren Vorkommen desselben Objekts.
Vorausgesetzt, Sie haben das System gut genug trainiert, um beide Fahrzeugtypen zu erkennen, sollten beide mithilfe von Standard-Kaskadenfilter-Ansätzen erkannt werden. Dies ist wie die Frage, wie ich zwei Gesichter auf einem Foto erkennen kann.
Wenn Sie nach einem Auto und einem Affen suchen, ist die Situation ganz anders. Wenn Sie gängige Ansätze mit Tools wie offenem Lebenslauf verwenden, trainieren Sie im Allgemeinen zwei Klassifikatoren (einen für Autos und einen für Affen), die das Bild zweimal durchlaufen.
Je mehr verschiedene Objektklassen Sie erkennen möchten, desto mehr Klassifizierer und Iterationen würden Sie benötigen.