1

Ich versuche, ein Objektklassifizierungssystem mit OpenCV einzurichten. Wenn ich ein neues Objekt in einer Szene erkenne, möchte ich wissen, ob das neue Objekt zu einer bekannten Objektklasse gehört (ist es eine Box, eine Flasche, etwas Unbekanntes usw.).Object Classification, wann das Vollbild oder das extrahierte Objekt verwendet werden soll?

Meine Schritte so weit:

  • das Bild in den roi Abholzen, wo ein neues Objekt
  • Berechnung keypoints für jedes Bild (cv :: SurfFeatureDetector)
  • Berechnung Deskriptoren für jeden charakteristischen Punkt erscheinen könnte (cv :: SurfDescriptorExtractor)
  • Generieren eines Vokabular Bag of Words (cv :: BOWKMeansTrainer)
  • Berechnung Antwort Histogramme (cv :: BOWImgDescriptorExtractor)
  • die Antwort Histogramme verwenden ein cv :: SVM für jede Objektklasse
  • Mit dem gleichen Satz von Bildern wieder zu trainieren, um die Klassifizierung

ich zu testen, wissen, dass es noch etwas falsch mit meinem Code ist seit die Klassifizierung funktioniert noch nicht.

Aber ich weiß nicht wirklich, wo ich das ganze Bild verwenden soll (runtergeschnitten zum roi) oder wann ich das neue Objekt aus dem Bild extrahieren soll und nur das Objekt selbst verwenden soll.

Es ist mein erster Schritt in die Objekterkennung/-klassifizierung und ich sah Leute, die sowohl volle Bilder als auch extrahierte Objekte benutzten, aber ich weiß einfach nicht, wann was zu verwenden ist.

Ich hoffe, Womeone kann dies für mich klären.

Antwort

0

Sie sollten nicht die gleichen Bilder für Test und Training verwenden. Im Training müssen Sie idealerweise einen ROI extrahieren, der nur ein dominantes Objekt enthält, da der Algorithmus davon ausgeht, dass die aus positiven Stichproben extrahierten Codewörter in einem Testbild enthalten sein müssen, um sie als positiv zu kennzeichnen. Wenn Sie jedoch ein wirklich großes Dataset wie ImageNet haben, sollte der Algorithmus eine Generalisierung vornehmen.

Beim Testen müssen Sie keinen ROI extrahieren, da SIFT/SURF skaleninvariante Funktionen sind. Es ist jedoch auch gut, ein einziges dominantes Objekt im Test-Set zu haben.

Ich denke, Sie sollten 1 Classifier für Ihre jede Objektklasse trainieren. Dies wird Ein-gegen-Alles-Klassifikator genannt.

Eine kleine Anmerkung, wenn Sie sich nicht um diese Probleme kümmern und große Datenmengen haben möchten. Gehen Sie einfach mit Convolutional Neural Networks. Sie haben eine wirklich gute Generalisierungsfähigkeit und sind dank ihrer vollständig verbundenen letzten Schicht von Natur aus Multi-Label.

+0

Gibt es einen Grund, die gleichen Bilder nicht für Training und erste Tests zu verwenden? Ich dachte, das sollte eine 100% richtige Klassifizierung bekommen, wenn alles korrekt eingerichtet ist, also habe ich dieselben Bilder verwendet. – Oronar

+0

Ich habe es! Sie wollen nur das Ergebnis sehen, aber denken Sie daran, dass Sie Ihre Trainingsgenauigkeit nicht kennen, oder? Vielleicht ist es sogar niedrig. Natürlich müssen Sie eine hohe Punktzahl erzielen, wenn Sie den Algorithmus mit Trainingsbildern testen. Könnten Sie Ihre Trainingsgenauigkeit teilen? – cagatayodabasi

+0

Wenn ich richtig verstehe, sollte ich eine ROI (AABB) mit dem Objekt von Interesse extrahieren.Dann hätte ich das Objekt mit seiner Orientierung und ein wenig Hintergrund. Beim Testen muss ich das Objekt wahrscheinlich extrahieren, da es mehrere Objekte in der Szene gibt. Ich verwende bereits einen 1vsAll-Klassifikator, also hat jede Objektklasse ihre eigene SVM. Ich benutzte diesen Code als Vorlage: https://github.com/royshil/FoodcamClassifier/blob/master/main.cpp Ich denke, CNN und ImageNet ist nicht geeignet, da ich nur 30 Bilder pro Objektklasse für das Training habe (aber ich brauche nur eine Draufsicht). – Oronar

Verwandte Themen