Verwenden Sie Azure Machine Learning, um ein Symbol in einem Bild zu erkennen

10

Vor 4 Jahren habe ich diese Frage gestellt und ein paar Antworten bekommen, die leider außerhalb meiner Fähigkeiten lagen. Ich habe gerade an einer Build-Tour-Konferenz teilgenommen, wo sie über maschinelles Lernen sprachen, und das brachte mich dazu, über die Möglichkeit nachzudenken, ML als Lösung für mein Problem zu verwenden. Ich fand dies auf der azurblauen Seite, aber ich denke nicht, dass es mir helfen wird, weil sein Umfang ziemlich eng ist.

Hier ist, was ich erreichen möchte:

Ich habe ein Quellbild:

und ich möchte, welches der folgenden Symbole (falls vorhanden) in dem Bild oben enthalten sind:

Der Vergleich muss geringfügige Verzerrungen, Skalierungen, Farbunterschiede, Rotationen und Helligkeitsunterschiede unterstützen.

Die Anzahl der übereinstimmenden Symbole wird letztendlich mindestens größer als 100 sein.

ist ML ein gutes Werkzeug, um dieses Problem zu lösen? wenn ja, irgendwelche Starttipps?

    
josh 16.06.2015, 05:58
quelle

1 Antwort

19

Soweit ich weiß, wäre Project Oxford (MS Azure CV API) für Ihre Aufgabe nicht geeignet. Ihre APIs sind sehr fokussiert auf Gesichtsbezogene Aufgaben (Erkennung, Verifizierung, etc.), OCR und Bildbeschreibung. Und anscheinend können Sie ihre Modelle nicht erweitern oder neue von den vorhandenen ausbilden.

Aber obwohl ich keine Standardlösung für Ihr Objekterkennungsproblem kenne; Es gibt einfach genug Ansätze, die Sie versuchen könnten, und das würde Ihnen einige Startpunkt Ergebnisse geben.

Hier ist zum Beispiel eine naive Methode, die Sie verwenden könnten:

1) Erstellen Sie Ihren Datensatz:     Dies ist wahrscheinlich der mühsamere und paradoxerweise entscheidende Schritt. Ich nehme an, Sie haben eine gute Anzahl von Bildern, mit denen Sie arbeiten können. Was Sie tun müssen, ist eine feste Fenstergröße auszuwählen und positive und negative Beispiele zu extrahieren.

Wenn einige der Bilder in Ihrem Dataset unterschiedliche Größen haben, müssen Sie sie auf eine gemeinsame Größe skalieren. Sie müssen nicht zu verrückt über die Größe, wahrscheinlich 30x30 Bilder wären mehr als genug. Um die Dinge einfacher zu machen, würde ich die Bilder auch in Graustufen umwandeln.

2) Wählen Sie einen Klassifizierungsalgorithmus und trainieren Sie ihn:     Es gibt eine schreckliche Menge an Klassifikationsalgorithmen. Aber wenn Sie neu im maschinellen Lernen sind, werde ich diejenige auswählen, die ich am meisten verstehe. Wenn ich das bedenke, würde ich logistische Regressionen ausprobieren, die ordentliche Ergebnisse liefern, es ist einfach genug für Anfänger und hat viele Bibliotheken und Tutorials. Zum Beispiel dieses oder dieser . Zuerst würde ich sagen, dass ich mich auf ein binäres Klassifikationsproblem konzentrieren muss (als ob es ein UD-Logo im Bild gibt oder nicht) und wenn Sie dieses beherrschen, können Sie zum Mehrklassenfall springen. Es gibt Ressourcen für diese oder Sie können immer mehrere Modelle pro Logo haben und führe dieses Rezept für jedes einzeln aus.

Um Ihr Modell zu trainieren, müssen Sie nur die in Schritt 1 erzeugten Bilder lesen und in einen Vektor umwandeln und entsprechend beschriften. Das wäre der Datensatz, der Ihr Modell füttern wird. Wenn Sie Bilder in Graustufen verwenden, entspricht jede Position im Vektor einem Pixelwert im Bereich von 0 bis 255. Abhängig vom Algorithmus müssen Sie diese Werte möglicherweise auf den Bereich [0-1] skalieren (weil einige Algorithmen mit Werten in diesem Bereich besser arbeiten). Beachten Sie, dass die Skalierung in diesem Fall ziemlich einfach ist (neuer_Wert = Wert / 255).

Sie müssen auch Ihren Datensatz aufteilen, indem Sie einige Beispiele für das Training, eine Teilmenge für die Validierung und eine weitere für das Testen reservieren. Auch hier gibt es verschiedene Möglichkeiten, aber ich halte diese Antwort so naiv wie möglich.

3) Führen Sie die Erkennung durch:     Lasst uns jetzt den spaßigen Teil beginnen. Bei einem beliebigen Bild möchten Sie Ihr Modell ausführen und Koordinaten in dem Bild erzeugen, in dem sich ein Logo befindet. Es gibt verschiedene Möglichkeiten, dies zu tun, und ich werde eine beschreiben, die wahrscheinlich nicht die beste oder die effizienteste ist, aber es ist meiner Meinung nach leichter zu entwickeln.

Sie scannen das Bild, extrahieren die Pixel in einem "Fenster", skalieren diese Pixel auf die Größe, die Sie in Schritt 1 ausgewählt haben, und führen sie dann Ihrem Modell zu.

Wenn das Modell eine positive Antwort gibt, markieren Sie dieses Fenster im Originalbild. Da das Logo möglicherweise in verschiedenen Maßstäben angezeigt wird, müssen Sie diesen Vorgang mit unterschiedlichen Fenstergrößen wiederholen. Sie müssten auch den Abstand zwischen Fenstern anpassen.

4) Spülen und wiederholen:     In der ersten Iteration ist es sehr wahrscheinlich, dass Sie viele falsche Positive erhalten. Dann müssen Sie diese als negative Beispiele nehmen und Ihr Modell umschulen. Dies wäre ein iterativer Prozess und hoffentlich werden Sie bei jeder Iteration immer weniger falsch positive und weniger falsche negative Ergebnisse haben.

Sobald Sie mit Ihrer Lösung zufrieden sind, möchten Sie sie vielleicht verbessern. Vielleicht möchten Sie andere Klassifikationsalgorithmen wie SVM oder Deep Learning Künstliche Neuronale Netze , oder um bessere Objekterkennungs-Frameworks wie Viola zu testen -Jones . Außerdem müssen Sie wahrscheinlich crossvalidation verwenden, um alle Ihre Lösungen zu vergleichen (Sie können Crossvalidierung verwenden) von Anfang an).Von diesem Moment an wette ich, dass Sie selbstsicher genug wären, dass Sie OpenCV oder ein anderes gebrauchsfertiges Framework verwenden möchten. In diesem Fall werden Sie verstehen, was unter der Haube passiert.

Auch Sie könnten diese Antwort einfach ignorieren und sich für ein OpenCV-Lernprogramm wie dieses entscheiden. Oder nehmen Sie eine andere Antwort von einer anderen Frage wie dieser one . Viel Glück!

    
Pedrom 16.06.2015 15:38
quelle